Website release v0.1-M1.

Generated from commit 033bdef2d53d16edd4d9a165d842f58ab235c62b
diff --git a/v0.1-M1/chi/eclipse-escet-incubation-chi-manual.pdf b/v0.1-M1/chi/eclipse-escet-incubation-chi-manual.pdf
new file mode 100644
index 0000000..0d55994
--- /dev/null
+++ b/v0.1-M1/chi/eclipse-escet-incubation-chi-manual.pdf
Binary files differ
diff --git a/v0.1-M1/chi/eclipse-incubation.png b/v0.1-M1/chi/eclipse-incubation.png
new file mode 100644
index 0000000..5fccef5
--- /dev/null
+++ b/v0.1-M1/chi/eclipse-incubation.png
Binary files differ
diff --git a/v0.1-M1/chi/favicon.png b/v0.1-M1/chi/favicon.png
new file mode 100644
index 0000000..7ffa2e9
--- /dev/null
+++ b/v0.1-M1/chi/favicon.png
Binary files differ
diff --git a/v0.1-M1/chi/index.html b/v0.1-M1/chi/index.html
new file mode 100644
index 0000000..b6faa58
--- /dev/null
+++ b/v0.1-M1/chi/index.html
@@ -0,0 +1,13577 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation">
+<link rel="icon" type="image/png" href="favicon.png">
+<title>Chi documentation (Incubation)</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+:not(pre)>code.nobreak{word-wrap:normal}
+:not(pre)>code.nowrap{white-space:nowrap}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<style>
+.menu, .submenu, .menuitem, .menuref {
+    background-color: Menu;
+}
+
+.button {
+    border: 1px solid ButtonFace;
+    /*
+    Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
+    border: 2px outset ButtonFace;
+    background-color: ButtonFace;
+    */
+    padding-left: 0.5ex;
+    padding-right: 0.5ex;
+    font-weight: normal;
+    font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
+    white-space: nowrap;
+}
+.button:before {
+    content: none !important;
+}
+.button:after {
+    content: none !important;
+}
+
+#footer-text, #footer-text a {
+    color: rgba(255,255,255,.8)
+}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<h1>Chi documentation (Incubation)</h1>
+<div class="details">
+<span id="author" class="author">Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation</span><br>
+<span id="revnumber">version 0.1.0.20210126-175926</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#tut-chapter-chi-tutorial">Chi Tutorial</a>
+<ul class="sectlevel2">
+<li><a href="#tut-chapter-introduction">Introduction</a></li>
+<li><a href="#tut-chapter-data-types">Data types</a></li>
+<li><a href="#tut-chapter-statements">Statements</a></li>
+<li><a href="#tut-chapter-functions">Functions</a></li>
+<li><a href="#tut-chapter-input-and-output">Input and output</a></li>
+<li><a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a></li>
+<li><a href="#tut-chapter-processes">Processes</a></li>
+<li><a href="#tut-chapter-channels">Channels</a></li>
+<li><a href="#tut-chapter-buffers">Buffers</a></li>
+<li><a href="#tut-chapter-servers-with-time">Servers with time</a></li>
+<li><a href="#tut-chapter-conveyors">Conveyors</a></li>
+<li><a href="#tut-chapter-simulation-and-experiments">Simulations and experiments</a></li>
+<li><a href="#tut-chapter-svg-visualization">SVG visualization</a></li>
+<li><a href="#tut-chapter-svg-example">SVG visualization example</a></li>
+</ul>
+</li>
+<li><a href="#ref-chapter-reference-manual">Chi Reference Manual</a>
+<ul class="sectlevel2">
+<li><a href="#ref-chapter-global-definitions">Global definitions</a></li>
+<li><a href="#ref-chapter-statements">Statements</a></li>
+<li><a href="#ref-chapter-expressions">Expressions</a></li>
+<li><a href="#ref-chapter-standard-library">Standard library functions</a></li>
+<li><a href="#ref-chapter-distributions">Distributions</a></li>
+<li><a href="#ref-chapter-types">Types</a></li>
+<li><a href="#ref-chapter-lexical-syntax">Lexical syntax</a></li>
+<li><a href="#ref-chapter-migration">Model migration</a></li>
+<li><a href="#ref-chapter-svg-visualization">SVG visualization</a></li>
+</ul>
+</li>
+<li><a href="#tool-chapter-tool-manual">Chi Tool Manual</a>
+<ul class="sectlevel2">
+<li><a href="#tool-chapter-software-operation">Software operation</a></li>
+<li><a href="#tool-chapter-command-line">Command line options</a></li>
+</ul>
+</li>
+<li><a href="#release-notes-chapter-index">Chi release notes</a>
+<ul class="sectlevel2">
+<li><a href="#version-0-1-unreleased">Version 0.1 (unreleased)</a></li>
+</ul>
+</li>
+<li><a href="#legal-chapter-index">Legal</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>Chi is a modeling language for describing and analyzing performance of
+discrete event systems by means of simulation.
+It uses a process-based view, and uses synchronous point-to-point
+communication between processes. A process is written as an imperative
+program, with a syntax much inspired by the well-known Python language.</p>
+</div>
+<div class="paragraph">
+<p>Chi is one of the tools of the
+<a href="https://eclipse.org/escet">Eclipse ESCET&#8482; project</a>.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The Eclipse ESCET project, including the Chi language and toolset,
+is currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+You can <a href="eclipse-escet-incubation-chi-manual.pdf">download this manual</a>
+as a PDF as well.
+</td>
+</tr>
+</table>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">Tutorial</dt>
+<dd>
+<p>The <a href="#tut-chapter-chi-tutorial">Chi Tutorial</a>
+teaches the Chi language, and its use in modeling and simulating systems
+to answer your performance questions.</p>
+<div class="paragraph">
+<p>Some interesting topics are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Basics (<a href="#tut-chapter-data-types">Data types</a>, <a href="#tut-chapter-statements">Statements</a>,
+<a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a>)</p>
+</li>
+<li>
+<p>Programming (<a href="#tut-chapter-processes">Processes</a>, <a href="#tut-chapter-channels">Channels</a>)</p>
+</li>
+<li>
+<p>Modeling (<a href="#tut-chapter-buffers">Buffers</a>, <a href="#tut-chapter-servers-with-time">Servers with time</a>,
+<a href="#tut-chapter-conveyors">Conveyors</a>)</p>
+</li>
+</ul>
+</div>
+</dd>
+<dt class="hdlist1">Reference manual</dt>
+<dd>
+<p>The <a href="#ref-chapter-reference-manual">Chi Reference Manual</a>
+describes the Chi language in full detail, for example the top level language
+elements or all statements. It also contains a list with all standard library
+functions and a list with all distribution functions.</p>
+<div class="paragraph">
+<p>Some interesting topics are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#ref-chapter-global-definitions">Global definitions</a> (Top level language elements)</p>
+</li>
+<li>
+<p><a href="#ref-chapter-standard-library">Standard library functions</a> (Standard library functions)</p>
+</li>
+<li>
+<p><a href="#ref-chapter-distributions">Distributions</a> (Available distributions)</p>
+</li>
+</ul>
+</div>
+</dd>
+<dt class="hdlist1">Tool manual</dt>
+<dd>
+<p>The <a href="#tool-chapter-tool-manual">Tool manual</a>
+describes the Chi simulator software.
+Use of the software to create and simulate Chi programs is also explained.</p>
+</dd>
+<dt class="hdlist1">Release notes</dt>
+<dd>
+<p>The <a href="#release-notes-chapter-index">Release notes</a> provides information on
+all Chi releases.</p>
+</dd>
+<dt class="hdlist1">Legal</dt>
+<dd>
+<p>See <a href="#legal-chapter-index">Legal</a> for copyright and licensing information.</p>
+</dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="tut-chapter-chi-tutorial">Chi Tutorial</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This manual explains using the Chi modeling language.</p>
+</div>
+<div class="paragraph">
+<p><em>Topics</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tut-chapter-introduction">Introduction</a> (global description of the aims of the language)</p>
+</li>
+<li>
+<p><em>Basics</em>: Elementary knowledge needed for writing and understanding Chi
+programs. <em>Start here to learn the language!</em></p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tut-chapter-data-types">Data types</a> (explanation of all kinds of data and their
+operations)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-statements">Statements</a> (available process statements)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-functions">Functions</a> (how to use functions)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-input-and-output">Input and output</a> (reading/writing files, displaying output)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>Programming</em>: How to specify parallel executing processes using the Chi
+language.</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a> (how to model varying behavior)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-processes">Processes</a> (creating and running processes)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-channels">Channels</a> (connecting processes with each other)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>Modeling</em>: Modeling a real system with Chi.</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tut-chapter-buffers">Buffers</a> (modeling temporary storage of items)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-servers-with-time">Servers</a> (modeling machines)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-conveyors">Conveyors</a> (modeling conveyor belts)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-simulation-and-experiments">Experiments</a> (performing simulation experiments)</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>Visualization</em>: Making an animated graphical display of a system with the
+Chi simulator.</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tut-chapter-svg-visualization">SVG visualization</a> (how to attach an SVG visualization)</p>
+</li>
+<li>
+<p><a href="#tut-chapter-svg-example">SVG example</a> (an SVG example)</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-introduction">Introduction</h3>
+<div class="paragraph">
+<p>The topic is modeling of the operation of (manufacturing) systems, e.g.
+semiconductor factories, assembly and packaging lines, car manufacturing
+plants, steel foundries, metal processing shops, beer breweries, health care
+systems, warehouses, order-picking systems.
+For a proper functioning of these systems, these systems are controlled by
+operators and electronic devices, e.g. computers.</p>
+</div>
+<div class="paragraph">
+<p>During the design process, engineers make use of (analytical) mathematical
+models, e.g. algebra and probability theory, to get answers about the
+operation of the system.
+For complex systems, (numerical) mathematical models are used, and computers
+perform simulation experiments, to analyze the operation of the system.
+Simulation studies give answers to questions like:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>What is the throughput of the system?</p>
+</li>
+<li>
+<p>What is the effect of set-up time in a machine?</p>
+</li>
+<li>
+<p>How will the batch size of an order influence the flow time of the
+product-items?</p>
+</li>
+<li>
+<p>What is the effect of more surgeons in a hospital?</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+The operation of a system can be described, e.g. in terms of or operating
+processes.</p>
+</div>
+<div class="paragraph">
+<p>An example of a system with parallel operating processes is a manufacturing
+line, with a number of manufacturing machines, where product-items go from
+machine to machine.
+A surgery room in a hospital is a system where patients are treated by teams
+using medical equipment and sterile materials.
+A biological system can be described by a number of parallel processes, where,
+e.g. processes transform sugars into water and carbon-dioxide producing
+energy.
+In all these examples, processes operate in parallel to complete a task, and
+to achieve a goal.
+Concurrency is the dominant aspect in these type of systems, and as a
+consequence this holds too for their models.</p>
+</div>
+<div class="paragraph">
+<p>The operating behavior of parallel processes can be described by different
+formalisms, e.g. automata, Petri-nets or parallel processes. This text uses
+the programming language Chi, which is an instance of a parallel processes
+formalism.</p>
+</div>
+<div class="paragraph">
+<p>A system is abstracted into a model, with cooperating processes, where
+processes are connected to each other via channels.
+The channels are used for exchanging material and information.
+Models of the above mentioned examples consist of a number of concurrent
+processes connected by channels, denoting the flow of products, patients or
+personnel.</p>
+</div>
+<div class="paragraph">
+<p>In Chi, communication takes place in a synchronous manner.
+This means that communication between a sending process, and a receiving
+process takes place only when both processes are able to communicate.
+Processes and channels can dynamically be altered.
+To model times, like inter-arrival times and server processing times, the
+language has a notation of time.</p>
+</div>
+<div class="paragraph">
+<p>The rationale behind the language is that models for the analysis of a system should be</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>formal (exactly one interpretation, every reader attaches the same meaning to the model),</p>
+</li>
+<li>
+<p>easily writable (write the essence of the system in a compact way),</p>
+</li>
+<li>
+<p>easily readable (non-experts should be able to understand the model),</p>
+</li>
+<li>
+<p>and easily extensible (adding more details in one part should not affect other parts).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Verification of the models to investigate the properties of the model should
+be relatively effortless. (A model has to preserve some properties of the real system
+otherwise results from the simulation study have no relation with the system
+being modeled. The language must allow this verification to take place in a
+simple manner.)</p>
+</div>
+<div class="paragraph">
+<p>Experiments should be performed in an straightforward manner. (Minimizing the
+effort in doing simulation studies, in particular for large systems, makes the
+language useful.)</p>
+</div>
+<div class="paragraph">
+<p>Finally, the used models should be usable for the supervisory (logic) control
+of the systems (simulation studies often provide answers on how to control a
+system in a better way, these answers should also work for the modeled
+system).</p>
+</div>
+<div class="sect3">
+<h4 id="tut-chi-in-a-nutshell">Chi in a nutshell</h4>
+<div class="paragraph">
+<p>During the past decades, the ancestors of Chi have been used with success,
+for the analysis of a variety of (industrial) systems.
+Based on this experience, the language Chi has been completely redesigned,
+keeping the strong points of the previous versions, while making it more
+powerful for advanced users, and easier to access for non-experts.</p>
+</div>
+<div class="paragraph">
+<p>Its features are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A system (and its control) is modeled as a collection of parallel running
+processes, communicating with each other using channels.</p>
+</li>
+<li>
+<p>Processes do not share data with other processes and channels are
+synchronous (sending and receiving is always done together at the same
+time), making reasoning about process behavior easier.</p>
+</li>
+<li>
+<p>Processes and channels are dynamic, new processes can be created as needed,
+and communication channels can be created or rerouted.</p>
+</li>
+<li>
+<p>Variables can have elementary values such as <em>boolean</em>, <em>integer</em> or <em>real</em>
+numbers, to high level structured collections of data like <em>lists</em>, <em>sets</em>
+and <em>dictionaries</em> to model the data of the system. If desired, processes
+and channels can also be part of that data.</p>
+</li>
+<li>
+<p>A small generic set of statements to describe algorithms, assignment, <em>if</em>,
+<em>while</em>, and <em>for</em> statements. This set is relatively easy to explain to
+non-experts, allowing them to understand the model, and participate in the
+discussions.</p>
+</li>
+<li>
+<p>Tutorials and manuals demonstrate use of the language for effective modeling
+of system processes. More detailed modeling of the processes, or custom
+tailoring them to the real situation, has no inherent limits.</p>
+</li>
+<li>
+<p>Time and (quasi-) random number generation distributions are available for
+modeling behavior of the system in time.</p>
+</li>
+<li>
+<p>Likewise, measurements to derive performance indicators of the modeled
+system are integrated in the model. Tutorials and manuals show basic use.
+The integration allows for custom solutions to obtain the needed data in the
+wanted form.</p>
+</li>
+<li>
+<p>Input and output facilities from and to the file system exists to support
+large simulation experiments.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Install the Chi programming environment at your computer.</p>
+</li>
+<li>
+<p>Test your first program.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Construct the following program in a project in your workspace:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M():
+    writeln(&quot;It works!&quot;)
+end</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Compile, and simulate the model as explained in the tool manual (in
+<a href="#tool-compile-and-simulate">Compile and simulate</a>).</p>
+</li>
+<li>
+<p>Try to explain the result.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Test a program with model parameters.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Construct the following program in the same manner:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M(string s):
+    write(&quot;%s\n&quot;)
+end</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Simulate the model, where you have to set the <em>Model instance</em> text to
+<code>M("OOPS")</code> in the dialog box of the simulator.</p>
+</li>
+<li>
+<p>Try to explain the result.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-data-types">Data types</h3>
+<div class="paragraph">
+<p>The language is a statically typed language, which means that all variables
+and values in a model have a single fixed type.
+All variables must be declared in the program.
+The declaration of a variable consists of the type, and the name, of the
+variable. The following fragment shows the declaration of two elementary data
+types, integer variable <code>i</code> and real variable <code>r</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">...
+int i;
+real r;
+...</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The ellipsis (<code>...</code>) denotes that non-relevant information is left out from
+the fragment. The syntax for the declaration of variables is similar to the
+language <em>C</em>. All declared variables are initialized, variables <code>i</code> and
+<code>r</code> are both initialized to zero.</p>
+</div>
+<div class="paragraph">
+<p>An expression, consisting of operators, e.g. plus (<code>+</code>), times (<code>*</code>), and
+operands, e.g. <code>i</code> and <code>r</code>, is used to calculate a new value. The new
+value can be assigned to a variable by using an <em>assignment</em> statement. An
+example with four variables, two expressions and assignment statements is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">...
+int  i = 2, j;
+real r = 1.50, s;
+
+j = 2 * i + 1;
+s = r / 2;
+...</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The value of variable <code>j</code> becomes <code>5</code>, and the value of <code>s</code> becomes
+<code>0.75</code>.
+Statements are described in <a href="#tut-chapter-statements">Statements</a>.</p>
+</div>
+<div class="paragraph">
+<p>Data types are categorized in five different groups: <em>elementary</em> types,
+<em>tuple</em> types, <em>container</em> types, <em>custom</em> types, and <em>distribution</em> types.
+Elementary types are types such as Boolean, integer, real or string.
+Tuple types contain at least one element, where each element can be of
+different type. In other languages tuple types are called records (Pascal) or
+structures (C).
+Variables with a container type (a list, set, or dictionary) contain many
+elements, where each element is of the same type.
+Custom types are created by the user to enhance the readability of the model.
+Distributions types are types used for the generation of distributions from
+(pseudo-) random numbers.
+They are covered in <a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a>.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-elementary-types">Elementary types</h4>
+<div class="paragraph">
+<p>The elementary data types are Booleans, numbers and strings.
+The language provides the elementary data types:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> for booleans, with values <code>false</code> and <code>true</code>.</p>
+</li>
+<li>
+<p><code>enum</code> for enumeration types, for example
+<code>enum FlagColors = {red, white, blue}</code>,</p>
+</li>
+<li>
+<p><code>int</code> for integers, e.g. <code>-7</code>, <code>20</code>, <code>0</code>.</p>
+</li>
+<li>
+<p><code>real</code> for reals, e.g. <code>3.14</code>, <code>7.0e9</code>.</p>
+</li>
+<li>
+<p><code>string</code> for text strings, e.g. <code>"Hello"</code>, <code>"world"</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-booleans">Booleans</h5>
+<div class="paragraph">
+<p>A boolean value has two possible values, the truth values.
+These truth values are <code>false</code> and <code>true</code>.
+The value <code>false</code> means that a property is not fulfilled.
+A value <code>true</code> means the presence of a property.
+Boolean variables are initialized with the value <code>false</code>.</p>
+</div>
+<div class="paragraph">
+<p>In mathematics, various symbols are used for unary and binary boolean
+operators.
+These operators are also present in Chi.
+The most commonly used boolean operators are <code>not</code>, <code>and</code>, and <code>or</code>.
+The names of the operators, the symbols in mathematics and the symbols in the
+language are presented in <a href="#tut-table-boolsymbols">Table with boolean symbols</a>.</p>
+</div>
+<table id="tut-table-boolsymbols" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 1. Table with boolean symbols</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Operator</th>
+<th class="tableblock halign-left valign-top">Math</th>
+<th class="tableblock halign-left valign-top">Chi</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">boolean not</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">¬</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">boolean and</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">∧</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>and</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">boolean or</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">∨</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>or</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Examples of boolean expressions are the following.
+If <code>z</code> equals <code>true</code>, then the value of <code>(not z)</code> equals <code>false</code>.
+If <code>s</code> equals <code>false</code>, and <code>t</code> equals <code>true</code>, then the value of the
+expression <code>(s or t)</code> becomes <code>true</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+The result of the unary <code>not</code>, the binary
+<code>and</code> and <code>or</code> operators, for two variables <code>p</code> and <code>q</code> is given in
+<a href="#tut-table-truthtable">Truth table for  <code>not</code>, <code>and</code> and <code>or</code> operators</a>.</p>
+</div>
+<table id="tut-table-truthtable" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 2. Truth table for  <code>not</code>, <code>and</code> and <code>or</code> operators</caption>
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top"><code>p</code></th>
+<th class="tableblock halign-left valign-top"><code>q</code></th>
+<th class="tableblock halign-left valign-top"><code>not p</code></th>
+<th class="tableblock halign-left valign-top"><code>p and q</code></th>
+<th class="tableblock halign-left valign-top"><code>p or q</code></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>If <code>p = true</code> and <code>q = false</code>, we find for <code>p or q</code> the value <code>true</code>
+(third line in <a href="#tut-table-truthtable">Truth table for  <code>not</code>, <code>and</code> and <code>or</code> operators</a>).</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-enumerations">Enumerations</h5>
+<div class="paragraph">
+<p>Often there are several variants of entities, like types of products,
+available resources, available machine types, and so on.</p>
+</div>
+<div class="paragraph">
+<p>One way of coding them is give each a unique number, which results in code
+with a lot of small numbers that are not actually numbers, but refer to one
+variant.</p>
+</div>
+<div class="paragraph">
+<p>Another way is to give each variant a name (which often already exists), and
+use those names instead.</p>
+</div>
+<div class="paragraph">
+<p>For example, to model a traffic light:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">enum TrafficColor = {RED, ORANGE, GREEN};
+
+TrafficColor light = RED;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>enum TrafficColor</code> line lists the available traffic colors. With this
+definition, a new type <code>TrafficColor</code> is created, which you can use like any
+other type. The line <code>TrafficColor light = RED;</code> creates a new variable
+called <code>light</code> and initializes it to the value <code>RED</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-numbers">Numbers</h5>
+<div class="paragraph">
+<p>In the language, two types of numbers are available: integer numbers and real
+numbers. Integer numbers are whole numbers, denoted by type <code>int</code> e.g.
+<code>3</code>, <code>-10</code>, <code>0</code>. Real numbers are used to present numbers with a
+fraction, denoted by type <code>real</code>. E.g. <code>3.14</code>, <code>2.7e6</code> (the scientific
+notation for 2.7 million). Note that real numbers <em>must</em> either have a
+fraction or use the scientific notation, to let the computer know you mean a
+real number (instead of an integer number). Integer variables are initialized
+with <code>0</code>. Real variables are initialized with <code>0.0</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+For numbers, the normal arithmetic operators are defined.
+Expressions can be constructed with these operators.
+The arithmetic operators for numbers are listed in <a href="#tut-table-aritoper">The arithmetic operators</a>.</p>
+</div>
+<table id="tut-table-aritoper" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 3. The arithmetic operators</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Operator name</th>
+<th class="tableblock halign-left valign-top">Notation</th>
+<th class="tableblock halign-left valign-top">Comment</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">unary plus</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+ x</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">unary minus</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>- x</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">raising to the power</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x ^ y</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Always a <code>real</code> result.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">multiplication</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x * y</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real division</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x / y</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Always a <code>real</code> result.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">division</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x div y</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">For <code>int</code> only.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">modulo</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x mod y</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">For <code>int</code> only.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">addition</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x + y</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">subtraction</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x - y</code></p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The priority of the operators is given from high to low.
+The unary operators have the strongest binding, and the <code>+</code> and <code>-</code> the
+weakest binding. So, <code>-3^2</code> is read as <code>(-3)^2</code> and not <code>-(3^2)</code>,
+because the priority rules say that the unary operator binds stronger than the
+raising to the power operator. Binding in expressions can be changed by the
+use of parentheses.</p>
+</div>
+<div class="paragraph">
+<p>The integer division, denoted by <code>div</code>, gives the biggest integral number
+smaller or equal to <code>x / y</code>. The integer remainder, denoted by <code>mod</code>,
+gives the remainder after division <code>x - y * (x div y)</code>. So, <code>7 div 3</code>
+gives <code>2</code> and <code>-7 div 3</code> gives <code>-3</code>, <code>7 mod 3</code> gives <code>1</code> and <code>-7
+mod 3</code> gives <code>2</code>.</p>
+</div>
+<div class="paragraph">
+<p>The rule for the result of an operation is as follows. The real division and
+raising to the power operations always produce a value of type <code>real</code>.
+Otherwise, if both operands (thus <code>x</code> and <code>y</code>) are of type <code>int</code>, the
+result of the operation is of type <code>int</code>. If one of the operands is of type
+<code>real</code>, the result of the operation is of type <code>real</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+Conversion functions exist to convert a real into an integer.
+The function <code>ceil</code> converts a real to the
+smallest integer value not less than the real, the
+function <code>floor</code> gives the biggest
+integer value smaller than or equal to the real, and the
+function <code>round</code> rounds the real to the nearest integer
+value (or up, if it ends on <code>.5</code>).</p>
+</div>
+<div class="paragraph">
+<p>
+
+Between two numbers a relational operation can be defined.
+If for example variable <code>x</code> is smaller than variable <code>y</code>, the expression
+<code>x &lt; y</code> equals <code>true</code>. The relational operators, with well-known
+semantics, are listed in <a href="#tut-table-reloper">The relational operators</a>.</p>
+</div>
+<table id="tut-table-reloper" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 4. The relational operators</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Name</th>
+<th class="tableblock halign-left valign-top">Operator</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">less than</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &lt;  y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">at most</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &lt;= y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">equals</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x == y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">differs from</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x != y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">at least</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt;= y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">greater than</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt;  y</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-strings">Strings</h5>
+<div class="paragraph">
+<p>Variables of type string contains a sequence of characters.
+A string is enclosed by double quotes.
+An example is <code>"Manufacturing line"</code>.
+Strings can be composed from different strings.
+The concatenation operator (<code>+</code>) adds one string to another, for
+example <code>"One" + " " + "string"</code> gives <code>"One string"</code>.
+Moreover the relational operators (<code>&lt;</code>, <code>&lt;=</code>, <code>==</code>, <code>!=</code> <code>&gt;=</code>,
+and <code>&gt;</code>) can be used to compare strings alphabetically,
+e.g. <code>"a" &lt; "aa" &lt; "ab" &lt; "b"</code>.
+String variables are initialized with the empty string <code>""</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-tuple-types">Tuple types</h4>
+<div class="paragraph">
+<p>
+
+
+
+Tuple types are used for keeping several (related) kinds of data together in
+one variable, e.g. the name and the age of a person.
+A tuple variable consists of a number of fields
+inside the tuple, where the types of these fields may be different.
+The number of fields is fixed. One operator, the projection operator
+denoted by a dot (<code>.</code>), is defined for tuples. It selects a field in the
+tuple for reading or assigning.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-notation">Notation</h5>
+<div class="paragraph">
+<p>A type <code>person</code> is a tuple with two fields, a 'name' field of type
+<code>string</code>, and an 'age' field of type <code>int</code>, is denoted by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type person = tuple(string name; int age)</code></pre>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-operator">Operator</h5>
+<div class="paragraph">
+<p>A projection operator fetches a field from a tuple.
+We define two persons:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">person eva  = (&quot;eva&quot; , 29),
+       adam = (&quot;adam&quot;, 27);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And we can speak of <code>eva.name</code> and <code>adam.age</code>, denoting the name of
+<code>eva</code> (<code>"eva"</code>) and the age of <code>adam</code> (<code>27</code>).
+We can assign a field in a tuple to another variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">ae = eva.age;
+eva.age = eva.age + 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This means that the age of <code>eva</code> is assigned tot variable <code>ae</code>, and the
+new age of <code>eva</code> becomes <code>eva.age + 1</code>.</p>
+</div>
+<div class="paragraph">
+<p>By using a multi assignment statement all values of a tuple can be copied into
+separate variables:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">string name;
+int age;
+
+name, age = eva</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This assignment copies the name of <code>eva</code> into variable <code>name</code> of type
+<code>string</code> and her age into <code>age</code> of type <code>int</code>.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-container-types">Container types</h4>
+<div class="paragraph">
+<p>Lists, sets and dictionaries are container types.
+A variable of this type contains zero or more identical elements.
+Elements can be added or removed in variables of these types.
+Variables of a container type are initialized with zero elements.</p>
+</div>
+<div class="paragraph">
+<p>Sets are unordered collections of elements. Each element value either exists
+in a set, or it does not exist in a set.
+Each element value is unique, duplicate elements are silently discarded.
+A list is an ordered collection of elements, that is, there is a first and a last
+element (in a non-empty list). A list also allows duplicate element values.
+Dictionaries are unordered and have no duplicate value, just like sets, but
+you can associate a value (of a different type) with each element value.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+Lists are denoted by a pair of (square) brackets.
+For example, <code>[7, 8, 3]</code> is a list with three integer elements. Since a list
+is ordered, <code>[8, 7, 3]</code> is a different list.
+With empty lists, the computer has to know the type of the elements, e.g.
+<code>&lt;int&gt;[]</code> is an empty list with integer elements.
+The prefix <code>&lt;int&gt;</code> is required in this case.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+Sets are denoted by a
+pair of (curly) braces, e.g. <code>{7, 8, 3}</code> is a set with three integer
+elements.
+As with lists, for an empty set a prefix is required, for example
+<code>&lt;string&gt;{}</code> is an empty set with strings.
+A set is an unordered collection of elements.
+The set <code>{7, 8, 3}</code> is a set with three integer numbers. Since order of
+the elements does not matter, the same set can also be written as
+<code>{8, 3, 7}</code> (or in one of the four other orders).
+In addition, each element in a set is unique, the set <code>{8, 7, 8, 3}</code> is
+equal to the set <code>{7, 8, 3}</code>.
+For readability, elements in a set are normally written in increasing order,
+for example <code>{3, 7, 8}</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+Dictionaries are denoted by a pair of (curly) braces, whereby an element value
+consists of two parts, a 'key' and a 'value' part.
+The two parts separated by a colon (<code>:</code>).
+For example <code>{"jim" : 32, "john" : 34}</code> is a dictionary with two elements.
+The first element has <code>"jim"</code> as key part and <code>32</code> as value part, the
+second element has <code>"john"</code> as key part and <code>34</code> as value part.
+The key parts of the elements work like a set, they are unordered and
+duplicates are silently discarded. A value part is associated with its key
+part.
+In this example, the key part is the name of a person, while the value part
+keeps the age of that person.
+Empty dictionaries are written with a type prefix just like lists and sets,
+e.g. <code>&lt;string:int&gt;{}</code>.</p>
+</div>
+<div class="paragraph">
+<p>Container types have some built-in functions in common (Functions are
+described in <a href="#tut-chapter-functions">Functions</a>):</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The function <code>size</code> gives the number of elements in a variable, for
+example <code>size([7, 8, 3])</code> yields 3; <code>size({7, 8})</code> results in 2;
+<code>size({"jim":32})</code> gives 1 (an element consists of two parts).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The function <code>empty</code> yields <code>true</code> if there are no elements in variable.
+E.g. <code>empty(&lt;string&gt;{})</code> with an empty set of type <code>string</code> is true.
+(Here the type <code>string</code> is needed to determine the type of the elements
+of the empty set.)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The function <code>pop</code> extracts a value from the provided collection and
+returns a tuple with that value, and the collection minus the value.</p>
+<div class="paragraph">
+<p>
+
+For lists, the first element of the list
+becomes the first field of the tuple. The second field of the tuple becomes
+the list minus the first list element. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">pop([7, 8, 3]) -&gt; (7, [8, 3])</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>-&gt;</code> above denotes 'yields'.
+The value of the list is split into a 'head' (the first element) and a
+'tail' (the remaining elements).</p>
+</div>
+<div class="paragraph">
+<p>
+
+For sets, the first field of the tuple becomes the
+value of an arbitrary element from the set. The second field of the tuple
+becomes the original set minus the arbitrary element.
+For example, a <code>pop</code> on the set <code>{8, 7, 3}</code> has three possible answers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">pop({8, 7, 3}) -&gt; (7, {3, 8}) or
+pop({8, 7, 3}) -&gt; (3, {7, 8}) or
+pop({8, 7, 3}) -&gt; (8, {3, 7})</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Performing a <code>pop</code> on a dictionary
+follows the same pattern as above, except 'a value from the collection' are
+actually a key item and a value item. In this case, the <code>pop</code> function
+gives a three-tuple as result. The first field of the tuple becomes the key
+of the extracted element, the second field of the tuple becomes the value of
+the element, and the third field of the tuple contains the dictionary except
+for the extracted element. Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">pop({&quot;a&quot; : 32, &quot;b&quot; : 34}) -&gt; (&quot;a&quot;, 32, {&quot;b&quot; : 34}) or
+pop({&quot;a&quot; : 32, &quot;b&quot; : 34}) -&gt; (&quot;b&quot;, 34, {&quot;a&quot; : 32})</code></pre>
+</div>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-lists">Lists</h5>
+<div class="paragraph">
+<p>A list is an ordered collection of elements of the same type.
+They are useful to model anything where duplicate values may occur or where
+order of the values is significant. Examples are waiting customers in a shop,
+process steps in a recipe, or products stored in a warehouse. Various
+operations are defined for lists.</p>
+</div>
+<div class="paragraph">
+<p>An element can be fetched by <em>indexing</em>.
+This indexing operation does not change the content of the variable.
+The first element of a list has index <code>0</code>.
+The last element of a list has index <code>size(xs) - 1</code>.
+A negative index, say <code>m</code>, starts from the back of the list, or
+equivalently, at offset <code>size(xs) + m</code> from the front.
+You cannot index non-existing elements.
+Some examples, with <code>xs = [7, 8, 3, 5, 9]</code> are:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs[0]  -&gt; 7
+xs[3]  -&gt; 5
+xs[5]  -&gt; ERROR (there is no element at position 5)
+xs[-1] -&gt; xs[5 - 1] -&gt; xs[4] -&gt; 9
+xs[-2] -&gt; xs[5 - 2] -&gt; xs[3] -&gt; 5</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+In <a href="#tut-figure-list-with-indices">A list with indices</a> the list with indices is visualized.
+A common name for the first element of a list
+(i.e., <code>x[0]</code>) is the <em>head</em> of a list.
+Similarly, the last element of a list
+(<code>xs[-1]</code>) is also known as <em>head right</em>.</p>
+</div>
+<div id="tut-figure-list-with-indices" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/list_with_indices.png" alt="list with indices">
+</div>
+<div class="title">Figure 1. A list with indices</div>
+</div>
+<div class="paragraph">
+<p>A part of a list can be fetched by <em>slicing</em>.
+The slicing operation does not change the content of the list, it copies a
+contiguous sequence of a list.
+The result of a slice operation is again a list, even if the slice contains
+just one element.</p>
+</div>
+<div class="paragraph">
+<p>Slicing is denoted by <code>xs[i:j]</code>.
+The slice of <code>xs[i:j]</code> is defined as the sequence of elements with index
+<code>k</code> such that <code>i &lt;= k &lt; j</code>. Note the upper bound <code>j</code> is noninclusive.
+If <code>i</code> is omitted use <code>0</code>.
+If <code>j</code> is omitted use <code>size(xs)</code>. If <code>i</code> is greater than or equal to
+<code>j</code>, the slice is empty. If <code>i</code> or <code>j</code> is negative, the index is
+relative to the end of the list: <code>size(xs) + i</code> or <code>size(xs) + j</code> is
+substituted. Some examples with <code>xs = [7, 8, 3, 5, 9]</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs[1:3] -&gt; [8, 3]
+xs[:2]  -&gt; [7, 8]
+xs[1:]  -&gt; [8, 3, 5, 9]
+xs[:-1] -&gt; [7, 8, 3, 5]
+xs[:-3] -&gt; [7, 8]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+The list of all but the first elements (<code>xs[1:]</code>) is often called <em>tail</em>
+and <code>xs[:-1]</code> is also known as <em>tail right</em>.
+In <a href="#tut-figure-list-with-slices">A list with indices and slices</a> the slicing operator is visualized.</p>
+</div>
+<div id="tut-figure-list-with-slices" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/list_with_slices.png" alt="list with slices">
+</div>
+<div class="title">Figure 2. A list with indices and slices</div>
+</div>
+<div class="paragraph">
+<p>
+
+Two lists can be 'glued' together into a new list.
+The glue-ing or concatenation of a list with elements <code>7</code>, <code>8</code>, <code>3</code> and a
+list with elements <code>5</code>, and <code>9</code> is denoted by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">[7, 8, 3] + [5, 9] -&gt; [7, 8, 3, 5, 9]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An element can be added to a list at the rear or at the front.
+The action is performed by transforming the element into a list and then
+concatenate these two lists. In the next example the value <code>5</code> is added to
+the rear, respectively the front, of a list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">[7, 8, 3] + [5] -&gt; [7, 8, 3, 5]
+[5] + [7, 8, 3] -&gt; [5, 7, 8, 3]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+Elements also can be removed from a list.
+The <code>del</code> function removes by position, e.g. <code>del(xs, 2)</code> returns the list
+<code>xs</code> without its third element (since positions start at index 0).
+Removing a value by value can be performed by the subtraction operator <code>-</code>.
+For instance, consider the following subtractions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">[1, 4, 2, 4, 5] - [2] -&gt; [1, 4, 4, 5]
+[1, 4, 2, 4, 5] - [4] -&gt; [1, 2, 4, 5]
+[1, 4, 2, 4, 5] - [8] -&gt; [1, 4, 2, 4, 5]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Every element in the list at the right is searched in the list at the left,
+and if found, the <em>first</em> occurrence is removed.
+In the first example, element <code>2</code> is removed. In the second example, only
+the first value <code>4</code> is removed and the second value (at position 3) is kept.
+In the third example, nothing is removed, since value <code>8</code> is not in the list
+at the left.</p>
+</div>
+<div class="paragraph">
+<p>When the list at the right is longer than one element, the operation is repeated.
+For example, consider <code>xs - ys</code>, whereby <code>xs = [1, 2, 3, 4, 5]</code> and
+<code>ys = [6, 4, 2, 3]</code>. The result is computed as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">    [1, 2, 3, 4, 5] - [6, 4, 2, 3]
+-&gt; ([1, 2, 3, 4, 5] - [6]) - [4, 2, 3]
+-&gt;  [1, 2, 3, 4, 5] - [4, 2, 3]
+-&gt; ([1, 2, 3, 4, 5] - [4]) - [2, 3]
+-&gt;  [1, 2, 3,    5] - [2, 3]
+-&gt; ([1, 2, 3,    5] - [2]) - [3]
+-&gt;  [1,    3,    5] - [3]
+-&gt; [1,5]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Lists have two relational operators, the equal operator and the not-equal operator.
+The equal operator (<code>==</code>) compares two lists. If the lists have the same
+number of elements and all the elements are pair-wise the same, the result of
+the operation is <code>true</code>, otherwise <code>false</code>.
+The not-equal operator (<code>!=</code>) does the same check, but with an opposite result.
+Some examples, with <code>xs = [7, 8, 3]</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs == [7, 8, 3] -&gt; true
+xs == [7, 7, 7] -&gt; false</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The membership operator (<code>in</code>) checks if an element is in a list.
+Some examples, with <code>xs = [7, 8, 3]</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">6 in xs -&gt; false
+7 in xs -&gt; true
+8 in xs -&gt; true</code></pre>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-initialization">Initialization</h5>
+<div class="paragraph">
+<p>A list variable is initialized with a list with zero elements, for example in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The initial value of <code>xs</code> equals <code>&lt;int&gt;[]</code>.</p>
+</div>
+<div class="paragraph">
+<p>A list can be initialized with a number, denoting the number of elements in the list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list(2) int ys</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This declaration creates a list with <code>2</code> elements, whereby each element of
+type <code>int</code> is initialized.
+The initial value of <code>ys</code> equals <code>[0, 0]</code>.
+Another example with a list of lists:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list(4) list(2) int zm</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This declaration initializes variable <code>zm</code> with the value
+<code>[ [0, 0], [0, 0], [0, 0], [0, 0] ]</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-sets">Sets</h5>
+<div class="paragraph">
+<p>Set operators for union, intersection and difference are present.
+<a href="#tut-table-set-operations">Table with set operations</a> gives the name, the mathematical notation and
+the notation in the Chi language.</p>
+</div>
+<table id="tut-table-set-operations" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 5. Table with set operations</caption>
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Operator</th>
+<th class="tableblock halign-left valign-top">Math</th>
+<th class="tableblock halign-left valign-top">Chi</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set union</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">∪</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set intersection</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">∩</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>*</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set difference</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">∖</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The union of two sets merges the values of both sets into one, that is, the
+result is the collection of values that appear in at least one of the
+arguments of the union operation. Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">{3, 7, 8} + {5, 9} -&gt; {3, 5, 7, 8, 9}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>All permutations with the elements <code>3</code>, <code>5</code>, <code>7</code>, <code>8</code> and <code>9</code> are
+correct (sets have no order, all permutations are equivalent). To keep sets
+readable the elements are sorted in increasing order in this tutorial.</p>
+</div>
+<div class="paragraph">
+<p>Values that occur in both arguments, appear only one time in the result (sets
+silently discard duplicate elements). For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">{3, 7, 8} + {7, 9} -&gt; {3, 7, 8, 9}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The intersection of two sets gives a set with the common elements, that is,
+all values that occur in <em>both</em> arguments.
+Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">{3, 7, 8} * {5, 9} -&gt; &lt;int&gt;{}   # no common element
+{3, 7, 8} * {7, 9} -&gt; {7}       # only 7 in common</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Set difference works much like subtraction on lists, except elements occur at
+most one time (and have no order). The operation computes 'remaining
+elements'. The result is a new set containing all values from the first set
+which are not in the second set.
+Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">{3, 7, 8} - {5, 9} -&gt; {3, 7, 8}
+{3, 7, 8} - {7, 9} -&gt; {3, 9}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The membership operator <code>in</code> works on sets too:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">3 in {3, 7, 8} -&gt; true
+9 in {3, 7, 8} -&gt; false</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-dictionaries">Dictionaries</h5>
+<div class="paragraph">
+<p>Elements of dictionaries are stored according to a key, while lists elements
+are ordered by a (relative) position, and set elements are not ordered at all.
+A dictionary can grow and shrink by adding or removing elements respectively,
+like a list or a set.
+An element of a dictionary is accessed by the key of the element.</p>
+</div>
+<div class="paragraph">
+<p>The dictionary variable <code>d</code> of type <code>dict(string : int)</code> is given by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict (string : int) d =
+    {&quot;jim&quot;  : 32,
+     &quot;john&quot; : 34,
+     &quot;adam&quot; : 25}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Retrieving values of the dictionary by using the key:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">d[&quot;john&quot;] -&gt; 34
+d[&quot;adam&quot;] -&gt; 25</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Using a non-existing key to retrieve a value results in a error message.</p>
+</div>
+<div class="paragraph">
+<p>A new value can be assigned to the variable by selecting the key of the element:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">d[&quot;john&quot;] = 35</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This assignment changes the value of the <code>"john"</code> item to <code>35</code>.
+The assignment can also be used to add new items:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">d[&quot;lisa&quot;] = 19</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Membership testing of keys in dictionaries can be done with the <code>in</code> operator:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">&quot;jim&quot; in d -&gt; true
+&quot;peter&quot; in d -&gt; false</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Merging two dictionaries is done by adding them together. The value of the
+second dictionary is used when a key exists in both dictionaries:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">{1 : 1, 2 : 2} + {1 : 5, 3 : 3} -&gt; {1 : 5, 2 : 2, 3 : 3}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The left dictionary is copied, and updated with each item of the right dictionary.</p>
+</div>
+<div class="paragraph">
+<p>Removing elements can be done with subtraction, based on key values. Lists and
+sets can also be used to denote which keys should be removed.
+A few examples for <code>p</code> is <code>{1 : 1, 2 : 2}</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">p - {1 : 3, 5 : 5} -&gt; {2 : 2}
+p - {1, 7} -&gt; {2 : 2}
+p - [2, 8] -&gt; {1 : 1}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Subtracting keys that do not exist in the left dictionary is allowed and has
+no effect.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-custom-types">Custom types</h4>
+<div class="paragraph">
+<p>To structure data the language allows the creation of new types. The
+definition can only be done at global level, that is, outside any <code>proc</code>,
+<code>func</code>, <code>model</code>, or <code>xper</code> definition.</p>
+</div>
+<div class="paragraph">
+<p>Types can be used as alias for elementary data types to increase readability,
+for example a variable of type <code>item</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type item = real;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variables of type <code>item</code> are, e.g.:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">item box, product;
+
+box = 4.0; product = 120.5;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This definition creates the possibility to speak about an item.</p>
+</div>
+<div class="paragraph">
+<p>Types also can be used to make combinations of other data types, e.g. a
+recipe:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type step   = tuple(string name; real process_time),
+     recipe = tuple(int id; list step steps);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A type <code>step</code> is defined by a <code>tuple</code> with two fields, a field with
+<code>name</code> of type <code>string</code>, denoting the name of the step, and a field with
+<code>process_time</code> of type <code>real</code>, denoting the duration of the (processing)
+step.
+The <code>step</code> definition is used in the type <code>recipe</code>.
+Type <code>recipe</code> is defined by a <code>tuple</code> with two fields, an <code>id</code> of type
+<code>int</code>, denoting the identification number, and a field <code>steps</code> of type
+<code>list step</code>, denoting a list of single steps.
+Variables of type recipe are, e.g.:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">recipe plate, bread;
+plate = (34, [(&quot;s&quot;, 10.8), (&quot;w&quot;, 13.7), (&quot;s&quot;, 25.6)]);
+bread = (90, [(&quot;flour&quot;, 16.3), (&quot;yeast&quot;, 6.9)]);</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-2">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Exercises for integer numbers.
+What is the result of the following expressions:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">-5 ^ 3
+-5 * 3
+5 mod 3</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Exercises for tuples.
+Given are tuple type <code>box</code> and variable <code>x</code> of type <code>box</code>:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type box = tuple(string name; real weight);
+box x = (&quot;White&quot;, 12.5);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>What is the result of the following expressions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x.name
+x.real
+x</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Exercises for lists.
+Given is the list <code>xs = [0,1,2,3,4,5,6]</code>.
+Determine the outcome of:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs[0]
+xs[1:]
+size(xs)
+xs + [3]
+[4,5] + xs
+xs - [2,2,3]
+xs - xs[2:]
+xs[0] + (xs[1:])[0]</code></pre>
+</div>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-statements">Statements</h3>
+<div class="paragraph">
+<p>There are several kinds of statements, such as assignment statements, choice
+statements (select and if statements), and loop statements (while and for
+statements).</p>
+</div>
+<div class="paragraph">
+<p>Semicolons are required after statements, except at the end of a sequence
+(that is, just before an <code>end</code> keyword and after the last statement) or
+after the keyword <code>end</code>. In this text semicolons are omitted before <code>end</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="tut-the-assignment-statement">The assignment statement</h4>
+<div class="paragraph">
+<p>An <em>assignment</em> statement is used to assign values to variables.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">y = x + 10</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This assignment consists of a name of the variable (<code>y</code>), an assignment
+symbol (<code>=</code>), and an expression (<code>x + 10</code>) yielding a value. For example,
+when <code>x</code> is <code>2</code>, the value of the expression is <code>12</code>.
+Execution of this statement copies the value to the <code>y</code> variable,
+immediately after executing the assignment, the value of the <code>y</code> variable is
+<code>10</code> larger than the value of the <code>x</code> variable at this point of the
+program.
+The value of the <code>y</code> variable will not change until the next assignment to
+<code>y</code>, for example, performing the assignment <code>x = 7</code> has no effect on the
+value of the <code>y</code> variable.</p>
+</div>
+<div class="paragraph">
+<p>An example with two assignment statements:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">i = 2;
+j = j + 1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The values of <code>i</code> becomes 2, and the value of <code>j</code> is incremented.
+Independent assignments can also be combined in a multi-assignment, for
+example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">i, j = 2, j + 1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The result is the same as the above described example, the first value goes
+into the first variable, the second value into the second variable, etc.</p>
+</div>
+<div class="paragraph">
+<p>In an assignment statement, first all expression values are computed before
+any assignment is actually done. In the following example the values of <code>x</code>
+and <code>y</code> are swapped:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x, y = y, x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-the-if-statement">The <code>if</code> statement</h4>
+<div class="paragraph">
+<p>The <em>if</em> statement is used to express decisions.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if x &lt; 0:
+    y = -x
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the value of <code>x</code> is negative, assign its negated value to <code>y</code>.
+Otherwise, do nothing (skip the <code>y = -x</code> assignment statement).</p>
+</div>
+<div class="paragraph">
+<p>To perform a different statement when the decision fails, an <code>if</code>-statement
+with an <code>else</code> alternative can be used. It has the following form.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if a &gt; 0:
+    c = a
+else:
+    c = b
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If <code>a</code> is positive, variable <code>c</code> gets the value of <code>a</code>, otherwise it
+gets the value of <code>b</code>.</p>
+</div>
+<div class="paragraph">
+<p>In some cases more alternatives must be tested. One way of writing it is by
+nesting an <code>if</code>-statement in the <code>else</code> alternative of the previous
+<code>if</code>-statement, like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if i &lt; 0:
+    writeln(&quot;i &lt; 0&quot;)
+else:
+    if i == 0:
+        writeln(&quot;i = 0&quot;)
+    else:
+        if i &gt; 0 and i &lt; 10:
+            writeln(&quot;0 &lt; i &lt; 10&quot;)
+        else:
+            # i must be greater or equal 10
+            writeln(&quot;i &gt;= 10&quot;)
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This tests <code>i &lt; 0</code>. If it fails, the <code>else</code> is chosen, which contains a
+second <code>if</code>-statement with the <code>i == 0</code> test. If that test also fails, the
+third condition <code>i &gt; 0 and i &lt; 10</code> is tested, and one of the <code>writeln</code>
+statements is chosen.</p>
+</div>
+<div class="paragraph">
+<p>The above can be written more compactly by combining an <code>else</code>-part and the
+<code>if</code>-statement that follows, into an <code>elif</code> part. Each <code>elif</code> part
+consists of a boolean expression, and a statement list. Using <code>elif</code> parts
+results in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if i &lt; 0:
+    writeln(&quot;i &lt; 0&quot;)
+elif i == 0:
+    writeln(&quot;i = 0&quot;)
+elif i &gt; 0 and i &lt; 10:
+    writeln(&quot;0 &lt; i &lt; 10&quot;)
+else:
+    # i must be greater or equal 10
+    writeln(&quot;i &gt;= 10&quot;)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each alternative starts at the same column, instead of having increasing
+indentation.
+The execution of this combined statement is still the same, an alternative is
+only tested when the conditions of all previous alternatives fail.</p>
+</div>
+<div class="paragraph">
+<p>
+Note that the line <code># i must be greater or equal 10</code> is a comment to clarify
+when the alternative is chosen. It is not executed by the simulator. You can
+write comments either at a line by itself like above, or behind program code.
+It is often useful to clarify the meaning of variables, give a more detailed
+explanation of parameters, or add a line of text describing what the purpose
+of a block of code is from a birds-eye view.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-the-while-statement">The <code>while</code> statement</h4>
+<div class="paragraph">
+<p>The <em>while</em> statement is used for repetitive execution of the same statements,
+a so-called <em>loop</em>. A fragment that calculates the sum of <code>10</code> integers,
+<code>10, 9, 8, ..., 3, 2, 1</code>, is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i = 10, sum;
+
+while i &gt; 0:
+    sum = sum + i; i = i - 1
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each iteration of a <code>while</code> statement starts with evaluating its condition
+(<code>i &gt; 0</code> above). When it holds, the statements inside the while (the
+<code>sum = sum + i; i = i - 1</code> assignments) are executed (which adds <code>i</code> to the sum
+and decrements <code>i</code>). At the end of the statements, the <code>while</code> is executed
+again by evaluating the condition again. If it still holds, the next iteration
+of the loop starts by executing the assignment statements again, etc.
+When the condition fails (<code>i</code> is equal to <code>0</code>), the <code>while</code> statement
+ends, and execution continues with the statement following <code>end</code>.</p>
+</div>
+<div class="paragraph">
+<p>A fragment with an infinite loop is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">while true:
+    i = i + 1;
+    ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The condition in this fragments always holds, resulting in <code>i</code> getting
+incremented 'forever'. Such loops are very useful to model things you switch
+on but never off, e.g. processes in a factory.</p>
+</div>
+<div class="paragraph">
+<p>A fragment to calculate <code>z = x ^ y</code>, where <code>z</code> and <code>x</code> are of type
+<code>real</code>, and <code>y</code> is of type <code>integer</code> with a non-negative value, showing
+the use of two <code>while</code> loops, is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">real x; int y; real z = 1;
+
+while y &gt; 0:
+    while y mod 2 == 0:
+        y = y div 2; x = x * x
+    end;
+    y = y - 1; z = x * z
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A fragment to calculate the greatest common divisor (GCD) of two integer
+numbers <code>j</code> and <code>k</code>, showing the use of <code>if</code> and <code>while</code> statements,
+is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">while j != k:
+    if j &gt; k:
+        j = j - k
+    else:
+        k = k - j
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The symbol <code>!=</code> stands for 'differs from' ('not equal').</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-for-statement">The <code>for</code> statement</h4>
+<div class="paragraph">
+<p>The while statement is useful for looping until a condition fails. The <em>for</em>
+statement is used for iterating over a collection of values. A fragment with
+the calculation of the sum of <code>10</code> integers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int sum;
+
+for i in range(1, 11):
+    sum = sum + i
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The result of the expression <code>range(1, 11)</code>
+is a list whose items are consecutive integers from <code>1</code> (included)
+up to <code>11</code> (excluded): <code>[1, 2, 3, ..., 9, 10]</code>.</p>
+</div>
+<div class="paragraph">
+<p>The following example illustrates the use of the for statement in relation
+with container-type variables. Another way of calculating the sum of a list of
+integer numbers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs = [1, 2, 3, 5, 7, 11, 13];
+int sum;
+
+for x in xs:
+    sum = sum + x
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This statement iterates over the elements of list <code>xs</code>.
+This is particularly useful when the value of <code>xs</code> may change before the
+<code>for</code> statement.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-notes">Notes</h4>
+<div class="paragraph">
+<p>In this chapter the most used statements are described. Below are a few other
+statements that may be useful some times:</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+. Inside loop statements, the <em>break</em> and <em>continue</em> statements are allowed.
+The <code>break</code> statements allows 'breaking
+out of a loop', that is, abort a while or a for statement.
+The <code>continue</code> statement aborts
+execution of the statements in a loop.
+It 'jumps' to the start of the next iteration.</p>
+</div>
+<div class="paragraph">
+<p>
+
+. A rarely used statement is the <code>pass</code> statement.
+It&#8217;s like an <code>x = x</code> assignment statement, but more clearly
+expresses 'nothing is done here'.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-3">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Study the Chi specification below and explain why, though it works, it is
+not an elegant way of modeling the selection.
+Make a suggestion for a shorter, more elegant version of:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M():
+    int i = 3;
+
+    if (i &lt;  0) == true:
+        write(&quot;%d is a negative number\n&quot;, i);
+    elif (i &lt;= 0) == false:
+        write(&quot;%d is a positive number\n&quot;, i);
+    end
+end</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Construct a list with the squares of the integers 1 to 10.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>using a <code>for</code> statement, and</p>
+</li>
+<li>
+<p>using a <code>while</code> statement.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Write a program that</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Makes a list with the first 50 prime numbers.</p>
+</li>
+<li>
+<p>Extend the program with computing the sum of the first 7 prime numbers.</p>
+</li>
+<li>
+<p>Extend the program with computing the sum of the last 11 prime numbers.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-functions">Functions</h3>
+<div class="paragraph">
+<p>In a model, computations must be performed to process the information that is
+sent around.
+Short and simple calculations are written as assignments between the other
+statements, but for longer computations or computations that are needed at
+several places in the model, a more encapsulated environment is useful, a
+<em>function</em>.
+In addition, the language comes with a number of built-in functions, such as
+<code>size</code> or <code>empty</code> on container types.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func real mean(list int xs):
+    int sum;
+
+    for x in xs:
+        sum = sum + x
+    end;
+    return sum / size(xs)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>func</code> keyword indicates it is a function. The name of the function is
+just before the opening parenthesis, in this example <code>mean</code>. Between the
+parentheses, the input values (the <em>formal parameters</em>) are listed. In this
+example, there is one input value, namely <code>list int</code> which is a list of
+integers. Parameter name <code>xs</code> is used to refer to the input value in the
+body of the function.
+Between <code>func</code> and the name of the function is the type of the computation
+result, in this case, a <code>real</code> value.
+In other words, this <code>mean</code> function takes a list of integers as input, and
+produces a <code>real</code> value as result.</p>
+</div>
+<div class="paragraph">
+<p>
+
+The colon at the end of the first line indicates the start of the computation.
+Below it are new variable declarations (<code>int sum</code>), and statements to
+compute the value, the <em>function algorithm</em>.
+The <code>return</code> statement denotes the end of
+the function algorithm.
+The value of the expression behind it is the result of the calculation.
+This example computes and returns the mean value of the integers of the list.</p>
+</div>
+<div class="paragraph">
+<p>Use of a function (<em>application</em> of a function) is done by using its name,
+followed by the values to be used as input (the <em>actual parameters</em>).
+The above function can be used like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">m = mean([1, 3, 5, 7, 9])</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The actual parameter of this function application is <code>[1, 3, 5, 7, 9]</code>.
+The function result is <code>(1 + 3 + 5 + 7 + 9)/5</code> (which is <code>5.0</code>), and
+variable <code>m</code> becomes <code>5.0</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+A function is a mathematical function: the result of a function is the same
+for the same values of input parameters.
+A function has no <em>side-effect</em>, and it cannot access variables outside the body.
+For example, it cannot access <code>time</code> (explained in
+<a href="#tut-servers-with-time">Servers with time</a>) directly, it has to be passed in through
+the parameter list.</p>
+</div>
+<div class="paragraph">
+<p>A function that calculates the sign of a real number, is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func int sign(real r):
+    if r &lt; 0:
+        return -1
+    elif r = 0:
+        return  0
+    end;
+    return  1
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The sign function returns:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if <code>r</code> is smaller than zero, the value minus one;</p>
+</li>
+<li>
+<p>if <code>r</code> equals zero, the value zero; and</p>
+</li>
+<li>
+<p>if <code>r</code> is greater than zero, the value one.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The computation in a function ends when it encounters a <code>return</code> statement.
+The <code>return 1</code> at the end is therefore only executed when both
+<code>if</code> conditions are false.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="tut-sorted-lists">Sorted lists</h4>
+<div class="paragraph">
+<p>The language allows <em>recursive</em> functions as well as <em>higher-order</em> functions.
+Explaining them in detail is beyond the scope of this tutorial, but these
+functions are useful for making and maintaining sorted lists.
+Such a sorted list is useful for easily getting the smallest (or largest) item
+from a collection, for example the order with the nearest deadline.</p>
+</div>
+<div class="paragraph">
+<p>To sort a list, the first notion that has to be defined is the desired order,
+by making a function of the following form:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func bool decreasing(int x, y):
+    return x &gt;= y
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The function is called <em>predicate function</em>.
+It takes two values from the list (two integers in this case), and produces a
+boolean value, indicating whether the parameters are in the right order.
+In this case, the function returns <code>true</code> when the first parameter is larger
+or equal than the second parameter, that is, larger values must be before
+smaller values (for equal values, the order does not matter). This results in
+a list with decreasing values.</p>
+</div>
+<div class="paragraph">
+<p>The requirements on <em>any</em> predicate function <code>f</code> are:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>If <code>x != y</code>, either <code>f(x, y)</code> must hold or <code>f(y, x)</code> must hold, but
+not both. (Unequal values must have a unique order.)</p>
+</li>
+<li>
+<p>If <code>x == y</code>, both <code>f(x, y)</code> and <code>f(y, x)</code> must hold. (Equal values
+can be placed in arbitrary order.)</p>
+</li>
+<li>
+<p>For values <code>x</code>, <code>y</code>, and <code>z</code>, if <code>f(x, y)</code> holds and <code>f(y, z)</code>
+holds (that is <code>x &gt;= y</code> and <code>y &gt;= z</code>), then <code>f(x, z)</code> must also hold
+(that is, <code>x &gt;= z</code> should also be true).</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>(The order between <code>x</code> and <code>z</code> must be stable, even when you compare
+with an intermediate value <code>y</code> between <code>x</code> and <code>z</code>.)</p>
+</div>
+<div class="paragraph">
+<p>These requirements hold for functions that test on <code>&lt;=</code> or <code>&gt;=</code> between
+two values, like above.</p>
+</div>
+<div class="paragraph">
+<p>If you do not provide a proper predicate function, the result may not be
+sorted as you expect, or the simulator may abort when it fails to find a
+proper sorting order.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-sort">Sort</h5>
+<div class="paragraph">
+<p>The first use of such a predicate function is for sorting a list. For example
+list <code>[3, 8, 7]</code> is sorted decreasingly (larger numbers
+before smaller numbers) with the following statement:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">ys = sort([3, 8, 7], decreasing)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Sorting is done with the <em>sort</em> function, it takes two parameters, the list to
+sort, and the predicate <em>function</em>. (There are no parentheses <code>()</code> behind
+<code>decreasing</code>!) The value of list <code>ys</code> becomes <code>[8, 7, 3]</code>.</p>
+</div>
+<div class="paragraph">
+<p>Another sorting example is a list of type <code>tuple(int number, real slack)</code>,
+where field <code>number</code> denotes the number of an item, and field <code>slack</code>
+denotes the slack time of the item. The list should be sorted in ascending
+order of the slack time. The type of the item is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type item = tuple(int number, real slack);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The predicate function <code>spred</code> is defined by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func bool spred(item x, y):
+    return x.slack &lt;= y.slack
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Function <code>spred</code> returns <code>true</code> if the two elements are in increasing
+order in the list, otherwise <code>false</code>.
+Note, the parameters of the function are of type <code>item</code>.
+Given a variable <code>ps</code> equal to <code>[(7, 21.6), (5, 10.3), (3, 35.8)]</code>.
+The statement denoting the sorting is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">qs = sort(ps, spred)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>variable <code>qs</code> becomes <code>[(5, 10.3), (7, 21.6), (3, 35.8)]</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-insert">Insert</h5>
+<div class="paragraph">
+<p>Adding a new value to a sorted list is the second use of higher-order
+functions. The simplest approach would be to add the new value to the head or
+rear of the list, and sort the list again, but sorting an almost sorted list
+is very expensive.
+It is much faster to find the right position in the already sorted list, and
+insert the new value at that point.
+This function also exists, and is named <code>insert</code>.
+An example is (assume <code>xs</code> initially contains <code>[3,8]</code>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs = insert(xs, 7, increasing)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where <code>increasing</code> is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func bool increasing(int x, y):
+    return x &lt;= y
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>insert</code> call assigns the result <code>[3,7,8]</code> as new value to <code>xs</code>,
+<code>7</code> is inserted in the list.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-input-and-output">Input and output</h3>
+<div class="paragraph">
+<p>A model communicates with the outside world, e.g. screen and files, by the use
+of read statements for input of data, and write statements for output of data.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="tut-the-read-function">The <code>read</code> function</h4>
+<div class="paragraph">
+<p>Data can be read from the command line or from a file by <em>read</em> functions.
+A read function requires a type value for each parameter to be read.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i; string s;
+
+i = read(int);
+s = read(string);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two values, an integer value and a string value are read from the command line.
+On the command line the two values are typed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">1 &quot;This is a string&quot;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>i</code> becomes <code>1</code>, and string <code>s</code> becomes <code>"This is a string"</code>.
+The double quotes are required! Parameter values are separated by a space or a
+tabular stop. Putting each value on a separate line also works.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reading-from-file">Reading from a file</h4>
+<div class="paragraph">
+<p>Data also can be read from files. An example fragment:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type row = tuple(string name; list int numbers);
+
+file f;
+int i;
+list row rows;
+
+f = open(&quot;data_file.txt&quot;, &quot;r&quot;);
+i = read(f, int);
+rows = read(f, list row);
+close(f)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Before a file can be used, the file has to be declared, <em>and</em> the file has to
+be opened by statement <code>open</code>.
+Statement <code>open</code> has two parameters, the first parameter denotes the file
+name (as a string), and the second parameter describes the way the file is
+used. In this case, the file is opened in a read-only mode, denoted by string
+"r".</p>
+</div>
+<div class="paragraph">
+<p>Reading values works in the same way as before, except you cannot add new text
+in the file while reading it. Instead, the file is processed sequentially from
+begin to end, with values separated from each other by white space (spaces,
+tabs, and new-lines). You can read values of different types from the same
+file, as long as the value in the file matches with the type that you ask.
+For example, the above Chi program could read the following data from
+<code>data_file.txt</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">21
+[(&quot;abc&quot;, [7,21]),
+ (&quot;def&quot;, [8,31,47])]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After enough values have been read, the file should be closed with the
+statement <code>close</code>, with one parameter, the variable of the file.
+If a file is still open after an experiment, the file is closed automatically
+before the program quits.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-advanced-file-reading">Advanced reading from a file</h4>
+<div class="paragraph">
+<p>When reading from a file, the <code>eof</code> and <code>eol</code> functions can be used to
+obtain information about the white space around the values.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>eof</code> (end of file) function returns <code>true</code> if you have read the
+last value (that is, there are no more values to read).</p>
+</li>
+<li>
+<p>The <code>eol</code> (end of line) function returns <code>true</code> if there are no more
+values at the current line. In particular, the <code>eol</code> function returns
+<code>true</code> when the end of the file has been reached.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>These functions can be used to customize reading of more complicated values.
+As an example, you may want to read the same <code>list row</code> value as above, but
+without having all the comma&#8217;s, quotes, parentheses, and brackets of the
+literal value <code>[("abc", [7,21]), ("def", [8,31,47])]</code>.
+Instead, imagine having a file <code>clean_data.txt</code> with the following layout:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">abc 7 21
+def 8 31 47</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each line is one row. It starts with a one-word string, followed by a list of
+integer numbers.
+By using the <code>eof</code> and <code>eol</code> functions, you can read this file in the
+following way:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">file f;
+list row rows;
+string name;
+list int xs;
+
+f = open(&quot;clean_data.txt&quot;, &quot;r&quot;);
+while not eof(f):
+    name = read(f, string);
+    xs = &lt;int&gt;[];
+    while not eol(f): # Next value is at the same line.
+        xs = xs + [read(f, int)];
+    end
+    rows = rows + [(name, xs)];
+end
+close(f);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each line is processed individually, where <code>eol</code> is used to find out whether
+the last value of a line has been read. The reading loop terminates when
+<code>eof</code> returns <code>true</code>.</p>
+</div>
+<div class="paragraph">
+<p>Note that <code>eol</code> returns whether the current line has no more values. It does
+not tell you how many lines down the next value is. For example, an empty line
+inserted between the  <code>abc 7 21</code> line and the <code>def 8 31 47</code> line is
+skipped silently. If you want that information, you can use the <code>newlines</code>
+function instead.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-the-write-statement">The <code>write</code> statement</h4>
+<div class="paragraph">
+<p>The <em>write</em> statement is used for for output of data to the screen of the
+computer. Data can also be written to a file.</p>
+</div>
+<div class="paragraph">
+<p>The first argument of <code>write</code> (or the second argument if you write to a file,
+see below) Is called the <em>format string</em>. It is a template of the text to
+write, with 'holes' at the point where a data value is to be written.</p>
+</div>
+<div class="paragraph">
+<p>Behind the format string, the data values to write are listed. The first value is
+written in the first 'hole', the second value in the second 'hole' and so
+on. The holes are also called <em>place holders</em>. A place holder starts with
+<code>%</code> optionally followed by numbers or some punctuation (its meaning is
+explained below). A place holder ends with a <em>format specifier</em>, a single
+letter like <code>s</code> or <code>f</code>. An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i = 5;
+
+write(&quot;i equals %s&quot;, i)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this example the text <code>i equals 5</code> is written to the screen by the
+<code>write</code> statement. The <code>"i equals %s"</code> format string defines what output
+is written. All 'normal' characters are copied as-is. The <code>%s</code> place holder
+is not copied. Instead the first data value (in this case <code>i</code>) is inserted.</p>
+</div>
+<div class="paragraph">
+<p>The <code>s</code> in the place holder is the format specifier. It means 'print as
+string'. The <code>%s</code> is a general purpose format specifier, it works with
+almost every type of data. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list dict(int:real) xs = [{1 : 5.3}];
+
+write(&quot;%s&quot;, xs)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>will output the contents of <code>xs</code> (<code>{1 : 5.3}</code>).</p>
+</div>
+<div class="paragraph">
+<p>In general, this works nicely, but for numeric values a little more control
+over the output is often useful.
+To this end, there are also format specifiers <code>d</code> for integer numbers, and
+<code>f</code> for real numbers.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i = 5;
+real r = 3.14;
+
+write(&quot;%4d/%8.2f&quot;, i, r)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This fragment has the effect that the values of <code>i</code> and <code>r</code> are written to
+the screen as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">   5/    3.14</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The value of <code>i</code> is written in <code>d</code> format (as <code>int</code> value), and the
+value of <code>r</code> is written in <code>f</code> format (as <code>real</code> value).
+The symbols <code>d</code> and <code>f</code> originate respectively from 'decimal', and
+'floating point' numbers.
+The numbers <code>4</code> respectively <code>8.2</code> denote that the integer value is
+written four positions wide (that is, 3 spaces and a <code>5</code> character), and
+that the real value is written eight positions wide, with two characters after
+the decimal point (that is, 4 spaces and the text <code>3.14</code>).</p>
+</div>
+<div class="paragraph">
+<p>A list of format specifiers is given in <a href="#tut-table-format-specifiers">Format specifiers</a>.</p>
+</div>
+<table id="tut-table-format-specifiers" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 6. Format specifiers</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Format specifier</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">boolean value (outputs <code>false</code> or <code>true</code>)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%d</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">integer</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10d</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">integer, at least ten characters wide</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%f</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10f</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real, at least ten characters wide</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%.4f</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real, four characters after the decimal point</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%10.4f</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real, at least ten characters wide with four characters after the decimal point</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%s</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">character string <code>s</code>, can also write other types of data</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%%</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>%</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Finally, there are also a few special character sequences called <em>escape
+sequence</em> which allow to write characters like horizontal tab (which means
+'jump to next tab position in the output'), or newline (which means 'go to the
+next line in the output') in a string.
+An escape sequence consists of two characters. First a backslash character
+<code>\</code>, followed by a second character.
+The escape sequence are presented in <a href="#tut-table-escape-sequences">Escape sequences in strings</a>.</p>
+</div>
+<table id="tut-table-escape-sequences" class="tableblock frame-all grid-all stretch">
+<caption class="title">Table 7. Escape sequences in strings</caption>
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Sequence</th>
+<th class="tableblock halign-left valign-top">Meaning</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\n</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">new line</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">horizontal tab</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\"</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>"</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\\</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">the character <code>\</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>An example is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i = 5, j = 10;
+real r = 3.14;
+write(&quot;%6d\t%d\n\t%.2f\n&quot;, i, j, r)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The result looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">     5  10
+        3.14</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The value of <code>j</code> is written at the tab position, the output goes to the next
+line again at the first tab position, and outputs the value of <code>r</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-writing-to-file">Writing to a file</h4>
+<div class="paragraph">
+<p>Data can be written to a file, analog to the read function.
+A file has to be defined first, and opened for writing before the file can be used.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">file f;
+int i;
+
+f = open(&quot;output_file&quot;, &quot;w&quot;);
+write(f, &quot;%s&quot;, i); write(f, &quot;%8.2f&quot;, r);
+close(f)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A file, in this case <code>"output_file"</code> is used in write-only mode, denoted by
+the character <code>"w"</code>.
+Opening a file for writing destroys its old contents (if the file already exists).
+In the write statement, the first parameter must be the file, and the second
+parameter must be the format string.</p>
+</div>
+<div class="paragraph">
+<p>After all data has been written, the file is closed by statement <code>close</code>.
+If the file is still open after execution of the program, the file is closed
+automatically.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-stochastic-behavior">Modeling stochastic behavior</h3>
+<div class="paragraph">
+<p>
+
+
+Many processes in the world vary a little bit each time they are performed.
+Setup of machines goes a bit faster or slower, patients taking their medicine
+takes longer this morning, more products are delivered today, or the quality
+of the manufactured product degrades due to a tired operator.
+Modeling such variations is often done with stochastic distributions. A
+distribution has a mean value and a known shape of variation. By matching the
+means and the variation shape with data from the system being modeled, an
+accurate model of the system can be obtained.
+The language has many stochastic distributions available, this chapter
+explains how to use them to model a system, and lists a few commonly used
+distributions. The full list is available in the reference manual at
+<a href="#ref-chapter-distributions">Distributions</a>.</p>
+</div>
+<div class="paragraph">
+<p>The following fragment illustrates the use of the random distribution to model
+a dice.
+Each value of the six-sided dice is equally likely to appear. Every value
+having the same probability of appearing is a property of the integer uniform
+distribution, in this case using interval <code>[1, 7)</code> (inclusive on the left
+side, exclusive on the right side).
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dist int dice = uniform(1,7);
+int x, y;
+
+x = sample dice;
+y = sample dice;
+writeln(&quot;x=%d, y=%d&quot;, x, y);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The variable <code>dice</code> is an integer distribution, meaning that values drawn
+from the distribution are integer numbers. It is assigned an
+uniform distribution.
+A throw of a dice is simulated with the <em>operator</em> <code>sample</code>.
+Each time <code>sample</code> is used, a new sample value is obtained from the
+distribution.
+In the fragment the dice is thrown twice, and the values are assigned to the
+variables <code>x</code>, and <code>y</code>.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-distributions">Distributions</h4>
+<div class="paragraph">
+<p>The language provides <em>constant</em>, <em>discrete</em> and <em>continuous</em> distributions.
+A discrete distribution is a distribution where only specific values can be
+drawn, for example throwing a dice gives an integer number.
+A continuous distribution is a distribution where a value from a continuous
+range can be drawn, for example assembling a product takes a positive amount
+of time.
+The constant distributions are discrete distributions that always return the
+same value. They are useful during the development of the model (see below).</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-constant-distributions">Constant distributions</h5>
+<div class="paragraph">
+<p>When developing a model with stochastic behavior, it is hard to verify whether
+the model behaves correctly, since the stochastic results make it difficult to
+predict the outcome of experiments. As a result, errors in the model may not
+be noticed, they hide in the noise of the stochastic results.
+One solution is to first write a model without stochastic behavior, verify
+that model, and then extend the model with stochastic sampling.
+Extending the model with stochastic behavior is however an invasive change
+that may introduce new errors. These errors are again hard to find due to the
+difficulties to predict the outcome of an experiment.
+The constant distributions aim to narrow the gap by reducing the amount of
+changes that need to be done after verification.</p>
+</div>
+<div class="paragraph">
+<p>With constant distributions, a stochastic model with sampling of distributions
+is developed, but the stochastic behavior is eliminated by temporarily using
+constant distributions. The model performs stochastic sampling of values, but
+with predictable outcome, and thus with predictable experimental results,
+making verification easier. After verifying the model, the constant
+distributions are replaced with the distributions that fit the mean value and
+variation pattern of the modeled system, giving a model with stochastic
+behavior.
+Changing the used distributions is however much less invasive, making it less
+likely to introduce new errors at this stage in the development of the model.</p>
+</div>
+<div class="paragraph">
+<p>Constant distributions produce the same value <code>v</code> with every call of
+<code>sample</code>. There is one constant distribution for each type of sample value:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>constant(bool v)</code>, a <code>bool</code> distribution.</p>
+</li>
+<li>
+<p><code>constant(int v)</code>, an <code>int</code> distribution.</p>
+</li>
+<li>
+<p><code>constant(real v)</code>, a <code>real</code> distribution.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>An example with a constant distribution is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dist int u = constant(7);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This distribution returns the integer value <code>7</code> with each <code>sample u</code>
+operation.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-discrete-distributions">Discrete distributions</h5>
+<div class="paragraph">
+<p>Discrete distributions return values from a finite fixed set of possible
+values as answer. In Chi, there is one distribution that returns a boolean
+when sampled, and there are several discrete distributions that return an
+integer number.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dist</code> <code>bool</code> <strong>bernoulli</strong><code>(real p)</code></p>
+<div class="paragraph">
+<p>Outcome of an experiment with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/bernoulli.svg" alt="bernoulli">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{false, true}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>1 - p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Bernoulli(p), <a href="#law-tut">[law-tut]</a>, page 302</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>uniform</strong><code>(int a, b)</code></p>
+<div class="paragraph">
+<p>Integer uniform distribution from <code>a</code> to <code>b</code> excluding the upper bound.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/disc_uni.svg" alt="disc uni">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{a, a+1, ..., b-1}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(a + b - 1) / 2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>((b - a)\^2 - 1) / 12</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>DU(a, b - 1), <a href="#law-tut">[law-tut]</a>, page 303</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-continuous-distributions">Continuous distributions</h5>
+<div class="paragraph">
+<p>Continuous distributions return a value from a continuous range.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dist</code> <code>real</code> <strong>uniform</strong><code>(real a, b)</code></p>
+<div class="paragraph">
+<p>Real uniform distribution from <code>a</code> to <code>b</code>, excluding the upper bound.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/cont_uni.svg" alt="cont uni">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[a, b)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(a + b) / 2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>(b - a)^2 / 12</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>U(a,b), <a href="#law-tut">[law-tut]</a>, page 282, except that distribution has an
+inclusive upper bound.</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>gamma</strong><code>(real a, b)</code></p>
+<div class="paragraph">
+<p>Gamma distribution, with shape parameter <code>a &gt; 0</code> and scale parameter <code>b &gt; 0</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/gamma.svg" alt="gamma">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>a * b</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>a * b^2</code></p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-references">References</h5>
+<div class="ulist bibliography">
+<ul class="bibliography">
+<li>
+<p><a id="law-tut"></a>[law-tut] Simulation Modeling &amp; Analysis, fourth edition,
+by Averill M. Law,
+publisher McGraw-Hill, International Edition, 2007,
+ISBN 978-007-125519-6</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-simulating-stochastic-behavior">Simulating stochastic behavior</h4>
+<div class="paragraph">
+<p>In this chapter, the mathematical notion of stochastic distribution is used to
+describe how to model stochastic behavior.
+Simulating a model with stochastic behavior at a computer is however not
+stochastic at all. Computer systems are deterministic machines, and
+have no notion of varying results.</p>
+</div>
+<div class="paragraph">
+<p>A (pseudo-)random number generator is used to create stochastic results
+instead. It starts with an initial <em>seed</em>, an integer number (you can give one
+at the start of the simulation).
+From this seed, a function creates a stream of 'random' values. When looking
+at the values there does not seem to be any pattern.
+It is not truly random however. Using the same seed again gives exactly the
+same stream of numbers. This is the reason to call the function a
+<em>pseudo</em>-random number generator (a true random number generator would never
+produce the exact same stream of numbers).
+A sample of a distribution uses one or more numbers from the stream to compute
+its value.
+The value of the initial seed thus decides the value of all samples drawn in
+the simulation. By default, a different seed is used each time you run a
+simulation (leading to slightly different results each time).
+You can also explicitly state what seed you want to use when running a model,
+see <a href="#tool-compile-and-simulate">Compile and simulate</a>.
+At the end of the simulation, the used
+initial seed of that simulation is printed for reference purposes.</p>
+</div>
+<div class="paragraph">
+<p>While doing a stochastic simulation study, performing several experiments with
+the same initial seed invalidates the results, as it is equivalent to copying
+the outcome of a single experiment a number of times.
+On the other hand, when looking for the cause of a bug in the model,
+performing the exact same experiment is useful as outcomes of previous
+experiments should match exactly.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-4">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>According to the Chi reference manual, for a <code>gamma</code> distribution with
+parameters <code>(a, b)</code>, the mean equals <code>a * b</code>.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Use a Chi specification to verify whether this is true for at least 3
+different pairs of <code>a</code> and <code>b</code>.</p>
+</li>
+<li>
+<p>How many samples from the distribution are approximately required to
+determine the mean up to three decimals accurate?</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Estimate the mean μ and variance σ<sup>2</sup> of a triangular distribution
+<code>triangle(1.0, 2.0, 5.0)</code> by simulating 1000 samples. Recall that the
+variance σ<sup>2</sup> of <em>n</em> samples can be calculated by a function like:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func real variance(list real samples, real avg):
+    real v;
+
+    for x in samples:
+        v = v + (x - avg)^2;
+    end
+
+    return v / (size(samples) - 1)
+end</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>We would like to build a small game, called <em>Higher or Lower</em>.
+The computer picks a random integer number between 1 and 14. The player
+then has to predict whether the next number will be higher or lower. The
+computer picks the next random number and compares the new number with the
+previous one. If the player guesses right his score is doubled. If the
+player guesses wrong, he looses all and the game is over. Try the following
+specification:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model HoL():
+    dist int u = uniform(1, 15);
+    int sc = 1;
+    bool c = true;
+    int new, oldval;
+    string s;
+
+    new = sample u;
+    write(&quot;Your score is %d\n&quot;, sc);
+    write(&quot;The computer drew %d\n&quot;, new);
+
+    while c:
+        writeln(&quot;(h)igher or (l)ower:\n&quot;);
+        s = read(string);
+        oldval = new;
+        new = sample u;
+        write(&quot;The computer drew %d\n&quot;, new);
+        if new == oldval:
+            c = false;
+        else:
+            c = (new &gt; oldval) == (s == &quot;h&quot;);
+        end;
+
+        if c:
+            sc = 2 * sc;
+        else:
+            sc = 0;
+        end;
+
+        write(&quot;Your score is %d\n&quot;, sc)
+    end;
+    write(&quot;GAME OVER...\n&quot;)
+end</code></pre>
+</div>
+</div>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>What is the begin score?</p>
+</li>
+<li>
+<p>What is the maximum end score?</p>
+</li>
+<li>
+<p>What happens, when the drawn sample is equal to the previous drawn
+sample?</p>
+</li>
+<li>
+<p>Extend this game specification with the possibility to stop.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-processes">Processes</h3>
+<div class="paragraph">
+<p>
+
+
+
+
+The language has been designed for modeling and analyzing systems with many
+components, all working together to obtain the total system behavior.
+Each component exhibits behavior over time. Sometimes they are busy making
+internal decisions, sometimes they interact with other components.
+The language uses a <em>process</em> to model the behavior of a component (the
+primary interest are the actions of the component rather than its physical
+representation). This leads to models with many processes working in
+<em>parallel</em> (also known as <em>concurrent</em> processes), interacting with each
+other.</p>
+</div>
+<div class="paragraph">
+<p>Another characteristic of these systems is that the parallelism happens at
+different scales at the same time, and each scale can be considered to be a
+collection of co-operating parallel working processes.
+For example, a factory can be seen as a single component, it accepts supplies
+and delivers products.
+However, within a factory, you can have several parallel operating production
+lines, and a line consists of several parallel operating machines.
+A machine again consists of parallel operating parts.
+In the other direction, a factory is a small element in a supply chain. Each
+supply chain is an element in a (distribution) network.
+Depending on the area that needs to be analyzed, and the level of detail, some
+scales are precisely modeled, while others either fall outside the scope of
+the system or are modeled in an abstract way.</p>
+</div>
+<div class="paragraph">
+<p>In all these systems, the interaction between processes is not random, they
+understand each other and exchange information.
+In other words, they <em>communicate</em> with each other. The Chi language uses
+<em>channels</em> to model the communication.
+A channel connects a sending process to a receiving process, allowing the
+sender to pass messages to the receiver.
+This chapter discusses parallel operating processes only, communication
+between processes using channels is discussed in <a href="#tut-chapter-channels">Channels</a>.</p>
+</div>
+<div class="paragraph">
+<p>As discussed above, a process can be seen as a single component with behavior
+over time, or as a wrapper around many processes that work at a smaller scale.
+The Chi language supports both kinds of processes.
+The former is modeled with the statements explained in previous chapters and
+communication that will be explained in <a href="#tut-chapter-channels">Channels</a>.
+The latter (a process as a wrapper around many smaller-scale processes) is
+supported with the <code>run</code> statement.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-a-single-process">A single process</h4>
+<div class="paragraph">
+<p>The simplest form of processes is a model with one process:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P():
+    write(&quot;Hello. I am a process.&quot;)
+end
+
+model M():
+    run P()
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Similar to a model, a process definition is denoted by the keyword <code>proc</code>
+(<code>proc</code> means process and does not mean procedure!), followed by the name of
+the process, here <code>P</code>, followed by an empty pair of parentheses <code>()</code>,
+meaning that the process has no parameters.
+Process <code>P</code> contains one statement, a <code>write</code> statement to output text to
+the screen.
+Model <code>M</code> contains one statement, a <code>run</code> statement to run a process.
+When simulating this model, the output is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">Hello. I am a process.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+A <code>run</code> statement constructs a process from the process definition (it
+<em>instantiates</em> a process definition) for each of its arguments, and they start
+running.
+This means that the statements inside each process are executed. The <code>run</code>
+statement waits until the statements in its created processes are finished,
+before it ends itself.</p>
+</div>
+<div class="paragraph">
+<p>To demonstrate, below is an example of a model with two processes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(int i):
+    write(&quot;I am process. %d.\n&quot;, i)
+end
+
+model M():
+    run P(1), P(2)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This model instantiates and runs two processes, <code>P(1)</code> and <code>P(2)</code>.
+The processes are running at the same time.
+Both processes can perform a <code>write</code> statement.
+One of them goes first, but there is no way to decide beforehand which one.
+(It may always be the same choice, it may be different on Wednesday, etc, you
+just don&#8217;t know.)
+The output of the model is therefore either:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">I am process 1.
+I am process 2.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">I am process 2.
+I am process 1.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After the two processes have finished their activities, the <code>run</code> statement
+in the model finishes, and the simulation ends.</p>
+</div>
+<div class="paragraph">
+<p>
+An important property of statements is that they are executed <em>atomically</em>.
+It means that execution of the statement of one process cannot be interrupted
+by the execution of a statement of another process.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-process-in-a-process">A process in a process</h4>
+<div class="paragraph">
+<p>The view of a process being a wrapper around many other processes is supported
+by allowing to use the <code>run</code> statement inside a process as
+well. An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P():
+    while true:
+        write(&quot;Hello. I am a process.\n&quot;)
+    end
+end
+
+proc DoubleP():
+    run P(), P()
+end
+
+model M():
+    run DoubleP()
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model instantiates and runs one process <code>DoubleP</code>.
+Process <code>DoubleP</code> instantiates and runs two processes <code>P</code>.
+The relevance becomes clear in models with a lot of processes.
+The concept of 'a process in a process' is very useful in keeping the model
+structured.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-many-processes">Many processes</h4>
+<div class="paragraph">
+<p>Some models consist of many identical processes at a single level. The
+language has an <code>unwind</code> statement to reduce the amount of program text.
+A model with e.g. ten identical processes, and a different parameter value, is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model MRun():
+    run P(0), P(1), P(2), P(3), P(4),
+        P(5), P(6), P(7), P(8), P(9)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An easier way to write this model is by applying the <code>unwind</code> statement
+inside <code>run</code> with the same effect:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model MP():
+    run unwind j in range(10):
+            P(j)
+        end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>unwind</code> works like a <code>for</code> statement
+(see <a href="#tut-for-statement">The <code>for</code> statement</a>),
+except the <code>unwind</code> expands all values at the same time instead of iterating
+over them one at a time.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-channels">Channels</h3>
+<div class="paragraph">
+<p>
+
+
+In <a href="#tut-chapter-processes">Processes</a> processes have been introduced.
+This chapter describes channels, denoted by the type <code>chan</code>.
+A channel connects two processes and is used for the transfer of data or just
+signals.
+One process is the sending process, the other process is the receiving process.
+Communication between the processes takes place instantly when both processes
+are willing to communicate, this is called <em>synchronous</em> communication.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-a-channel">A channel</h4>
+<div class="paragraph">
+<p>The following example shows the sending of an integer value between two
+processes via a channel.
+<a href="#tut-figure-producer-consumer">A producer and a consumer</a> shows the two processes <code>P</code> and <code>C</code>,
+connected by channel variable <code>a</code>.</p>
+</div>
+<div id="tut-figure-producer-consumer" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/producer_consumer.png" alt="producer consumer">
+</div>
+<div class="title">Figure 3. A producer and a consumer</div>
+</div>
+<div class="paragraph">
+<p>Processes are denoted by circles, and channels are denoted by directed arrows
+in the figure. The arrow denotes the direction of communication.
+Process <code>P</code> is the sender or producer, process <code>C</code> is the receiver or consumer.</p>
+</div>
+<div class="paragraph">
+<p>In this case, the producer sends a finite stream of integer values (5 numbers)
+to the consumer.
+The consumer receives these values and writes them to the screen.
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(chan! int a):
+    for i in range(5):
+        a!i
+    end
+end
+
+proc C(chan? int b):
+    int x;
+
+    while true:
+        b?x;
+        write(&quot;%d\n&quot;,x)
+    end
+end
+
+model M():
+    chan int a;
+
+    run P(a), C(a)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model instantiates processes <code>P</code> and <code>C</code>.
+The two processes are connected to each other via channel variable <code>a</code> which
+is given as actual parameter in the <code>run</code> statement.
+This value is copied into the local formal parameter <code>a</code> in process <code>P</code>
+and in formal parameter <code>b</code> inside process <code>C</code>.</p>
+</div>
+<div class="paragraph">
+<p>Process <code>P</code> can send a value of type <code>int</code> via the actual channel
+parameter <code>a</code> to process <code>C</code>.
+In this case <code>P</code> first tries to send the value <code>0</code>.
+Process <code>C</code> tries to receive a value of type <code>int</code> via the actual channel
+parameter <code>a</code>.
+Both processes can communicate, so the communication occurs and the value
+<code>0</code> is sent to process <code>C</code>.
+The received value is assigned in process <code>C</code> to variable <code>x</code>.
+The value of <code>x</code> is printed and the cycle starts again.
+This model writes the sequence <code>0, 1, 2, 3, 4</code> to the screen.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-synchronization-channels">Synchronization channels</h4>
+<div class="paragraph">
+<p>Above, process <code>P</code> constructs the numbers and sends them to process <code>C</code>.
+However, since it is known that the number sequence starts at <code>0</code> and
+increments by one each time, there is no actual need to transfer a number.
+Process <code>C</code> could also construct the number by itself after getting a signal
+(a 'go ahead') from process <code>P</code>.
+Such signals are called synchronization signals, transfered by means of a
+synchronization channel. The signal does not carry any data,
+it just synchronizes a send and a receive between different processes.
+(Since there is no actual data transfered, the notion of sender and receiver
+is ambiguous. However, in modeling there is often a notion of 'initiator'
+process that can be conveniently expressed with sending.)</p>
+</div>
+<div class="paragraph">
+<p>The following example shows the use of synchronization signals between
+processes <code>P</code> and <code>C</code>.
+The connecting channel 'transfers' values of type <code>void</code>.
+The type <code>void</code> means that 'non-values' are sent and received;
+the type <code>void</code> is only allowed in combination with channels.
+The iconic model is given in the previous figure,
+<a href="#tut-figure-producer-consumer">A producer and a consumer</a>.
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(chan! void a):
+    for i in range(5):
+        a!    # No data is being sent
+    end
+end
+
+proc C(chan? void b):
+    int i;
+
+    while true:
+        b?;   # Nothing is being received
+        write(&quot;%d\n&quot;, i);
+        i = i + 1
+    end
+end
+
+model M():
+    chan void a;
+
+    run P(a), C(a)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Process <code>P</code> sends a signal (and no value is sent), and process <code>C</code>
+receives a signal (without a value).
+The signal is used by process <code>C</code> to write the value of <code>i</code> and to
+increment variable <code>i</code>.
+The effect of the model is identical to the previous example: the numbers
+<code>0, 1, 2, 3, 4</code> appear on the screen.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-two-channels">Two channels</h4>
+<div class="paragraph">
+<p>A process can have more than one channel, allowing interaction with several
+other processes.</p>
+</div>
+<div class="paragraph">
+<p>The next example shows two channel variables, <code>a</code> and <code>b</code>, and three
+processes, generator <code>G</code>, server <code>S</code> and exit <code>E</code>.
+The iconic model is given in <a href="#tut-figure-generator-server-exit">A generator, a server and an exit</a>.</p>
+</div>
+<div id="tut-figure-generator-server-exit" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/generator_server_exit.png" alt="generator server exit">
+</div>
+<div class="title">Figure 4. A generator, a server and an exit</div>
+</div>
+<div class="paragraph">
+<p>Process <code>G</code> is connected via channel variable <code>a</code> to process <code>S</code> and
+process <code>S</code> is connected via channel variable <code>b</code> to process <code>E</code>.
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan! int a):
+    for x in range(5):
+        a!x
+    end
+end
+
+proc S(chan? int a; chan! int b):
+    int x;
+
+    while true:
+        a?x; x = 2 * x; b!x
+    end
+end
+
+proc E(chan int a):
+    int x;
+
+    while true:
+        a?x;
+        write(&quot;E %d\n&quot;, x)
+    end
+end
+
+model M():
+    chan int a,b;
+
+    run G(a), S(a,b), E(b)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model contains two channel variables <code>a</code> and <code>b</code>.
+The processes are connected to each other in model <code>M</code>.
+The processes are instantiated and run where the formal parameters are
+replaced by the actual parameters.
+Process <code>G</code> sends a stream of integer values <code>0, 1, 2, 3, 4</code> to another
+process via channel <code>a</code>.
+Process <code>S</code> receives a value via channel <code>a</code>, assigns this value to
+variable <code>x</code>, doubles the value of the variable, and sends the value of the
+variable via <code>b</code> to another process.
+Process <code>E</code> receives a value via channel <code>b</code>, assigns this value to the
+variable <code>x</code>, and prints this value.
+The result of the model is given by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">E   0
+E   2
+E   4
+E   6
+E   8</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After printing this five lines, process <code>G</code> stops, process <code>S</code> is blocked,
+as well as process <code>E</code>, the model gets blocked, and the model ends.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-more-senders-or-receivers">More senders or receivers</h4>
+<div class="paragraph">
+<p>Channels send a message (or a signal in case of synchronization channels) from
+one sender to one receiver. It is however allowed to give the same channel to
+several sender or receiver processes. The channel selects a sender and a
+receiver before each communication.</p>
+</div>
+<div class="paragraph">
+<p>The following example gives an illustration, see
+<a href="#tut-figure-generator-2servers-exit">A generator, two servers and an exit</a>.</p>
+</div>
+<div id="tut-figure-generator-2servers-exit" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/generator_2servers_exit.png" alt="generator 2servers exit">
+</div>
+<div class="title">Figure 5. A generator, two servers and an exit</div>
+</div>
+<div class="paragraph">
+<p>Suppose that only <code>G</code> and <code>S0</code> want to communicate.
+The channel can select a sender (namely <code>G</code>) and a receiver (process
+<code>S0</code>), and let both processes communicate with each other.
+When sender <code>G</code>, and both receivers (<code>S0</code> and <code>S1</code>), want to
+communicate, the channel selects a sender (<code>G</code> as it is the only sender
+available to the channel), and a receiver (either process <code>S0</code> or process
+<code>S1</code>), and it lets the selected processes communicate with each other.
+This selection process is non-deterministic; a choice is made, but it is
+unknown how the selection takes place and it cannot be influenced.
+Note that a non-deterministic choice is different from a random choice. In the
+latter case, there are known probabilities of selecting a process.</p>
+</div>
+<div class="paragraph">
+<p>Sharing a channel in this way allows to send data to receiving processes where
+the receiving party is not relevant (either server process will do).
+This way of communication is different from <em>broadcasting</em>, where both servers
+receive the same data value.
+Broadcasting is not supported by the Chi language.</p>
+</div>
+<div class="paragraph">
+<p>In case of two senders, <code>S0</code> and <code>S1</code>, and one receiver <code>E</code> the
+selection process is the same.
+If one of the two servers <code>S</code> can communicate with exit <code>E</code>, communication
+between that server and the exit takes place.
+If both servers can communicate, a non-deterministic choice is made.</p>
+</div>
+<div class="paragraph">
+<p>Having several senders and several receivers for a single channel is also
+handled in the same manner.
+A non-deterministic choice is made for the sending process and a
+non-deterministic choice is made for the receiving process before each
+communication.</p>
+</div>
+<div class="paragraph">
+<p>To communicate with several other processes but without non-determinism,
+unique channels must be used.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-notes-2">Notes</h4>
+<div class="ulist">
+<ul>
+<li>
+<p>The direction in channels, denoted by <code>?</code> or <code>!</code>, may be omitted.
+By leaving it out, the semantics of the parameters becomes less clear (the
+direction of communication has to be derived from the process code).
+
+</p>
+</li>
+<li>
+<p>There are a several ways to name channels:
+
+</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Start naming formal channel parameters
+in each new process with <code>a</code>, <code>b</code>, etc.
+The actual names follow from the figure.
+This convention is followed in this chapter.
+For small models this convention is easy and works well, for complicated
+models this convention can be error-prone.
+
+</p>
+</li>
+<li>
+<p>Use the actual names of the channel parameters in the figures as formal
+names in the processes. Start naming in figures with <code>a</code>, <code>b</code>, etc.
+This convention works well, if both figure and code are at hand during
+the design process. If many processes have sub-processes, this convention
+does not really work.</p>
+</li>
+<li>
+<p>Use unique names for the channel parameters for the whole model, and for
+all sub-systems, for example a channel between processes <code>A</code> and <code>B</code>
+is named <code>a2b</code> (the lower-case name of the sending process, followed by
+<code>2</code>, denoting 'to', and the lower-case name of the receiving process).</p>
+<div class="paragraph">
+<p>In this case the formal and actual parameters can be in most cases the same.
+If many identical processes are used, this convention does not really work.</p>
+</div>
+</li>
+</ol>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In the text all three conventions are used, depending on the structure of
+the model.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-5">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Given is the specification of process <code>P</code> and model <code>PP</code>:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(chan int a, b):
+    int x;
+
+    while true:
+        a?x;
+        x = x + 1;
+        write(&quot;%d\n&quot;, x);
+        b!x
+    end
+end
+
+model PP():
+    chan int a, b;
+
+    run P(a,b), P(b,a)
+end</code></pre>
+</div>
+</div>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Study this specification.</p>
+</li>
+<li>
+<p>Why does the model terminate immediately?</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Six children have been given the assignment to perform a series of
+calculations on the numbers <code>0, 1, 2, 3, ..., 9</code>, namely add 2, multiply
+by 3, multiply by 2, and add 6 subsequently. They decide to split up the
+calculations and to operate in parallel. They sit down at a table next to
+each other. The first child, the reader <code>R</code>, reads the numbers
+<code>0, 1, 2, 3, ..., 9</code> one by one to the first calculating child <code>C1</code>. Child
+<code>C1</code> adds 2 and tells the result to its right neighbour, child <code>C2</code>. After
+telling the result to child <code>C2</code>, child <code>C1</code> is able to start
+calculating on the next number the reader <code>R</code> tells him. Children <code>C2</code>,
+<code>C3</code>, and <code>C4</code> are analogous to child <code>C1</code>; they each perform a
+different calculation on a number they hear and tell the result to their
+right neighbor. At the end of the table the writer <code>W</code> writes every
+result he hears down on paper. Figure <a href="#tut-figure-sixchilds">Six children working in parallel</a> shows a
+schematic drawing of the children at the table.</p>
+<div id="tut-figure-sixchilds" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/sixchilds.png" alt="sixchilds">
+</div>
+<div class="title">Figure 6. Six children working in parallel</div>
+</div>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Finish the specification for the reading child <code>R</code>, that reads the
+numbers 0 till 9 one by one:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc R(...):
+    int i;
+
+    while i &lt; 10:
+        ...;
+        ...
+    end
+end</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Specify the parameterized process <code>Cadd</code> that represents the children
+<code>C1</code> and <code>C4</code>, who perform an addition.</p>
+</li>
+<li>
+<p>Specify the parameterized process <code>Cmul</code> that represents the children
+<code>C2</code> and <code>C3</code>, who perform a multiplication.</p>
+</li>
+<li>
+<p>Specify the process <code>W</code> representing the writing child. Write each
+result to the screen separated by a new line.</p>
+</li>
+<li>
+<p>Make a graphical representation of the model <code>SixChildren</code> that is
+composed of the six children.</p>
+</li>
+<li>
+<p>Specify the model <code>SixChildren</code>. Simulate the model.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-buffers">Buffers</h3>
+<div class="paragraph">
+<p>In the previous chapter, a production system was discussed that passes values
+from one process to the next using channels, in a synchronous manner.
+(Sender and receiver perform the communication at exactly the same moment in
+time, and the communication is instantaneous.)
+In many systems however, processes do not use synchronous communication, they
+use <em>asynchronous</em> communication instead.
+Values (products, packets, messages, simple tokens, and so on) are sent,
+temporarily stored in a buffer, and then received.</p>
+</div>
+<div class="paragraph">
+<p>In fact, the decoupling of sending and receiving is very important, it allows
+compensating temporarily differences between the number of items that are sent
+and received.
+(Under the assumption that the receiver is fast enough to keep up with the
+sender in general, otherwise the buffer will grow forever or overflow.)</p>
+</div>
+<div class="paragraph">
+<p>For example, consider the exchange of items from a producer process <code>P</code> to a
+consumer process <code>C</code> as shown in <a href="#tut-figure-pc2">A producer and a consumer</a>.</p>
+</div>
+<div id="tut-figure-pc2" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/producer_consumer.png" alt="producer consumer">
+</div>
+<div class="title">Figure 7. A producer and a consumer</div>
+</div>
+<div class="paragraph">
+<p>In the unbuffered situation, both processes communicate at the same time.
+This means that when one process is (temporarily) faster than the other, it
+has to wait for the other process before communication can take place.
+With a buffer in-between, the producer can give its item to the buffer, and
+continue with its work.
+Likewise, the consumer can pick up a new item from the buffer at any later
+time (if the buffer has items).</p>
+</div>
+<div class="paragraph">
+<p>In Chi, buffers are not modeled as channels, they are modeled as additional
+processes instead. The result is shown in <a href="#tut-figure-pbc">A producer and a consumer, with an additional buffer process</a>.</p>
+</div>
+<div id="tut-figure-pbc" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/buffered_producer_consumer.png" alt="buffered producer consumer">
+</div>
+<div class="title">Figure 8. A producer and a consumer, with an additional buffer process</div>
+</div>
+<div class="paragraph">
+<p>The producer sends its items synchronously (using channel <code>a</code>) to the buffer
+process. The buffer process keeps the item until it is needed.
+The consumer gets an item synchronously (using channel <code>b</code>) from the buffer
+when it needs a new item (and one is available).</p>
+</div>
+<div class="paragraph">
+<p>In manufacturing networks, buffers, in combination with servers, play a
+prominent role, for buffering items in the network.
+Various buffer types exist in these networks: buffers can have a finite or
+infinite capacity, they have a input/output discipline, for example a
+first-out queuing discipline or a priority-based discipline.
+Buffers can store different kinds of items, for example, product-items,
+information-items, or a combination of both.
+Buffers may also have sorting facilities, etc.</p>
+</div>
+<div class="paragraph">
+<p>In this chapter some buffer types are described, and with the presented
+concepts numerous types of buffer can be designed by the engineer.
+First a simple buffer process with one buffer position is presented, followed
+by more advanced buffer models.
+The producer and consumer processes are not discussed in this chapter.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-a-one-place-buffer">A one-place buffer</h4>
+<div class="paragraph">
+<p>A buffer usually has a receiving channel and a sending channel, for receiving
+and sending items.
+A buffer, buffer <code>B1</code>, is presented in <a href="#tut-figure-oneplacebuffer">A <code>1</code>-place buffer</a>.</p>
+</div>
+<div id="tut-figure-oneplacebuffer" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/one_place_buffer.png" alt="one place buffer">
+</div>
+<div class="title">Figure 9. A <code>1</code>-place buffer</div>
+</div>
+<div class="paragraph">
+<p>The simplest buffer is a one-place buffer, for buffering precisely one item.
+A one-place buffer can be defined by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B1(chan? item a; chan! item b):
+    item x;
+
+    while true:
+        a?x; b!x
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where <code>a</code> and <code>b</code> are the receiving and sending channels.
+Item <code>x</code> is buffered in the process.
+A buffer receives an item, stores the item, and sends the item to the next
+process, if the next process is willing to receive the item.
+The buffer is  not willing to receive a second item, as long as the first item
+is still in the buffer.</p>
+</div>
+<div class="paragraph">
+<p>A two-place buffer can be created, by using the one-place buffer process
+twice.
+A two-place buffer is depicted in <a href="#tut-figure-twoplacebuffer">A <code>2</code>-place buffer</a>.</p>
+</div>
+<div id="tut-figure-twoplacebuffer" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/two_place_buffer.png" alt="two place buffer">
+</div>
+<div class="title">Figure 10. A <code>2</code>-place buffer</div>
+</div>
+<div class="paragraph">
+<p>A two-place buffer is defined by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B2(chan? item a; chan! item b):
+    chan item c;
+
+    run B1(a, c), B1(c, b)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where two processes <code>B1</code> buffer maximal two items.
+If each process <code>B1</code> contains an item, a third item has to wait in front of
+process <code>B2</code>. This procedure can be extended to create even larger buffers.
+Another, more preferable manner however, is to describe a buffer in a single
+process by using a <em>select</em> statement and a list for storage of the items.
+Such a buffer is discussed in the next section.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-single-process-buffer">A single process buffer</h4>
+<div class="paragraph">
+<p>An informal description of the process of a buffer, with an arbitrary number
+of stored items, is the following:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>If the buffer has space for an item, <em>and</em> can receive an item from another
+process via channel <code>a</code>, the buffer process receives that item, and
+stores the item in the buffer.</p>
+</li>
+<li>
+<p>If the buffer contains at least one item, <em>and</em> the buffer can send that
+item to another process via channel <code>b</code>, the buffer process sends that
+item, and removes that item from the buffer.</p>
+</li>
+<li>
+<p>If the buffer can both send and receive a value, the buffer process selects
+one of the two possibilities (in a non-deterministic manner).</p>
+</li>
+<li>
+<p>If the buffer cannot receive an item, and cannot send an item, the buffer
+process waits.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>Next to the sending and receiving of items (to and from the buffer process) is
+the question of how to order the stored items.
+A common form is the <em>first-in first-out</em> (fifo) queuing discipline.
+Items that enter the buffer first (first-in) also leave first (first-out), the
+order of items is preserved by the buffer process.</p>
+</div>
+<div class="paragraph">
+<p>In the model of the buffer, an (ordered) list of type <code>item</code> is used for
+storing the received items.
+New item <code>x</code> is added at the rear of list <code>xs</code> by the statement:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs = xs + [x]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first item of the list is sent, and then deleted with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xs = xs[1:]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An alternative solution is to swap the function of the rear and the front,
+which can be useful some times.</p>
+</div>
+<div class="paragraph">
+<p>The statement to monitor several channels at the same time is the <code>select</code>
+statement.
+The syntax of the <code>select</code> statement, with two alternatives, is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">select
+    boolean_expression_1, communication statement_1:
+        statement_list_1
+alt
+    boolean_expression_2, communication statement_2:
+        statement_list_2
+...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There has to be at least one alternative in a select statement. The statement
+waits, until for one of the alternatives the <code>boolean_expression</code> holds
+<em>and</em> communication using the <code>communication statement</code> is possible.
+(When there are several such alternatives, one of them is
+non-deterministically chosen.)
+For the selected alternative, the communication statement is executed,
+followed by the statements in the <code>statement_list</code> of the alternative.</p>
+</div>
+<div class="paragraph">
+<p>The above syntax is the most generic form, the <code>boolean_expression</code> may
+be omitted when it always holds, or the <code>communication statement</code> may be
+omitted when there is no need to communicate. The <code>,</code> also disappears then.
+(Omitting both the boolean expression and the communication statement is not
+allowed.) Similarly, when the <code>statement_list</code> is empty or just <code>pass</code>, it
+may be omitted (together with the <code>:</code> in front of it).</p>
+</div>
+<div class="paragraph">
+<p>The description (in words) of the core of the buffer, from the start of this
+section, is translated in code, by using a <code>select</code> statement:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">select
+    size(xs) &lt; N, a?x:
+        xs = xs + [x]
+alt
+    size(xs) &gt; 0, b!xs[0]:
+        xs = xs[1:]
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the first alternative, it is stated that, if the buffer is not full, and
+the buffer can receive an item, an item is received, and that item is added to
+the rear of the list.
+In the second alternative, it is stated that, if the buffer contains at least
+one item, and the buffer can send an item, the first item in the list is sent,
+and the list is updated.
+Please keep in mind that both the condition must hold and the communication
+must be possible <em>at the same moment</em>.</p>
+</div>
+<div class="paragraph">
+<p>The complete description of the buffer is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(chan? item a; chan! item b):
+    list item xs; item x;
+
+    while true:
+        select
+            size(xs) &lt; N, a?x:
+                xs = xs + [x]
+        alt
+            size(xs) &gt; 0, b!xs[0]:
+                xs = xs[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Instead of boolean expression <code>size(xs) &gt; 0</code>, expression <code>not empty(xs)</code>
+can be used, where <code>empty</code> is a function yielding <code>true</code> if the list is
+empty, otherwise <code>false</code>.
+In case the capacity of the buffer is infinite, expression <code>size(xs) &lt; N</code>
+can be replaced by <code>true</code>, or even omitted (including the comma).</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-infinite-buffer">An infinite buffer</h4>
+<div class="paragraph">
+<p>A buffer with infinite capacity can be written as:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(chan? item a; chan! item b):
+    list item xs; item x;
+
+    while true:
+        select
+            a?x:
+                xs = xs + [x]
+        alt
+            not empty(xs), b!xs[0]:
+                xs = xs[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A first-in first-out buffer is also called a <em>queue</em>, while a first-in
+last-out buffer (<em>lifo</em> buffer), is called a <em>stack</em>.
+A description of a lifo buffer is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(chan? item a; chan! item b):
+    list item xs; item x;
+
+    while true:
+        select
+            a?x:
+                xs = [x] + xs
+        alt
+            not empty(xs), b!xs[0]:
+                xs = xs[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The buffer puts the last received item at the head of the list, and gets the
+first item from the list. An alternative is to put the last item at the rear
+of the list, and to get the last item from the list.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-token-buffer">A token buffer</h4>
+<div class="paragraph">
+<p>In the next example, signals are buffered instead of items.
+The buffer receives and sends 'empty' items or <em>tokens</em>.
+Counter variable <code>w</code> of type <code>int</code> denotes the difference between the
+number of tokens received and the number of tokens sent.
+If the buffer receives a token, counter <code>w</code> is incremented; if the buffer
+sends a token, counter <code>w</code> is decremented.
+If the number of tokens sent is less than the number of tokens received, there
+are tokens in the buffer, and <code>w &gt; 0</code>.
+A receiving channel variable <code>a</code> of type <code>void</code> is defined for receiving
+tokens. A sending channel variable <code>b</code> of type <code>void</code> is defined for
+sending tokens.
+The buffer becomes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(chan? void a; chan! void b):
+    int w;
+
+    while true:
+        select
+            a?:
+                w = w + 1
+        alt
+            w &gt; 0, b!:
+                w = w - 1
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that variables of type <code>void</code> do not exist.
+Type <code>void</code> only can be used in combination with channels.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-priority-buffer">A priority buffer</h4>
+<div class="paragraph">
+<p>A buffer for items with different priority is described in this section. An
+item has a high priority or a normal priority.
+Items with a high priority should leave the buffer first.</p>
+</div>
+<div class="paragraph">
+<p>An item is a tuple with a field <code>prio</code>, denoting the priority, <code>0</code> for
+high priority, and <code>1</code> for normal priority:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type item = tuple(...; int prio);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the storage of items, two lists are used: a list for high priority items
+and a list for normal priority items.
+The two lists are described by a list with size two:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list(2) list item xs;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>xs[0]</code> contains the high priority items, <code>xs[1]</code> the normal
+priority items.
+The first item in the high priority list is denoted by <code>xs[0][0]</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>In the model the received items are, on the basis of the value of the
+<code>prio</code>-field in the item, stored in one of the two lists: one list for
+'high' items and one list for 'normal' items.
+The discipline of the buffer is that items with a high priority leave the
+buffer first.
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc BPrio(chan? item a; chan! item b):
+    list(2) list item xs; item x;
+
+    while true:
+        select
+            a?x:
+                xs[x.prio] = xs[x.prio] + [x]
+        alt
+            not empty(xs[0]), b!xs[0][0]:
+                xs[0] = xs[0][1:]
+        alt
+            empty(xs[0]) and not empty(xs[1]), b!xs[1][0]:
+                xs[1] = xs[1][1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The buffer has two lists <code>xs[0]</code> and <code>xs[1]</code>. Received items <code>x</code> are
+stored in <code>xs[x.prio]</code> by the statement <code>xs[x.prio] = xs[x.prio] + [x]</code>.</p>
+</div>
+<div class="paragraph">
+<p>If the list high priority items (<code>xs[0]</code>) is not empty, items with high
+priority are sent. The first element in list <code>xs[0]</code> is element
+<code>xs[0][0]</code>. If there are no high priority items (list <code>xs[0]</code> is empty),
+and there are normal priority items (list <code>xs[1]</code> is not empty), the first
+element of list <code>xs[1]</code>, element <code>xs[1][0]</code>, is sent.</p>
+</div>
+<div class="paragraph">
+<p>Note that the order of the alternatives in the select statement does not
+matter, every alternative is treated in the same way.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-buffer-exercises">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>To study product flow to and from a factory, a setup as shown in
+<a href="#tut-figure-controlled-factory">A controlled factory</a> is created.</p>
+<div id="tut-figure-controlled-factory" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/controlled_factory.png" alt="controlled factory">
+</div>
+<div class="title">Figure 11. A controlled factory</div>
+</div>
+<div class="paragraph">
+<p><code>F</code> is the factory being studied, generator <code>G</code> sends products into the
+factory, and exit process <code>E</code> retrieves finished products. The factory is
+tightly controlled by controller <code>C</code> that sends a signal to <code>G</code> or <code>E</code>
+before a product may be moved. The model is as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan! int a; chan? void sg):
+    for i in range(10):
+        sg?;
+        a!i;
+    end
+end
+
+proc F(chan? int a; chan! int b):
+    ...
+end
+
+proc E(chan? int a; chan? void se):
+    int x;
+
+    while true:
+        se?;
+        a?x;
+        write(&quot;E received %d\n&quot;, x);
+    end
+end
+
+proc C(chan! void sg, se; int low, high):
+    int count;
+
+    while true:
+        while count &lt; high:
+            sg!;
+            count = count + 1;
+        end
+        while count &gt; low:
+            se!;
+            count = count - 1;
+        end
+    end
+end
+
+model M():
+    chan void sg, se;
+    chan int gf, fe;
+
+    run C(sg, se, 0, 1),
+        G(gf, sg), F(gf, fe), E(fe, se);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The number of products inserted by the generator has been limited to allow
+for manual inspection of results.</p>
+</div>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>As a model of the factory, use a FIFO buffer process.
+Run the simulation, and check whether all products are received by the
+exit process.</p>
+</li>
+<li>
+<p>Change the control policy to <code>low = 1</code> and <code>high = 4</code>.
+Predict the outcome, and verify with simulation.</p>
+</li>
+<li>
+<p>The employees of the factory propose to stack the products in the
+factory to reduce the amount of space needed for buffering.
+Replace the factory process with a LIFO buffer process, run the
+experiments again, first with <code>low = 0</code> and <code>high = 1</code> and then with
+<code>low = 1</code> and <code>high = 4</code>.</p>
+</li>
+<li>
+<p>You will notice that some products stay in the factory forever. Why does
+that happen? How should the policy be changed to ensure all products
+eventually leave the factory?</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-servers-with-time">Servers with time</h3>
+<div class="paragraph">
+<p>
+A manufacturing line contains machines and/or persons that perform a sequence
+of tasks, where each machine or person is responsible for a single task.
+The term <em>server</em> is used for a machine or a person that performs a task.
+Usually the execution of a task takes time, e.g. a drilling process, a welding
+process, the set-up of a machine.
+In this chapter we introduce the concept of <em>time</em>, together with the <em>delay</em>
+statement.</p>
+</div>
+<div class="paragraph">
+<p>Note that here 'time' means the simulated time inside the model.
+For example, assume there are two tasks that have to be performed in sequence
+in the modeled system.
+The first task takes three hours to complete, the second task takes five hours
+to complete. These amounts of time are specified in the model (using the delay
+statement, as will be explained below).
+A simulation of the system should report 'It takes eight hours from start of
+the first task to finish of the second task'.
+However, it generally does not take eight hours to compute that result, a
+computer can calculate the answer much faster.
+When an engineer says ''I had to run the system for a year to reach
+steady-state'', he means that time inside the model has progressed a year.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="tut-the-clock">The clock</h4>
+<div class="paragraph">
+<p>The variable <code>time</code> denotes the current time in a model. It is a <em>global</em>
+variable, it can be used in every <code>model</code> and <code>proc</code>.
+The time is a variable of type <code>real</code>. Its initial value is <code>0.0</code>. The
+variable is updated automatically by the model, it cannot be changed by the
+user.
+The unit of the time is however determined by the user, that is, you define
+how long 1 time unit of simulated time is in the model.</p>
+</div>
+<div class="paragraph">
+<p>The value of variable <code>time</code> can be retrieved by reading from the <code>time</code>
+variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">t = time</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The meaning of this statement is that the current time is copied to variable
+<code>t</code> of type real.</p>
+</div>
+<div class="paragraph">
+<p>A process delays itself to simulate the processing time of an operation with a
+<em>delay</em> statement.
+The process postpones or suspends its own actions until the delay ends.</p>
+</div>
+<div class="paragraph">
+<p>For example, suppose a system has to perform three actions, each action takes
+45 seconds. The unit of time in the model is one minute (that is, progress of
+the modeled time by one time unit means a minute of simulated time has
+passed).
+The model looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P():
+    for i in range(3):
+        write(&quot;i = %d, time = %f\n&quot;, i, time);
+        delay 0.75
+    end
+end
+
+model M():
+    run P()
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An action takes 45 seconds, which is <code>0.75</code> time units. The <code>delay 0.75</code>
+statement represents performing the action, the process is suspended until
+0.75 units of time has passed.</p>
+</div>
+<div class="paragraph">
+<p>The simulation reports:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">i = 0, time = 0.000000
+i = 1, time = 0.750000
+i = 2, time = 1.500000
+All processes finished at time 2.25</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The three actions are done in 2.25 time units (2.25 minutes).</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-servers-with-time">Servers with time</h4>
+<div class="paragraph">
+<p>Adding time to the model allows answering questions about time, often
+performance questions ('how many products can I make in this situation?'). Two
+things are needed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Servers must model use of time to perform their task.</p>
+</li>
+<li>
+<p>The model must perform measurements of how much time passes.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>By extending models of the servers with time, time passes while tasks are
+being performed. Time measurements then give non-zero numbers (servers that
+can perform actions instantly result in all tasks being done in one moment of
+time, that is 0 time units have passed between start and finish).
+Careful analysis of the measurements should yields answers to questions about
+performance.</p>
+</div>
+<div class="paragraph">
+<p>In this chapter, adding of passing time in a server and how to embed time
+measurements in the model is explained.
+The first case is a small production line with a deterministic server (its
+task takes a fixed amount of time), while the second case uses stochastic
+arrivals (the moment of arrival of new items varies), and a stochastic server
+instead (the duration of the task varies each time).
+In both cases, the question is what the flow time of an item is (the amount of
+time that a single item is in the system), and what the throughput of the
+entire system is (the number of items the production line can manufacture per
+time unit).</p>
+</div>
+<div class="sect4">
+<h5 id="tut-servers-deterministic-system">A deterministic system</h5>
+<div class="paragraph">
+<p>The model of a deterministic system consists of a deterministic generator, a
+deterministic server, and an exit process.
+The line is depicted in <a href="#tut-figure2-generator-server-exit">Generator <code>G</code>, server <code>S</code>, and exit <code>E</code></a>.</p>
+</div>
+<div id="tut-figure2-generator-server-exit" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/generator_server_exit.png" alt="generator server exit">
+</div>
+<div class="title">Figure 12. Generator <code>G</code>, server <code>S</code>, and exit <code>E</code></div>
+</div>
+<div class="paragraph">
+<p>Generator process <code>G</code> sends items, with constant inter-arrival time <code>ta</code>,
+via channel <code>a</code>, to server process <code>S</code>.
+The server processes items with constant processing time <code>ts</code>, and sends
+items, via channel <code>b</code>, to exit process <code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>An item contains a real value, denoting the creation time of the item, for
+calculating the throughput of the system and flow time (or sojourn time) of an
+item in the system.
+The generator process creates an item (and sets its creation time), the exit
+process <code>E</code> writes the measurements (the moment in time when the item
+arrives in the exit process, and its creation time) to the output.
+From these measurements, throughput and flow time can be calculated.</p>
+</div>
+<div class="paragraph">
+<p>Model <code>M</code> describes the system:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type item = real;
+
+model M(real ta, ts; int N):
+    chan item a, b;
+
+    run G(a, ta),
+        S(a, b, ts),
+        E(b, N)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>item</code> is a real number for storing the creation time.
+Parameter <code>ta</code> denotes the inter-arrival time, and is used in generator <code>G</code>.
+Parameter <code>ts</code> denotes the server processing time, and is used in server <code>S</code>.
+Parameter <code>N</code> denotes the number of items that must flow through the system
+to get a good measurement.</p>
+</div>
+<div class="paragraph">
+<p>Generator <code>G</code> has two parameters, channel <code>a</code>, and inter-arrival time <code>ta</code>.
+The description of process <code>G</code> is given by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan! item a; real ta):
+    while true:
+        a!time; delay ta
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Process <code>G</code> sends an item, with the current time, and delays for <code>ta</code>,
+before sending the next item to server process <code>S</code>.</p>
+</div>
+<div class="paragraph">
+<p>Server <code>S</code> has three parameters, receiving channel <code>a</code>, sending channel
+<code>b</code>, and server processing time <code>ts</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(chan? item a; chan! item b; real ts):
+    item x;
+
+    while true:
+        a?x; delay ts; b!x
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The process receives an item from process <code>G</code>, processes the item during
+<code>ts</code> time units, and sends the item to exit  process <code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>Exit <code>E</code> has two parameters, receiving channel <code>a</code> and the length of the
+experiment <code>N</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc E(chan item a; int N):
+    item x;
+
+    for i in range(N):
+        a?x; write(&quot;%f, %f\n&quot;, time, time - x)
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The process writes current time <code>time</code> and item flow time <code>time - x</code> to
+the screen for each received item.
+Analysis of the measurements will show that the system throughput equals
+<code>1 / ta</code>, and that the item flow time equals <code>ts</code> (if <code>ta &gt;= ts</code>).</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-stochastic-system">A stochastic system</h5>
+<div class="paragraph">
+<p>In the next model, the generator produces items with an exponential
+inter-arrival time, and the server processes items with an exponential server
+processing time. To compensate for the variations in time of the generator and
+the server, a buffer process has been added.
+The model is depicted in <a href="#tut-figure-MM1">Generator <code>G</code>, buffer <code>B</code>, server <code>S</code>, and exit <code>E</code></a>.</p>
+</div>
+<div id="tut-figure-MM1" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/generator_buffer_server_exit.png" alt="generator buffer server exit">
+</div>
+<div class="title">Figure 13. Generator <code>G</code>, buffer <code>B</code>, server <code>S</code>, and exit <code>E</code></div>
+</div>
+<div class="paragraph">
+<p>Type <code>item</code> is the same as in the previous situation.
+The model runs the additional buffer process:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M(real ta, ts; int N):
+    chan item a, b, c;
+
+    run G(a, ta),
+        B(a, b),
+        S(b, c, ts),
+        E(c, N)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Generator <code>G</code> has two parameters, channel variable <code>a</code>, and variable
+<code>ta</code>, denoting the mean inter-arrival time.
+An <code>exponential</code> distribution is used for deciding the inter-arrival time of
+new items:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan item a; real ta):
+    dist real u = exponential(ta);
+
+    while true:
+        a!time; delay sample u
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The process sends a new item to the buffer, and delays <code>sample u</code> time units.
+Buffer process <code>B</code> is a fifo buffer with infinite capacity, as described at
+<a href="#tut-infinite-buffer">An infinite buffer</a>.
+Server <code>S</code> has three parameters, channel
+variables <code>a</code> and <code>b</code>, for receiving and sending items, and a variable for
+the average processing time <code>ts</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(chan item a, b; real ts):
+    dist real u = exponential(ts);
+    item x;
+
+    while true:
+        a?x; delay sample u; b!x
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An <code>exponential</code> distribution is used for deciding the processing time.
+The process receives an item from process <code>G</code>, processes the item during
+<code>sample u</code> time units, and sends the item to exit process <code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>Exit process <code>E</code> is the same as previously, see <a href="#tut-servers-deterministic-system">A deterministic system</a>.
+In this case the throughput of the system also equals <code>1 / ta</code>, and the
+<em>mean flow</em> can be obtained by doing an experiment and analysis of the
+resulting measurements (for <code>ta &gt; ts</code>).</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-two-servers">Two servers</h4>
+<div class="paragraph">
+<p>In this section two different types of systems are shown: a serial and a
+parallel system.
+In a serial system the servers are positioned after each other, in a parallel
+system the servers are operating in parallel.
+Both systems use a stochastic generator, and stochastic servers.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-serial-system">Serial system</h5>
+<div class="paragraph">
+<p>The next model describes a <em>serial</em> system, where an item is processed by one
+server, followed by another server.
+The generator and the servers are decoupled by buffers.
+The model is depicted in <a href="#tut-figure-tandem">A generator, two buffers, two servers, and an exit</a>.</p>
+</div>
+<div id="tut-figure-tandem" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/generator_2buffers_2servers_exit.png" alt="generator 2buffers 2servers exit">
+</div>
+<div class="title">Figure 14. A generator, two buffers, two servers, and an exit</div>
+</div>
+<div class="paragraph">
+<p>The model can be described by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M(real ta, ts; int N):
+    chan item a, b, c, d, e;
+
+    run G(a, ta),
+        B(a, b), S(b, c, ts),
+        B(c, d), S(d, e, ts),
+        E(e, N)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The various processes are equal to those described previously in
+<a href="#tut-stochastic-system">A stochastic system</a>.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-parallel-systems">Parallel systems</h5>
+<div class="paragraph">
+<p>In a parallel system the servers are operating in parallel. Having several
+servers in parallel is useful for enlarging the processing capacity of the
+task being done, or for reducing the effect of break downs of servers (when a
+server breaks down, the other server continues with the task for other items).
+<a href="#tut-figure-two-parallel-servers">A model with two parallel servers</a> depicts the system.</p>
+</div>
+<div id="tut-figure-two-parallel-servers" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/two_parallel_servers.png" alt="two parallel servers">
+</div>
+<div class="title">Figure 15. A model with two parallel servers</div>
+</div>
+<div class="paragraph">
+<p>Generator process <code>G</code> sends items via <code>a</code> to buffer process <code>B</code>, and
+process <code>B</code> sends the items in a first-in first-out manner to the servers
+<code>S</code>. Both servers send the processed items to the exit process <code>E</code> via
+channel <code>c</code>.
+The inter-arrival time and the two process times are assumed to be stochastic,
+and exponentially distributed.
+Items can pass each other, due to differences in processing time between the
+two servers.</p>
+</div>
+<div class="paragraph">
+<p>If a server is free, and the buffer is not empty, an item is sent to a server.
+If both servers are free, one server will get the item, but which one cannot
+be determined beforehand. (How long a server has been idle is not taken into
+account.)
+The model is described by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M(real ta, ts; int N):
+    chan item a, b, c;
+
+    run G(a, ta),
+        B(a, b),
+        S(b, c, ts), S(b, c, ts),
+        E(c, N)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>To control which server gets the next item, each server must have its own
+channel from the buffer. In addition, the buffer has to know when the server
+can receive a new item.
+The latter is done with a 'request' channel, denoting that a server is free
+and needs a new item.
+The server sends its own identity as request, the requests are administrated
+in the buffer.
+The model is depicted in <a href="#tut-figure-two-parallel-requesting-servers">A model with two parallel requesting servers</a>.</p>
+</div>
+<div id="tut-figure-two-parallel-requesting-servers" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/two_parallel_requesting_servers.png" alt="two parallel requesting servers">
+</div>
+<div class="title">Figure 16. A model with two parallel requesting servers</div>
+</div>
+<div class="paragraph">
+<p>In this model, the servers 'pull' an item through the line.
+The model is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model M(real ta, ts; int N):
+    chan item a; list(2) chan item b; chan item c;
+    chan int r;
+
+    run G(a, ta),
+        B(a, b, r),
+        unwind j in range(2):
+            S(b[j], c, r, ts, j)
+        end,
+        E(c, N)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this model, an <code>unwind</code> statement is used for the initialization and
+running of the two servers.
+Via channel <code>r</code> an integer value, <code>0</code> or <code>1</code>, is sent to the buffer.</p>
+</div>
+<div class="paragraph">
+<p>The items received from generator <code>G</code> are stored in list <code>xs</code>, the
+requests received from the servers are stored in list <code>ys</code>.
+The items and requests are removed form their respective lists in a first-in
+first-out manner.
+Process <code>B</code> is defined by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(chan? item a; list chan! item b; chan? int r):
+    list item xs; item x;
+    list int ys; int y;
+
+    while true:
+        select
+            a?x:
+                xs = xs + [x]
+        alt
+            r?y:
+                ys = ys + [y]
+        alt
+            not empty(xs) and not empty(ys), b[ys[0]]!xs[0]:
+                xs = xs[1:]; ys = ys[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If, there is an item present, <em>and</em> there is a server demanding for an item,
+the process sends the first item to the longest waiting server.
+The longest waiting server is denoted by variable <code>ys[0]</code>.
+The head of the item list is denoted by <code>xs[0]</code>.
+Assume the value of <code>ys[0]</code> equals <code>1</code>, then the expression
+<code>b[ys[0]]!xs[0]</code>, equals <code>b[1]!xs[0]</code>, indicates that the first item of
+list <code>xs</code>, equals <code>xs[0]</code>, is sent to server <code>1</code>.</p>
+</div>
+<div class="paragraph">
+<p>The server first sends a request via channel <code>r</code> to the buffer, and waits
+for an item. The item is processed, and sent to exit process <code>E</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(chan? item b; chan! item c; chan! int r; real ts; int k):
+    dist real u = exponential(ts);
+    item x;
+
+    while true:
+        r!k;
+        b?x;
+        delay sample u;
+        c!x
+    end
+end</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-assembly">Assembly</h4>
+<div class="paragraph">
+<p>In assembly systems, components are assembled into bigger components.
+These bigger components are assembled into even bigger components.
+In this way, products are built, e.g. tables, chairs, computers, or cars.
+In this section some simple assembly processes are described.
+These systems illustrate how assembling can be performed: in industry these
+assembly processes are often more complicated.</p>
+</div>
+<div class="paragraph">
+<p>An assembly work station for two components is shown in
+<a href="#tut-figure-assembly-two-components">Assembly for two components</a>.</p>
+</div>
+<div id="tut-figure-assembly-two-components" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/assembly_two_components.png" alt="assembly two components">
+</div>
+<div class="title">Figure 17. Assembly for two components</div>
+</div>
+<div class="paragraph">
+<p>The assembly process server <code>S</code> is preceded by buffers. The server receives
+an item from each buffer <code>B</code>, before starting assembly. The received items
+are assembled into one new item, a list of its (sub-)items.
+The description of the assembly server is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(list chan? item c, chan! list item b):
+    list(2) item v;
+
+    while true:
+        select
+            c[0]?v[0]: c[1]?v[1]
+        alt
+            c[1]?v[1]: c[0]?v[0]
+        end
+        b!v
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The process takes a list of channels <code>c</code> to receive items from the preceding
+buffers.
+The output channel <code>b</code> is used to send the assembled component away to the
+next process.</p>
+</div>
+<div class="paragraph">
+<p>First, the assembly process receives an item from both buffers. All buffers
+are queried at the same time, since it is unknown which buffer has components
+available. If the first buffer reacts first, and sends an item, it is received
+with channel <code>c[0]</code> and stored in <code>v[0]</code> in the first alternative. The
+next step is then to receive the second component from the second buffer, and
+store it (<code>c[1]?v[1]</code>).
+The second alternative does the same, but with the channels and stored items
+swapped.</p>
+</div>
+<div class="paragraph">
+<p>When both components have been received, the assembled product is sent away.</p>
+</div>
+<div class="paragraph">
+<p>A generalized assembly work station for <code>n</code> components is depicted in
+<a href="#tut-figure-assembly-n-components">Assembly for <code>n</code> components, with <code>m = n - 1</code></a>.</p>
+</div>
+<div id="tut-figure-assembly-n-components" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/assembly_n_components.png" alt="assembly n components">
+</div>
+<div class="title">Figure 18. Assembly for <code>n</code> components, with <code>m = n - 1</code></div>
+</div>
+<div class="paragraph">
+<p>The entire work station (the combined buffer processes and the assembly server
+process) is described by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc W(list chan? item a; chan! list item b):
+    list(size(a)) chan item c;
+
+    run unwind i in range(size(a)):
+            B(a[i], c[i])
+        end,
+        S(c,b)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The size of the list of channels <code>a</code> is determined during initialization of
+the workstation.
+This size is used for the generation of the process buffers, and the
+accompanying channels.</p>
+</div>
+<div class="paragraph">
+<p>The assembly server process works in the same way as before, except for a
+generic <code>n</code> components, it is impossible to write a select statement
+explicitly. Instead, an <em>unwind</em> is used to unfold the alternatives:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(list chan? item c, chan! list item b):
+    list(size(c)) item v;
+    list int rec;
+
+    while true:
+        rec = range(size(c));
+        while not empty(rec):
+            select
+                unwind i in rec
+                    c[i]?v[i]: rec = rec - [i]
+                end
+            end
+        end;
+        delay ...;
+        b!v
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The received components are again in <code>v</code>. Item <code>v[i]</code> is received from
+channel <code>c[i]</code>. The indices of the channels that have not provided an item
+are in the list <code>rec</code>. Initially, it contains all channels
+<code>0</code> &#8230;&#8203; <code>size(c)</code>, that is, <code>range(size(c))</code>. While <code>rec</code> still has a
+channel index to monitor, the <code>unwind i in rec</code> unfolds all alternatives
+that are in the list. For example, if <code>rec</code> contains <code>[0, 1, 5]</code>,
+the <code>select unwind i in rec ... end</code> is equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">select
+    c[0]?v[0]: rec = rec - [0]
+alt
+    c[1]?v[1]: rec = rec - [1]
+alt
+    c[5]?v[5]: rec = rec - [5]
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After receiving an item, the index of the channel is removed from <code>rec</code> to
+prevent receiving a second item from the same channel.
+When all items have been received, the assembly process starts (modeled with a
+<code>delay</code>, followed by sending the assembled component away with <code>b!v</code>.</p>
+</div>
+<div class="paragraph">
+<p>In practical situations these assembly processes are performed in a more
+cascading manner. Two or three components are 'glued' together in one assemble
+process, followed in the next process by another assembly process.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-6">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>To understand how time and time units relate to each other, change the time
+unit of the model in <a href="#tut-the-clock">The clock</a>.</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Change the model to using time units of one second (that is, one time
+unit means one second of simulated time).</p>
+</li>
+<li>
+<p>Predict the resulting throughput and flow time for a deterministic case
+like in
+<a href="#tut-servers-with-time">Servers with time</a>, with <code>ta = 4</code> and <code>ts = 5</code>.
+Verify the prediction with an experiment, and explain the result.</p>
+</li>
+</ol>
+</div>
+</li>
+<li>
+<p>Extend the model <a href="#tut-figure-controlled-factory">A controlled factory</a>
+in <a href="#tut-buffer-exercises">Buffer exercises</a>
+with a single deterministic server taking
+<code>4.0</code> time units to model the production capacity of the factory.
+Increase the number of products inserted by the generator, and measure the
+average flow time for</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>A FIFO buffer with control policy <code>low = 0</code> and <code>high = 1</code>.</p>
+</li>
+<li>
+<p>A FIFO buffer with control policy <code>low = 1</code> and <code>high = 4</code>.</p>
+</li>
+<li>
+<p>A <em>LIFO</em> buffer with control policy <code>low = 1</code> and <code>high = 4</code>.</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-conveyors">Conveyors</h3>
+<div class="paragraph">
+<p>A conveyor is a long belt on which items are placed at the starting point of
+the conveyor.
+The items leave the conveyor at the end point, after traveling a certain
+period of time on the conveyor.
+The number of items traveling on the conveyor varies, while each item stays
+the same amount of time on the conveyor. It works like a buffer that provides
+output based on item arrival time instead of based on demand from the next
+process.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="tut-using-timers">Timers</h4>
+<div class="paragraph">
+<p>
+
+
+
+To model a conveyor, you have to wait until a particular point in time. The
+Chi language has timers to signal such a time-out.
+The timer is started by assigning it a value. From that moment, it
+automatically decrements when time progresses in the model, until it reaches
+zero. The function <code>ready</code> gives the boolean value <code>true</code> if the timer is ready.
+The amount of time left can be obtained by reading from the variable.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P():
+    timer t;
+
+    delay 10.0;
+    t = timer(5.0); # Get a time-out at time = 15.0
+    for i in range(7):
+        write(&quot;%f %f %b\n, time, real(t), ready(t));
+        delay 1.0
+    end
+end
+
+model M():
+    run P()
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Initially, <code>time</code> equals <code>0.0</code>.
+The first action of process <code>P</code> is to delay the time for <code>10.0</code> time units.
+Now the value of <code>time</code> equals <code>10.0</code>. Nothing happens to timer <code>t</code> as
+it was already zero.
+At time <code>10</code> timer <code>t</code> is started with the value <code>5.0</code>.
+The output of the program is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">10.0   5.0    false
+11.0   4.0    false
+12.0   3.0    false
+13.0   2.0    false
+14.0   1.0    false
+15.0   0.0    true
+16.0   0.0    true</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Timer <code>t</code> decrements as time progresses, and it is <code>ready</code> at
+<code>10.0 + 5.0</code> units.
+A process can have more timers active at the same moment.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-conveyor">A conveyor</h4>
+<div class="paragraph">
+<p>A conveyor is schematically depicted in <a href="#tut-figure-conveyor">A conveyor with three items</a>.</p>
+</div>
+<div id="tut-figure-conveyor" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/conveyor_3items.png" alt="conveyor 3items">
+</div>
+<div class="title">Figure 19. A conveyor with three items</div>
+</div>
+<div class="paragraph">
+<p>Three items are placed on the conveyor. For simplicity, assume the conveyor is
+<code>60.0</code> meter long and has a speed of <code>1</code> meter per second.
+An item thus stays on the conveyor for <code>60.0</code> seconds.</p>
+</div>
+<div class="paragraph">
+<p>Item <code>0</code> has been placed on the conveyor <code>50.0</code> seconds ago, and will leave
+the conveyor <code>10.0</code> second from now. In the same way, item <code>1</code> will leave
+<code>30.0</code> seconds from now, and <code>2</code> leaves after <code>45.0</code> seconds. Each item
+has a <em>yellow sticker</em> with the time that the item leaves the conveyor. Based
+on this idea, tuple type <code>conv_item</code> has been defined, consisting of a
+field <code>item</code>, denoting the received item, and a timer field <code>t</code>, with the
+remaining time until the item leaves the conveyor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type conv_item = tuple(item x; timer t);
+
+proc T(chan? item a; chan! item b; real convey_time):
+    list conv_item xst; item x;
+
+    while true:
+        select
+            a?x:
+                xst = xst + [(x, timer(convey_time))]
+        alt
+            not empty(xst) and ready(xst[0].t), b!xst[0].x:
+                xst = xst[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The conveyor always accepts new items from channel <code>a</code>, and adds the item
+with the yellow sticker to the list. If the conveyor is not empty, and the
+timer has expired for the first item in the list, it is sent (without sticker)
+to the next process. The conveyor sends items to a process that is always
+willing to a receive an item, this implies that the conveyor is never blocked.
+Blocking implies that the items nevertheless are transported to the end of the
+conveyor.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-a-priority-conveyor">A priority conveyor</h4>
+<div class="paragraph">
+<p>In this example, items are placed on a conveyor, where the time of an item on
+the conveyor varies between items.
+Items arriving at the conveyor process, get inserted in the list with waiting
+items, in ascending order of their remaining time on the conveyor.
+The field <code>tt</code> in the item denotes the traveling time of the item on the
+conveyor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type item      = tuple(...; real tt; ...),
+     conv_item = tuple(item x; timer t);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The predicate function <code>pred</code> is defined by:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">func bool pred(conv_item x, y):
+    return real(x.t) &lt;= real(y.t)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The conveyor process becomes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc T(chan? item a; chan! item b):
+    list conv_item xst; item x;
+
+    while true:
+        select
+            a?x:
+                xst = insert(xst, (x, timer(x.tt)), pred)
+        alt
+            not empty(xst) and ready(xst[0].t), b!xst[0].item:
+                xst = xst[1:]
+        end
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The conveyor process works like before, except the new item is inserted in the
+list according to its remaining time, instead of at the rear of the list.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exercises-7">Exercises</h4>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Model the system as shown in <a href="#tut-figure-conveyor-system">A conveyor system</a> where <code>T</code>
+is a conveyor process with a capacity of <em>at most</em> three products and
+exponentially distributed conveying times with an average of <code>4.0</code>.</p>
+<div class="paragraph">
+<p>Compute the average flow time of products in the system.</p>
+</div>
+<div id="tut-figure-conveyor-system" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/conveyor_system.png" alt="conveyor system">
+</div>
+<div class="title">Figure 20. A conveyor system</div>
+</div>
+</li>
+<li>
+<p>Model the system as shown in <a href="#tut-figure-three-parallel-servers">A system with three parallel servers</a> with
+exponentially distributed server processing times with an average of
+<code>4.0</code>.</p>
+<div id="tut-figure-three-parallel-servers" class="imageblock">
+<div class="content">
+<img src="./tutorial/pictures/three_parallel_servers.png" alt="three parallel servers">
+</div>
+<div class="title">Figure 21. A system with three parallel servers</div>
+</div>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>Compute the average flow time of products in the system.</p>
+</li>
+<li>
+<p>Are there differences in behavior between both systems? Why (not)?</p>
+</li>
+</ol>
+</div>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-simulation-and-experiments">Simulations and experiments</h3>
+<div class="paragraph">
+<p>So far, attention has focused on the Chi language, and how to use it for
+modeling a discrete-event system.</p>
+</div>
+<div class="paragraph">
+<p>In this chapter, the focus shifts to performing simulations, in particular for
+systems with infinite behavior. Also, how to perform multiple model
+simulations is explained.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-simulating-finite-systems">Simulating finite systems</h4>
+<div class="paragraph">
+<p>For systems that have simple cyclic behavior, the simulation can be
+'exhaustive', for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan! real a):
+    a!time
+end
+
+proc M(chan? real a, chan! real b):
+    real x;
+
+    a?x; delay 5.0; b!x
+end
+
+proc E(chan? real a):
+    real x;
+
+    a?x;
+    writeln(&quot;Flow time: %.2f&quot;, time - x);
+end
+
+model M():
+    chan real gm, me;
+
+    run G(gm), M(gm, me), E(me);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This simulation sends a single product through the line, prints the flow time,
+and exits. (All processes end, which makes that the <code>run</code> statement and the
+model end as well.)</p>
+</div>
+<div class="paragraph">
+<p>In this case, the answer is even obvious without running the simulation.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-exit">Simulating infinite systems</h4>
+<div class="paragraph">
+<p>For other systems, it is much harder to decide when enough has been simulated.
+Typically, a process (<code>E</code> in the example below), collects values of the
+property of interest (for example flow time of products), until it has
+collected enough samples to draw a conclusion, and compute the resulting value.</p>
+</div>
+<div class="paragraph">
+<p>After doing so, the problem arises to let all processes know the simulation
+should be stopped. This can be programmed in the model (such as adding
+channels to
+signal termination of the simulation to all processes). A simpler alternative
+is to use the <code>exit</code> statement, in the following way:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc real E(chan? real a, int N):
+    real total, x;
+
+    for n in range(N):
+        a?x;
+        total = total + time - x;
+    end;
+    exit total / N
+end
+
+model real M(... int N):
+    ...
+
+    run ..., E(..., N);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In process <code>E</code>, the average flow time is calculated and given as
+argument of the <code>exit</code> statement. At the moment this statement is executed,
+the model and all processes are killed, and the computed value becomes the
+exit value (the result) of the simulation. The <code>real</code> type before
+the name <code>E</code> denotes that the process may perform an <code>exit</code> statement
+returning a real value. The model runs the <code>E</code> process, so it may also give
+an exit value as result. These types are called <em>exit type</em>.
+Exit values are printed to the screen by the simulator when it ends the
+model simulation.</p>
+</div>
+<div class="paragraph">
+<p>Another option is to use <code>write</code> to output the computed value, and use
+<code>exit</code> without argument. In that case, the exit value is of type <code>void</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-experiment">Simulating several scenarios</h4>
+<div class="paragraph">
+<p>The above works nicely for single model simulations. The model is started one
+time, and it derives a result for a single scenario.</p>
+</div>
+<div class="paragraph">
+<p>Often however, you want to perform several model simulations. This can be the
+exact same scenario when the model has stochastic behavior, or it can be
+with different parameter values each time (to investigate system behavior
+under different circumstances).
+In such cases, you can use an experiment, like below:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xper X():
+    real v;
+    int n;
+
+    for n in range(5, 10):
+        v = M(n);
+        write(&quot;%2d: %.2f\n&quot;, n, v)
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The experiment <code>X</code> looks just like a function, except that it has no
+<code>return</code>
+statement. It can however 'call' a model like a function. In the example above
+<code>M(n)</code> starts a simulation with model <code>M</code> and the given value for <code>n</code>.
+When the model exits by means of the <code>exit</code> statement (this is required!),
+the computed exit
+value of the (model) simulation is assigned to variable <code>v</code>. In the
+experiment, this value can be used for post-processing, or in this case, get
+printed as result value in a table.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-svg-visualization">SVG visualization</h3>
+<div class="paragraph">
+<p>A Chi simulation often produces large amounts of textual output that you have
+to process in order to understand the simulation result. Also for people
+unfamiliar with the details of the simulated system, results are hard to
+understand. A possible solution is to add a visualization of the system to the
+simulator, that displays how the system behaves over time. Generally, it
+looses some of the details, but it makes globally checking, and explaining of
+the simulation much easier.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="tut-the-svg-file-format">The SVG file format</h4>
+<div class="paragraph">
+<p>
+The <a href="http://www.w3.org/TR/SVG11/">Scalable Vector Graphics</a> (SVG) file
+format is a widely used, royalty-free standard for two-dimensional vector
+graphics, developed by the <a href="http://www.w3.org/">World Wide Web Consortium</a>
+(W3C). SVG images consist of three types of objects: vector graphic shapes
+(rectangles, circles, etc.), raster images, and text. The benefit of vector
+images formats over raster image formats, is that raster images are created
+with a fixed size, while vector images contain a description of the image and
+can be rendered at any size without loss of quality.</p>
+</div>
+<div class="paragraph">
+<p>
+
+SVG image files are stored in an
+<a href="http://en.wikipedia.org/wiki/XML">XML</a>-based file format. This means that
+they can be edited with any text editor. However, it is often more convenient
+to edit them with a drawing program that supports vector graphics, such as
+<a href="http://www.adobe.com/products/illustrator.html">Adobe Illustrator</a>
+or <a href="https://inkscape.org/">Inkscape</a>.
+Most modern web browsers also support display of SVG images.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-visualization">Visualization</h4>
+<div class="paragraph">
+<p>An SVG file has a tree structure; (graphical) elements are drawn in the same
+order as they appear in the file. Elements further down in the file are thus
+drawn on top of earlier elements. Also, each element has a position and size.
+They may have other properties like a color or a gradient as well. There are
+also 'administrative' elements, that can group, scale, or rotate parts of the
+tree. The website of Jakob Jenkov has a very nice
+<a href="http://tutorials.jenkov.com/svg">SVG Tutorial</a>.</p>
+</div>
+<div class="paragraph">
+<p>The SVG visualization by the Chi simulator exploits this structure. You access
+the elements, and literally change the value of their properties or copy part
+of the tree. The
+<a href="http://xmlgraphics.apache.org/batik/">Apache Batik SVG Toolkit</a>
+used for drawing the SVG image at the
+screen notices the changes, and updates the displayed image.</p>
+</div>
+<div class="paragraph">
+<p>By updating the SVG tree every time when the state of the simulation changes,
+you can display how a system evolves over time as an animated image.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-chapter-svg-example">SVG visualization example</h3>
+<div class="paragraph">
+<p>To illustrate how to make an SVG visualization, a simple generator, buffer,
+server, buffer, server, exit (GBSBSE) process line is used.
+Below the generator and exit process definitions, and the model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc G(chan! real to; real ptime):
+    int n = 0;
+
+    while n &lt; 100:
+        to!time; delay ptime; n = n + 1
+    end
+end
+
+proc E(chan? real from):
+    real x;
+
+    while true:
+        from?x
+    end
+end
+
+model M():
+    list(3) chan real c;
+    list(2) chan real bs;
+
+    run G(c[0], 1.1),
+
+        B(0, c[0], bs[0], 3),
+        S(0, bs[0], c[1], 1.0, exponential(10.0), exponential(4.0)),
+
+        B(1, c[1], bs[1], 3),
+        S(1, bs[1], c[2], 0.9, exponential(10.0), exponential(4.0)),
+
+        E(c[2]);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This system should be visualized, where the number of items in each buffer
+should be displayed, and the state of each server (waiting for input,
+processing, or waiting for output) should also be shown.
+The <a href="./tutorial/gbse.svg">gbse.svg</a>
+SVG file was made for this purpose, which
+looks like</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/sbb.png" alt="sbb">
+</div>
+</div>
+<div class="paragraph">
+<p>in an editor. The black rectangle represents the displayed area when the
+visualization is running. It has two light-green rectangles in it, representing
+the first and second buffer. The darker green rectangles inside will vary in height
+to show the number of items in each buffer.</p>
+</div>
+<div class="paragraph">
+<p>The circle at the left of the displayed area is never displayed in the
+visualization. However, each server makes a copy of it, and places it at an
+appropriate position in the display. While for two servers, one could just as
+well perform the copying beforehand, as was done with the buffer graphics, but
+the copying technique demonstrates how to scale visualizations for displaying
+a larger number of items without a lot of effort.</p>
+</div>
+<div class="sect3">
+<h4 id="tut-buffer-visualization">Buffer visualization</h4>
+<div class="paragraph">
+<p>The left darker green rectangle has an <code>id</code> with value <code>buf0</code>, while the
+right rectangle has an <code>id</code> containing <code>buf1</code>. Through the <code>id</code>, you can
+access the properties, in this case, the height, for example
+<code>attr buf0.height = 50</code>. This will set the <code>height</code> property of the SVG element
+named <code>buf0</code> to <code>50</code>.</p>
+</div>
+<div class="paragraph">
+<p>The SVG visualization is not in the Chi model itself, it is an external
+entity. You access it by opening a 'file', and writing the commands such as
+above, as lines of text.
+The code of the buffer is shown below.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc B(int num; chan? real from; chan! real to; int cap):
+    list real xs;
+    real x;
+    file f = open(&quot;SVG:gbse.svg&quot;, &quot;w&quot;);
+
+    while true:
+        select size(xs) &gt; 0, to!xs[0]:
+            xs = xs[1:];
+        alt size(xs) &lt; cap, from?x:
+            xs = xs + [x]
+        end
+        writeln(f, &quot;attr buf%d.height = %d&quot;, num, size(xs) * 50);
+    end
+    close(f);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is a normal finite buffer process, except for three additional lines. The
+first change is the <code>file f = open("SVG:gbse.svg", "w");</code> line. It creates a
+connection to the SVG visualization due to the <code>SVG:</code> prefix of the file
+name. <code>gbse.svg</code> is the name of the <code>.svg</code> file described above. The
+'file' should be opened for writing (since you will be sending commands to
+it).</p>
+</div>
+<div class="paragraph">
+<p>The second line is the
+<code>writeln(f, "attr buf%d.height = %d", num, size(xs) * 50);</code> line,
+which constructs a line of text to set the height of the darker
+green rectangle to a value proportional to the number of elements in the
+buffer. There is however a <a href="#svg-vertical-trickery">vertical coordinate trick</a>
+needed to make it all work.</p>
+</div>
+<div class="paragraph">
+<p>The third line is the <code>close(f);</code> line at the end of the process. It closes
+the connection to the SVG visualization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="svg-vertical-trickery">Vertical coordinates trickery</h4>
+<div class="paragraph">
+<p>In SVG, the vertical coordinates run from the top of the screen to the bottom.
+If you just draw a rectangle, its base position <code>(x,y)</code> is at the top-left
+corner, with <code>width</code> going to the right of the screen, and <code>height</code>
+towards the bottom. In other words, if you change the height of a simple
+SVG rectangle by a program like the buffer process, the rectangle will grow
+downwards instead of upwards!</p>
+</div>
+<div class="paragraph">
+<p>To make it grow upwards instead, you can</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>change both the <code>height</code> and the <code>y</code> coordinate of the rectangle at the
+same time (you move the top of the rectangle in opposite direction with its
+growth in height, so it looks like the rectangle grows upwards), or</p>
+</li>
+<li>
+<p>flip the coordinate system of the rectangle by inserting a '180 degrees
+rotation' transformation around the rectangle (you tell SVG to draw the
+rectangle 'upside down', thus if you make it higher, it grows downwards, but
+the flipped coordinate displays it as growth upwards.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-server-process">Server process</h4>
+<div class="paragraph">
+<p>The server process code looks as follows (ignore all the <code>writeln</code> lines for
+now).</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc S(int num; chan? real from; chan! real to; real ptime; dist real up, down):
+    real event, x;
+    file f = open(&quot;SVG:gbse.svg&quot;, &quot;w&quot;);
+
+    writeln(f, &quot;copy server, , _x%d&quot;, num);
+    writeln(f, &quot;absmove s_x%d (%d, 325)&quot;, num, num*420+150);
+
+    while true:
+        event = time + sample up;
+
+        # Up; process items.
+        while event &gt; time:
+            writeln(f, &quot;attr s_x%d.fill=yellow&quot;, num);
+            from?x;
+            writeln(f, &quot;attr s_x%d.fill=green&quot;, num);
+            delay ptime;
+            writeln(f, &quot;attr s_x%d.fill=magenta&quot;, num);
+            to!x;
+        end
+
+        # Down; repair machine.
+        writeln(f, &quot;attr s_x%d.fill=red&quot;, num);
+        delay sample down;
+    end
+    close(f);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The server runs forever, starting with sampling how long it will be up
+(<code>event = time + sample up</code>). Until it has reached that time
+(<code>while event &gt; time:</code>), it cycles through getting a product, processing
+it for <code>uptime</code> time units, and sending the product out again. After a
+few cycles, it has reached the <code>event</code> time, goes down, and waits for repair
+(<code>delay sample down;</code>). Once the machine is repaired it starts again.
+Visualization of the servers is discussed below.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-visualizing-the-server">Visualizing the server</h4>
+<div class="paragraph">
+<p>A server is to be visualized with a circle that changes color depending on
+what the server is doing. Yellow means it is waiting for a product, green
+means processing, magenta means it is waiting to pass the finished product
+to the next station, and red means the machine is down. After repairing, it
+will continue processing.</p>
+</div>
+<div class="paragraph">
+<p>As with the buffer process, the SVG visualization first opens a file
+connection to the visualizer and the SVG file with the
+<code>file f = open("SVG:gbse.svg", "w");</code> line. The filename of the <code>.svg</code> file
+must be the same as with the buffer process (the visualizer can only show
+one SVG file at a time).</p>
+</div>
+<div class="paragraph">
+<p>To display server state in the SVG visualization, we need a circle (called <em>arc</em> in
+SVG) named <code>s_0</code> and <code>s_1</code> (for server 0 and server 1), positioned behind
+its buffer. If there are not too many servers, and their number is fixed, one
+could simply add those arcs to the SVG file and be done with it.
+However, if you have a lot of servers, or you don&#8217;t know in advance how many
+you will have, you cannot add them beforehand, you need to construct the SVG
+elements 'on the fly'.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-copying-svg-elements">Copying SVG elements</h4>
+<div class="paragraph">
+<p>For showing the server states, arcs named <code>s_0</code> and <code>s_1</code> are required in
+SVG, which are created by copying and moving an SVG element. In this case, a
+server is represented by just one SVG element, so you can copy and move that
+one element. In general however, you want to copy several elements at the same
+time (for example you might want to copy graphical elements to display a work
+station, a server with its buffer).</p>
+</div>
+<div class="paragraph">
+<p>SVG has group elements, where you can put any number of (graphical) elements inside.
+When you copy a group, you copy its entire contents. The <code>gbse.svg</code> file as
+a group called <code>server</code>, containing an arc element called <code>s</code>. The server
+group is copied and moved, which causes the arc element to be copied and moved
+as well.</p>
+</div>
+<div class="paragraph">
+<p>Inside an SVG file, each element must have a unique <code>id</code>, that is, each
+element must have a unique name. When making a copy, the copied elements must
+thus also be given a new name. The entire operation is performed with sending
+a <code>copy [node], [prefix], [suffix]</code> command to the SVG visualizer. It
+takes the element named <code>[node]</code>, and makes a full copy of it
+(all elements inside it are also copied). For each copied element the
+<code>[prefix]</code> is added in front of its <code>id</code> name, and the <code>[suffix]</code> is
+added behind it.</p>
+</div>
+<div class="paragraph">
+<p>The <code>writeln(f, "copy server, , _x%d", num);</code> line in the Chi simulation
+performs the copy operation for the servers. It takes the <code>server</code> group
+element (which contains an <code>s</code> arc element), and adds nothing in front of
+the names (there is no text between the first and the second comma). It
+appends the names with <code>_x0</code> for the first server, and <code>_x1</code> for the
+second server. The result is thus a copy of the <code>server</code> group, called
+<code>server_x0</code> or <code>server_x1</code>, containing an arc <code>s_x0</code> respectively
+<code>s_x1</code>.</p>
+</div>
+<div class="paragraph">
+<p>Note that the copy command performs copying, and nothing else. Since the
+copied element is exactly at the same position as the original, you don&#8217;t see
+copies. This is however fixed by a move command explained next.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-moving-svg-elements">Moving SVG elements</h4>
+<div class="paragraph">
+<p>You often want to position an SVG element at some point in the display. The
+simplest way to do that is to change its <code>x</code> and <code>y</code> attributes, much
+like the <code>height</code> attribute of the buffer rectangle was modified. Another
+solution is to perform a relative move, using transform/translate.</p>
+</div>
+<div class="paragraph">
+<p>This works, until you add a transformation element that changes the coordinate
+system. Sometimes you do this consciously, for example adding a 'flip'
+transformation to fix the vertical coordinates. At other times the SVG editor
+may insert one, for example when you rotate or scale some part of the drawing.</p>
+</div>
+<div class="paragraph">
+<p>The Chi SVG visualizer has a <code>absmove [node] ([xpos], [ypos])</code>
+command to handle this case. It computes a transformation to get the top-left
+corner of the element named <code>[node]</code> at position (<code>[xpos]</code>, <code>[ypos]</code>).
+Keep in mind that the vertical coordinate starts at the top, and goes down.</p>
+</div>
+<div class="paragraph">
+<p>There are limitations to this command, in some case it may fail (see the
+<a href="#ref-chapter-svg-visualization">reference manual</a> for details about the
+command). It is recommended to use this command one time on an element to move
+it to a known base position. Once it is at a known position, change the <code>x</code>
+and <code>y</code> coordinates of a child element (to avoid disturbing the base
+position), to move relative to that base position. Another solution is to
+perform a relative move, using transform/translate.</p>
+</div>
+<div class="paragraph">
+<p>In the Chi simulation, the
+<code>writeln(f, "absmove s_x%d (%d, 325)", num, num*420+150);</code> line moves the
+copied <code>s_x0</code> and <code>s_x1</code> arcs to the right
+position in the display.</p>
+</div>
+<div class="paragraph">
+<p>With the arcs in the right position in the display, the servers can display
+their activities by changing the color of the <code>fill</code> attribute.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="ref-chapter-reference-manual">Chi Reference Manual</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This manual explains the allowed Chi language constructs and their semantics.
+Topics discussed here are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#ref-chapter-global-definitions">Global definitions</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-statements">Statements</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-expressions">Expressions</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-standard-library">Standard library functions</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-distributions">Distributions</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-types">Types</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-lexical-syntax">Lexical syntax</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-migration">Model migration</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-svg-visualization">SVG visualization</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-global-definitions">Global definitions</h3>
+<div class="paragraph">
+<p>At global level, a Chi program is a sequence of definitions, as shown in the
+following diagram</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/program.png" alt="program">
+</div>
+</div>
+<div class="paragraph">
+<p>Each of the definitions is explained below.
+The syntax diagram suggests that a <code>;</code> separator is obligatory between
+definitions. The implementation is more liberal, you may omit the separator
+when a definition ends with the <code>end</code> keyword. Also, it is allowed to use a
+separator after the last definition.</p>
+</div>
+<div class="paragraph">
+<p>The name of each global definition has to be unique.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="ref-enum-definitions">Enumeration definitions</h4>
+<div class="paragraph">
+<p>With enumerations, you create a new enumeration type containing a number of
+names (called enumeration values).
+The syntax is given below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/enumdef.png" alt="enumdef">
+</div>
+</div>
+<div class="paragraph">
+<p>The enumeration definitions start with the keyword <code>enum</code>, followed by a
+sequence of definitions separated with a <code>,</code>. Each definition
+associates an enumeration type name with a set of enumeration value names.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">enum FlagColours  = {red, white, blue},
+     MachineState = {idle, heating, processing};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The enumeration type names act as normal types, and the enumeration values are
+its values. The values have to be unique words.</p>
+</div>
+<div class="paragraph">
+<p>For example, you can create a variable, and compare values like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">MachineState state = idle;
+...
+while state != processing:
+    ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that enumeration values have no order, you cannot increment or decrement
+variables with an enumeration type, and you can only compare values with
+equality and inequality.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-type-definitions">Type definitions</h4>
+<div class="paragraph">
+<p>Type definitions allow you to assign a name to a type. By using a name instead
+of the type itself, readability of the program increases.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/typedef.png" alt="typedef">
+</div>
+</div>
+<div class="paragraph">
+<p>A type definition starts with the keyword <code>type</code>, followed by a number of
+'assignments' that associate a type name with a type, separated with a <code>,</code>.
+For further details about type names and types, see <a href="#ref-chapter-types">Types</a>.</p>
+</div>
+<div class="paragraph">
+<p>An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type lot   = real,
+     batch = list lot;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here a <code>lot</code> type name is introduced that is implemented with a real number,
+and a <code>batch</code> type name is created, which is a list of <code>lot</code>.</p>
+</div>
+<div class="paragraph">
+<p>These type names can be used at every place where you can use a type, for
+example in variable declarations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">batch xs;
+lot x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that you cannot define use a type name in its own definition.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-constant-definitions">Constant definitions</h4>
+<div class="paragraph">
+<p>Constant definitions allow you to give a name to a fixed value to enhance
+readability. It also makes it easier to change a value between different
+experiments. For example, if you have a constant named <code>speed</code>, and you want
+to investigate how its value affects performance, you only have to change
+value in the constant definition, instead of finding and changing numbers in
+the entire program.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of constant definitions is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/constantdef.png" alt="constantdef">
+</div>
+</div>
+<div class="paragraph">
+<p>An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">const real speed = 4.8,
+      dict(string : list int) recipes = { &quot;short&quot; : [1,4,8],
+                                          &quot;long&quot;  : [1,1,2,3,4,5] };</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, a <code>speed</code> real value is defined, and <code>recipes</code> value, a
+dictionary of string to numbers. The constant names can be used at every point
+where you can use an expression. See the <a href="#ref-chapter-expressions">Expressions</a>
+section for details about expressions.</p>
+</div>
+<div class="paragraph">
+<p>Note that you cannot use a constant name in its own definition.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-process-definitions">Process definitions</h4>
+<div class="paragraph">
+<p>A process is an entity that shows behavior over time. A process definition is
+a template for such a process. It is defined as follows</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/procdef.png" alt="procdef">
+</div>
+</div>
+<div class="paragraph">
+<p>The definition starts with the keyword <code>proc</code> optionally followed by an exit
+type. The name of the process definition, and its formal parameters concludes
+the header.
+In the body, the behavior is described using statements.</p>
+</div>
+<div class="paragraph">
+<p>Formal parameters are further explained in <a href="#ref-formal-parameters">Formal parameters</a>,
+statements are explained in the <a href="#ref-chapter-statements">Statements</a> section.</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P():
+  writeln(&quot;Hello&quot;);
+  delay 15;
+  writeln(&quot;Finished&quot;)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the example, a process definition with the name <code>P</code> is defined, without
+parameters, that outputs a line of text when starting, and another line of
+text 15 time units later (and then finishes execution).</p>
+</div>
+<div class="paragraph">
+<p>Creating and running a process is done with <a href="#ref-sub-process-statements">Sub-process statements</a>
+(<code>start</code> or <code>run</code>) from another process or from a model.</p>
+</div>
+<div class="paragraph">
+<p>If a process definition has no exit type specified, it may not use the
+<code>exit</code> statement, nor may it start other processes that have an exit type
+(see also <a href="#ref-sub-process-statements">Sub-process statements</a>).
+Process definitions that have an exit type may use the <code>exit</code> statement
+directly (see <a href="#ref-exit-statement">Exit statement</a> for details on the statement), and it
+may start other processes without exit type, or with the same exit type.</p>
+</div>
+<div class="paragraph">
+<p>Since values returned by the <code>exit</code> statement may get printed onto the
+output, you may only use exit types that are printable. These are all the
+'normal' data values, from simple booleans to lists, sets, and dictionaries of
+data values, but not channels, files, etc.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-model-definitions">Model definitions</h4>
+<div class="paragraph">
+<p>A model behaves like a process, the only difference is that a model is run
+as first process. It is the 'starting point' of a simulation.
+As such, a model can only take data values which you can write down as literal
+value. For example, giving it a channel or a process instance is not allowed.</p>
+</div>
+<div class="paragraph">
+<p>Like the process, a model also has a definition. It is defined below</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/modeldef.png" alt="modeldef">
+</div>
+</div>
+<div class="paragraph">
+<p>The syntax is exactly the same as process definitions explained in
+<a href="#ref-process-definitions">Process definitions</a>, except it starts with
+a <code>model</code> keyword instead.
+A model can be started directly in the simulator (see
+<a href="#tool-chapter-software-operation">Software operation</a>), or as part of an experiment, explained in
+<a href="#tut-experiment">Simulating several scenarios</a>, and <a href="#ref-xper-definitions">Experiment definitions</a>.
+If the model definition has no exit type, it may not use the <code>exit</code>
+statement directly, nor may it start other processes that have an exit type.
+If an exit type is specified, the model may use the <code>exit</code> statement
+to end the model simulation (see <a href="#ref-sub-process-statements">Sub-process statements</a> for
+details), and it may start other processes, either without exit type, or with
+a matching exit type.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-function-definitions">Function definitions</h4>
+<div class="paragraph">
+<p>In programs, computations are executed to make decisions. These computations
+can be long and complex. A function definition attaches a name to a
+computation, so it can be moved to a separate place in the file.</p>
+</div>
+<div class="paragraph">
+<p>Another common pattern is that the same computation is needed at several
+places in the program. Rather than duplicating it (which creates consistency
+problems when updating the computation), write it in a function  definition,
+and call it by name when needed.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of a function definition is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/funcdef.png" alt="funcdef">
+</div>
+</div>
+<div class="paragraph">
+<p>In the syntax, the only thing that changes compared with the syntax in
+<a href="#ref-process-definitions">Process definitions</a> or <a href="#ref-model-definitions">Model definitions</a> is the
+additional <code>Type</code> node that defines the type resulting from the computation.</p>
+</div>
+<div class="paragraph">
+<p>However, since a function represents a computation (that is, calculation of an
+output value from input values) rather than having behavior over time, the
+<code>Body</code> part has additional restrictions.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A computation is performed instantly, no time passes. This means that you
+cannot delay or wait in a function.</p>
+</li>
+<li>
+<p>A computation outputs a result. You cannot have a function that has no
+result.</p>
+</li>
+<li>
+<p>A computation is repeatable. That means if you run the
+same computation again with the same input values, you get the same result
+<em>every time</em>. Also in the environment of the function, there should be no
+changes. This idea is known as <em>mathematical functions</em>.</p>
+<div class="paragraph">
+<p>A consequence of having mathematical functions is that you cannot interact
+with 'outside'. No querying of the current time, no communication, no select
+statement, and no use of distributions.</p>
+</div>
+<div class="paragraph">
+<p>Technically, this would also imply no input/output, but for practical
+reasons this restriction has been lifted. However, as a general rule, avoid
+using it.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-xper-definitions">Experiment definitions</h4>
+<div class="paragraph">
+<p>An experiment can execute one or more model simulations, collect their exit
+values, and combine them into a experiment result.
+Its syntax is shown below</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/xperdef.png" alt="xperdef">
+</div>
+</div>
+<div class="paragraph">
+<p>An experiment definition has some function-like restrictions, like not being
+able to use sub-process statements, no communication, and no use of time. On
+the other hand, it does not return a value, and it can start model
+simulations that have a non-void exit type (<a href="#ref-void-type">Void type</a> discusses the
+void type).</p>
+</div>
+<div class="paragraph">
+<p>The definition is very similar to other definitions. It starts with an
+<code>xper</code> keyword, followed by the name of the definition. The name can be used
+to start an experiment with the simulator (see <a href="#tool-chapter-software-operation">Software operation</a>
+for details on starting the simulator).
+If formal parameters are specified with the experiment definition (see
+<a href="#ref-formal-parameters">Formal parameters</a> below), the experiment can be parameterized with
+values.
+Like models, an experiment can only take data values which you can write down
+as literal value. For example, giving it a channel or a process instance is
+not allowed.</p>
+</div>
+<div class="paragraph">
+<p>The body of an experiment is just like the body of a
+<a href="#ref-function-definitions">Function definitions</a> (no interaction with processes or time).
+Unlike a function, an experiment never returns a value with the
+<a href="#ref-return-statement">Return statement</a>.</p>
+</div>
+<div class="paragraph">
+<p>The primary goal of an <code>xper</code> is to allow you to run one or more model
+simulations that give an exit value. For this purpose, you can 'call' a model
+like a function, for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">xper X():
+    real total;
+    int n;
+
+    while n &lt; 10:
+        total = total + M();
+        n = n + 1
+    end
+
+    writeln(&quot;Average is %.2f&quot;, total / 10);
+end
+
+model real M():
+    dist real d = exponential(7.5);
+    exit sample d;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model above is very short to keep the example compact. In practice it will
+be larger, start several concurrent processes, and do a lengthy simulation
+before it decides what the answer should be.
+The experiment <code>X</code> makes ten calls to the model. Each call causes the
+model to be run, until the model or one of its processes executes the <code>exit</code>
+statement. At that point, the model and all its processes are killed, and the
+value supplied with the exit statement becomes the return value of the model
+call, adding it to <code>total</code>.
+After the ten model simulations, the experiment outputs the average value of
+all model simulations.</p>
+</div>
+<div class="paragraph">
+<p>Note that the called model (or one of its started processes) <strong>must</strong> end with
+the <code>exit</code> statement, it is an error when the model ends by finishing its
+last model statement.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-formal-parameters">Formal parameters</h4>
+<div class="paragraph">
+<p>Definitions above often take values as parameter to allow customizing their
+behavior during execution.
+The definition of those parameters are called <em>formal parameters</em>,
+The syntax of formal parameters is shown below</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/formalparms.png" alt="formalparms">
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, they are just variable declarations (explained in the
+<a href="#ref-variable-declarations">Local variables</a> section), except you may not add an initial
+value, since their values are obtained during use of the definition.</p>
+</div>
+<div class="paragraph">
+<p>To a definition, the formal parameters act like variables. You may
+use them just like other variables.</p>
+</div>
+<div class="paragraph">
+<p>An example, where <code>int x, y; string rel</code> are the formal parameters of
+process definition <code>P</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(int x, y; string rel):
+    writeln(&quot;%d %s %d&quot;, x, rel, x-y)
+end
+
+...
+
+run P(2, -1, &quot;is less than&quot;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The formal parameters introduce additional variables in the process, that can
+be just just like any other variable. Here, they are just printed to the
+screen.
+Elsewhere in the program, the definition gets used (instantiated), and a value
+is supplied for the additional variables. Such values are called
+<em>actual parameters</em>.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-statements">Statements</h3>
+<div class="paragraph">
+<p>
+
+
+
+Statements express how a process or function in a system works. They define
+what is done and in which order. Many statements use data for their decisions,
+which is stored in local variables. The combined local variables and
+statements are called 'body' with the following syntax.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/body.png" alt="body">
+</div>
+</div>
+<div class="paragraph">
+<p>Data values available to the process are the global constants (see
+<a href="#ref-constant-definitions">Constant definitions</a>) and enumeration values (see
+<a href="#ref-enum-definitions">Enumeration definitions</a>). The formal parameters of the surrounding
+process definition (explained in <a href="#ref-process-definitions">Process definitions</a>) or the
+surrounding function definition (explained in <a href="#ref-function-definitions">Function definitions</a>)
+are added as well.</p>
+</div>
+<div class="paragraph">
+<p>Data storage that can be modified by the process are the local variables,
+defined by the <code>VarDefinitions</code> block in the <code>Body</code> diagram
+above (variable definitions are explained below in
+<a href="#ref-variable-declarations">Local variables</a>).</p>
+</div>
+<div class="paragraph">
+<p>The data values and the modifiable data storage is used by the statements of
+the <code>Body</code> in the path after <code>1</code>. For ease of reference they are grouped
+by kind of statement as shown in the <code>Statement</code> diagram below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/statement.png" alt="statement">
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>AssignmentStatement</code> is used to assign new values to the local
+variables (and explained further in <a href="#ref-assignment-statement">Assignment statement</a>).</p>
+</li>
+<li>
+<p>The <code>IterativeStatement</code> allows repeated execution of the same statements
+by means of the <code>for</code> and <code>while</code> statements (further explained in
+<a href="#ref-iterative-statements">Iterative statements</a>).</p>
+</li>
+<li>
+<p>The <code>ChoiceStatement</code> allows selection on which statement to perform next
+by means of the <code>if</code> statement (explained in <a href="#ref-choice-statement">Choice statement</a>).</p>
+</li>
+<li>
+<p>The <code>run</code> and <code>start</code> statements of the <code>SubProcessStatement</code> group
+(explained in <a href="#ref-sub-process-statements">Sub-process statements</a>) start new processes.</p>
+</li>
+<li>
+<p>Communication with other processes using channels is done with send,
+receive, and <code>select</code> statements in <code>CommunicationStatement</code> (explained
+in <a href="#ref-communication-statements">Communication statements</a>)</p>
+</li>
+<li>
+<p>Finally, the <code>OtherStatements</code> group contains several different
+statements (explained further in <a href="#ref-other-statements">Other statements</a>).
+The more commonly used statements in that group are the <code>delay</code> statement,
+the <code>write</code> statement, and the <code>return</code> statement.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The syntax diagram of <code>Body</code> states that statements are separated from each
+other with a semi colon (<code>;</code>). The compiler allows more freedom. Semicolons
+may be omitted before and after a <code>end</code> keyword, and a semi colon may be
+added after the last statement.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="ref-variable-declarations">Local variables</h4>
+<div class="paragraph">
+<p>Local variables are introduced in a process or function using the following
+syntax</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/vardef.png" alt="vardef">
+</div>
+</div>
+<div class="paragraph">
+<p>Variable definitions start with a <code>Type</code> node (its syntax if explained in
+<a href="#ref-chapter-types">Types</a>), followed by a sequence of variable names where
+each variable may be initialized with a value by means of the <code>= Expression</code>
+path. If no value is assigned, the variable gets the default value of the
+type. Use a semi colon to terminate the sequence of new variables.</p>
+</div>
+<div class="paragraph">
+<p>Next, another set of variables may be defined by going back to the start of
+the diagram, and giving another <code>Type</code> node, or the diagram can be ended,
+and the statements of the process or function can be given.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-assignment-statement">Assignment statement</h4>
+<div class="paragraph">
+<p>An assignment statement assigns one or more values to the local variables.
+Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/assignment_statement.png" alt="assignment statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The assignment statement computes the value of every <code>Expression</code> at the
+right. If there is one expression, its value is also the value to assign. If
+there are more expressions, a tuple value is constructed, combining all values
+into one tuple (see <a href="#ref-tuple-expression">Tuple expression</a> for a discussion of tuple
+values).</p>
+</div>
+<div class="paragraph">
+<p>
+At the left, a number of <code>Addressable</code> blocks define where the computed
+value is assigned to.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/addressable.png" alt="addressable">
+</div>
+</div>
+<div class="paragraph">
+<p>An <code>Addressable</code> is a variable. If the variable has a tuple type (see
+<a href="#ref-tuple-type">Tuple type</a>) a field of the tuple may be assigned only using Path 1.
+Similarly, if the variable is a list (see <a href="#ref-list-type">List type</a>) or a
+dictionary (see <a href="#ref-dictionary-type">Dictionary type</a>) assignment is done to one
+element by using Path 2. The <code>Expression</code> here is evaluated before <em>any</em>
+assignment by this statement is performed.
+Since selected elements may also have a type that allows selection, element
+selection can be repeated.</p>
+</div>
+<div class="paragraph">
+<p>After processing the element selections at the left, it is known where
+values are assigned to. If there is exactly one addressable at the left, its
+type must match with the type of the value at the right (which may be a
+constructed tuple value as explained above). The value gets copied into the
+variable (or in its element if one is selected).
+If there are several addressable values at the left, the number of values must
+be equal to the length of the tuple from the expression(s) at the right, and
+each field of the right tuple must pair-wise match with the type of the
+addressed element at the left. In the latter case, all assignments are done at
+the same moment.</p>
+</div>
+<div class="paragraph">
+<p>For a few examples, a number of variable declarations are needed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int x, y;
+real r;
+list(10) int xs;
+tuple(real v; int w) t;
+func tuple(real v; int w) (int) f;
+
+...  # Initialization of the variables omitted</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The variable declarations introduce integer variables <code>x</code> and <code>y</code>, a real
+number variable <code>r</code>, a list of 10 integers <code>xs</code>, a tuple <code>t</code> with two
+fields, and a function variable <code>f</code>.</p>
+</div>
+<div class="paragraph">
+<p>For reasons of clarity, initialization of the variables has been omitted.
+Also, expressions at the right are simple values. However, you may use all
+allowed expression operations explained in the next chapter
+(<a href="#ref-chapter-expressions">Expressions</a>) to obtain a value to assign.
+The first assignments show assignment of values to variables where there is
+one explicit value for every assigned variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x = 3;
+t = f(y);
+x, y = 4, 5;
+xs[0], t.v = x+x, r;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first assignment statement assigns 3 to <code>x</code>. The second assignment
+assigns the return value of the function call <code>f(y)</code> to tuple <code>t</code>. The
+third assignment assigns 4 to <code>x</code> and 5 to <code>y</code> at the same time. The
+fourth assignment assigns the value of <code>x+x</code> to the first element of the
+list <code>xs</code>, and the value of <code>r</code> to the <code>v</code> field of tuple <code>t</code>.</p>
+</div>
+<div class="paragraph">
+<p>The next assignments show combining or splitting of tuples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">t = r, y;
+r, x = t;
+r, x = f(y);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first assignment assigns a new value to every field of tuple <code>t</code>
+(<code>t.v</code> gets the value of <code>r</code>, while <code>t.w</code> gets the value of <code>y</code>). This
+is called <em>packing</em>, it 'packs' the sequence of values into one tuple. The
+opposite operation is demonstrated in the second assignment. The value of each
+field of <code>t</code> is assigned to a separate variable. The types of the variables
+at the left have to  pair-wise match with the field types of the tuple at the
+right. This assignment is called <em>unpacking</em>, it 'unpacks' a tuple value into
+its separate elements.
+The third assignment does the same as the second assignment, the difference is
+that the value at the right is obtained from a function call. The origin of
+the value is however irrelevant to the assignment statement.</p>
+</div>
+<div class="paragraph">
+<p>To demonstrate the order of evaluation, the following assignment, under the
+assumption that variable <code>x</code> holds value 3:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x, xs[x-1] = 7, x+2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The assignment first computes all values at the right. Since there are more
+than one expression, they are combined into a tuple:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x, xs[x-1] = (7, 5);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Next, the addressable values are calculated:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x, xs[2] = (7, 5);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Finally the values are assigned, <code>x</code> gets a new value 7, while the third
+element of <code>xs</code> gets the value of expression <code>x+2</code>.</p>
+</div>
+<div class="paragraph">
+<p>The expressions at the right as well as the expressions to select elements in
+lists and dictionaries are always evaluated using values from before the
+assignment.</p>
+</div>
+<div class="paragraph">
+<p>It is forbidden to assign the same variable or selected element more than
+once:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">x, x = 3, 3         # Error, assigned 'x' twice.
+xs[0], xs[1] = 0, 1 # Allowed, different selected elements.
+xs[0], xs[x] = 0, 1 # Allowed if x != 0 .</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-iterative-statements">Iterative statements</h4>
+<div class="paragraph">
+<p>The iterative statements are</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/iterative_statement.png" alt="iterative statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The Chi language has two statements for repeatedly executing a body (a
+sequence of statements), a <code>while</code> statement and a <code>for</code> statement.
+The former is the generic iterative statement, the latter simplifies the
+common case of iterating over a collection of values.</p>
+</div>
+<div class="paragraph">
+<p>The <code>break</code> and <code>continue</code> statements change the flow of control in the
+iterative statements.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-while-loop-statement">While loop statement</h5>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/while_statement.png" alt="while statement">
+</div>
+</div>
+<div class="paragraph">
+<p>A while loop starts with the keyword <code>while</code> with a boolean condition.
+Between the colon and the <code>end</code> keyword, the body of statements is given,
+which is executed repeatedly.</p>
+</div>
+<div class="paragraph">
+<p>Executing an iterative <code>while</code> statement starts with evaluating the boolean
+condition. If it does not hold, the <code>while</code> statement ends (and execution
+continues with the statement following the while statement). If the condition
+holds, the statements in the body are executed from start to end (unless a
+<code>break</code> or <code>continue</code> statement is executed, as explained below).
+After the last statement has been executed, the <code>while</code> statement starts
+again from the beginning, by evaluating the boolean condition again.</p>
+</div>
+<div class="paragraph">
+<p>As an example, consider the following code:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int s, i;
+
+while i &lt; 10:
+    s = s + i
+    i = i + 1
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>At first, the <code>i &lt; 10</code> condition holds, and the body of the <code>while</code>
+statement (two assignment statements) is executed.
+After the body has finished, <code>i</code> has been incremented, but is still less
+than <code>10</code>. The condition again holds, and the body is again executed, etc.
+This process continues, until the final statement of the body increments <code>i</code>
+to <code>10</code>. The condition does not hold, and execution of the <code>while</code>
+statement ends.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-for-loop-statement">For loop statement</h5>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/for_statement.png" alt="for statement">
+</div>
+</div>
+<div class="paragraph">
+<p>A common case for iterating is to execute some statements for every value in a
+collection, for example a list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs;
+int x;
+int i;
+
+while i &lt; size(xs):
+    x = xs[i]
+    ...
+    i = i + 1
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where the <code>...</code> line represents the statements that should be executed for
+each value <code>x</code> of the list. This is a very common case. Chi has a special
+statement for it, the <code>for</code> statement. It looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs;
+
+for x in xs:
+    ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This code performs the same operation, the statements represented with <code>...</code>
+are executed for each value <code>x</code> from list <code>xs</code>, but it is shorter and
+easier to write.
+The advantages are mainly a reduction in the amount of code that must be
+written.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>No need to create and update the temporary index variable <code>i</code>.</p>
+</li>
+<li>
+<p>Variable <code>x</code> is declared implicitly, no need to write a full variable
+declaration for it.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The behavior is slightly different in some circumstances.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>There is no index variable <code>i</code> that can be accessed afterwards.</p>
+</li>
+<li>
+<p>When the <code>...</code> statements modify the source variable (<code>xs</code> in the
+example), the <code>while</code> statement above uses the changed value. The <code>for</code>
+statement continues to use the original value of the source variable.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Continuing use of the original source value can be an advantage or a
+disadvantage, depending on the case. Using the new value gives more
+flexibility, keeping the old value makes the <code>for</code> statement more
+predictable, for example indices in the source variable stay valid.</p>
+</div>
+<div class="paragraph">
+<p>Besides iterating over a list with <code>for</code>, you can also iterate over element
+values of a set, or over key-value tuples of a dictionary, for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(int:int) d = {1:10, 2:20};
+
+for k, v in d:
+    writeln(&quot;%s: %s&quot;, k, v);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When iterating over a set or a dictionary, the order of the elements is
+undefined. In the above example, the first pair is either <code>(1, 10)</code> or
+<code>(2, 20)</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-break-statement">Break statement</h5>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/break_statement.png" alt="break statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>break</code> statement may only be used inside the body of a loop statement.
+When executed, the inner-most loop statement ends immediately, and execution
+continues with the first statement after the inner-most loop statement.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi"># Get a slice of the xs list, up-to the position of value x in the list
+func get_until(list int xs, int x):
+    int index;
+
+    while index &lt; size(xs):
+        if xs[index] == x:
+            break
+        end;
+        index = index + 1
+    end
+    return xs[:index]
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the example, elements of the list <code>xs</code> are inspected until an element
+with a value equal to <code>x</code> is found. At that point, the loop ends with the
+<code>break</code> statement, and the function returns a slice of the list.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-continue-statement">Continue statement</h5>
+<div class="paragraph">
+<p>Another common case when executing the body of an inner-most loop is that the
+remaining statements of the body should be skipped this time. It can be
+expressed with an <code>if</code> statement, but a <code>continue</code> statement is often
+easier.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/continue_statement.png" alt="continue statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The syntax of the continue statement is just <code>continue</code>.
+An example to demonstrate its operation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int s;
+
+for x in xs:
+    if x mod 5 == 0:
+        continue
+    end
+    s = s + x
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>for</code> statement iterates over every value in list <code>xs</code>. When the value
+is a multiple of 5 (expressed by the condition <code>x mod 5 == 0</code>), the
+<code>continue</code> is executed, which skips the remaining statements of the body of
+the <code>for</code> statement, namely the <code>s = s + x</code> assignment. The result is that
+after executing the <code>for</code> statement, variable <code>s</code> contains the sum of all
+values of the list that are not a multiple of 5.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-choice-statement">Choice statement</h4>
+<div class="paragraph">
+<p>The choice statement, also known as 'if statement', selects one alternative
+from a list based on the current value of a boolean expression. The
+alternatives are tried in turn, until a boolean expression one an alternative
+yields true. The statements of that alternative are executed, and the choice
+statement ends. The choice statement also ends when all boolean expressions
+yield false. The boolean expression of the <code>else</code> alternative always holds.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of the choice statement is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/choice_statement.png" alt="choice statement">
+</div>
+</div>
+<div class="paragraph">
+<p>Processing starts with evaluating the <code>BooleanExpression</code> behind the <code>if</code>.
+If it evaluates to <code>true</code>, the statements behind it are executed, and the
+choice statement ends.</p>
+</div>
+<div class="paragraph">
+<p>If the boolean expression behind the <code>if</code> does not hold, the sequence
+<code>elif</code> alternatives is tried. Starting from the first one, each boolean
+expression is evaluated. If it holds, the statements of that alternative are
+performed, and the choice statement ends. If the boolean expression does not
+hold, the next <code>elif</code> alternative is tried.</p>
+</div>
+<div class="paragraph">
+<p>When there are no <code>elif</code> alternatives or when all boolean expressions of
+the <code>elif</code> alternatives do not hold, and there is an <code>else</code> alternative,
+the statements behind the <code>else</code> are executed and the choice statement ends.
+If there is no <code>else</code> alternative, the choice statement ends without
+choosing any alternative.</p>
+</div>
+<div class="paragraph">
+<p>An example with just one alternative:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if x == 1:
+    x = 2
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>which tests for <code>x == 1</code>. If it holds, <code>x = 2</code> is performed, else no
+alternative is chosen.</p>
+</div>
+<div class="paragraph">
+<p>An longer example with several alternatives:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if x == 1:
+     y = 5
+elif x == 2:
+    y = 6; x = 6
+else:
+    y = 7
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This choice statement first tests whether <code>x</code> is equal to <code>1</code>. If it is,
+the <code>y = 5</code> statement is executed, and the choice statement finishes. If the
+first test fails, the test <code>x == 2</code> is computed. If it holds, the statements
+<code>y = 6; x = 6</code> are performed, and the choice statement ends. If the second
+test also fails, the <code>y = 7</code> statement is performed.</p>
+</div>
+<div class="paragraph">
+<p>The essential points of this statement are</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The choice is computed now, you cannot wait for a condition to become true.</p>
+</li>
+<li>
+<p>Each alternative is tried from the top down, until the first expression
+that yields true.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The second point also implies that for an alternative to be chosen, the
+boolean expressions of all previous alternatives have to yield false.</p>
+</div>
+<div class="paragraph">
+<p>In the above example, while executing the <code>y = 7</code> alternative, you
+know that <code>x</code> is neither <code>1</code> nor <code>2</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-sub-process-statements">Sub-process statements</h4>
+<div class="paragraph">
+<p>The sub-process statements deal with creating and managing of new processes.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/subprocess_statement.png" alt="subprocess statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>RunStartStatement</code> block creates new processes (see
+<a href="#ref-run-and-start-statements">Run and start statements</a> for details), while the <code>FinishStatement</code>
+waits for a process to end (further explanation at <a href="#ref-finish-statement">Finish statement</a>).</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-run-and-start-statements">Run and start statements</h5>
+<div class="paragraph">
+<p>The <code>run</code> and <code>start</code> commands take a sequence of process instance as
+their argument.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/run_start.png" alt="run start">
+</div>
+</div>
+<div class="paragraph">
+<p>Both statements start all instances listed in the sequence. The <code>start</code>
+statement ends directly after starting the processes, while the <code>run</code>
+statement waits until all the started instances have ended.
+Using <code>run</code> is generally recommended for creating new processes.</p>
+</div>
+<div class="paragraph">
+<p>
+
+A process instance has the following syntax.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/process_instance.png" alt="process instance">
+</div>
+</div>
+<div class="paragraph">
+<p>The elementary process instance is created using Path 1. It consists of a
+process name (which must be one of the names of the
+<a href="#ref-process-definitions">Process definitions</a>), followed by a sequence of actual parameters
+for the process between parentheses. The number of actual parameters and their
+types must match pair-wise with the number and type of the formal parameters
+of the referenced process definition.
+Channel directions of the formal parameters must be a sub-set of the channel
+directions of the actual parameters.</p>
+</div>
+<div class="paragraph">
+<p>The optional assignment of the process to a process variable (which must be of
+type <code>inst</code>, see <a href="#ref-inst-type">Instance type</a>) allows for checking whether the
+started process has ended, or for waiting on that condition in a <code>select</code>
+statement (explained in <a href="#ref-select-statement">Select statement</a>), or with a <code>finish</code>
+statement (explained in <a href="#ref-finish-statement">Finish statement</a>).</p>
+</div>
+<div class="paragraph">
+<p>For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">chan c;
+inst p, q;
+
+run P(18, c), Q(19, c);
+start p = P(18, c), q = Q(19, c);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>First two processes are completely run, namely the instances <code>P(18, c)</code>, and
+<code>Q(19, c)</code>. When both have ended, the <code>start</code> statement is executed, which
+starts the same processes, and assigned the <code>P</code> process instance to instance
+variable <code>p</code> and the <code>Q</code> process instance to variable <code>q</code>. After
+starting the processes, the <code>start</code> ends. Unless one of started processes
+has already ended, in the statement following the <code>start</code>, three processes
+are running, namely the process that executed the start statement, and the two
+started process instances referenced by variables <code>p</code> and <code>q</code>. (There may
+be more processes of course, created either before the above statements were
+executed, or the <code>P</code> or <code>Q</code> process may have created more processes.)</p>
+</div>
+<div class="paragraph">
+<p>Path 2 of the <code>ProcessInstance</code> diagram is used to construct many new
+processes by means of an <code>unwind</code> loop.
+Each value in the <code>Expression</code> gets assigned to the iterator variable
+sequence of <code>VariableName</code> blocks (and this may be done several times as the
+syntax supports several <code>Expression</code> loops). For each combination of
+assignments, the process instances behind the colon are created. The <code>end</code>
+keyword denotes the end of the <code>unwind</code>.</p>
+</div>
+<div class="paragraph">
+<p>Typical use of <code>unwind</code> is to start many similar processes, for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs = [1, 2]
+
+run
+    unwind i in range(5),
+           j in range(3),
+           x in xs: P(i, j, x)
+    end;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This <code>run</code> statement runs 5*3*2 processes: <code>P(0, 0, 1)</code>,
+<code>P(0, 0, 2)</code>, <code>P(0, 1, 1)</code>, &#8230;&#8203;, <code>P(0, 2, 2)</code>, <code>P(1, 0, 1)</code>, &#8230;&#8203;,
+<code>P(4, 2, 2)</code>.</p>
+</div>
+<div class="paragraph">
+<p>Both the <code>run</code> and the <code>start</code> statements can always instantiate new
+processes that have no exit type specified.
+(see <a href="#ref-process-definitions">Process definitions</a> for details about exit types in process
+definitions). If the definition containing the sub-process statement has an
+exit type, the statements can also instantiate processes with the same exit
+type.</p>
+</div>
+<div class="paragraph">
+<p>This requirement ensures that all exit statements in a model simulation give
+exit values of the same type.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-finish-statement">Finish statement</h5>
+<div class="paragraph">
+<p>The <code>finish</code> statement allows waiting for the end of a process instance.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.
+Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/finish_statement.png" alt="finish statement">
+</div>
+</div>
+<div class="paragraph">
+<p>Each process variable must be of type <code>inst</code> (see <a href="#ref-inst-type">Instance type</a> for
+details). The statement ends when all referenced process instances have ended.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">chan bool c;
+inst p, q;
+
+start p = P(18, c), q = Q(19, c);
+finish p, q;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>During the <code>start</code> statement (see <a href="#ref-run-and-start-statements">Run and start statements</a>), instance
+variables <code>p</code> and <code>q</code> get a process instance assigned (this may also
+happen in different <code>start</code> statements).
+The <code>finish</code> statement waits until both process instances have ended.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-communication-statements">Communication statements</h4>
+<div class="paragraph">
+<p>Communication with another process is the only means to forward information
+from one process to another processes, making it the primary means to create
+co-operating processes in the modeled system.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.</p>
+</div>
+<div class="paragraph">
+<p>All communication is point-to-point (from one sender to one receiver) and
+synchronous (send and receive occur together). A communication often exchanges
+a message (a value), but communication without exchange of data is also
+possible (like waving 'hi' to someone else, the information being sent is 'I
+am here', but that information is already implied by the communication itself).
+The latter form of communication is called <em>synchronization</em>.</p>
+</div>
+<div class="paragraph">
+<p>Send and receive does not specify the remote process directly, instead a
+channel is used (see <a href="#ref-channel-type">Channel type</a> and <a href="#ref-channel-expression">Channel expressions</a>
+sections for more informations about channels and how to create them).
+Using a channel increases flexibility, the same channel can be used by several
+processes (allowing communication with one of them). Channels can also be
+created and exchanged during execution, for even more flexibility.</p>
+</div>
+<div class="paragraph">
+<p>Setting up a communication channel between two processes is often done in the
+following way:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">chan void sync;   # Synchronization channel
+chan int  dch;    # Channel with integer number messages
+
+run P(sync, dch), Q(sync, dch);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In a parent process, two channels are created, a synchronization channel
+<code>sync</code>, and a communication channel with data called <code>dch</code>. The channel
+values are given to processes <code>P</code> and <code>Q</code> through their formal parameters.</p>
+</div>
+<div class="paragraph">
+<p>The communication statements are</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/communication_statement.png" alt="communication statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The elementary communication statements for sending and receiving at a single
+channel are the <a href="#ref-send-statement">Send statement</a> and the <a href="#ref-receive-statement">Receive statement</a>.
+The <a href="#ref-select-statement">Select statement</a> is used for monitoring several channels and
+conditions at the same time, until at least one of them becomes available.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-send-statement">Send statement</h5>
+<div class="paragraph">
+<p>The send statement send signals or data away through a channel.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.
+It has the following syntax:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/send_statement.png" alt="send statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The statement takes a channel value (derived from
+<code>ChannelExpression</code>), and waits until another process can receive on the
+same channel. When that happens, and the channel is a synchronization channel,
+a signal 'Communication has occurred' is being sent, if the channel also
+carries data, the <code>Expression</code> value is computed and sent to the other
+process.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc P(chan void a, chan! int b):
+    a!;
+    b!21;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Process <code>P</code> takes two parameters, a synchronization channel locally called
+<code>a</code> and a outgoing channel called <code>b</code> carrying integer values.
+In the process body, it first synchronizes over the channel stored in <code>a</code>,
+and then sends the value <code>21</code> of the channel stored in <code>b</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-receive-statement">Receive statement</h5>
+<div class="paragraph">
+<p>The receive statement receives signals or data from a channel.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.
+It has the following syntax:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/receive_statement.png" alt="receive statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The statement takes a channel value (derived from the <code>ChannelExpression</code>),
+and waits until another process can send on the same channel. For
+synchronization channels, it receives just a signal that the communication has
+occurred, for channels carrying data, the data value is received and stored in
+the variable indicated by <code>Addressable</code>.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc Q(chan void a, chan int b):
+    int x;
+
+    a?;
+    b?x;
+    writeln(&quot;%s&quot;, x);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Process <code>Q</code> takes a synchronization channel called <code>a</code> and a data channel
+for integer values called <code>b</code> as parameters.
+The process first waits for a synchronization over channel <code>a</code>, and then
+waits for receiving an integer value over channel <code>b</code> which is stored in
+local variable <code>x</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-select-statement">Select statement</h5>
+<div class="paragraph">
+<p>The <a href="#ref-send-statement">Send statement</a> and the <a href="#ref-receive-statement">Receive statement</a> wait for
+communication over a single channel. In some cases, it is unknown which
+channel will be ready first. Additionally, there may be time-dependent
+internal activities that must be monitored as well.
+The select statement is the general purpose solution for such cases.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.</p>
+</div>
+<div class="paragraph">
+<p>Its syntax is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/select_statement.png" alt="select statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The statement has one or more <code>SelectCondition</code> alternatives that are all
+monitored. The first alternative is prefixed with <code>select</code> to denote it is a
+the start of a select statement, the other alternatives each start with
+<code>alt</code> (which is an abbreviation of 'alternative').</p>
+</div>
+<div class="paragraph">
+<p>The statement monitors all conditions simultaneously, waiting for at least one
+to become possible. At that moment, one of the conditions is selected to be
+executed, and the select statement ends.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of a <code>SelectCondition</code> is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/select_condition.png" alt="select condition">
+</div>
+</div>
+<div class="paragraph">
+<p>In its simplest form, a <code>SelectCondition</code> is a <code>SelectAlternative</code> (taking
+Path 1). At Path 2, the condition is eventually also an <code>SelectAlternative</code>,
+but prefixed with an <code>unwind</code> construct, and with an additional <code>end</code>
+keyword at the end to terminate the unwind.</p>
+</div>
+<div class="paragraph">
+<p>The unwind construct allows for a compact notation of a large number of
+alternatives that must be monitored. Examples are provided below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/select_alternative.png" alt="select alternative">
+</div>
+</div>
+<div class="paragraph">
+<p>Using Path 1, a <code>SelectAlternative</code> can be a <a href="#ref-send-statement">Send statement</a> or a
+<a href="#ref-receive-statement">Receive statement</a>, which may optionally have a
+<code>BooleanExpression</code> condition prefix. Path 2 allows for a condition without
+a send or receive statement.</p>
+</div>
+<div class="paragraph">
+<p>The alternative checks the condition and monitors the channel. If the
+condition holds <em>and</em> the channel has a communication partner, the alternative
+can be chosen by the select statement. (Of course, omitting a condition skips
+the check, and not specifying a send or receive statement skips monitoring of
+the channel.)
+When an alternative is chosen by the select statement, the send or receive
+statement are performed (if it was present). If additional statements were
+given in the alternative using Path 3, they are executed after the
+communication has occurred (if a send or receive was present).</p>
+</div>
+<div class="paragraph">
+<p>A few examples to demonstrate use of the select statement:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">timer t = timer(5.2);
+
+select
+    a?
+alt
+    b!7:
+        writeln(&quot;7 sent&quot;)
+alt
+    ready(t):
+        writeln(&quot;done&quot;)
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This select waits until it can receive a signal from channel <code>a</code>, it can
+send value <code>7</code> over channel <code>b</code>, or until <code>ready(t)</code> holds (which
+happens <code>5.2</code> time units after starting the <code>select</code>, see
+<a href="#tut-using-timers">Timers</a> for details). If <code>b!7</code> was selected, the
+<code>writeln("7 sent")</code> is executed after the communication over channel <code>b</code>.
+If the <code>ready(t)</code> alternative is chosen, the <code>writeln("done")</code> is
+executed.</p>
+</div>
+<div class="paragraph">
+<p>A buffer can be specified with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs;
+int x;
+
+select
+    a?x:
+        xs = xs + [x]
+alt
+    not empty(xs), b!xs[0]:
+        xs = xs[1:]
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The select either receives a value through channel <code>a</code>, or it sends the
+first element of list <code>xs</code> over channel <code>b</code> if the list is not empty (the
+condition must hold and the channel must be able to send an item at the same
+time to select the second alternative).</p>
+</div>
+<div class="paragraph">
+<p>After communication has been performed, the first alternative appends the
+newly received value <code>x</code> to the list (the received value is stored in <code>x</code>
+before the assignment is executed). In the second alternative, the assignment
+statement drops the first element of the list (which just got sent away over
+channel <code>b</code>).</p>
+</div>
+<div class="paragraph">
+<p>The <code>unwind</code> loop 'unwinds' alternatives, for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list(5) chan int cs;
+int x;
+
+select
+    unwind i, c in enumerate(cs):
+        c?x:
+            writeln(&quot;Received %s from channel number %d&quot;, x, i)
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here <code>cs</code> is a list  of channels, for example <code>list(5) chan int cs</code>. (See
+<a href="#ref-list-type">List type</a> for details about lists.) The <code>unwind</code> iterates over
+the <code>enumerate(cs)</code> (see <a href="#ref-list-expression">List expressions</a> for details about
+<code>enumerate</code>), assigning the index and the channel to local <code>i</code> and <code>c</code>
+variables. The <code>SelectAlternative</code> uses the variables to express the actions
+to perform (wait for a receive, and output some text saying that a value has
+been received).</p>
+</div>
+<div class="paragraph">
+<p>The above is equivalent to (if list <code>cs</code> has length 5):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">select
+    cs[0]?x:
+        writeln(&quot;Received %s from channel number %d&quot;, x, 0)
+alt
+    cs[1]?x:
+        writeln(&quot;Received %s from channel number %d&quot;, x, 1)
+
+...
+
+alt
+    cs[4]?x:
+        writeln(&quot;Received %s from channel number %d&quot;, x, 4)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>unwind</code> however works for any length of list <code>cs</code>. In addition, the
+<code>unwind</code> allows for nested loops to unfold for example
+<code>list list bool ds</code>, or to send one of several values over one of several
+channels.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-other-statements">Other statements</h4>
+<div class="paragraph">
+<p>Finally, there are a number of other useful statements.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/other_statements.png" alt="other statements">
+</div>
+</div>
+<div class="paragraph">
+<p>The <a href="#ref-delay-statement">Delay statement</a> waits for the given amount of time units,
+the <a href="#ref-write-statement">Write statement</a> outputs text to the screen or a file,
+the <a href="#ref-close-statement">Close statement</a> closes a file,
+the <a href="#ref-return-statement">Return statement</a> returns a value from a function.
+the <a href="#ref-exit-statement">Exit statement</a> ends the execution of all processes, and
+the <a href="#ref-pass-statement">Pass statement</a> does nothing.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-delay-statement">Delay statement</h5>
+<div class="paragraph">
+<p>The <code>delay</code> statement is useful to wait some time.
+The statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>.
+Its syntax is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/delay_statement.png" alt="delay statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>IntegerExpression</code> or <code>RealExpression</code> is evaluated, and is the
+amount of time that the
+statement waits. The value of the expression is computed only at the start, it
+is not evaluated while waiting. Changes in its value has thus no effect.
+A negative value ends the statement immediately, you cannot go back in time.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">delay 1.5   # Delay for 1.5 time units.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-write-statement">Write statement</h5>
+<div class="paragraph">
+<p>The write statement is used to output text to the screen or to a file.
+Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/write_statement.png" alt="write statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <em>format string</em> at 2 is a literal string value (further explained at
+<a href="#ref-string-expression">String expressions</a>) which defines what gets written.
+Its text is copied to the output, except for two types of patterns which are
+replaced before being copied. Use of the <code>writeln</code> (write line) keyword
+causes an additional <code>\n</code> to be written afterwards.</p>
+</div>
+<div class="paragraph">
+<p>The first group of pattern are the back-slash patterns. They all start with
+the <code>\</code> character, followed by another character that defines the character
+written to the output. The back-slash patterns are listed in the table below.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Pattern</th>
+<th class="tableblock halign-left valign-top">Replaced by</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\n</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The new-line character (U+000A)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The tab character (U+0009)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\"</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The double-quote character (U+0022)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>\\</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The back-slash character (U+005C)</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The second group of patterns are the percent patterns. Each percent pattern
+starts with a <code>%</code> character. It is (normally) replaced by the (formatted)
+value of a corresponding expression listed after the format string (the first
+expression is used as replacement for the first percent pattern, the second
+expression for the second pattern, etc). How the value is formatted depends on
+the <em>format specifier</em>, the first letter after the percent character. Between
+the percent character and the format specifier may be a <em>format definition</em>
+giving control on how the value is output.</p>
+</div>
+<div class="paragraph">
+<p>The format definition consists of five parts, each part is optional.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A <code>-</code> character, denoting alignment of the value to the left. Cannot be
+combined with a <code>0</code>, and needs a <em>width</em>.</p>
+</li>
+<li>
+<p>A <code>+</code> character, denoting the value with always be printed with a sign,
+only for formatting decimal integers, and real numbers.</p>
+</li>
+<li>
+<p>A <code>0</code> character, denoting the value will be prefixed with zeros, only for
+integer numbers. Cannot be combined with <code>-</code>, and needs a <em>width</em>.</p>
+</li>
+<li>
+<p>A <em>width</em> as decimal number, denoting the minimal amount of space used for
+the value. The value will be padded with space (or zeros if the <code>0</code> part
+has been specified).</p>
+</li>
+<li>
+<p>A <code>.</code> and a <em>precision</em> as decimal number, denoting the number of digits
+to use for the fraction, only for real numbers.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The format definition is a single letter, the table below lists them and their
+function.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Definition</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output boolean value.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>d</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output integer value as decimal number.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code>, <code>X</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output integer value as hexadecimal number.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>f</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value as number with a fraction.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>e</code>, <code>E</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value in exponential notation.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>g</code>, <code>G</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output real value either as <code>f</code> or as <code>e</code> (<code>E</code>) depending on the value</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>s</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output value as a string (works for every printable value)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>%</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output a <code>%</code> character</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-close-statement">Close statement</h5>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/close_statement.png" alt="close statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>close</code> statement takes a value of type <code>file</code> as argument (see
+<a href="#ref-file-type">File type</a> for details about the file type). It closes the given
+file, which means that the file is no longer available for read or write. In
+case data was previously written to the file, the <code>close</code> statement ensures
+that the data ends up in the file itself.</p>
+</div>
+<div class="paragraph">
+<p>Note that a close of a file is global in the system, none of the processes can
+use the file any longer.</p>
+</div>
+<div class="paragraph">
+<p>In <a href="#tut-reading-from-file">Reading from a file</a> and <a href="#tut-writing-to-file">Writing to a file</a>, use of the
+close statement is shown.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-return-statement">Return statement</h5>
+<div class="paragraph">
+<p>The return statement may only be used in a <a href="#ref-function-definitions">Function definitions</a>.
+Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/return_statement.png" alt="return statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The statement starts with a <code>return</code> keyword, followed by one or more
+(comma-separated) expressions that form the value to return to the caller of
+the function.</p>
+</div>
+<div class="paragraph">
+<p>The value of the expressions are calculated, and combined to a single return
+value. The type of the value must match with the return type of the function.
+Execution of the function statements stops (even when inside a loop or in an
+alternative of an <code>if</code> statement), and the computed value is returned to the
+caller of the function.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">return 4          # Return integer value 4 to the caller.
+
+return true, 3.7  # Return value of type tuple(bool b; real r).</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-exit-statement">Exit statement</h5>
+<div class="paragraph">
+<p>The <code>exit</code> statement may only be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>. Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/exit_statement.png" alt="exit statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The exit statement allows for immediately stopping the current model
+simulation. The statement may be used in <a href="#ref-process-definitions">Process definitions</a> and
+<a href="#ref-model-definitions">Model definitions</a>. If arguments are provided, they become the exit
+value of the model simulation. Such values can be processed further in an
+<a href="#tut-experiment">Simulating several scenarios</a>, see also <a href="#ref-xper-definitions">Experiment definitions</a> on how to run a
+model in an experiment.</p>
+</div>
+<div class="paragraph">
+<p>The type of the combined arguments must match with the exit type of the
+process or model that uses the statement. If no arguments are given, the exit
+type must be a <code>void</code> type (see also <a href="#ref-void-type">Void type</a>).</p>
+</div>
+<div class="paragraph">
+<p>If an experiment is running, execution continues by returning from the model
+instantiation call. Otherwise, the simulation as a whole is terminated.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-pass-statement">Pass statement</h5>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/pass_statement.png" alt="pass statement">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>pass</code> statement does nothing. Its purpose is to act as a place holder
+for a statement at a point where there is nothing useful to do (for example to
+make an empty process), or to
+explicitly state nothing is being done at some point:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">if x == 3:
+    pass
+else:
+    x = x + 1
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, <code>pass</code> is used to explicitly state that nothing is done when <code>x == 3</code>.
+Such cases are often a matter of style, usually it is possible to rewrite
+the code and eliminate the <code>pass</code> statement.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-expressions">Expressions</h3>
+<div class="paragraph">
+<p>Expressions are computations to obtain a value.
+The generic syntax of an expression is shown below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/generic_expression.png" alt="generic expression">
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As shown in Path 1, a name may be used in an expression. It must refer to a
+value that can be used in an expression.
+Names are explained further at <a href="#ref-lexical-names">Names</a>.</p>
+<div class="paragraph">
+<p>The first four entries are quite normal, function names can be used for
+variables with a function type (see <a href="#ref-function-type">Function type</a>) and process
+names for variables with a process type (see <a href="#ref-process-type">Process type</a>). The
+latter two are mainly useful as actual parameters of functions or processes.</p>
+</div>
+</li>
+<li>
+<p>Path 2 states that you can write parentheses around an expression. Its main
+use is to force a different order of applying the unary and binary operators
+(see <a href="#ref-operator-priorities">Operator priorities</a>). Parentheses may also be used to
+clarify the meaning of a complicated expression.</p>
+</li>
+<li>
+<p>Path 3 gives access to the other parts of expressions.
+<a href="#ref-typed-expression">Typed expressions</a> gives the details about typed expressions.</p>
+</li>
+</ul>
+</div>
+<div class="sect3">
+<h4 id="ref-typed-expression">Typed expressions</h4>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/typed_expression.png" alt="typed expression">
+</div>
+</div>
+<div class="paragraph">
+<p>The number of operators in expressions is quite large. Also, each node has an
+associated type, and the allowed operators depend heavily on the types of the
+sub-expressions. To make expressions easier to access, they have been split.
+If possible the (result) type is leading, but in some cases (like the
+<code>ReadExpression</code> for example) this is not feasible.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The expressions with a boolean type are denoted by the <code>BooleanExpression</code>
+block and explained further in <a href="#ref-boolean-expression">Boolean expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with an integer type are denoted by the <code>IntegerExpression</code>
+block and explained further in <a href="#ref-integer-expression">Integer expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a real number type are denoted by the <code>RealExpression</code>
+block and explained further in <a href="#ref-real-expression">Real number expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a string type are denoted by the <code>StringExpression</code>
+block and explained further in <a href="#ref-string-expression">String expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a list type are denoted by the <code>ListExpression</code>
+block and explained further in <a href="#ref-string-expression">String expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a set type are denoted by the <code>SetExpression</code>
+block and explained further in <a href="#ref-set-expression">Set expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a dictionary type are denoted by the
+<code>DictionaryExpression</code> block and explained further in
+<a href="#ref-dictionary-expression">Dictionary expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a tuple type are denoted by the <code>TupleExpression</code>
+block and explained further in <a href="#ref-tuple-expression">Tuple expression</a>.</p>
+</li>
+<li>
+<p>The expressions with a file handle type are denoted by the
+<code>FileExpression</code> block and explained further in
+<a href="#ref-file-expression">File handle expressions</a>.</p>
+</li>
+<li>
+<p>The function to read values from an external source is shown in the
+<code>ReadExpression</code> block, and further discussed in
+<a href="#ref-read-expression">Read expression</a>.</p>
+</li>
+<li>
+<p>The expressions with a timer type are denoted by the <code>TimerExpression</code>
+block and explained further in <a href="#ref-timer-expression">Timer expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a channel type are denoted by the <code>ChannelExpression</code>
+block and explained further in <a href="#ref-channel-expression">Channel expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a distribution type are denoted by the
+<code>DistributionExpression</code> block and explained further
+in <a href="#ref-distribution-expression">Distribution expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with a process type are denoted by the <code>ProcessExpression</code>
+block and explained further in <a href="#ref-process-expression">Process expressions</a>.</p>
+</li>
+<li>
+<p>The expressions with an instance type are denoted by the
+<code>InstanceExpression</code> block and explained further in
+<a href="#ref-instance-expression">Instance expressions</a>.</p>
+</li>
+<li>
+<p>The expressions that convert one type to another are denoted by the
+<code>CastExpression</code> block, and explained further in
+<a href="#ref-cast-expression">Cast expressions</a>.</p>
+</li>
+<li>
+<p>The expressions that perform a function call are denoted by the
+<code>FunctionCallExpression</code> block, and explained further in
+<a href="#ref-functioncall-expression">Function call expressions</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-enum-value-expression">Enumeration value</h4>
+<div class="paragraph">
+<p>Enumeration values may be used as literal value in an expression</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/enum_value.png" alt="enum value">
+</div>
+</div>
+<div class="paragraph">
+<p>See <a href="#ref-enum-definitions">Enumeration definitions</a> for a discussion about enumeration definitions
+and enumeration values.</p>
+</div>
+<div class="paragraph">
+<p>There are two binary operators for enumeration values.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>E</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Two enumeration values from the same enumeration definition <strong>E</strong> can be
+compared against each other for equality (or in-equality).
+Example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">enum FlagColours  = {red, white, blue};
+
+...
+
+bool same = (red == white);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-boolean-expression">Boolean expressions</h4>
+<div class="paragraph">
+<p>The literal values for the boolean data type are</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/bool_expression.png" alt="bool expression">
+</div>
+</div>
+<div class="paragraph">
+<p>The values <code>true</code> and <code>false</code> are also the only available values of the
+boolean data type.</p>
+</div>
+<div class="paragraph">
+<p>The <code>not</code> operation is the only boolean unary operator.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is inverted.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <code>and</code>, the <code>or</code>, and the equality tests are available for boolean
+values.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>and</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Both operands hold</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>or</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">At least one operand holds</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-integer-expression">Integer expressions</h4>
+<div class="paragraph">
+<p>The syntax of an integer literal number is (at character level)</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_integer_number.png" alt="literal integer number">
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This diagram works at lexical level (at the level of single
+characters), white space or comments are not allowed between elements in this
+diagram.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>An integer number is either <code>0</code>, or a sequence of decimal digits, starting
+with a non-zero digit.</p>
+</div>
+<div class="paragraph">
+<p>There are two unary operators on integer numbers.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is negated.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is copied.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>With the unary <code>-</code> operation, the sign of the operand gets toggled. The
+<code>+</code> unary operation simply copies its argument.</p>
+</div>
+<div class="paragraph">
+<p>There are many binary operations for integer numbers, see the table below.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Integer addition</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Integer subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Integer multiplication</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>/</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Real division</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>div</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Integer divide operation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>mod</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Modulo operation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>^</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Power operation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The divide operator <code>/</code> and the power operator <code>^</code> always gives a real
+result, integer division is performed with <code>div</code>. The operation always rounds
+down, that is <strong>a</strong> <code>div</code> <strong>b</strong> == <code>floor</code>(<strong>a</strong> <code>/</code> <strong>b</strong>) for all integer
+values <strong>a</strong> and <strong>b</strong>. The <code>mod</code> operation returns the remainder from the
+<code>div</code>, that is <strong>a</strong> <code>mod</code> <strong>b</strong> == <strong>a</strong> - <strong>b</strong> * (<strong>a</strong> <code>div</code> <strong>b</strong>). The
+table below gives examples. For clarity, the sign of the numbers is explicitly
+added everywhere.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Example</th>
+<th class="tableblock halign-left valign-top">Result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 div +4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(+7/+4) = floor(+1.75) = +1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 mod +4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">+3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 - +4 * (+7 div +4) = +7 - +4 * +1 = +7 - +4 = +3</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 div -4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(+7/-4) = floor(-1.75) = -2</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 mod -4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+7 - -4 * (+7 div -4) = +7 - -4 * -2 = +7 - +8 = -1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 div +4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(-7/+4) = floor(-1.75) = -2</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 mod +4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 - +4 * (-7 div +4) = -7 - +4 * -2 = -7 - -8 = +1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 div -4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">+1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>floor(-7/-4) = floor(+1.75) = +1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 mod -4</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">-3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-7 - -4 * (-7 div -4) = -7 - -4 * +1 = -7 - -4 = -3</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The Chi simulator uses 32 bit integer variables, which means that only values
+from -2,147,483,647 to 2,147,483,647 (with an inclusive upper bound) can be
+used. Using a value outside the valid range will yield invalid results.
+Sometimes such values are detected and reported.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+The technical minimum value for integers is -2,147,483,648, but this
+number cannot be entered as literal value due to parser limitations.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-real-expression">Real number expressions</h4>
+<div class="paragraph">
+<p>Real numbers are an important means to express values in the contiguous domain.
+The type of a real number expression is a <code>real</code> type, see
+<a href="#ref-real-type">Real type</a> for more information about the type.
+The syntax of real number values is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/real_number_values.png" alt="real number values">
+</div>
+</div>
+<div class="paragraph">
+<p>There are two ways to construct real numbers, by writing a literal real
+number, or by using <code>time</code> which returns the current time in the model.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of a literal real number (at character level) is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/lexical_real_number.png" alt="lexical real number">
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This diagram works at lexical level (at the level of single
+characters), white space or comments are not allowed between elements in this
+diagram.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>A literal real number starts with one or more digits, and then either a dot or
+an exponent. In the former case, an exponent is allowed as well. Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">3.14
+0.314e1
+314E-2</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A real number <strong>always</strong> has either a dot character, or an exponent notation in
+the number.</p>
+</div>
+<div class="paragraph">
+<p>Many of the integer operations can also be performed on real numbers. The unary
+operators are the same, except for the type of the argument.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is negated.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>op</strong> value is copied.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>With the unary <code>-</code> operation, the sign of the operand gets toggled. The
+<code>+</code> unary operation simply copies its argument.</p>
+</div>
+<div class="paragraph">
+<p>The binary operators on real numbers is almost the same as the binary operators
+on integer numbers. Only the <code>div</code> and <code>mod</code> operations are not here.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Addition</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Multiplication</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>/</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Real division</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>^</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Power operation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int,real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>With these operations, one of the operands has to be a real number value,
+while the other operand can be either an integer value or a real number value.</p>
+</div>
+<div class="paragraph">
+<p>The standard library functions for real numbers contain a lot of math
+functions. They can be found in <a href="#ref-real-stdlib">Real number functions</a>.</p>
+</div>
+<div class="paragraph">
+<p>The Chi simulator uses <a href="http://en.wikipedia.org/wiki/IEEE_floating_point">64-bit IEEE 754 floating point</a>
+numbers to represent real
+number values. Using a value outside the valid range of this format will yield
+invalid results. Sometimes such values are detected and reported.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-string-expression">String expressions</h4>
+<div class="paragraph">
+<p>Strings are sequences of characters. Their most frequent use is to construct
+text to output to the screen. A string literal is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/lexical_string_literal.png" alt="lexical string literal">
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+This diagram works at lexical level (at the level of single
+characters), white space or comments are not allowed between elements in this
+diagram.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>A string literal starts with a quote character <code>"</code>, and ends with another
+quote character. In between, you may have a sequence of characters. Most
+characters can be written literally (eg write a <code>a</code> to get an 'a' in the
+string). The exceptions are a backslash <code>\</code>, a quote <code>"</code>, a TAB, and a NL
+(newline) character. For those characters, write a backslash, followed by
+<code>\</code>, <code>"</code>, <code>t</code>, or <code>n</code> respectively. (A TAB character moves the cursor
+to the next multiple of 8 positions at a line, a NL moves the cursor to the
+start of the next line.)</p>
+</div>
+<div class="paragraph">
+<p>Strings have the following binary expressions.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Concatenation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int, int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing with step <code>1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int, int, int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less than</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&lt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for less or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger or equal</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>&gt;</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for bigger than</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <strong>concatenation</strong> operator joins two strings (<code>"a" + "bc"</code> gives <code>"abc"</code>).</p>
+</div>
+<div class="paragraph">
+<p>The <strong>element access</strong> and <strong>slicing</strong> operators use numeric indices to denote a
+character in the string. First character has index value <code>0</code>, second
+character has index <code>1</code>, and so on. Negative indices count from the back of
+the string, for example index value <code>-1</code> points to the last character of a
+string.
+Unlike lists, both the <strong>element access</strong> and the <strong>slicing</strong> operators return a
+string. The former constructs a string with only the indicated character,
+while the latter constructs a sub-string where the first character is at index
+<strong>low</strong>, the second character at index <strong>low</strong> + <strong>step</strong>, and so on, until
+index value <strong>high</strong> is reached or crossed. That final character is not included
+in the result (that it, the <strong>high</strong> boundary is excluded from the result).
+If <strong>low</strong> is omitted, it is 0, if <strong>high</strong> is omitted, it is the length of the
+string (<code>size(</code> <strong>lhs</strong> <code>)</code>). If <strong>step</strong> is omitted, it is <code>1</code>.
+A few examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">string s = &quot;abcdef&quot;;
+
+s[4]        # results in &quot;e&quot;
+s[2:4]      # results in &quot;cd&quot;
+s[1::2]     # results in &quot;bdf&quot;
+s[-1:0:-2]  # results in &quot;fdb&quot;
+s[-1:-7:-1] # results in &quot;fedcba&quot;
+s[:4]       # results in &quot;abcd&quot;
+s[-1:]      # results in &quot;f&quot; (from the last character to the end)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the comparison operations, strings use lexicographical order.</p>
+</div>
+<div class="paragraph">
+<p>There are also a few standard library functions on strings, see
+<a href="#ref-string-stdlib">String functions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>Note that length of the string is not the same as the number of characters
+needed for writing the string literal:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">size(&quot;a&quot;)  # results in 1, string is 1 character long (namely 'a').
+size(&quot;\n&quot;) # results in 1, string contains one NL character.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-list-expression">List expressions</h4>
+<div class="paragraph">
+<p>Lists are very versatile data structures, the Chi language has a large number
+of operations and functions for them.</p>
+</div>
+<div class="paragraph">
+<p>The most elementary list expression is a literal list. It has the following
+syntax.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_list.png" alt="literal list">
+</div>
+</div>
+<div class="paragraph">
+<p>The first line shows the syntax of an empty list. The <code>Type</code> block denotes
+the element type of the list, for example <code>&lt;int&gt;[]</code> is an empty list of
+integer values.</p>
+</div>
+<div class="paragraph">
+<p>The second line shows how to write a non-empty literal list value. It is a
+comma-separated sequence of expressions surrounded by square brackets.
+The type of all expressions must be the same, and this is also the element type
+of the list.</p>
+</div>
+<div class="paragraph">
+<p>Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs;
+list int ys = &lt;int&gt;[];
+list int zs = [1, 4, 28];</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>ys</code> is assigned an empty list with integer element type.
+Since an empty list is the default value of a variable, <code>xs</code> has the same
+value. Variable <code>zs</code> is initialized with a list holding three elements.</p>
+</div>
+<div class="paragraph">
+<p>Two list values are equal when they have the same number of element values,
+and each value is pair-wise equal.</p>
+</div>
+<div class="paragraph">
+<p>Lists have no unary operators, the binary operators of lists are</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int, int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing with step <code>1</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int, int, int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Slicing</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Concatenation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">List subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <strong>element access</strong> operator '<strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code> ' indexes with
+zero-based positions, for example <code>xs[0]</code>
+retrieves the first element value, <code>xs[1]</code> retrieves the second value, etc.
+Negative indices count from the back of the list, <code>xs[-1]</code> retrieves the last
+element of the list (that is, <code>xs[size(xs)-1]</code>), <code>xs[-2]</code> gets the second
+to last element, ect. It is not allowed to index positions that do not exist.
+Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs = [4, 7, 18];
+int x;
+
+x = xs[0];  # assigns 4
+x = xs[2];  # assigns 18
+x = xs[-1]; # assigns 18
+x = xs[-2]; # assigns 7
+
+xs[2]  # ERROR, OUT OF BOUNDS
+xs[-4] # ERROR, OUT OF BOUNDS</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>slicing</strong> operator '<strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>]</code> ' extracts
+(sub-)lists from the <strong>lhs</strong> source. The <strong>low</strong> and <strong>high</strong> index expressions may
+be omitted (and default to <code>0</code> respectively <code>size(</code> <strong>lhs</strong> <code>)</code> in that
+case). As with element access, negative indices count from the back of the
+list. The result is the list of values starting at index <strong>low</strong>, and up to but
+not including the index <strong>high</strong>. If the <strong>low</strong> value is higher or equal to
+<strong>high</strong>, the resulting list is empty. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs = [4, 7, 18];
+list int ys;
+
+ys = xs[0:2];  # assigns [4, 7]
+ys = xs[:2];   # == xs[0:2]
+ys = xs[1:];   # == xs[1:3], assigns [7, 18]
+ys = xs[:];    # == xs[0:3] == xs
+
+ys = xs[1:2];  # assigns [7] (note, it is a list!)
+ys = xs[0:0];  # assigns &lt;int&gt;[]
+ys = xs[2:1];  # assigns &lt;int&gt;[], lower bound too high
+ys = xs[0:-1]; # == xs[0:2]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>slicing</strong> operator with the <strong>step</strong> expression (that is, the expression with
+the form '<strong>lhs</strong> <code>[</code> <strong>low</strong> <code>:</code> <strong>high</strong> <code>:</code> <strong>step</strong> <code>]</code> ') can also
+skip elements (with step values other than <code>1</code>) and traverse lists from back
+to front (with negative step values). Omitting the <strong>step</strong> expression or using
+<code>0</code> as its value, uses the step value <code>1</code>. This extended form does not
+count from the back of the list for negative indices, since the <strong>high</strong> value
+may need to be negative with a negative step size.</p>
+</div>
+<div class="paragraph">
+<p>The first element of the result is at '<strong>lhs</strong> [<strong>low</strong> ]'. The
+second element is at '<strong>lhs</strong> [<strong>low</strong> + <strong>step</strong> ]', the third element at
+'<strong>lhs</strong> [<strong>low</strong> + 2 * <strong>step</strong> ]' and so on. For a positive <strong>step</strong> value,
+the index of the last element is the highest value less than <strong>high</strong>, for a
+negative <strong>step</strong> value, the last element is the smallest index bigger than
+<strong>high</strong> (that is, boundary <strong>high</strong> is excluded from the result).
+The (sub-)list is empty when the first value ('<strong>lhs</strong> [ <strong>low</strong> ]') already
+violates the conditions of the <strong>high</strong> boundary.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list int xs = [4, 7, 18];
+list int ys;
+
+ys = xs[::2];  # == xs[0:3:2], assigns [4, 18]
+ys = xs[::-1]; # == xs[2:-1:-1], assigns [18, 7, 4]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With the latter example, not that the <code>-1</code> end value in <code>xs[2:-1:-1]</code>
+really means index <code>-1</code>, it is <strong>not</strong> rewritten!!</p>
+</div>
+<div class="paragraph">
+<p>The <strong>concatenation</strong> operator <code>+</code> 'glues' two lists together by constructing a
+new list, copying the value of the <strong>lhs</strong> list, and appending the values of the
+<strong>rhs</strong>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">[1, 2] + [3, 4] == [1, 2, 3, 4]
+&lt;int&gt;[] + [1]   == [1]
+[5] + &lt;int&gt;[]   == [5]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>subtraction</strong> operator <code>-</code> subtracts two lists. It copies the <strong>lhs</strong> list,
+and each element in the <strong>rhs</strong> list is searched in the copy, and the left-most
+equal value is deleted. Searched values that do not exist are silently ignored.
+The result of the operation has the same type as the <strong>lhs</strong> list.
+Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">[1, 2, 4, 2] - [4]        # results in [1, 2, 2], 4 is removed.
+[1, 2, 4, 2] - [6]        # results in [1, 2, 4 2], 6 does not exist.
+[1, 2, 4, 2] - [1, 4]     # results in [2, 2], 1 and 4 are removed.
+[1, 2, 4, 2] - [2]        # results in [1, 4, 2], first 2 is removed.
+[1, 2, 4, 2] - [2, 2]     # results in [1, 4].
+[1, 2, 4, 2] - [2, 2, 2]  # results in [1, 4], no match for the 3rd '2'.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>element test</strong> operator <code>in</code> tests whether the value <strong>lhs</strong> exists in list
+<strong>rhs</strong>. This operation is expensive to compute, if you need this operation
+frequently, consider using a set instead.
+Some examples of the element test operation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">1 in [1, 2, 3]          == true
+4 in [1, 2, 3]          == false  # there is no 4 in [1, 2, 3]
+[1] in [[2], [1]]       == true
+[2, 1] in [[1, 2]]      == false  # [2, 1] != [1, 2]
+&lt;int&gt;[] in &lt;list int&gt;[] == false  # empty list contains no values.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are also standard library functions for lists, see
+<a href="#ref-list-stdlib">List functions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-set-expression">Set expressions</h4>
+<div class="paragraph">
+<p>Literal sets are written like</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_set.png" alt="literal set">
+</div>
+</div>
+<div class="paragraph">
+<p>The first line shows the syntax of an empty set. The <code>Type</code> block denotes
+the element type of the set, for example <code>&lt;int&gt;{}</code> is an empty set of
+integer values.</p>
+</div>
+<div class="paragraph">
+<p>The second line shows how to write a non-empty literal set value. It is a
+comma-separated sequence of expressions surrounded by curly brackets.
+The type of all expressions must be the same, and this is also the element type
+of the set. The order of the values in the literal is not relevant, and
+duplicate values are silently discarded. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">set real xr = {1.0, 2.5, -31.28, 1.0}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>assigns the set <code>{-31.28, 1.0, 2.5}</code> (any permutation of the values is
+allowed). By convention, elements are written in increasing order in this
+document.</p>
+</div>
+<div class="paragraph">
+<p>Two set values are equal when they have the same number of element values
+contained, and each value of one set is also in the other set. The order of the
+elements in a set is not relevant, any permutation is equivalent.</p>
+</div>
+<div class="paragraph">
+<p>Like lists, sets have no unary operators. They do have binary operators though,
+which are</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Set union</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Set difference</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>*</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Set intersection</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>sub</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Sub-set test</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <strong>union</strong> of two sets means that the <strong>lhs</strong> elements and the <strong>rhs</strong> elements
+are merged into one set (and duplicates are silently discarded).
+<strong>Set difference</strong> makes a copy of the <strong>lhs</strong> set, and removes all elements that
+are also in the <strong>rhs</strong> operand.
+The result of the operation has the same type as the <strong>lhs</strong> set.
+<strong>Set intersection</strong> works the other way around, its result is a set with
+elements that exist both in <strong>lhs</strong> and in <strong>rhs</strong>. Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">set int xr = {1, 3, 7};
+set int yr;
+
+yr = xr + {1, 2};  # assigns {1, 2, 3, 7}
+yr = xs - {1, 2};  # assigns {3, 7}
+yr = xs * {1, 2};  # assigns {1}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>element test</strong> of sets tests whether the value <strong>lhs</strong> is an element in the
+set <strong>rhs</strong>. This operation is very fast.
+The <strong>sub-set test</strong> does the same for every element value in the <strong>lhs</strong> operand.
+It returns <code>true</code> is every value of the left set is also in the right set.
+A few examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">1 in {1, 3, 7}  == true
+9 in {1, 3, 7}  == false
+
+{1} sub {1, 3, 7}       == true
+{9} sub {1, 3, 7}       == false
+{1, 9} sub {1, 3, 7}    == false # All elements must be present.
+{1, 3, 7} sub {1, 3, 7} == true # All sets are a sub-set of themselves.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are also standard library functions for sets, see
+<a href="#ref-set-stdlib">Set functions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-dictionary-expression">Dictionary expressions</h4>
+<div class="paragraph">
+<p>Literal dictionaries are written using the syntax shown below</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_dictionary.png" alt="literal dictionary">
+</div>
+</div>
+<div class="paragraph">
+<p>An empty dictionary needs the key and value type prefix, for
+example <code>&lt;string:int&gt;{}</code> is an empty dictionary with strings as key, and
+integer numbers as value.
+Literal values of such a dictionary are:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(string, int) d;  # Initialized with the empty dictionary.
+
+d = {&quot;one&quot;: 1, &quot;twenty-three&quot;: 23};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The key-value pairs can be put in any order. Also, the key value must be
+unique. Two dictionaries are equal when they have the same number of keys, each
+key in one dictionary is also in the other dictionary, and the value
+associated with each key also match pair-wise.</p>
+</div>
+<div class="paragraph">
+<p>The binary operators of dictionaries are</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>[</code> <strong>rhs</strong> <code>]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">K</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">V</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element access</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>+</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Update</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list K</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>-</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set K</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Subtraction</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>in</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">K</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Element test</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>sub</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dict(K:V)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Sub-set test</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <strong>element access</strong> operator accesses the value of a key. Querying the value
+of a non-existing key value is not allowed, however when used at the left side
+of an assignment, it acts as an adding operation. A few examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(int:bool) d = {1:true, 2:false};
+bool b;
+
+b = d[1];     # assigns 'true' (the value of key 1).
+d[1] = false; # updates the value of key '1' to 'false'.
+d[8] = true;  # adds pair 8:true to the dictionary.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>+</code> operation on dictionaries is an <strong>update</strong> operation. It copies the
+<strong>lhs</strong> dictionary, and assigns each key-value pair of the <strong>rhs</strong> dictionary to
+the copy, overwriting values copied from the <strong>lhs</strong>.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(int:bool) d = {1:true, 2:false};
+
+d + {1:false}   # result is {1:false, 2:false}
+d + {3:false}   # result is {1:true, 2:false, 3:false}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <strong>subtraction</strong> operator only takes keys into consideration, that is, it
+makes a copy of the <strong>lhs</strong> dictionary, and removes key-value pairs where the key
+is also in the <strong>rhs</strong> argument (for subtraction of lists and sets, the elements
+are used, instead of the keys):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(int:bool) d = {1:true, 2:false};
+
+d - {1:false}   # results in {2:false}, value of '1' is not relevant
+d - [1]         # results in {2:false}
+d - {1}         # results in {2:false}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As with list subtraction and set difference, the type of the result is the
+same as the type of the <strong>lhs</strong> dictionary.</p>
+</div>
+<div class="paragraph">
+<p>The <strong>element test</strong> tests for presence of a key value, and the <strong>sub-set</strong>
+operation tests whether all keys of the <strong>lhs</strong> value are also in the <strong>rhs</strong>
+value. Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict(int:bool) d = {1:true, 2:false};
+bool b;
+
+b = 2 in d;  # assigns 'true', 2 is a key in d.
+b = 5 in d;  # assigns 'false', 5 is not a key in d.
+
+{1:false} sub d # results in 'true', all keys are in d.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are also standard library functions for dictionaries, see
+<a href="#ref-dictionary-stdlib">Dictionary functions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-tuple-expression">Tuple expression</h4>
+<div class="paragraph">
+<p>A tuple expression is a value of a tuple type (explained in
+<a href="#ref-tuple-type">Tuple type</a>). A tuple expression literal value is written like</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_tuple.png" alt="literal tuple">
+</div>
+</div>
+<div class="paragraph">
+<p>A literal tuple is a comma separated sequence of expressions of length two or
+longer, surrounded by a
+pair of parentheses. The number of expressions and the type of each expression
+decide the tuple type. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type tup = tuple(bool b; real r);
+
+tup t = (true, 3.48);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The type named <code>tup</code> is a tuple type with a boolean field and a real field.
+The expression <code>(true, 3.48)</code> constructs the same tuple type, thus it can be
+assigned to variable <code>t</code>. Names of the fields are not relevant in this
+matching, for example variable declaration (and initialization)
+<code>tuple(bool z; real w) u = t</code> is allowed, since the types of
+the fields match in a pair-wise manner.</p>
+</div>
+<div class="paragraph">
+<p>A field of a tuple can be accessed both for read and for assignment by the name
+of the field:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">bool c;
+
+c = t.b;     # Read the 'b' field.
+t.b = false; # Assign a new value to the 'b' field.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the latter case, only the assigned field changes, all other fields keep the
+same value.</p>
+</div>
+<div class="paragraph">
+<p>Tuples can also be packed and unpacked. Packing is assignment to all fields,
+while unpacking is reading of all fields into separate variables:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">real q;
+
+t = false, 3.8; # Packing of values into a tuple.
+
+c, q = t;       # Unpacking into separate variables.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Packing is very closely related to literal tuples above. The difference is
+that packing can be done only like above in an assignment to a tuple value,
+while a literal tuple works everywhere.</p>
+</div>
+<div class="paragraph">
+<p>Unpacking is very useful when the right side (<code>t</code> in the example) is more
+complex, for example, the return value of a function call, as
+in <code>c, q = f();</code>. In such cases you don&#8217;t need to construct an intermediate
+tuple variable.</p>
+</div>
+<div class="paragraph">
+<p>Packing and unpacking is also used in multi-assignment statements:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">a, b = 3, 4;   # Assign 3 to 'a', and 4 to 'b'.
+
+a, b = b, a;   # Swap values of 'a' and 'b'.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The latter works due to the intermediate tuple that is created as part in the
+assignment.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-file-expression">File handle expressions</h4>
+<div class="paragraph">
+<p>Variables of type <code>file</code> are created using a variable declaration with a
+<code>file</code> type, see <a href="#ref-file-type">File type</a> for details about the type.</p>
+</div>
+<div class="paragraph">
+<p>You cannot write a literal value for a file type (nor can you read or write
+values of this type), file values are created by means of the <code>open</code> function
+in the standard library, see <a href="#ref-file-stdlib">File functions</a>.</p>
+</div>
+<div class="paragraph">
+<p>You can test whether two files are the same with the binary <code>==</code> and <code>!=</code>
+operators.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">file</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Values of type <code>file</code> are used for writing output to a file using the
+<a href="#ref-write-statement">Write statement</a>, or for reading values from a file using the
+<code>read</code> function explained in <a href="#ref-read-expression">Read expression</a>.
+After use, a file should be closed with a <code>close</code> statement explained at
+<a href="#ref-close-statement">Close statement</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-read-expression">Read expression</h4>
+<div class="paragraph">
+<p>The read expression reads a value of a given type from the keyboard or from a
+file. It has two forms:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code> <strong>read</strong>(<code>T</code>)</dt>
+<dd>
+<p>Read a value of type <code>T</code> from the keyboard.</p>
+</dd>
+<dt class="hdlist1"><code>T</code> <strong>read</strong>(<code>file f, T</code>)</dt>
+<dd>
+<p>Read a value of type <code>T</code> from the file opened for reading by file <code>f</code>
+(see the <code>open</code> function in <a href="#ref-file-stdlib">File functions</a> for details about
+opening files).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>You can read values from types that contain data used for calculation, that is
+values of types <code>bool</code>, <code>int</code>, <code>real</code>, <code>string</code>, <code>list T</code>, <code>set T</code>,
+and <code>dict(K:V)</code>. Types <code>T</code>, <code>K</code>, and <code>V</code> must also be readable types of
+data (that is, get chosen from the above list of types).</p>
+</div>
+<div class="paragraph">
+<p>Reading a value takes a text (with the same syntax as Chi literal values of
+the same type), and converts it into a value that can be manipulated in the Chi
+model. Values read from the text have to be constant, for example the input
+<code>time</code> cannot be interpreted as real number with the same value as the
+current simulation time.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-timer-expression">Timer expressions</h4>
+<div class="paragraph">
+<p>Timers are clocks that count down to 0. They are used to track the amount of
+time you still have to wait.
+Timers can be stored in data of type <code>timer</code> (see <a href="#ref-timer-type">Timer type</a> for
+details of the type).</p>
+</div>
+<div class="paragraph">
+<p>The standard library function <code>ready</code> exists to test whether a timer has
+expired. See <a href="#ref-timer-stdlib">Timer functions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-channel-expression">Channel expressions</h4>
+<div class="paragraph">
+<p>Channels are used to connect processes with each other. See the
+<a href="#ref-channel-type">Channel type</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>Usually, channels are created by variable declarations, as in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">chan void s;
+chan int c, d;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This creates three channels, one synchronization channel <code>s</code>, and two
+channels (<code>c</code>, and <code>d</code>) communicating integers.</p>
+</div>
+<div class="paragraph">
+<p>There is also a <code>channel</code> function to make new channels:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>chan T</code> <strong>channel</strong>(<code>T</code>)</dt>
+<dd>
+<p>Construct a new channel communicating data type <code>T</code>. When <code>T</code> is
+<code>void</code>, a synchronization channel is created instead.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>The only binary expressions on channels are equality comparison operations.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>lhs</strong></th>
+<th class="tableblock halign-left valign-top">Type <strong>rhs</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>==</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for equality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>lhs</strong> <code>!=</code> <strong>rhs</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">chan T</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Test for inequality</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>where <code>T</code> can be either a normal type, or <code>void</code>.
+There has to be an overlap between the channel directions (that is, you cannot
+compare a receive-only channel with a send-only channel).</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-distribution-expression">Distribution expressions</h4>
+<div class="paragraph">
+<p>A distribution represents a stochastic distribution for drawing random numbers.
+It use a pseudo-random number generator. See
+<a href="#tut-chapter-stochastic-behavior">Modeling stochastic behavior</a> for a discussion how random numbers are
+used.</p>
+</div>
+<div class="paragraph">
+<p>Variables of type distribution (see <a href="#ref-distribution-type">Distribution type</a>) are
+initialized by using a distribution function from the standard library, see
+<a href="#ref-chapter-distributions">Distributions</a> for an overview.</p>
+</div>
+<div class="paragraph">
+<p>There is only one operator for variables with a distribution type, as shown
+below</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Expression</th>
+<th class="tableblock halign-left valign-top">Type <strong>op</strong></th>
+<th class="tableblock halign-left valign-top">Type result</th>
+<th class="tableblock halign-left valign-top">Explanation</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dist bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dist int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>sample</code> <strong>op</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">dist real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Sample <strong>op</strong> distribution</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The <code>sample</code> operator draws a random number from a distribution.
+For example rolling a dice:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">model Dice():
+    dist int d = uniform(1, 7);
+
+    # Roll the dice 5 times
+    for i in range(5):
+        writeln(&quot;Rolled %d&quot;, sample d);
+    end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-process-expression">Process expressions</h4>
+<div class="paragraph">
+<p>A process expression refers to a process definition. It can be used to
+parameterize the process that is being instantiated, by passing such a value
+to a <code>run</code> or <code>start</code> statement. (See <a href="#ref-run-and-start-statements">Run and start statements</a> for
+details on how to create a new process.)
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc A(int x):
+    writeln(&quot;A(%d)&quot;, x);
+end
+
+proc B(int x):
+    writeln(&quot;B(%d)&quot;, x);
+end
+
+proc P(proc (int) ab):
+    run ab(3);
+end
+
+model M():
+    run P(A); # Pass 'proc A' into P.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Formal parameter <code>ab</code> of process <code>P</code> is a process variable that refers to
+a process taking an integer parameter. The given process definition is
+instantiated. Since in the model definition, <code>A</code> is given to process <code>P</code>,
+the output of the above model is <code>A(3)</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-instance-expression">Instance expressions</h4>
+<div class="paragraph">
+<p>Process instances represent running processes in the model. Their use is to
+store a reference to such a running process, to allow testing for finishing.</p>
+</div>
+<div class="paragraph">
+<p>An instance variable is assigned during a <code>start</code> statement. (See
+<a href="#ref-run-and-start-statements">Run and start statements</a> for details on how to start a new process.)</p>
+</div>
+<div class="paragraph">
+<p>The instance variable is used to test for termination of the instantiated
+process, or to wait for it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">proc Wait():
+    delay 4.52;
+end
+
+model M():
+    inst w;
+
+    start w = Wait();
+
+    delay 1.2;
+    writeln(&quot;is Wait finished? %b&quot;, finished(w));
+
+    # Wait until the process has finished.
+    finish w;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>Wait</code> is a process that waits a while before terminating. In the <code>start</code>
+statement, instance variable <code>w</code> is set up to refer to instantiated process
+<code>Wait</code>. After assignment, you can use the variable for testing whether the
+process has terminated. In the example, the test result is written to the
+screen, but this could also be used as a guard in a select statement (See
+<a href="#ref-select-statement">Select statement</a> for details).</p>
+</div>
+<div class="paragraph">
+<p>The other thing that you can do is to wait for termination of the process by
+means of the <code>finish</code> statement, see also <a href="#ref-finish-statement">Finish statement</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-matrix-expression">Matrix expression</h4>
+<div class="paragraph">
+<p>The syntax of a matrix literal value is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/literal_matrix.png" alt="literal matrix">
+</div>
+</div>
+<div class="paragraph">
+<p>The literal starts with a <code>[</code> symbol, and ends with a <code>]</code> symbol.
+In between it has at least two comma-separated lists of real number values,
+separated with a <code>;</code> symbol.</p>
+</div>
+<div class="paragraph">
+<p>Each comma-separated list of real number values is a row of the matrix. The
+number of columns of each row is the same at each row, which means the number
+of real number values must be the same with each list.
+As an example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">matrix(2, 3) m = [1.0, 2.0, 3.0;
+                  4.0, 5.0, 6.0]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>m</code> is a matrix with two rows and three columns. A comma separates two
+columns from each other, a semi colon separates two rows.</p>
+</div>
+<div class="paragraph">
+<p>The syntax demands at least one semi colon in a literal matrix value, which
+means you cannot write a matrix literal with a single row directly. Instead,
+write a cast expression that converts a list of real numbers to a matrix with
+a single row. See <a href="#ref-cast-expression">Cast expressions</a> for an explanation of cast
+expressions.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-cast-expression">Cast expressions</h4>
+<div class="paragraph">
+<p>A cast expression converts a value from one type to another. The syntax of a
+cast expression is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/cast_expression.png" alt="cast expression">
+</div>
+</div>
+<div class="paragraph">
+<p>You write the result type, followed by an expression between parentheses.
+The value of the expression is converted to the given type.
+For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">real v = 3.81;
+timer t;
+
+t = timer(v);  # Convert from real to timer (third entry in the table)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The conversion from a list to a matrix (the first entry in the table) is a
+special case in the sense that you also need to specify the size of the
+resulting matrix, as in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list real xs = [1, 2, 3];
+
+writeln(&quot;matrix with one row and three columns: %s&quot;, matrix(1, 3, xs));</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The expected number of rows and columns given in the first two arguments must
+be constant. When the conversion is performed, the length of the given list
+must be the same as the number of columns stated in the second argument.</p>
+</div>
+<div class="paragraph">
+<p>The number of available conversions is quite limited, below is a table that
+lists them.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Value type</th>
+<th class="tableblock halign-left valign-top">Result type</th>
+<th class="tableblock halign-left valign-top">Remarks</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">matrix</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Conversion of a list to a matrix with one row</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">list</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">set</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Construct a set from a list</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">timer</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Setting up a timer</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">timer</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Reading the current value of a timer</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing a boolean value from a string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing an integer number from a string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Parsing a real number from a string</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">bool</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Converting a boolean to a string representation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Converting an integer to a string representation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Converting a real number to a string representation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">int</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">real</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Widening an integer number to a real number</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The first entry exists for creating matrices with one row (which you cannot
+write syntactically). The second entry constructs a set from a list of values.
+The element type of the list and the resulting set are the same.</p>
+</div>
+<div class="paragraph">
+<p>The pair of conversions between timer
+type and real number type is for setting and reading timers, see
+<a href="#tut-using-timers">Timers</a> for their use.</p>
+</div>
+<div class="paragraph">
+<p>The conversions from string to boolean or numeric allows parsing of a
+string. The other way around is also possible, although this is usually done
+as part of a <strong>write</strong> statement (see <a href="#ref-write-statement">Write statement</a> for details).</p>
+</div>
+<div class="paragraph">
+<p>The final entry is for widening an integer to a real number. The other way
+around (from a real number to an integer number) does not exist as cast, but
+there are stdlib functions <strong>ceil</strong>, <strong>floor</strong>, and <strong>round</strong> available instead
+(explained in <a href="#ref-real-stdlib">Real number functions</a>).</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-functioncall-expression">Function call expressions</h4>
+<div class="paragraph">
+<p>A function call starts a function to compute its result value from the input
+parameters. The syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/func_call_expression.png" alt="func call expression">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>Expression</code> before the open parenthesis represents the function to
+call. Often this is a simple name like <code>size</code> (the name of one of the
+standard library functions), but you can have more complicated expressions.</p>
+</div>
+<div class="paragraph">
+<p>The sequence of expressions inside the parentheses denote the values of the
+input parameters of the functions. Their type has to match with the type
+stated in the formal parameter at the corresponding position.</p>
+</div>
+<div class="paragraph">
+<p>The result of the function call is a value with the same type as stated in the
+return type of the function definition.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-operator-priorities">Operator priorities</h4>
+<div class="paragraph">
+<p>Operator priorities aim to reduce the number of parentheses needed in
+expressions. They do this by make choices in the order of applying operators on
+their arguments. For example, <code>1 + 2 * 3</code> can be interpreted as
+<code>(1 + 2) * 3</code> (if the addition operation is applied first), or as
+<code>1 + (2 * 3)</code> (if the multiplication operation is performed first).</p>
+</div>
+<div class="paragraph">
+<p>In the following table, the order of applying operators in the Chi language
+is defined.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Priority</th>
+<th class="tableblock halign-left valign-top">Operators</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">(unary) <code>sample</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">unary <code>+</code>, unary <code>-</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>^</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>*</code>, <code>/</code>, <code>div</code>, <code>mod</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">5</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code>, <code>-</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;</code>, <code>&lt;=</code>, <code>==</code>, <code>!=</code>, <code>&gt;=</code>, <code>&gt;</code>, <code>in</code>, <code>sub</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">7</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">(unary) <code>not</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">8</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>and</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">9</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>or</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Operators with a smaller priority number get applied before operators with a
+higher priority number. Operators with the same priority get applied from left
+to right.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-standard-library">Standard library functions</h3>
+<div class="paragraph">
+<p>
+The Chi language has many general purpose functions available.
+They are organized by type and kind of use.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#ref-integer-stdlib">Integer functions</a></p>
+</li>
+<li>
+<p><a href="#ref-real-stdlib">Real number functions</a></p>
+</li>
+<li>
+<p><a href="#ref-string-stdlib">String functions</a></p>
+</li>
+<li>
+<p><a href="#ref-list-stdlib">List functions</a></p>
+</li>
+<li>
+<p><a href="#ref-set-stdlib">Set functions</a></p>
+</li>
+<li>
+<p><a href="#ref-dictionary-stdlib">Dictionary functions</a></p>
+</li>
+<li>
+<p><a href="#ref-chapter-distributions">Distributions</a></p>
+</li>
+<li>
+<p><a href="#ref-timer-stdlib">Timer functions</a></p>
+</li>
+<li>
+<p><a href="#ref-file-stdlib">File functions</a></p>
+</li>
+<li>
+<p><a href="#ref-instance-stdlib">Process instance functions</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="ref-integer-stdlib">Integer functions</h4>
+<div class="paragraph">
+<p>The following standard library functions on integers exist</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>int</code> <strong>abs</strong><code>(int val)</code></p>
+<div class="paragraph">
+<p>Return the absolute value of <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>sign</strong><code>(int val)</code></p>
+<div class="paragraph">
+<p>Return <code>-1</code> if val less than zero, <code>1</code> if val more than zero, and
+<code>0</code> otherwise.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>max</strong><code>(int a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the biggest value of the parameters.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>min</strong><code>(int a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the smallest value of the parameters.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-real-stdlib">Real number functions</h4>
+<div class="paragraph">
+<p>The following standard library functions on real numbers exist</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>real</code> <strong>abs</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return the absolute value of <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>sign</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return <code>-1</code> if val less than zero, <code>1</code> if val more than zero, and
+<code>0</code> otherwise.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>max</strong><code>(real a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the biggest value of the parameters. Integer parameters are
+silently promoted to real.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>min</strong><code>(real a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the smallest value of the parameters. Integer parameters are
+silently promoted to real.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Conversion from real number to integer can be performed in three different
+ways.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>int</code> <strong>ceil</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return smallest integer bigger or equal to <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>floor</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return biggest integer less or equal to <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>round</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Round to nearest integer value (up if distance is <code>0.5</code>).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following power and logarithmic functions exist.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>real</code> <strong>sqrt</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return the square root of <code>val</code> (argument must be non-negative).</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>cbrt</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Return the cube root of <code>val</code> (<code>val^(1/3)</code>).</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>exp</strong><code>(real x)</code></p>
+<div class="paragraph">
+<p>Compute <code>e^x</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>ln</strong><code>(real x)</code></p>
+<div class="paragraph">
+<p>Compute the natural logarithm of <code>x</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>log</strong><code>(real x)</code></p>
+<div class="paragraph">
+<p>Compute the base-10 logarithm of <code>x</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Finally, there are trigonometric functions available.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>real</code> <strong>cos</strong><code>(real a)</code></p>
+<div class="paragraph">
+<p>Cosine function of angle <code>a</code> (in radians).</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>sin</strong><code>(real angle)</code></p>
+<div class="paragraph">
+<p>Sine function of angle <code>a</code> (in radians).</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>tan</strong><code>(real angle)</code></p>
+<div class="paragraph">
+<p>Tangent function of angle <code>a</code> (in radians).</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>acos</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Arc cosine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>asin</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Arc sine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>atan</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Arc tangent function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>cosh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Hyperbolic cosine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>sinh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Hyperbolic sine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>tanh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Hyperbolic tangent function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>acosh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Inverse hyperbolic cosine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>asinh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Inverse hyperbolic sine function of value <code>val</code>.</p>
+</div>
+</li>
+<li>
+<p><code>real</code> <strong>atanh</strong><code>(real val)</code></p>
+<div class="paragraph">
+<p>Inverse hyperbolic tangent function of value <code>val</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-string-stdlib">String functions</h4>
+<div class="paragraph">
+<p>The following string functions exist in the standard library.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>int</code> <strong>size</strong><code>(string s)</code></p>
+<div class="paragraph">
+<p>Get the number of characters in string <code>s</code>.</p>
+</div>
+</li>
+<li>
+<p><code>string</code> <strong>max</strong><code>(string a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the biggest string of the parameters.</p>
+</div>
+</li>
+<li>
+<p><code>string</code> <strong>min</strong><code>(string a, b, ...)</code></p>
+<div class="paragraph">
+<p>Return the smallest string of the parameters.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-list-stdlib">List functions</h4>
+<div class="paragraph">
+<p>Getting an element out of list can be done in two ways.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>tuple(T value, list T ys)</code> <strong>pop</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Get the first element of non-empty list <code>xs</code> (with arbitrary element type
+<code>T</code>), and return a tuple with the first element and the list without the
+first element.</p>
+</div>
+</li>
+<li>
+<p><code>list T</code> <strong>del</strong><code>(list T xs, int index)</code></p>
+<div class="paragraph">
+<p>Remove element <code>xs[index]</code> from list <code>xs</code> (with arbitrary type <code>T</code>).
+The index position must exist in the list. Returns a
+list without the removed element.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For getting information about the number of elements in a list, the following
+functions are available.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>empty</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Is list <code>xs</code> empty (for any element type <code>T</code>)?
+Returns <code>true</code> when <code>xs</code> contains no elements, and <code>false</code> when it has at
+least one element.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>size</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Get the number of elements in list <code>xs</code> (for any element type <code>T</code>).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>List functions mainly useful for using with a <code>for</code> statement (explained in
+<a href="#ref-for-loop-statement">For loop statement</a>) follow next.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>list tuple(int index, T value)</code> <strong>enumerate</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Construct a copy of the list <code>xs</code> with arbitrary element type <code>T</code>, with
+each element replaced by a tuple containing the index of the element as
+well as the element itself.
+For example, <code>enumerate(["a", "b"])</code> results in the list
+<code>[(0, "a"), (1, "b")]</code>.</p>
+</div>
+</li>
+<li>
+<p><code>list int</code> <strong>range</strong><code>(int end)</code></p>
+<div class="paragraph">
+<p>Construct a list with integer values running from <code>0</code> to (but not including)
+<code>end</code>. For example <code>range(3)</code> produces list <code>[0, 1, 2]</code>.</p>
+</div>
+</li>
+<li>
+<p><code>list int</code> <strong>range</strong><code>(int start, end)</code></p>
+<div class="paragraph">
+<p>Construct a list with integer values running from <code>start</code> to (but not including)
+<code>end</code>. For example, <code>range(3, 7)</code> produces list <code>[3, 4, 5, 6]</code>.</p>
+</div>
+</li>
+<li>
+<p><code>list int</code> <strong>range</strong><code>(int start, end, step)</code></p>
+<div class="paragraph">
+<p>Construct a list with integer values running from <code>start</code> to (but not
+including) <code>end</code>, while incrementing the value with step size <code>step</code>.
+For example <code>range(3, 8, 2)</code> produces <code>list [3, 5, 7]</code>. Negative step sizes
+are also allowed to construct lists with decrementing values, but <code>start</code> has
+to be larger than <code>end</code> in that case.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For occasionally getting the biggest or smallest element of a list, the <code>min</code>
+and <code>max</code> functions are available. These functions take a lot of time, if
+smallest or biggest values are needed often, it may be better to use a sorted
+list.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>T</code> <strong>min</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Return the smallest element value of type <code>T</code> (<code>T</code> must be type
+int, real, or string) from non-empty list <code>xs</code>.</p>
+</div>
+</li>
+<li>
+<p><code>T</code> <strong>max</strong><code>(list T xs)</code></p>
+<div class="paragraph">
+<p>Return the biggest element value of type <code>T</code> (<code>T</code> must be type
+int, real, or string) from non-empty list <code>xs</code>.</p>
+</div>
+</li>
+<li>
+<p><code>list</code> <code>T</code> <strong>sort</strong><code>(list T xs, func bool pred(T a, b))</code></p>
+<div class="paragraph">
+<p>Sort list <code>xs</code> such that the predicate function <code>pred</code> holds for
+every pair of elements in the list, and return the sorted list.</p>
+</div>
+<div class="paragraph">
+<p>The predicate function <code>pred</code> must implement a total ordering on the
+values. See also the <a href="#tut-sorted-lists">sorted lists</a> discussion
+in the tutorial.</p>
+</div>
+</li>
+<li>
+<p><code>list</code> <code>T</code> <strong>insert</strong><code>(list T xs, T x, func bool pred(T a, b))</code></p>
+<div class="paragraph">
+<p>Given an already sorted list <code>xs</code> with respect to predicate function <code>pred</code>
+(with arbitrary element type <code>T</code>), insert element value <code>x</code> into the list
+such that the predicate function <code>pred</code> again holds for every pair of
+elements in the list. Return the list with the inserted <code>element</code>.</p>
+</div>
+<div class="paragraph">
+<p>The predicate function <code>pred</code> must implement a total ordering on the
+values. See also the <a href="#tut-sorted-lists">sorted lists</a> discussion
+in the tutorial.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-set-stdlib">Set functions</h4>
+<div class="paragraph">
+<p>Similar to lists, there are two functions for getting an element from a set.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>tuple(T val, set T yr)</code> <strong>pop</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Get an element of non-empty set <code>xr</code> (with arbitrary element type <code>T</code>), and
+return a tuple with the retrieved element and the set without the retrieved
+element. Note that the order of elements in a set has no meaning, and may
+change at any moment.</p>
+</div>
+</li>
+<li>
+<p><code>list tuple(int index, T val)</code> <strong>enumerate</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Construct a list of tuples with position <code>index</code> and element value <code>val</code>
+from the set <code>xr</code> with arbitrary element type <code>T</code>. Note that the <code>index</code>
+has no meaning in the set.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Removing a single element from a set can be done with the function below.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>set T</code> <strong>del</strong><code>(set T xr, T value)</code></p>
+<div class="paragraph">
+<p>Remove from set <code>xr</code> (with arbitrary element type <code>T</code>) element
+<code>value</code> if it exists in the set. Returns a set without the (possibly)
+removed element.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For getting information about the number of elements in a set, the following
+functions are available.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>empty</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Is set <code>xr</code> empty (for any element type <code>T</code>)?
+Returns <code>true</code> when <code>xr</code> contains no elements, and <code>false</code> when it has at
+least one element.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>size</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Get the number of elements in set <code>xr</code> (for any element type <code>T</code>).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For occasionally getting the biggest or smallest element of a set, the <code>min</code>
+and <code>max</code> functions are available. These functions take a lot of time, if
+smallest or biggest values are needed often, it may be better to make a sorted
+list.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>T</code> <strong>min</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Return the smallest element value of type <code>T</code> (<code>T</code> must be type
+<code>int</code>, <code>real</code>, or <code>string</code>) from non-empty set <code>xr</code>.</p>
+</div>
+</li>
+<li>
+<p><code>T</code> <strong>max</strong><code>(set T xr)</code></p>
+<div class="paragraph">
+<p>Return the biggest element value of type <code>T</code> (<code>T</code> must be type
+<code>int</code>, <code>real</code>, or <code>string</code>) from non-empty set <code>xr</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-dictionary-stdlib">Dictionary functions</h4>
+<div class="paragraph">
+<p>Getting a value or a sequence of values from a dictionary can be done with the
+following functions.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>tuple(K key, V val, dict(K:V) e)</code> <strong>pop</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Get a key-value pair from non-empty dictionary <code>d</code> (with arbitrary key
+type <code>K</code> and arbitrary value type <code>V</code>), and return a tuple with the
+retrieved key, the retrieved value, and the dictionary without the
+retrieved element.</p>
+</div>
+</li>
+<li>
+<p><code>list tuple(int index, K key, V val)</code> <strong>enumerate</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Construct a list of tuples with position <code>index</code>, key <code>key</code> and value
+<code>val</code> from dictionary <code>d</code> (with arbitrary key type <code>K</code> and arbitrary
+value type <code>V</code>). Note that the <code>index</code> has no meaning in the
+dictionary. In combination with a for statement (explained in
+<a href="#ref-for-loop-statement">For loop statement</a>), it is also possible to iterate over the
+dictionary directly.</p>
+</div>
+</li>
+<li>
+<p><code>list K</code> <strong>dictkeys</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Return the keys of dictionary <code>d</code> (with any key type <code>K</code> and value type
+<code>V</code>) as a list with element type <code>K</code>. Since a dictionary has no order,
+the order of the elements in the resulting list is also undefined.</p>
+</div>
+</li>
+<li>
+<p><code>list V</code> <strong>dictvalues</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Return the values of dictionary <code>d</code> (with any key type <code>K</code> and value type
+<code>V</code>) as a list with element type <code>V</code>. Since a dictionary has no order,
+the order of the elements in the resulting list is also undefined.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Removing a single element from a dictionary can be done with the function below.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dict(K:V)</code> <strong>del</strong><code>(dict(K:V) d, K key)</code></p>
+<div class="paragraph">
+<p>Remove element <code>key</code> from dictionary <code>d</code> (with arbitrary element key type <code>K</code> and
+arbitrary value type <code>V</code>) if it exists in the dictionary.
+Returns a dictionary without the (possibly) removed element.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The number of keys in a dictionary can be queried with the following
+functions.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>empty</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Is dictionary <code>d</code> empty? (with any key type <code>K</code> and value type <code>V</code>)
+Returns <code>true</code> when <code>d</code> contains no elements, and <code>false</code> when it has at
+least one key element.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>size</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Get the number of key elements in dictionary <code>d</code> (with any key type <code>K</code>
+and value type <code>V</code>).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For occasionally getting the biggest or smallest key value of a dictionary, the
+<code>min</code> and <code>max</code> functions are available. These functions take a lot of
+time, if smallest or biggest keys are needed often, it may be better to use a
+sorted list.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>K</code> <strong>min</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Return the smallest key of type <code>K</code> (<code>K</code> must be type
+<code>int</code>, <code>real</code>, or <code>string</code>) from non-empty dictionary <code>d</code>.</p>
+</div>
+</li>
+<li>
+<p><code>K</code> <strong>max</strong><code>(dict(K:V) d)</code></p>
+<div class="paragraph">
+<p>Return the biggest key of type <code>K</code> (<code>K</code> must be type
+<code>int</code>, <code>real</code>, or <code>string</code>) from non-empty dictionary <code>d</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-timer-stdlib">Timer functions</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>ready</strong><code>(timer t)</code></p>
+<div class="paragraph">
+<p>Return whether timer <code>t</code> has expired (or was never set). Returns <code>true</code>
+if the timer has reached <code>0</code> or was never set, and <code>false</code> if it is still
+running.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-file-stdlib">File functions</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>eof</strong><code>(file handle)</code></p>
+<div class="paragraph">
+<p>For files that are read, this function tests whether the end of the file
+(EOF) has been reached. That is, it tests whether you have read the last
+value in the <code>file</code>.</p>
+</div>
+<div class="paragraph">
+<p>If the call returns <code>true</code>, there are no more values to read. If it
+returns <code>false</code>, another value is still available.
+For an example of how to use <code>eof</code> and <code>eol</code>, see
+<a href="#tut-advanced-file-reading">Advanced reading from a file</a>.</p>
+</div>
+</li>
+<li>
+<p><code>bool</code> <strong>eol</strong><code>(file handle)</code></p>
+<div class="paragraph">
+<p>For files that are read, this function tests whether the end of a line
+(EOL) has been reached. That is, it tests whether you have read the last
+value at the current line.</p>
+</div>
+<div class="paragraph">
+<p>If the call returns <code>true</code>, there are no more values to read at this
+line. If it returns <code>false</code>, another value can be read.
+For an example of how to use <code>eof</code> and <code>eol</code>, see
+<a href="#tut-advanced-file-reading">Advanced reading from a file</a>.</p>
+</div>
+<div class="paragraph">
+<p>Note that 'the same line' is applied only to the leading white space. It
+does not say anything about the number lines that a value itself uses.
+For example, you could spread a list or set with numbers over multiple lines.</p>
+</div>
+</li>
+<li>
+<p><code>int</code> <strong>newlines</strong><code>(file handle)</code></p>
+<div class="paragraph">
+<p>For files that are read, this function returns how many lines down the
+next value can be found. It returns a negative number if the end of the
+file has been reached.</p>
+</div>
+<div class="paragraph">
+<p>For example, executing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">int i;
+file f = open(&quot;data.txt&quot;, &quot;r&quot;);
+
+i = read(f, int);
+writeln(&quot;read %d, eol count is %d&quot;, i, newlines(f));
+i = read(f, int);
+writeln(&quot;read %d, eol count is %d&quot;, i, newlines(f));
+i = read(f, int);
+writeln(&quot;read %d, eol count is %d&quot;, i, newlines(f));
+close(f);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where "data.txt" contains:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">123 345
+789</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>produces:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">read 123, eol count is 0
+read 345, eol count is 1
+read 789, eol count is -1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>After reading <code>123</code>, the next integer is at the same line, which is <code>0</code>
+lines down. After reading <code>345</code>, the next value is at the next line,
+which is <code>1</code> line down. After reading the final value, a negative line
+count is returned to indicate lack of a next value.</p>
+</div>
+<div class="paragraph">
+<p>Note that 'number of lines down' is applied only to the leading white
+space. It does not say anything about the number lines that a value itself
+uses, a set of list could use several lines.</p>
+</div>
+</li>
+<li>
+<p><code>file</code> <strong>open</strong><code>(string filename, string mode)</code></p>
+<div class="paragraph">
+<p>Open the file with name <code>filename</code> using access mode <code>mode</code>.
+When the access mode is <code>"r"</code>, the file should exist and is opened for
+reading. When the access mode is <code>"w"</code>, the file is either created or its
+previous contents is erased. There is no way to append output to an
+existing file.</p>
+</div>
+<div class="paragraph">
+<p>Notice that filename is a normal Chi string, which means that the <code>\</code>
+character needs to be escaped to <code>\\</code>. (That is, use a string like
+<code>"mydir\\myfile.txt"</code> to open the file with the name <code>myfile.txt</code> in
+directory (map) <code>mydir</code>.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, you may want to use the forward slash <code>/</code> instead as path
+component separator.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-instance-stdlib">Process instance functions</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bool</code> <strong>finished</strong><code>(inst p)</code></p>
+<div class="paragraph">
+<p>Return whether the process stored by process instance <code>p</code> has finished.
+Returns <code>true</code> when the process has finished, and <code>false</code> if it has not ended yet.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-distributions">Distributions</h3>
+<div class="paragraph">
+<p>
+
+The Chi language has three kinds of distributions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#ref-constant-distributions">Constant distributions</a>, distributions returning always the same value</p>
+</li>
+<li>
+<p><a href="#ref-discrete-distributions">Discrete distributions</a>, distributions returning a boolean or integer value</p>
+</li>
+<li>
+<p><a href="#ref-continuous-distributions">Continuous distributions</a>, distributions returning a real number value</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The constant distributions are used during creation of the Chi program.
+Before adding stochastic behavior, you want to make sure the program itself
+is correct. It is much easier to verify correctness without stochastic
+behavior, but if you have to change the program again after the verification,
+you may introduce new errors in the process.</p>
+</div>
+<div class="paragraph">
+<p>The constant distributions solve this by allowing you to program with
+stochastic sampling in the code, but it is not doing anything (since you get
+the same predictable value on each sample operation). After verifying
+correctness of the program, you only need to modify the distributions that you
+use to get proper stochastic behavior.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="ref-constant-distributions">Constant distributions</h4>
+<div class="paragraph">
+<p>The constant distributions have very predictable samples, which makes them
+ideal for testing functioning of the program before adding stochastic
+behavior.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dist</code> <code>bool</code> <strong>constant</strong><code>(bool b)</code></p>
+<div class="paragraph">
+<p>Distribution always returning <code>b</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>b</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>b</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p>-</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>constant</strong><code>(int i)</code></p>
+<div class="paragraph">
+<p>Distribution always returning <code>i</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>i</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>i</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p>-</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>constant</strong><code>(real r)</code></p>
+<div class="paragraph">
+<p>Distribution always returning <code>r</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>r</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>r</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p>-</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-discrete-distributions">Discrete distributions</h4>
+<div class="paragraph">
+<p>The discrete distributions return integer or boolean sample values.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dist</code> <code>bool</code> <strong>bernoulli</strong><code>(real p)</code></p>
+<div class="paragraph">
+<p>Outcome of an experiment with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/bernoulli.svg" alt="bernoulli">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{false, true}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>1 - p</code> (where <code>false</code> is interpreted as <code>0</code>, and <code>true</code> is interpreted as <code>1</code>)</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Bernoulli(p), <a href="#law-ref">[law-ref]</a>, page 302</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>binomial</strong><code>(int n, real p)</code></p>
+<div class="paragraph">
+<p>Number of successes when performing <code>n</code> experiments <code>(n &gt; 0)</code> with chance <code>p</code> <code>(0 &lt;= p &lt;= 1)</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{0, 1, ..., n}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>n * p</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>n * p * (1 - p)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>bin(n, p), <a href="#law-ref">[law-ref]</a>, page 304</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>geometric</strong><code>(real p)</code></p>
+<div class="paragraph">
+<p>Geometric distribution, number of failures before success for an experiment with chance <code>p</code> <code>(0 &lt; p &lt;= 1)</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{0, 1, ...}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(1 - p) / p</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>(1 - p) / p^2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>geom(p), <a href="#law-ref">[law-ref]</a>, page 305</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>poisson</strong><code>(real lambda)</code></p>
+<div class="paragraph">
+<p>Poisson distribution.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/poisson.svg" alt="poisson">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{0, 1, ...}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>lambda</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>lambda</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Poison(lambda), <a href="#law-ref">[law-ref]</a>, page 308</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>int</code> <strong>uniform</strong><code>(int a, b)</code></p>
+<div class="paragraph">
+<p>Integer uniform distribution from <code>a</code> to <code>b</code> excluding the upper bound.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/disc_uni.svg" alt="disc uni">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>{a, a+1, ..., b-1}</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(a + b - 1) / 2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>((b - a)^2 - 1) / 12</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>DU(a, b - 1), <a href="#law-ref">[law-ref]</a>, page 303</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-continuous-distributions">Continuous distributions</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>dist</code> <code>real</code> <strong>beta</strong><code>(real p, q)</code></p>
+<div class="paragraph">
+<p>Beta distribution with shape parameters <code>p</code> and <code>q</code>, with <code>p &gt; 0</code> and <code>q &gt; 0</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/beta.svg" alt="beta">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[0, 1]</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>p / (p + q)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>p * q / ((p + q)^2 * (p + q + 1))</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Beta(p, q), <a href="#law-ref">[law-ref]</a>, page 291</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>erlang</strong><code>(double m, int k)</code></p>
+<div class="paragraph">
+<p>Erlang distribution with <code>k</code> a positive integer and <code>m &gt; 0</code>.
+Equivalent to <code>gamma(k, m / k)</code>.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>m</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>m * m / k</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>ERL(m, k), <a href="#banks-ref">[banks-ref]</a>, page 153</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>exponential</strong><code>(real m)</code></p>
+<div class="paragraph">
+<p>(Negative) exponential distribution with mean <code>m</code>, with <code>m &gt; 0</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/exponential.svg" alt="exponential">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[0, infinite)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>m</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>m * m</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>expo(m), <a href="#law-ref">[law-ref]</a>, page 283</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>gamma</strong><code>(real a, b)</code></p>
+<div class="paragraph">
+<p>Gamma distribution, with shape parameter <code>a &gt; 0</code> and scale parameter <code>b &gt; 0</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/gamma.svg" alt="gamma">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>a * b</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>a * b^2</code></p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>lognormal</strong><code>(real m, v2)</code></p>
+<div class="paragraph">
+<p>Log-normal distribution.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/lognormal.svg" alt="lognormal">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[0, infinite)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>exp(m + v2/2)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>exp(2*m + v2) * (exp(v2) - 1)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>N(m, v2), <a href="#law-ref">[law-ref]</a>, page 290</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>normal</strong><code>(real m, v2)</code></p>
+<div class="paragraph">
+<p>Normal distribution.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/normal.svg" alt="normal">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>(-infinite, infinite)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>m</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>v2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>N(m, v2), <a href="#law-ref">[law-ref]</a>, page 288</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>random</strong><code>()</code></p>
+<div class="paragraph">
+<p>Random number generator.</p>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[0, 1)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>0.5</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>1 / 12</code></p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>triangle</strong><code>(real a, b, c)</code></p>
+<div class="paragraph">
+<p>Triangle distribution, with <code>a &lt; b &lt; c</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/triangle.svg" alt="triangle">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[a, c]</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(a + b + c) /3</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>(a^2 + c^2 + b^2 - a*b - a*c - b*c) / 18</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Triangle(a, c, b), <a href="#law-ref">[law-ref]</a>, page 300</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>uniform</strong><code>(real a, b)</code></p>
+<div class="paragraph">
+<p>Real uniform distribution from <code>a</code> to <code>b</code>, excluding upper bound.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/cont_uni.svg" alt="cont uni">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[a, b)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(a + b) / 2</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>(b - a)^2 / 12</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>U(a,b), <a href="#law-ref">[law-ref]</a>, page 282, except that distribution has an inclusive upper bound.</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+<li>
+<p><code>dist</code> <code>real</code> <strong>weibull</strong><code>(real a, b)</code></p>
+<div class="paragraph">
+<p>Weibull distribution with shape parameter <code>a</code> and scale parameter <code>b</code>, with <code>a &gt; 0</code> and <code>b &gt; 0</code>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/distribution_plots/weibull.svg" alt="weibull">
+</div>
+</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+Range
+</td>
+<td class="hdlist2">
+<p><code>[0, infinite)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Mean
+</td>
+<td class="hdlist2">
+<p><code>(b / a) * G(1 / a)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+Variance
+</td>
+<td class="hdlist2">
+<p><code>(b^2 / a) * (2 * G(2 / a) - (1 / a) * G(1 / a)^2)</code> with <code>G(x)</code> the Gamma function,
+<code>G(x)</code> <code>=</code> integral over <code>t</code> from <code>0</code> to <code>infinity</code>, for <code>t^(x - 1) * exp(-t)</code></p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+See also
+</td>
+<td class="hdlist2">
+<p>Weibull(a, b), <a href="#law-ref">[law-ref]</a>, page 284</p>
+</td>
+</tr>
+</table>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-references">References</h4>
+<div class="ulist bibliography">
+<ul class="bibliography">
+<li>
+<p><a id="banks-ref"></a>[banks-ref] Handbook of Simulation,
+Principles, Methodology, Advances, Applications, and Practice,
+editor Jerry Banks,
+publisher John Wiley &amp; Sons, inc, 1998</p>
+</li>
+<li>
+<p><a id="law-ref"></a>[law-ref] Simulation Modeling &amp; Analysis, fourth edition,
+by Averill M. Law,
+publisher McGraw-Hill, International Edition, 2007,
+ISBN 978-007-125519-6</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-types">Types</h3>
+<div class="paragraph">
+<p>
+A type defines the set of possible values of an expression or a variable.
+Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/type.png" alt="type">
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>ElementaryType</code> block contains types that do not build on other types.
+They are explained further in <a href="#ref-elementary-type">Elementary types</a>.</p>
+</li>
+<li>
+<p>The <code>ContainerType</code> block contains types that can store values of a single
+other type, the 'list', 'set', and 'dictionary' type. These types are further
+explained in <a href="#ref-container-type">Container types</a>.</p>
+</li>
+<li>
+<p>The <code>TupleType</code> block describes 'tuples', a type that can hold values of
+several other types.</p>
+</li>
+<li>
+<p>The <code>ChannelType</code> blocks describes communication channels that connect
+processes with each other, see <a href="#ref-channel-type">Channel type</a> for more explanation.</p>
+</li>
+<li>
+<p>The <code>DistributionType</code> block contains the stochastic distribution type,
+explained in <a href="#ref-distribution-type">Distribution type</a>.</p>
+</li>
+<li>
+<p>The <code>FunctionType</code> can hold a function definition. It allows you to pass
+a function to a process or another function. It is further explained in
+<a href="#ref-function-type">Function type</a>.</p>
+</li>
+<li>
+<p>The <code>ProcessType</code> can hold a process definition. It allows you to pass
+a process definition to a another process. It is further explained in
+<a href="#ref-process-type">Process type</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The <code>TypeName</code> is the name of a type defined with a <code>type</code> definition
+(explained in <a href="#ref-type-definitions">Type definitions</a>). For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">type lot = real;
+
+model M():
+    lot x;
+
+    ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>lot x</code> variable declaration (explained in <a href="#ref-variable-declarations">Local variables</a>)
+uses the type definition of <code>lot</code> at the first line to define the type of
+variable <code>x</code>.</p>
+</div>
+<div class="paragraph">
+<p>The <code>EnumTypeName</code> is similar, except it uses an enumeration definition (see
+<a href="#ref-enum-definitions">Enumeration definitions</a>) as type. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">enum FlagColours = {red, white, blue};
+
+model M():
+    FlagColours x = white;
+
+    ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>FlagColours x</code> variable declaration defines that variable <code>x</code> has the
+type of the enumeration, and can hold its values.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="ref-elementary-type">Elementary types</h4>
+<div class="paragraph">
+<p>The elementary types do not depend on other types to define their set of
+allowed values. Their syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/elementary_type.png" alt="elementary type">
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, they are mostly just a single keyword. The
+<code>ConstantExpression</code> nodes in the <code>matrix</code> type line are integer
+expressions with a fixed (and known) value before execution of the program.
+More information about the elementary types is provided below.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-boolean-type">Boolean type</h5>
+<div class="paragraph">
+<p>The <code>bool</code> keyword denotes the boolean data type. The allowed values are
+<code>false</code> and <code>true</code>. While it is allowed to store boolean values in other
+data types, their most frequent use is in expressions of statements that
+decide what to do, for example, the condition in the <code>while</code>, <code>if</code> or
+select statement (see <a href="#ref-while-loop-statement">While loop statement</a>,
+<a href="#ref-choice-statement">Choice statement</a> and <a href="#ref-select-statement">Select statement</a>).
+Expressions with booleans are explained in <a href="#ref-boolean-expression">Boolean expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-integer-type">Integer type</h5>
+<div class="paragraph">
+<p>The <code>int</code> keyword denotes the integer data type, integer numbers from
+<code>2147483647</code> to <code>-2147483648</code> (a standard signed 32 bit number). Values outside
+that range give undefined behavior.
+Expressions with integers are explained in <a href="#ref-integer-expression">Integer expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-real-type">Real type</h5>
+<div class="paragraph">
+<p>The <code>real</code> keyword denotes the real number data type, real numbers between
+<code>4.94065645841246544e-324</code> to <code>1.79769313486231570e+308</code> positive or negative (a
+standard 8 bytes IEEE 754 number). As normal with floating point numbers in
+computer systems, many  values are missing from the above range. Expect
+rounding errors with each calculation.
+Expressions with real numbers are explained in <a href="#ref-real-expression">Real number expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-string-type">String type</h5>
+<div class="paragraph">
+<p>The <code>string</code> keyword denotes strings, sequences of characters. It contains
+all printable ASCII characters U+0020 to U+007E, and 'tab' (U+0009) and
+'new line' (U+000A).
+Expressions with strings are explained in <a href="#ref-string-expression">String expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-file-type">File type</h5>
+<div class="paragraph">
+<p>The <code>file</code> keyword denotes a file at the file system of the computer. It
+allows reading and writing values of many data types (not all data types can
+be read or written). Expressions with files are explained in
+<a href="#ref-file-expression">File handle expressions</a>.
+How to work with files is explained in <a href="#tut-chapter-input-and-output">Input and output</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-inst-type">Instance type</h5>
+<div class="paragraph">
+<p>The <code>inst</code> keyword denotes an instance type, it can store a running
+process. Its use is to check whether the stored process has ended.
+The <a href="#ref-finish-statement">Finish statement</a> gives more details and provides an example.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-timer-type">Timer type</h5>
+<div class="paragraph">
+<p>The <code>timer</code> keyword denotes a count-down timer. Variables of this type
+measure time that has passed since their initialization. Expressions with
+timers are given in <a href="#ref-timer-expression">Timer expressions</a>, a tutorial about using
+timers can be found in <a href="#tut-using-timers">Timers</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-matrix-type">Matrix type</h5>
+<div class="paragraph">
+<p>The <code>matrix</code> type takes two constant expressions that define the number of
+rows and the number of columns of the matrix. The main purpose of the data
+type is to allow temporary storage of matrices so they can be passed on to
+other software. The Chi language also has expressions to write literal
+matrices, see <a href="#ref-matrix-expression">Matrix expression</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-void-type">Void type</h5>
+<div class="paragraph">
+<p>The <code>void</code> type denotes that no data is involved. Values of type <code>void</code> do
+not exist. The type is allowed at two places in the Chi specification, namely</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As data type of synchronization channels. Further explanation can be found
+at <a href="#ref-communication-statements">Communication statements</a> and <a href="#ref-channel-type">Channel type</a>.</p>
+</li>
+<li>
+<p>As exit type of <a href="#ref-model-definitions">Model definitions</a> and
+<a href="#ref-process-definitions">Process definitions</a>, to express that it may return an exit value
+from an <a href="#ref-exit-statement">Exit statement</a> without arguments.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-container-type">Container types</h4>
+<div class="paragraph">
+<p>The main function of container types is to organize and hold a collection of
+values of another type (the <em>element type</em>).
+The syntax diagram of the container types is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/container_type.png" alt="container type">
+</div>
+</div>
+<div class="paragraph">
+<p>The language has three container types, <em>lists</em> (explained in
+<a href="#ref-list-type">List type</a>), <em>sets</em> (explained in <a href="#ref-set-type">Set type</a>), and
+<em>dictionaries</em> (explained in <a href="#ref-dictionary-type">Dictionary type</a>).</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="ref-list-type">List type</h5>
+<div class="paragraph">
+<p>The list type has an ordered collection of values from its element type as its
+value. Duplicate element values are allowed.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of a list type is given below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/list_type.png" alt="list type">
+</div>
+</div>
+<div class="paragraph">
+<p>It starts with the keyword <code>list</code>, optionally followed by a parenthesized
+(non-negative) integer expression denoting the initial number of element
+values in the collection, and finally the type of the element values.</p>
+</div>
+<div class="paragraph">
+<p>The default size of the collection is the value of the integer expression, or
+0 if there is no such expression. The value of the elements in the initial
+list value depends on the type of the elements.</p>
+</div>
+<div class="paragraph">
+<p>A few examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">list bool    # A list of boolean values, initial value is &lt;bool&gt;[]
+list (2) int # A list of integer values, initial value is [0, 0]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For a discussion of operations on values of this type,
+see <a href="#ref-list-expression">List expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-set-type">Set type</h5>
+<div class="paragraph">
+<p>The set type has an unordered collection of values from its element type as
+its value. Duplicate element values are silently discarded.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of the set type is given below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/set_type.png" alt="set type">
+</div>
+</div>
+<div class="paragraph">
+<p>The set type starts with a <code>set</code> keyword, followed by the type of its
+elements. Its initial value is the empty set.
+An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">set real  # A set of real numbers, initial value &lt;real&gt;{}.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For a discussion of operations on values of this type, see
+<a href="#ref-set-expression">Set expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="ref-dictionary-type">Dictionary type</h5>
+<div class="paragraph">
+<p>The dictionary type has an unordered collection of values of its key type, so
+called keys. The keys are unique in the collection. In addition,
+the dictionary has a value of its value type associated with each key.</p>
+</div>
+<div class="paragraph">
+<p>The syntax of a dictionary type is given below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/dictionary_type.png" alt="dictionary type">
+</div>
+</div>
+<div class="paragraph">
+<p>The syntax starts with a <code>dict</code> keyword, and the key type and value type
+between parentheses, separated by a colon.
+The initial value of a dictionary type is the empty dictionary. An example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">dict (bool : int)  # A dictionary with boolean keys, and integer values.
+                   # Initial value &lt;bool:int&gt;{}.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For a discussion of operations on values of this type, see
+<a href="#ref-dictionary-expression">Dictionary expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-tuple-type">Tuple type</h4>
+<div class="paragraph">
+<p>A tuple contains a fixed number of values of (possibly) different types. Its
+syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/tuple_type.png" alt="tuple type">
+</div>
+</div>
+<div class="paragraph">
+<p>A tuple type starts with the keyword <code>tuple</code>, followed by the list of its
+fields between parentheses. Each field has a name and a type. Sequences of
+fields with the same type can share their type description, which reduces the
+amount of text of the tuple type.
+Tuple types must have at least two fields.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="chi">tuple(int a, b)      # A tuple containing fields 'a' and 'b', both of type int
+tuple(int a; int b)  # A tuple containing fields 'a' and 'b', both of type int
+
+tuple(lot x; real start) # A tuple with a 'lot' and a 'real' type.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first two examples are equivalent, the first form is just a bit shorter in
+notation. The third example is more common fields of different types that are
+kept together in the modeled system.
+Expressions with tuples are discussed in <a href="#ref-tuple-expression">Tuple expression</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-channel-type">Channel type</h4>
+<div class="paragraph">
+<p>The channel type defines the direction and the type of values transported.
+The syntax of the channel type is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/channel_type.png" alt="channel type">
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>chan</code> keyword denotes a channel type is being created. It may be
+followed by allowed directions of transport, a <code>!</code> means that sending values
+is allowed but not for receiving, and a <code>?</code> means that receiving values is
+allowed and sending is not allowed. Finally <code>!?</code> means
+both sending and receiving is allowed. The latter is also selected when no
+direction is specified.
+The language silently discards allowed directions. A channel usable for both
+sending and receiving may be used as a channel for sending only (dropping
+the ability to receive at that point). It does not allow adding directions, a
+receive-only channel cannot be used for sending. It can also not be used as a
+channel for sending and receiving, even if then latter is only used for
+receiving values (that is, sending is never done).</p>
+</div>
+<div class="paragraph">
+<p>The type of data that is transported with a communication is given by the
+<code>Type</code> block. Signalling channels (that only synchronize without
+transporting data) are indicated by the <code>void</code> keyword.
+The only expressions available for channels are the equality tests, and a
+function to create new channels, see
+<a href="#ref-channel-expression">Channel expressions</a> for details.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-distribution-type">Distribution type</h4>
+<div class="paragraph">
+<p>The distribution type represents a stochastic distribution. The syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/distribution_type.png" alt="distribution type">
+</div>
+</div>
+<div class="paragraph">
+<p>A stochastic distribution allows modeling of random behavior, but with a known
+chance distribution. The <code>Type</code> block in the <code>DistributionType</code> diagram
+defines the type of values drawn. For a discussion of expressions for the
+distribution type, see <a href="#ref-distribution-expression">Distribution expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-function-type">Function type</h4>
+<div class="paragraph">
+<p>The function type can hold a function. Its syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/function_type.png" alt="function type">
+</div>
+</div>
+<div class="paragraph">
+<p>A function type starts with the keyword <code>func</code> followed by the return type
+of the function and the type of the formal parameters.
+The purpose of the function type is to pass functions to processes or other
+functions, for example, the predicate function in <code>sort</code> and <code>insert</code>, see
+<a href="#ref-list-stdlib">List functions</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-process-type">Process type</h4>
+<div class="paragraph">
+<p>The process type is similar to the function type (discussed in
+<a href="#ref-function-type">Function type</a>), except this type can hold a process definition.
+The syntax is</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./reference-manual/rail_diagrams/process_type.png" alt="process type">
+</div>
+</div>
+<div class="paragraph">
+<p>The type starts with the keyword <code>proc</code> followed by the formal parameters of
+the process definition to store between parentheses.
+Expressions with process types are explained in <a href="#ref-process-expression">Process expressions</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-lexical-syntax">Lexical syntax</h3>
+<div class="paragraph">
+<p>At the lowest level, a Chi specification file consists of a sequence of
+characters. The characters are grouped together to form keywords, names,
+literal values such as numbers, and symbols such as expression operators
+like <code>+</code> and statement separator <code>;</code>. Also comments are recognized at this
+level.</p>
+</div>
+<div class="sect3">
+<h4 id="ref-whitespace">Whitespace</h4>
+<div class="paragraph">
+<p>The characters that delimit groups and lines from each other is known as
+<em>whitespace</em>. It contains the 'tab' character (U0009), the 'line feed'
+character (U000A), the 'carriage return' character (U000D), and the 'space'
+character (U0020).</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-comment">Comment</h4>
+<div class="paragraph">
+<p>A comment is a line of text intended for annotating the program text. It can
+also be used to (temporarily) add or remove statements.
+In the latter case, do note that the meaning of the program may change.</p>
+</div>
+<div class="paragraph">
+<p>A line of comment starts with a 'hash' character <code>#</code>, and continues
+until a 'line feed' character (or the end of the file). All characters in the
+comment are ignored by the simulator.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-lexical-names">Names</h4>
+<div class="paragraph">
+<p>A name is a word-like group of characters. It may start with a <code>$</code> prefix.
+After the prefix (if one is provided), first a letter (<code>A</code> to <code>Z</code> or <code>a</code>
+to <code>z</code>) or an 'underscore' character <code>_</code> should be used, optionally
+followed by more letters, 'underscore' characters, or digits <code>0</code> to <code>9</code>.</p>
+</div>
+<div class="paragraph">
+<p>Some names are special in the sense that the Chi language reserves them for
+its own use, for example the names <code>model</code> and <code>end</code>. Keywords are always
+written using lowercase letters. In the grammar diagrams, the keywords are
+shown in a rounded box. Names starting with a <code>$</code> prefix are never used as
+keyword.</p>
+</div>
+<div class="paragraph">
+<p>Names not used as keyword can be used to give entities in the Chi program a
+unique identification. In the grammar of this reference manual names are split
+according to the kind of entity that they refer to:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">ConstantName</dt>
+<dd>
+<p>Name that refers to a constant value, see <a href="#ref-constant-definitions">Constant definitions</a>
+for details.</p>
+</dd>
+<dt class="hdlist1">EnumtypeName</dt>
+<dd>
+<p>Name that refers to an enum type, see <a href="#ref-enum-definitions">Enumeration definitions</a> for
+details.</p>
+</dd>
+<dt class="hdlist1">EnumvalueName</dt>
+<dd>
+<p>Name that refers to a value within an enum type, see
+<a href="#ref-enum-value-expression">Enumeration value</a> for details.</p>
+</dd>
+<dt class="hdlist1">FieldName</dt>
+<dd>
+<p>Name that refers to a field in a tuple type, see <a href="#ref-tuple-type">Tuple type</a>
+for more details about tuples.</p>
+</dd>
+<dt class="hdlist1">FunctionName</dt>
+<dd>
+<p>Name that refers to a function definition, see
+<a href="#ref-function-definitions">Function definitions</a> for details.</p>
+</dd>
+<dt class="hdlist1">ModelName</dt>
+<dd>
+<p>Name that refers to a model definition, see <a href="#ref-model-definitions">Model definitions</a>
+for details.</p>
+</dd>
+<dt class="hdlist1">ProcessName</dt>
+<dd>
+<p>Name that refers to a process definition, see
+<a href="#ref-process-definitions">Process definitions</a> for details.</p>
+</dd>
+<dt class="hdlist1">TypeName</dt>
+<dd>
+<p>Name that refers to a type, see <a href="#ref-type-definitions">Type definitions</a> for details.</p>
+</dd>
+<dt class="hdlist1">VariableName</dt>
+<dd>
+<p>Name that refers to a variable (see <a href="#ref-variable-declarations">Local variables</a>) or
+formal parameter in a process or function (see <a href="#ref-formal-parameters">Formal parameters</a>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>Names are also shown in a rounded box, but as shown above, start with an
+uppercase letter and end with <code>Name</code>.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-migration">Model migration</h3>
+<div class="paragraph">
+<p>There are currently no migrations to upgrade from older versions of Chi.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="ref-chapter-svg-visualization">SVG visualization</h3>
+<div class="paragraph">
+<p>The Chi simulator has the possibility to display an SVG file during the
+simulation. The model can modify the displayed image depending on the state of
+the simulated system, thus visualizing the system.</p>
+</div>
+<div class="paragraph">
+<p>Such a visualization is useful for getting a quick global verification, as
+well as explaining the purpose of the model to people that do not know the
+detailed ins and outs of the problem being solved.</p>
+</div>
+<div class="paragraph">
+<p>Below are the technical details of the SVG visualization. The tutorial has a
+<a href="#tut-chapter-svg-visualization">more gentle introduction</a> into the subject.</p>
+</div>
+<div class="sect3">
+<h4 id="ref-svg-interface">SVG interface</h4>
+<div class="paragraph">
+<p>The SVG visualization itself is controlled by the simulator. Normally, it is
+updated just before a time step is performed. The simulation can however
+force an update with the <code>redraw</code> command (see below for details).</p>
+</div>
+<div class="paragraph">
+<p>The simulation accesses the SVG visualization by opening a file for writing
+with a name like <code>SVG:xyz.svg</code>. The <code>SVG:</code> prefix redirects the request to
+the SVG visualizer, the <code>xyz.svg</code> suffix is the name of the SVG file to
+display. The file should be available at the file system.</p>
+</div>
+<div class="paragraph">
+<p>Different Chi processes may open the same file at the same time. The SVG
+visualizer can only display one SVG file at a time, it is not allowed for
+processes to open different <code>.svg</code> files.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="ref-visualization-modification-commands">Visualization modification commands</h4>
+<div class="paragraph">
+<p>After opening the file, the content of the SVG file can be changed by
+modifying the nodes. This is done by writing lines with commands (one command
+at each line). Available commands are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><strong>Copy an element (recursively)</strong></p>
+<div class="paragraph">
+<p><code>copy [orig-id], [opt-prefix], [op-suffix]</code>, with <code>[orig-id]</code> the
+id-name of the element to copy, <code>[opt-prefix]</code> an optional prefix that is
+added to the <code>id</code> of all copied elements, and <code>[opt-suffix]</code> an optional
+suffix that is added to the <code>id</code> of all copied elements. Since the <code>id</code>
+of all elements must be unique, leaving both the prefix and the suffix empty
+gives an error about duplicate <code>id</code> labels.</p>
+</div>
+<div class="paragraph">
+<p>Note that the element (and its descendants) is only copied, but not moved.
+In other words, after copying it is fully obscured by the original element.
+The next step is normally an absolute move command or an attribute command
+to perform a relative translate transformation.</p>
+</div>
+</li>
+<li>
+<p><strong>Move an element to an absolute position</strong></p>
+<div class="paragraph">
+<p><code>absmove [id] ([xpos], [ypos])</code> with <code>[id]</code> the id-name of the
+element to move, <code>[xpos]</code> the horizontal position to move to, and
+<code>[ypos]</code> the vertical position to move to. This operation adds a
+translation to the <code>transform</code> attribute of the node such that the
+top-left corner of the bounding rectangle is moved to the provided position.
+It also takes the existing transformation into account, and in doing so,
+will fail if the transformation cannot be reversed.</p>
+</div>
+<div class="paragraph">
+<p>The origin of the coordinate system is at the top-left of the SVG
+visualization window, with positive X running to the right, and positive Y
+running down.</p>
+</div>
+<div class="paragraph">
+<p>Avoid using this operation repeatedly on the same element. Instead move it
+once to a base position, and perform relative translate transformations
+on a child element to move it to the desired position.</p>
+</div>
+</li>
+<li>
+<p><strong>Change an attribute of an element</strong></p>
+<div class="paragraph">
+<p><code>attr [id].[atrribute] = [value]</code> with <code>[id]</code> the id-name of the
+element, <code>[attribute]</code> the name of the attribute of the element to change,
+and <code>[value]</code> the new value of the attribute.</p>
+</div>
+<div class="paragraph">
+<p>A change overwrites any previous value of the attribute. Also, names of
+attributes and syntax of values are not checked.</p>
+</div>
+</li>
+<li>
+<p><strong>Change the text of an element</strong></p>
+<div class="paragraph">
+<p><code>text [id] = [value]</code> with <code>[id]</code> the id-name of the element, and
+<code>[value]</code> the new text.</p>
+</div>
+</li>
+<li>
+<p><strong>Force a redraw of the image</strong></p>
+<div class="paragraph">
+<p>Normally the program redraws the SVG image when it detects a change in time
+after making changes in the image by using one of the previous commands.
+With this command you can fake a change in time, thus allowing you to also
+display intermediate states.</p>
+</div>
+<div class="paragraph">
+<p>The command is mostly useful in experiments, where time never changes.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="tool-chapter-tool-manual">Chi Tool Manual</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This manual explains how to use the Chi simulation software. Before using
+the software however, you need to install it. The software is part of the
+Eclipse ESCET software.</p>
+</div>
+<div class="paragraph">
+<p>Once you&#8217;re finished installing, you can start to
+<a href="#tool-chapter-software-operation">simulate</a> Chi programs. The easiest way to
+start simulation is to press the <em>F9</em> key in a Chi text editor, or when a Chi
+(a file with a <code>.chi</code> extension) is selected in the
+<em>Project Explorer</em> or <em>Package Explorer</em> tab.</p>
+</div>
+<div class="paragraph">
+<p><em>Topics</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tool-chapter-software-operation">Available operations on a <code>chi</code> file</a></p>
+</li>
+<li>
+<p><a href="#tool-chapter-command-line">Command line options</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="tool-chapter-software-operation">Software operation</h3>
+<div class="paragraph">
+<p>The Chi simulator software performs two steps internally:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Type checking of the Chi source file, and building a simulator for it.</p>
+</li>
+<li>
+<p>Running the created simulator.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Starting with a <code>.chi</code> source file, both steps have to be performed for a
+simulation. As this is the common situation, the software normally combines
+both steps.
+If you run many experiments with the same file, it becomes useful to skip the
+first step. How to do this is explained in <a href="#tool-compile-or-simulate">Compile only</a>.
+In addition, the software can be run from the command line. In that case,
+command-line options as explained in <a href="#tool-chapter-command-line">Command line options</a> need to be
+specified.</p>
+</div>
+<div class="sect3">
+<h4 id="tool-compile-and-simulate">Compile and simulate</h4>
+<div class="paragraph">
+<p>Normally, you want to simulate a <code>.chi</code> source file. The Chi simulator
+software uses two steps internally (first checking the input and building the
+simulator, then running the just created simulator), but these steps are
+combined in the dialog.</p>
+</div>
+<div class="paragraph">
+<p>The process starts by selecting the source file you want to use (a file with
+a <code>.chi</code> extension) in the <em>Project Explorer</em> or <em>Package Explorer</em> tab, and opening the
+popup menu with the right mouse button from that selection.
+Alternatively, open the file in the editor, and use the right mouse button to
+get a similar popup menu.</p>
+</div>
+<div class="paragraph">
+<p>From the popup menu, select <em>Simulate Chi file</em> entry. The
+selection causes the <em>Console</em> view to be opened in Eclipse, and a
+dialog window pops up to set the simulator options like below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tool-manual/chi_simulator_dialog.png" alt="chi simulator dialog">
+</div>
+</div>
+<div class="paragraph">
+<p>The dialog shows the source file being used in the <em>Input file path</em> box.
+Below it, in the <em>Instance</em> box, you can enter how to run the
+model or the experiment of the source file. The syntax of the input is the same
+as you would
+write it in your Chi file. For example, with a model definition
+<code>model M(list real xs, int n): ... end</code>, you could write <code>M([1.5, 2.81], 15)</code> as
+model instantiation. If you leave the entry empty, the simulator tries to find
+an experiment without any parameters (for example <code>X()</code>). If that fails, it
+tries to find a model without any parameters (typically <code>M()</code>). If both
+attempts fail, or the simulator finds more than one such experiment or model,
+an error is reported.</p>
+</div>
+<div class="paragraph">
+<p>If you want to set an initial seed (see
+<a href="#tut-simulating-stochastic-behavior">Simulating stochastic behavior</a> for a discussion), you can use the
+<em>Initial seed value</em> box. Value <code>0</code> means 'create a new one'.</p>
+</div>
+<div class="paragraph">
+<p>This is all you have to do, select <em>OK</em> at the bottom. The software
+performs its two steps, and if no errors are found, it runs the model.</p>
+</div>
+<div class="sect4">
+<h5 id="tool-quick-simulate">Quick simulate</h5>
+<div class="paragraph">
+<p>For files that do not need any further configuration before
+they are run, there is a <em>Quick simulate Chi file</em>. This menu
+option assumes the default configuration (a parameter-less experiment or
+model needs to be run with a new seed), skips the dialog (saving you from
+having to press <em>OK</em>) and immediately proceeds with processing the Chi file.</p>
+</div>
+<div class="paragraph">
+<p>This functionality is also available from the Chi text editor, by pressing
+the <em>F9</em> key. Alternatively, you can select a Chi file in the
+<em>Project Explorer</em> or <em>Package Explorer</em>, and press the
+<em>F9</em> key.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tool-compile-or-simulate">Compile only</h4>
+<div class="paragraph">
+<p>The above is convenient for simple experiments, but checking the input and
+building a simulator each time is tedious if you want to do several
+experiments with the same source file.
+For this reason, each step can be done separately as well.</p>
+</div>
+<div class="paragraph">
+<p>Only building a simulator starts in the same way as above, select a <code>.chi</code>
+source file from the <em>Project Explorer</em>, the <em>Package Explorer</em>
+or an editor window, and right-click at it. Select the <em>Simulate Chi file</em>
+option from the popup menu. As the file only gets compiled, the
+simulator options are of no interest. Instead switch to the <em>Compiler</em>
+tab. It looks like this:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tool-manual/chi_compiler_dialog.png" alt="chi compiler dialog">
+</div>
+</div>
+<div class="paragraph">
+<p>Most settings are only useful for developers, but at the bottom, check the
+<em>Write the compiled Java code to a .cchi file</em> box, and click
+<em>OK</em> at the bottom. Setting this option causes the simulator
+software to check the input file, build a simulator, write the constructed
+simulator to a <code>.cchi</code> file (a compiled Chi file), and quit. No simulation
+of the Chi model is performed at this time.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tool-simulate-a-compiled-model">Simulate a compiled model</h4>
+<div class="paragraph">
+<p>You can simulate the Chi model from the <code>.cchi</code> file now, by selecting
+that file as source file by right-clicking on it. Select the
+<em>Simulate Chi file</em> or the <em>Quick simulate Chi file</em>
+option as before, and proceed with setting the
+simulator options and running the model as-if you selected a normal <code>.chi</code>
+file, as explained in <a href="#tool-compile-and-simulate">Compile and simulate</a> above.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tool-terminating-a-simulation">Terminating a simulation</h4>
+<div class="paragraph">
+<p>A simulation ends when:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The model goes into a deadlock state,</p>
+</li>
+<li>
+<p>An <code>exit</code> statement is performed (see <a href="#tut-exit">experiments</a>
+in the tutorial),</p>
+</li>
+<li>
+<p>The simulation is terminated by the user, via the console
+<em>Terminate</em> button (explained below), or</p>
+</li>
+<li>
+<p>A runtime error occurs.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The simulation can be stopped at any time by using the <em>Terminate</em> button
+(image::./tool-manual/terminate_button.png[]),
+located at the upper right corner of the console.
+Note however that if the console does not have the focus, this button may not
+be visible. If the button is not visible, click somewhere in the console to
+make the button appear. If even then the button is still not available, it may
+still appear if you <em>Maximize</em> the console. Also note that the
+button has no effect while the simulator interactively asks for input from the
+console. However, once the console input is provided, and <em>ENTER</em> is
+pressed, the termination request will be processed.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tool-chapter-command-line">Command line options</h3>
+<div class="paragraph">
+<p>When you run the Chi software from the command line, the interactive dialog
+as shown in <a href="#tool-chapter-software-operation">Software operation</a> is not shown (at least not by
+default), and everything has to be specified at the command line instead.</p>
+</div>
+<div class="paragraph">
+<p>The Chi simulator software takes one input file, which is a filename
+with <code>.chi</code> extension, or a filename with <code>.cchi</code> extension.</p>
+</div>
+<div class="paragraph">
+<p>Below is a list of the available options of such a command line. Most of them
+are for advanced uses only, and not of interest to most users.</p>
+</div>
+<div class="sect3">
+<h4 id="tool-simulator-options">Simulator options</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>--instance=&lt;instance&gt;</code>, <code>-i &lt;instance&gt;</code></p>
+<div class="paragraph">
+<p>Instantiate the model of the file as given by instance.
+Default is instantiation of a model without parameters.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tool-general-application-options">General application options</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>--help, -h</code></p>
+<div class="paragraph">
+<p>Prints the help text of the application to the console.</p>
+</div>
+</li>
+<li>
+<p><code>--option-dialog=&lt;bool&gt;</code></p>
+<div class="paragraph">
+<p>Whether to show the option dialog after the command line options have
+been processed. Default is <code>off</code>.</p>
+</div>
+</li>
+<li>
+<p><code>--output-mode=&lt;outmode&gt;</code>, <code>-m &lt;outmode&gt;</code></p>
+<div class="paragraph">
+<p>The output mode. Specify <code>error</code> for errors only; <code>warning</code> for errors
+and warnings only; <code>normal</code> (default) for errors, warnings, and normal
+output; or <code>debug</code> for errors, warnings, normal, and debug output.</p>
+</div>
+</li>
+<li>
+<p><code>--show-license</code></p>
+<div class="paragraph">
+<p>Prints the license text of the application to the console.</p>
+</div>
+</li>
+<li>
+<p><code>--devmode=&lt;bool&gt;</code></p>
+<div class="paragraph">
+<p>Whether exceptional situations return limited user friendly information
+(<code>--devmode=off</code>), or extended developer oriented information
+(<code>--devmode=on</code>).
+Default is user friendly information.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tool-compiler-options">Compiler options</h4>
+<div class="ulist">
+<ul>
+<li>
+<p><code>--emf=&lt;bool&gt;</code>, <code>-e &lt;bool&gt;</code></p>
+<div class="paragraph">
+<p>Whether or not to write the generated EMF model after type checking
+(default is <code>off</code>).</p>
+</div>
+</li>
+<li>
+<p><code>--directory=&lt;dir&gt;</code>, <code>-d &lt;dir&gt;</code></p>
+<div class="paragraph">
+<p>Output directory for generated Java files. Output is not written when the
+option is empty or not provided.</p>
+</div>
+</li>
+<li>
+<p><code>--java-compile=&lt;bool&gt;</code>, <code>-c &lt;bool&gt;</code></p>
+<div class="paragraph">
+<p>Whether or not to perform compilation of the generated Java code (default
+is <code>on</code>).</p>
+</div>
+</li>
+<li>
+<p><code>--jar=&lt;bool&gt;</code>, <code>-j &lt;bool&gt;</code></p>
+<div class="paragraph">
+<p>Whether or not to write the compiled Java simulator classes (default is
+<code>off</code>).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="release-notes-chapter-index">Chi release notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The release notes for the releases of Chi and the associated tools, as
+part of the Eclipse ESCET project, are listed below in reverse chronological
+order.</p>
+</div>
+<div class="sect2">
+<h3 id="version-0-1-unreleased">Version 0.1 (unreleased)</h3>
+<div class="paragraph">
+<p>The first release of Chi as part of the Eclipse ESCET project.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="legal-chapter-index">Legal</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The material in this documentation is
+Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
+Eclipse, and the Eclipse Logo are registered trademarks of the
+Eclipse Foundation. Other names may be trademarks of their
+respective owners.</p>
+</div>
+<div class="paragraph">
+<p><strong>License</strong></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Foundation makes available all content in this document
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the MIT License. A copy of the MIT License
+is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>. For purposes of the
+MIT License, "Software" will mean the Content.</p>
+</div>
+<div class="paragraph">
+<p>If you did not receive this Content directly from the Eclipse Foundation,
+the Content is being redistributed by another party ("Redistributor") and
+different terms and conditions may apply to your use of any object code in
+the Content. Check the Redistributor&#8217;s license that was provided with the
+Content. If no such license exists, contact the Redistributor. Unless
+otherwise indicated below, the terms and conditions of the MIT License
+still apply to any source code in the Content and such source code may be
+obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
+pre.CodeRay{background:#f7f7f8}
+.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
+.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
+.CodeRay .line-numbers strong{color:#000}
+table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.CodeRay td{vertical-align:top;line-height:inherit}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.code{padding:0 0 0 .75em}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+  messageStyle: "none",
+  tex2jax: {
+    inlineMath: [["\\(", "\\)"]],
+    displayMath: [["\\[", "\\]"]],
+    ignoreClass: "nostem|nolatexmath"
+  },
+  asciimath2jax: {
+    delimiters: [["\\$", "\\$"]],
+    ignoreClass: "nostem|noasciimath"
+  },
+  TeX: { equationNumbers: { autoNumber: "none" } }
+})
+MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
+  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
+    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
+      data.math.root.display = "block"
+    }
+    return data
+  })
+})
+</script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+
+<div id="footer">
+<div id="footer-text">
+<a href="https://www.eclipse.org">Eclipse Home</a>
+|
+<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
+|
+<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
+|
+<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
+|
+<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/Makefile b/v0.1-M1/chi/reference-manual/distribution_plots/Makefile
new file mode 100644
index 0000000..5a4504c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/Makefile
@@ -0,0 +1,66 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+#
+# Makefile for building density function plots.
+# The *.dat files have been generated by the
+# gen-chi-docu-distributions-plot-data.launch launch configuration.
+#
+SVG_FILES=gamma.svg beta.svg binomial.svg bernoulli.svg disc_uni.svg \
+	cont_uni.svg exponential.svg lognormal.svg normal.svg poisson.svg \
+	triangle.svg weibull.svg
+
+.phony: images clean
+
+images: $(SVG_FILES)
+
+bernoulli.svg: bernoulli.plt bernoulli.dat
+	gnuplot bernoulli.plt
+
+beta.svg: beta.plt beta_0.8_0.5.dat beta_1.5_3.0.dat beta_2.0_2.0.dat beta_5.0_1.5.dat
+	gnuplot beta.plt
+
+binomial.svg: binomial.plt binomial_20_0.5.dat binomial_20_0.7.dat binomial_40_0.5.dat
+	gnuplot binomial.plt
+
+cont_uni.svg: cont_uni.plt cont_uni1.dat cont_uni2.dat
+	gnuplot cont_uni.plt
+
+disc_uni.svg: disc_uni.plt disc_uni1.dat disc_uni2.dat
+	gnuplot disc_uni.plt
+
+exponential.svg: exponential.plt exponential_0.5.dat exponential_1.0.dat exponential_1.5.dat
+	gnuplot exponential.plt
+
+gamma.svg: gamma.plt gamma_1.0_2.0.dat gamma_3.0_2.0.dat gamma_6.0_0.5.dat gamma_6.0_2.0.dat
+	gnuplot gamma.plt
+
+lognormal.svg: lognormal.plt lognormal_0.0_0.25.dat lognormal_0.0_0.5.dat lognormal_0.0_1.0.dat
+	gnuplot lognormal.plt
+
+normal.svg: normal.plt normal_3_1.dat normal_5_2.dat
+	gnuplot normal.plt
+
+poisson.svg: poisson.plt poisson_10.0.dat poisson_4.0.dat
+	gnuplot poisson.plt
+
+triangle.svg: triangle.plt triangle_1_2_4.dat
+	gnuplot triangle.plt
+
+weibull.svg: weibull.plt weibull_0.5_1.0.dat weibull_1.0_1.0.dat weibull_1.5_1.0.dat weibull_5.0_1.0.dat
+	gnuplot weibull.plt
+
+clean:
+	for i in $(SVG_FILES) $(SVG_FILES:.svg=.pdf);\
+	do if test -f $$i;\
+	   then rm $$i;\
+	   fi;\
+	done
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.dat b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.dat
new file mode 100644
index 0000000..d1707aa
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.dat
@@ -0,0 +1,14 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.31
+1	0.69
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.plt b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.plt
new file mode 100644
index 0000000..ee7607e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.plt
@@ -0,0 +1,27 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+set nokey
+set xrange [-0.2:1.2]
+set yrange [0:1]
+set xlabel "x"
+set ylabel "bernoulli(real p)"
+set label "bernoulli(0.69)" at 0.7, 0.5
+#set samples 2000
+set xtics ("false" 0, "true" 1)
+set output "bernoulli.svg"
+set style data impulses
+set pointsize 1
+plot "bernoulli.dat" using 1:2 with impulses linetype 1, \
+     "bernoulli.dat" using 1:2 with points linetype 1
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.svg b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.svg
new file mode 100644
index 0000000..9f6ac3b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/bernoulli.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,341.3 L80.9,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(63.6,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,260.1 L80.9,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(63.6,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,179.0 L80.9,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(63.6,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.6</text>
+	</g>
+	<path  d='M71.9,97.8 L80.9,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(63.6,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.8</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+	<path  d='M143.8,422.4 L143.8,413.4 M143.8,16.7 L143.8,25.7 '></path>
+	<g transform="translate(143.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>false</text>
+	</g>
+	<path  d='M503.1,422.4 L503.1,413.4 M503.1,16.7 L503.1,25.7 '></path>
+	<g transform="translate(503.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>true</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>bernoulli(real p)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(395.3,224.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>bernoulli(0.69)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M143.8,422.4 L143.8,296.6 M503.1,422.4 L503.1,142.5 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt0' transform='translate(143.8,296.6) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(503.1,142.5) scale(4.50)'/>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta.plt b/v0.1-M1/chi/reference-manual/distribution_plots/beta.plt
new file mode 100644
index 0000000..cb4d2ed
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta.plt
@@ -0,0 +1,31 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:20]
+#set yrange [0:0.5]
+set xlabel "x"
+set ylabel "beta(real p, q)"
+#set samples 2000
+set output "beta.svg"
+set nokey
+set label "beta(0.8, 0.5)" at 0.2, 0.8
+set label "beta(1.5, 3.0)" at 0.15, 2
+set label "beta(2.0, 2.0)" at 0.45, 1.6
+set label "beta(5.0, 1.5)" at 0.57, 2.5
+set style data lines
+plot "beta_0.8_0.5.dat" using 1:2 linetype 1, \
+     "beta_1.5_3.0.dat" using 1:2 linetype 2, \
+     "beta_2.0_2.0.dat" using 1:2 linetype 3, \
+     "beta_5.0_1.5.dat" using 1:2 linetype 4
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta.svg b/v0.1-M1/chi/reference-manual/distribution_plots/beta.svg
new file mode 100644
index 0000000..b17b93b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta.svg
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,364.4 L80.9,364.4 M575.0,364.4 L566.0,364.4 '></path>
+	<g transform="translate(63.6,368.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+	<path  d='M71.9,306.5 L80.9,306.5 M575.0,306.5 L566.0,306.5 '></path>
+	<g transform="translate(63.6,311.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+	<path  d='M71.9,248.5 L80.9,248.5 M575.0,248.5 L566.0,248.5 '></path>
+	<g transform="translate(63.6,253.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.5</text>
+	</g>
+	<path  d='M71.9,190.6 L80.9,190.6 M575.0,190.6 L566.0,190.6 '></path>
+	<g transform="translate(63.6,195.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 2</text>
+	</g>
+	<path  d='M71.9,132.6 L80.9,132.6 M575.0,132.6 L566.0,132.6 '></path>
+	<g transform="translate(63.6,137.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 2.5</text>
+	</g>
+	<path  d='M71.9,74.7 L80.9,74.7 M575.0,74.7 L566.0,74.7 '></path>
+	<g transform="translate(63.6,79.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 3</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 3.5</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M122.2,422.4 L122.2,413.4 M122.2,16.7 L122.2,25.7 '></path>
+	<g transform="translate(122.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.1</text>
+	</g>
+	<path  d='M172.5,422.4 L172.5,413.4 M172.5,16.7 L172.5,25.7 '></path>
+	<g transform="translate(172.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.2</text>
+	</g>
+	<path  d='M222.8,422.4 L222.8,413.4 M222.8,16.7 L222.8,25.7 '></path>
+	<g transform="translate(222.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.3</text>
+	</g>
+	<path  d='M273.1,422.4 L273.1,413.4 M273.1,16.7 L273.1,25.7 '></path>
+	<g transform="translate(273.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.4</text>
+	</g>
+	<path  d='M323.5,422.4 L323.5,413.4 M323.5,16.7 L323.5,25.7 '></path>
+	<g transform="translate(323.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.5</text>
+	</g>
+	<path  d='M373.8,422.4 L373.8,413.4 M373.8,16.7 L373.8,25.7 '></path>
+	<g transform="translate(373.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.6</text>
+	</g>
+	<path  d='M424.1,422.4 L424.1,413.4 M424.1,16.7 L424.1,25.7 '></path>
+	<g transform="translate(424.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.7</text>
+	</g>
+	<path  d='M474.4,422.4 L474.4,413.4 M474.4,16.7 L474.4,25.7 '></path>
+	<g transform="translate(474.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.8</text>
+	</g>
+	<path  d='M524.7,422.4 L524.7,413.4 M524.7,16.7 L524.7,25.7 '></path>
+	<g transform="translate(524.7,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.9</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>beta(real p, q)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(172.5,334.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>beta(0.8, 0.5)</text>
+	</g>
+	<g transform="translate(147.4,195.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>beta(1.5, 3.0)</text>
+	</g>
+	<g transform="translate(298.3,241.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>beta(2.0, 2.0)</text>
+	</g>
+	<g transform="translate(358.7,137.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>beta(5.0, 1.5)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M76.9,295.1 L82.0,311.0 L87.0,319.2 L92.0,324.5 L97.1,328.2 L102.1,331.1 L107.1,333.4 L112.1,335.3 
+		L117.2,336.9 L122.2,338.2 L127.2,339.3 L132.3,340.3 L137.3,341.1 L142.3,341.8 L147.4,342.5 L152.4,343.0 
+		L157.4,343.5 L162.5,344.0 L167.5,344.3 L172.5,344.6 L177.6,344.9 L182.6,345.1 L187.6,345.3 L192.6,345.5 
+		L197.7,345.6 L202.7,345.7 L207.7,345.7 L212.8,345.8 L217.8,345.8 L222.8,345.7 L227.9,345.7 L232.9,345.6 
+		L237.9,345.5 L243.0,345.4 L248.0,345.3 L253.0,345.1 L258.0,344.9 L263.1,344.7 L268.1,344.5 L273.1,344.2 
+		L278.2,344.0 L283.2,343.7 L288.2,343.3 L293.3,343.0 L298.3,342.7 L303.3,342.3 L308.4,341.9 L313.4,341.4 
+		L318.4,341.0 L323.5,340.5 L328.5,340.0 L333.5,339.5 L338.5,338.9 L343.6,338.3 L348.6,337.7 L353.6,337.1 
+		L358.7,336.4 L363.7,335.7 L368.7,334.9 L373.8,334.1 L378.8,333.3 L383.8,332.4 L388.9,331.5 L393.9,330.5 
+		L398.9,329.5 L403.9,328.5 L409.0,327.3 L414.0,326.1 L419.0,324.9 L424.1,323.6 L429.1,322.1 L434.1,320.7 
+		L439.2,319.1 L444.2,317.4 L449.2,315.6 L454.3,313.7 L459.3,311.6 L464.3,309.4 L469.3,307.1 L474.4,304.5 
+		L479.4,301.8 L484.4,298.8 L489.5,295.5 L494.5,291.9 L499.5,287.9 L504.6,283.5 L509.6,278.6 L514.6,273.1 
+		L519.7,266.8 L524.7,259.6 L529.7,251.2 L534.8,241.2 L539.8,229.1 L544.8,214.0 L549.8,194.6 L554.9,168.3 
+		L559.9,129.6 L564.9,64.5 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L82.0,319.1 L92.0,282.2 L102.1,257.8 L112.1,240.3 L122.2,227.6 L132.3,218.3 L142.3,211.9 
+		L152.4,207.7 L162.5,205.4 L172.5,204.7 L182.6,205.3 L192.6,207.2 L202.7,210.0 L212.8,213.7 L222.8,218.2 
+		L232.9,223.4 L243.0,229.2 L253.0,235.5 L263.1,242.1 L273.1,249.2 L283.2,256.6 L293.3,264.2 L303.3,272.0 
+		L313.4,279.9 L323.5,287.9 L333.5,296.0 L343.6,304.1 L353.6,312.2 L363.7,320.2 L373.8,328.1 L383.8,335.9 
+		L393.9,343.5 L403.9,351.0 L414.0,358.2 L424.1,365.1 L434.1,371.8 L444.2,378.2 L454.3,384.2 L464.3,389.9 
+		L474.4,395.2 L484.4,400.1 L494.5,404.6 L504.6,408.6 L514.6,412.1 L524.7,415.2 L534.8,417.7 L544.8,419.7 
+		L554.9,421.2 L564.9,422.1 '></path>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L82.0,408.8 L92.0,395.7 L102.1,383.2 L112.1,371.2 L122.2,359.8 L132.3,349.0 L142.3,338.7 
+		L152.4,328.9 L162.5,319.7 L172.5,311.1 L182.6,303.1 L192.6,295.5 L202.7,288.6 L212.8,282.2 L222.8,276.3 
+		L232.9,271.1 L243.0,266.3 L253.0,262.2 L263.1,258.5 L273.1,255.5 L283.2,253.0 L293.3,251.0 L303.3,249.6 
+		L313.4,248.8 L323.5,248.5 L333.5,248.8 L343.6,249.6 L353.6,251.0 L363.7,253.0 L373.8,255.5 L383.8,258.5 
+		L393.9,262.2 L403.9,266.3 L414.0,271.1 L424.1,276.3 L434.1,282.2 L444.2,288.6 L454.3,295.5 L464.3,303.1 
+		L474.4,311.1 L484.4,319.7 L494.5,328.9 L504.6,338.7 L514.6,349.0 L524.7,359.8 L534.8,371.2 L544.8,383.2 
+		L554.9,395.7 L564.9,408.8 '></path>
+</g>
+	</g>
+	<g id="Plot_4"><title>Plot_4</title>
+<g style="fill:none; color:cyan; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L82.0,422.4 L92.0,422.4 L102.1,422.4 L112.1,422.3 L122.2,422.3 L132.3,422.1 L142.3,421.8 
+		L152.4,421.5 L162.5,420.9 L172.5,420.2 L182.6,419.2 L192.6,417.9 L202.7,416.2 L212.8,414.2 L222.8,411.8 
+		L232.9,408.8 L243.0,405.4 L253.0,401.3 L263.1,396.6 L273.1,391.3 L283.2,385.2 L293.3,378.4 L303.3,370.8 
+		L313.4,362.3 L323.5,353.1 L333.5,342.9 L343.6,331.9 L353.6,320.1 L363.7,307.3 L373.8,293.8 L383.8,279.5 
+		L393.9,264.5 L403.9,248.8 L414.0,232.6 L424.1,216.1 L434.1,199.3 L444.2,182.5 L454.3,166.0 L464.3,150.0 
+		L474.4,135.0 L484.4,121.5 L494.5,110.0 L504.6,101.3 L514.6,96.5 L524.7,96.9 L534.8,104.5 L544.8,122.4 
+		L554.9,155.9 L564.9,217.7 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta_0.8_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/beta_0.8_0.5.dat
new file mode 100644
index 0000000..456f9ab
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta_0.8_0.5.dat
@@ -0,0 +1,110 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.010000	1.097966
+0.020000	0.960700
+0.030000	0.890423
+0.040000	0.845005
+0.050000	0.812364
+0.060000	0.787431
+0.070000	0.767619
+0.080000	0.751441
+0.090000	0.737968
+0.100000	0.726583
+0.110000	0.716858
+0.120000	0.708482
+0.130000	0.701227
+0.140000	0.694915
+0.150000	0.689412
+0.160000	0.684610
+0.170000	0.680421
+0.180000	0.676776
+0.190000	0.673618
+0.200000	0.670897
+0.210000	0.668574
+0.220000	0.666615
+0.230000	0.664991
+0.240000	0.663678
+0.250000	0.662656
+0.260000	0.661906
+0.270000	0.661413
+0.280000	0.661163
+0.290000	0.661147
+0.300000	0.661353
+0.310000	0.661774
+0.320000	0.662403
+0.330000	0.663234
+0.340000	0.664261
+0.350000	0.665482
+0.360000	0.666893
+0.370000	0.668492
+0.380000	0.670277
+0.390000	0.672247
+0.400000	0.674402
+0.410000	0.676743
+0.420000	0.679271
+0.430000	0.681986
+0.440000	0.684892
+0.450000	0.687991
+0.460000	0.691287
+0.470000	0.694783
+0.480000	0.698484
+0.490000	0.702397
+0.500000	0.706525
+0.510000	0.710877
+0.520000	0.715460
+0.530000	0.720282
+0.540000	0.725352
+0.550000	0.730681
+0.560000	0.736280
+0.570000	0.742160
+0.580000	0.748336
+0.590000	0.754822
+0.600000	0.761634
+0.610000	0.768791
+0.620000	0.776312
+0.630000	0.784220
+0.640000	0.792537
+0.650000	0.801290
+0.660000	0.810510
+0.670000	0.820228
+0.680000	0.830481
+0.690000	0.841310
+0.700000	0.852759
+0.710000	0.864880
+0.720000	0.877730
+0.730000	0.891375
+0.740000	0.905886
+0.750000	0.921350
+0.760000	0.937861
+0.770000	0.955531
+0.780000	0.974488
+0.790000	0.994882
+0.800000	1.016889
+0.810000	1.040717
+0.820000	1.066615
+0.830000	1.094880
+0.840000	1.125877
+0.850000	1.160051
+0.860000	1.197962
+0.870000	1.240313
+0.880000	1.288011
+0.890000	1.342247
+0.900000	1.404618
+0.910000	1.477329
+0.920000	1.563522
+0.930000	1.667866
+0.940000	1.797651
+0.950000	1.965065
+0.960000	2.192413
+0.970000	2.526339
+0.980000	3.087781
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta_1.5_3.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/beta_1.5_3.0.dat
new file mode 100644
index 0000000..16e367e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta_1.5_3.0.dat
@@ -0,0 +1,62 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.020000	0.891326
+0.040000	1.209600
+0.060000	1.420367
+0.080000	1.571050
+0.100000	1.680948
+0.120000	1.760456
+0.140000	1.816060
+0.160000	1.852200
+0.180000	1.872118
+0.200000	1.878297
+0.220000	1.872707
+0.240000	1.856958
+0.260000	1.832396
+0.280000	1.800169
+0.300000	1.761270
+0.320000	1.716572
+0.340000	1.666850
+0.360000	1.612800
+0.380000	1.555050
+0.400000	1.494176
+0.420000	1.430705
+0.440000	1.365123
+0.460000	1.297884
+0.480000	1.229410
+0.500000	1.160097
+0.520000	1.090319
+0.540000	1.020427
+0.560000	0.950755
+0.580000	0.881621
+0.600000	0.813327
+0.620000	0.746161
+0.640000	0.680400
+0.660000	0.616310
+0.680000	0.554145
+0.700000	0.494152
+0.720000	0.436568
+0.740000	0.381621
+0.760000	0.329533
+0.780000	0.280519
+0.800000	0.234787
+0.820000	0.192540
+0.840000	0.153975
+0.860000	0.119282
+0.880000	0.088649
+0.900000	0.062257
+0.920000	0.040285
+0.940000	0.022905
+0.960000	0.010288
+0.980000	0.002599
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta_2.0_2.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/beta_2.0_2.0.dat
new file mode 100644
index 0000000..c741a22
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta_2.0_2.0.dat
@@ -0,0 +1,62 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.020000	0.117600
+0.040000	0.230400
+0.060000	0.338400
+0.080000	0.441600
+0.100000	0.540000
+0.120000	0.633600
+0.140000	0.722400
+0.160000	0.806400
+0.180000	0.885600
+0.200000	0.960000
+0.220000	1.029600
+0.240000	1.094400
+0.260000	1.154400
+0.280000	1.209600
+0.300000	1.260000
+0.320000	1.305600
+0.340000	1.346400
+0.360000	1.382400
+0.380000	1.413600
+0.400000	1.440000
+0.420000	1.461600
+0.440000	1.478400
+0.460000	1.490400
+0.480000	1.497600
+0.500000	1.500000
+0.520000	1.497600
+0.540000	1.490400
+0.560000	1.478400
+0.580000	1.461600
+0.600000	1.440000
+0.620000	1.413600
+0.640000	1.382400
+0.660000	1.346400
+0.680000	1.305600
+0.700000	1.260000
+0.720000	1.209600
+0.740000	1.154400
+0.760000	1.094400
+0.780000	1.029600
+0.800000	0.960000
+0.820000	0.885600
+0.840000	0.806400
+0.860000	0.722400
+0.880000	0.633600
+0.900000	0.540000
+0.920000	0.441600
+0.940000	0.338400
+0.960000	0.230400
+0.980000	0.117600
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/beta_5.0_1.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/beta_5.0_1.5.dat
new file mode 100644
index 0000000..4ee7a92
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/beta_5.0_1.5.dat
@@ -0,0 +1,62 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.020000	0.000002
+0.040000	0.000034
+0.060000	0.000170
+0.080000	0.000532
+0.100000	0.001284
+0.120000	0.002633
+0.140000	0.004822
+0.160000	0.008130
+0.180000	0.012866
+0.200000	0.019370
+0.220000	0.028003
+0.240000	0.039148
+0.260000	0.053207
+0.280000	0.070593
+0.300000	0.091727
+0.320000	0.117036
+0.340000	0.146944
+0.360000	0.181871
+0.380000	0.222225
+0.400000	0.268398
+0.420000	0.320756
+0.440000	0.379637
+0.460000	0.445340
+0.480000	0.518119
+0.500000	0.598175
+0.520000	0.685642
+0.540000	0.780580
+0.560000	0.882961
+0.580000	0.992659
+0.600000	1.109426
+0.620000	1.232883
+0.640000	1.362493
+0.660000	1.497540
+0.680000	1.637095
+0.700000	1.779984
+0.720000	1.924741
+0.740000	2.069554
+0.760000	2.212194
+0.780000	2.349920
+0.800000	2.479352
+0.820000	2.596300
+0.840000	2.695507
+0.860000	2.770264
+0.880000	2.811801
+0.900000	2.808234
+0.920000	2.742582
+0.940000	2.588513
+0.960000	2.299208
+0.980000	1.765560
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/binomial.plt b/v0.1-M1/chi/reference-manual/distribution_plots/binomial.plt
new file mode 100644
index 0000000..89159e2
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/binomial.plt
@@ -0,0 +1,32 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:20]
+#set yrange [0:0.5]
+set xlabel "x"
+set ylabel "binomial(int n, real p)"
+#set samples 2000
+set output "binomial.svg"
+set nokey
+set label "binomial(20, 0.5)" at 2, 0.185
+set label "binomial(20, 0.7)" at 16, 0.17
+set label "binomial(40, 0.5)" at 24, 0.09
+set style data impulses
+set pointsize 1
+plot "binomial_20_0.5.dat" using 1:2 with impulses linetype 1, \
+     "binomial_20_0.5.dat" using 1:2 with points linetype 1, \
+     "binomial_20_0.7.dat" using 1:2 with impulses linetype 2, \
+     "binomial_20_0.7.dat" using 1:2 with points linetype 2, \
+     "binomial_40_0.5.dat" using 1:2 with impulses linetype 3, \
+     "binomial_40_0.5.dat" using 1:2 with points linetype 3
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/binomial.svg b/v0.1-M1/chi/reference-manual/distribution_plots/binomial.svg
new file mode 100644
index 0000000..9812442
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/binomial.svg
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 L89.2,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(71.9,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M80.2,381.8 L89.2,381.8 M575.0,381.8 L566.0,381.8 '></path>
+	<g transform="translate(71.9,386.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.02</text>
+	</g>
+	<path  d='M80.2,341.3 L89.2,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(71.9,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.04</text>
+	</g>
+	<path  d='M80.2,300.7 L89.2,300.7 M575.0,300.7 L566.0,300.7 '></path>
+	<g transform="translate(71.9,305.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.06</text>
+	</g>
+	<path  d='M80.2,260.1 L89.2,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(71.9,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.08</text>
+	</g>
+	<path  d='M80.2,219.5 L89.2,219.5 M575.0,219.5 L566.0,219.5 '></path>
+	<g transform="translate(71.9,224.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M80.2,179.0 L89.2,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(71.9,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.12</text>
+	</g>
+	<path  d='M80.2,138.4 L89.2,138.4 M575.0,138.4 L566.0,138.4 '></path>
+	<g transform="translate(71.9,142.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.14</text>
+	</g>
+	<path  d='M80.2,97.8 L89.2,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(71.9,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.16</text>
+	</g>
+	<path  d='M80.2,57.3 L89.2,57.3 M575.0,57.3 L566.0,57.3 '></path>
+	<g transform="translate(71.9,61.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.18</text>
+	</g>
+	<path  d='M80.2,16.7 L89.2,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(71.9,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M80.2,422.4 L80.2,413.4 M80.2,16.7 L80.2,25.7 '></path>
+	<g transform="translate(80.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M142.1,422.4 L142.1,413.4 M142.1,16.7 L142.1,25.7 '></path>
+	<g transform="translate(142.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5</text>
+	</g>
+	<path  d='M203.9,422.4 L203.9,413.4 M203.9,16.7 L203.9,25.7 '></path>
+	<g transform="translate(203.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 10</text>
+	</g>
+	<path  d='M265.8,422.4 L265.8,413.4 M265.8,16.7 L265.8,25.7 '></path>
+	<g transform="translate(265.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 15</text>
+	</g>
+	<path  d='M327.6,422.4 L327.6,413.4 M327.6,16.7 L327.6,25.7 '></path>
+	<g transform="translate(327.6,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 20</text>
+	</g>
+	<path  d='M389.5,422.4 L389.5,413.4 M389.5,16.7 L389.5,25.7 '></path>
+	<g transform="translate(389.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 25</text>
+	</g>
+	<path  d='M451.3,422.4 L451.3,413.4 M451.3,16.7 L451.3,25.7 '></path>
+	<g transform="translate(451.3,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 30</text>
+	</g>
+	<path  d='M513.2,422.4 L513.2,413.4 M513.2,16.7 L513.2,25.7 '></path>
+	<g transform="translate(513.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 35</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 40</text>
+	</g>
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>binomial(int n, real p)</text>
+	</g>
+	<g transform="translate(327.6,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(104.9,51.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>binomial(20, 0.5)</text>
+	</g>
+	<g transform="translate(278.1,82.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>binomial(20, 0.7)</text>
+	</g>
+	<g transform="translate(377.1,244.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>binomial(40, 0.5)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 M92.6,422.4 M104.9,422.4 L104.9,422.0 M117.3,422.4 L117.3,420.2 M129.7,422.4 L129.7,413.0 
+		M142.1,422.4 L142.1,392.4 M154.4,422.4 L154.4,347.4 M166.8,422.4 L166.8,272.4 M179.2,422.4 L179.2,178.7 
+		M191.5,422.4 L191.5,97.5 M203.9,422.4 L203.9,65.0 M216.3,422.4 L216.3,97.5 M228.6,422.4 L228.6,178.7 
+		M241.0,422.4 L241.0,272.4 M253.4,422.4 L253.4,347.4 M265.8,422.4 L265.8,392.4 M278.1,422.4 L278.1,413.0 
+		M290.5,422.4 L290.5,420.2 M302.9,422.4 L302.9,422.0 M315.2,422.4 M327.6,422.4 M340.0,422.4 M352.3,422.4 
+		M364.7,422.4 M377.1,422.4 M389.5,422.4 M401.8,422.4 M414.2,422.4 M426.6,422.4 M438.9,422.4 M451.3,422.4 
+		M463.7,422.4 M476.0,422.4 M488.4,422.4 M500.8,422.4 M513.2,422.4 M525.5,422.4 M537.9,422.4 M550.3,422.4 
+		M562.6,422.4 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt0' transform='translate(80.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(92.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(104.9,422.0) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(117.3,420.2) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(129.7,413.0) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(142.1,392.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(154.4,347.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(166.8,272.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(179.2,178.7) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(191.5,97.5) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(203.9,65.0) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(216.3,97.5) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(228.6,178.7) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(241.0,272.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(253.4,347.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(265.8,392.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(278.1,413.0) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(290.5,420.2) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(302.9,422.0) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(315.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(327.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(340.0,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(352.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(364.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(377.1,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(389.5,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(401.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(414.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(426.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(438.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(451.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(463.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(476.0,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(488.4,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(500.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(513.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(525.5,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(537.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(550.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt0' transform='translate(562.6,422.4) scale(4.50)'/>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 M92.6,422.4 M104.9,422.4 M117.3,422.4 M129.7,422.4 M142.1,422.4 L142.1,422.3 M154.4,422.4 
+		L154.4,422.0 M166.8,422.4 L166.8,420.3 M179.2,422.4 L179.2,414.6 M191.5,422.4 L191.5,398.0 M203.9,422.4 
+		L203.9,359.9 M216.3,422.4 L216.3,289.8 M228.6,422.4 L228.6,190.3 M241.0,422.4 L241.0,89.2 M253.4,422.4 
+		L253.4,33.7 M265.8,422.4 L265.8,59.6 M278.1,422.4 L278.1,157.8 M290.5,422.4 L290.5,277.2 M302.9,422.4 
+		L302.9,365.9 M315.2,422.4 L315.2,408.5 M327.6,422.4 L327.6,420.8 M340.0,422.4 M352.3,422.4 M364.7,422.4 
+		M377.1,422.4 M389.5,422.4 M401.8,422.4 M414.2,422.4 M426.6,422.4 M438.9,422.4 M451.3,422.4 M463.7,422.4 
+		M476.0,422.4 M488.4,422.4 M500.8,422.4 M513.2,422.4 M525.5,422.4 M537.9,422.4 M550.3,422.4 M562.6,422.4 
+		'></path>
+</g>
+	</g>
+	<g id="Plot_4"><title>Plot_4</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt1' transform='translate(80.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(92.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(104.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(117.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(129.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(142.1,422.3) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(154.4,422.0) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(166.8,420.3) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(179.2,414.6) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(191.5,398.0) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(203.9,359.9) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(216.3,289.8) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(228.6,190.3) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(241.0,89.2) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(253.4,33.7) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(265.8,59.6) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(278.1,157.8) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(290.5,277.2) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(302.9,365.9) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(315.2,408.5) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(327.6,420.8) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(340.0,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(352.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(364.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(377.1,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(389.5,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(401.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(414.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(426.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(438.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(451.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(463.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(476.0,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(488.4,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(500.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(513.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(525.5,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(537.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(550.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt1' transform='translate(562.6,422.4) scale(4.50)'/>
+</g>
+	</g>
+	<g id="Plot_5"><title>Plot_5</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 M92.6,422.4 M104.9,422.4 M117.3,422.4 M129.7,422.4 M142.1,422.4 M154.4,422.4 M166.8,422.4 
+		M179.2,422.4 L179.2,422.3 M191.5,422.4 L191.5,421.9 M203.9,422.4 L203.9,420.8 M216.3,422.4 L216.3,418.1 
+		M228.6,422.4 L228.6,412.1 M241.0,422.4 L241.0,400.2 M253.4,422.4 L253.4,379.6 M265.8,422.4 L265.8,348.2 
+		M278.1,422.4 L278.1,306.4 M290.5,422.4 L290.5,258.7 M302.9,422.4 L302.9,213.2 M315.2,422.4 L315.2,180.2 
+		M327.6,422.4 L327.6,168.1 M340.0,422.4 L340.0,180.2 M352.3,422.4 L352.3,213.2 M364.7,422.4 L364.7,258.7 
+		M377.1,422.4 L377.1,306.4 M389.5,422.4 L389.5,348.2 M401.8,422.4 L401.8,379.6 M414.2,422.4 L414.2,400.2 
+		M426.6,422.4 L426.6,412.1 M438.9,422.4 L438.9,418.1 M451.3,422.4 L451.3,420.8 M463.7,422.4 L463.7,421.9 
+		M476.0,422.4 L476.0,422.3 M488.4,422.4 M500.8,422.4 M513.2,422.4 M525.5,422.4 M537.9,422.4 M550.3,422.4 
+		M562.6,422.4 '></path>
+</g>
+	</g>
+	<g id="Plot_6"><title>Plot_6</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt2' transform='translate(80.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(92.6,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(104.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(117.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(129.7,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(142.1,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(154.4,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(166.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(179.2,422.3) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(191.5,421.9) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(203.9,420.8) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(216.3,418.1) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(228.6,412.1) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(241.0,400.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(253.4,379.6) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(265.8,348.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(278.1,306.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(290.5,258.7) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(302.9,213.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(315.2,180.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(327.6,168.1) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(340.0,180.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(352.3,213.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(364.7,258.7) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(377.1,306.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(389.5,348.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(401.8,379.6) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(414.2,400.2) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(426.6,412.1) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(438.9,418.1) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(451.3,420.8) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(463.7,421.9) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(476.0,422.3) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(488.4,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(500.8,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(513.2,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(525.5,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(537.9,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(550.3,422.4) scale(4.50)'/>
+	<use xlink:href='#gpPt2' transform='translate(562.6,422.4) scale(4.50)'/>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.5.dat
new file mode 100644
index 0000000..9ef2dbe
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.5.dat
@@ -0,0 +1,52 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.000001
+1	0.000019
+2	0.000181
+3	0.001087
+4	0.004621
+5	0.014786
+6	0.036964
+7	0.073929
+8	0.120134
+9	0.160179
+10	0.176197
+11	0.160179
+12	0.120134
+13	0.073929
+14	0.036964
+15	0.014786
+16	0.004621
+17	0.001087
+18	0.000181
+19	0.000019
+20	0.000001
+21	0.000000
+22	0.000000
+23	0.000000
+24	0.000000
+25	0.000000
+26	0.000000
+27	0.000000
+28	0.000000
+29	0.000000
+30	0.000000
+31	0.000000
+32	0.000000
+33	0.000000
+34	0.000000
+35	0.000000
+36	0.000000
+37	0.000000
+38	0.000000
+39	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.7.dat b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.7.dat
new file mode 100644
index 0000000..9afac8f
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_20_0.7.dat
@@ -0,0 +1,52 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.000000
+1	0.000000
+2	0.000000
+3	0.000001
+4	0.000005
+5	0.000037
+6	0.000218
+7	0.001018
+8	0.003859
+9	0.012007
+10	0.030817
+11	0.065370
+12	0.114397
+13	0.164262
+14	0.191639
+15	0.178863
+16	0.130421
+17	0.071604
+18	0.027846
+19	0.006839
+20	0.000798
+21	0.000000
+22	0.000000
+23	0.000000
+24	0.000000
+25	0.000000
+26	0.000000
+27	0.000000
+28	0.000000
+29	0.000000
+30	0.000000
+31	0.000000
+32	0.000000
+33	0.000000
+34	0.000000
+35	0.000000
+36	0.000000
+37	0.000000
+38	0.000000
+39	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/binomial_40_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_40_0.5.dat
new file mode 100644
index 0000000..ce85960
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/binomial_40_0.5.dat
@@ -0,0 +1,52 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.000000
+1	0.000000
+2	0.000000
+3	0.000000
+4	0.000000
+5	0.000001
+6	0.000003
+7	0.000017
+8	0.000070
+9	0.000249
+10	0.000771
+11	0.002103
+12	0.005081
+13	0.010944
+14	0.021107
+15	0.036585
+16	0.057164
+17	0.080702
+18	0.103119
+19	0.119401
+20	0.125371
+21	0.119401
+22	0.103119
+23	0.080702
+24	0.057164
+25	0.036585
+26	0.021107
+27	0.010944
+28	0.005081
+29	0.002103
+30	0.000771
+31	0.000249
+32	0.000070
+33	0.000017
+34	0.000003
+35	0.000001
+36	0.000000
+37	0.000000
+38	0.000000
+39	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.plt b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.plt
new file mode 100644
index 0000000..a3503e9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.plt
@@ -0,0 +1,25 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+set nokey
+set xrange [0.5:6.5]
+set yrange [0:0.25]
+set xlabel "x"
+set ylabel "uniform(real a, b)"
+set label "uniform(1.0, 6.0)" at 3.5, 0.18
+#set samples 2000
+set output "cont_uni.svg"
+set style data lines
+plot "cont_uni1.dat" using 1:2 linetype 1, \
+     "cont_uni2.dat" using 1:2 with points linetype 1 pt 6
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.svg b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.svg
new file mode 100644
index 0000000..5dfe954
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 L89.2,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(71.9,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M80.2,341.3 L89.2,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(71.9,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.05</text>
+	</g>
+	<path  d='M80.2,260.1 L89.2,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(71.9,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M80.2,179.0 L89.2,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(71.9,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.15</text>
+	</g>
+	<path  d='M80.2,97.8 L89.2,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(71.9,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M80.2,16.7 L89.2,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(71.9,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.25</text>
+	</g>
+	<path  d='M121.4,422.4 L121.4,413.4 M121.4,16.7 L121.4,25.7 '></path>
+	<g transform="translate(121.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M203.9,422.4 L203.9,413.4 M203.9,16.7 L203.9,25.7 '></path>
+	<g transform="translate(203.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M286.4,422.4 L286.4,413.4 M286.4,16.7 L286.4,25.7 '></path>
+	<g transform="translate(286.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M368.8,422.4 L368.8,413.4 M368.8,16.7 L368.8,25.7 '></path>
+	<g transform="translate(368.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M451.3,422.4 L451.3,413.4 M451.3,16.7 L451.3,25.7 '></path>
+	<g transform="translate(451.3,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5</text>
+	</g>
+	<path  d='M533.8,422.4 L533.8,413.4 M533.8,16.7 L533.8,25.7 '></path>
+	<g transform="translate(533.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 6</text>
+	</g>
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>uniform(real a, b)</text>
+	</g>
+	<g transform="translate(327.6,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(327.6,134.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>uniform(1.0, 6.0)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M121.4,153.0 L129.7,153.0 L137.9,153.0 L146.2,153.0 L154.4,153.0 L162.7,153.0 L170.9,153.0 L179.2,153.0 
+		L187.4,153.0 L195.7,153.0 L203.9,153.0 L212.1,153.0 L220.4,153.0 L228.6,153.0 L236.9,153.0 L245.1,153.0 
+		L253.4,153.0 L261.6,153.0 L269.9,153.0 L278.1,153.0 L286.4,153.0 L294.6,153.0 L302.9,153.0 L311.1,153.0 
+		L319.4,153.0 L327.6,153.0 L335.8,153.0 L344.1,153.0 L352.3,153.0 L360.6,153.0 L368.8,153.0 L377.1,153.0 
+		L385.3,153.0 L393.6,153.0 L401.8,153.0 L410.1,153.0 L418.3,153.0 L426.6,153.0 L434.8,153.0 L443.1,153.0 
+		L451.3,153.0 L459.5,153.0 L467.8,153.0 L476.0,153.0 L484.3,153.0 L492.5,153.0 L500.8,153.0 L509.0,153.0 
+		L517.3,153.0 L525.5,153.0 L529.6,153.0 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt5' transform='translate(533.8,153.0) scale(4.50)'/>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni1.dat b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni1.dat
new file mode 100644
index 0000000..f83d940
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni1.dat
@@ -0,0 +1,63 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+1.0	0.166
+1.1	0.166
+1.2	0.166
+1.3	0.166
+1.4	0.166
+1.5	0.166
+1.6	0.166
+1.7	0.166
+1.8	0.166
+1.9	0.166
+2.0	0.166
+2.1	0.166
+2.2	0.166
+2.3	0.166
+2.4	0.166
+2.5	0.166
+2.6	0.166
+2.7	0.166
+2.8	0.166
+2.9	0.166
+3.0	0.166
+3.1	0.166
+3.2	0.166
+3.3	0.166
+3.4	0.166
+3.5	0.166
+3.6	0.166
+3.7	0.166
+3.8	0.166
+3.9	0.166
+4.0	0.166
+4.1	0.166
+4.2	0.166
+4.3	0.166
+4.4	0.166
+4.5	0.166
+4.6	0.166
+4.7	0.166
+4.8	0.166
+4.9	0.166
+5.0	0.166
+5.1	0.166
+5.2	0.166
+5.3	0.166
+5.4	0.166
+5.5	0.166
+5.6	0.166
+5.7	0.166
+5.8	0.166
+5.9	0.166
+5.95	0.166
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni2.dat b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni2.dat
new file mode 100644
index 0000000..1d928d6
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/cont_uni2.dat
@@ -0,0 +1,13 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+6.0	0.166
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.plt b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.plt
new file mode 100644
index 0000000..015caec
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.plt
@@ -0,0 +1,27 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+set nokey
+set xrange [0.5:6.5]
+set yrange [0:0.25]
+set xlabel "x"
+set ylabel "uniform(int a, b)"
+set label "uniform(1, 6)" at 3.5, 0.22
+#set samples 2000
+set output "disc_uni.svg"
+set style data impulses
+set pointsize 3
+plot "disc_uni1.dat" using 1:2 with impulses linetype 1, \
+     "disc_uni1.dat" using 1:2 with dots linetype 1, \
+     "disc_uni2.dat" using 1:2 with points linetype 1 pt 6 ps 1
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.svg b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.svg
new file mode 100644
index 0000000..c81e1b7
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,422.4 L89.2,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(71.9,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M80.2,341.3 L89.2,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(71.9,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.05</text>
+	</g>
+	<path  d='M80.2,260.1 L89.2,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(71.9,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M80.2,179.0 L89.2,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(71.9,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.15</text>
+	</g>
+	<path  d='M80.2,97.8 L89.2,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(71.9,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M80.2,16.7 L89.2,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(71.9,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.25</text>
+	</g>
+	<path  d='M121.4,422.4 L121.4,413.4 M121.4,16.7 L121.4,25.7 '></path>
+	<g transform="translate(121.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M203.9,422.4 L203.9,413.4 M203.9,16.7 L203.9,25.7 '></path>
+	<g transform="translate(203.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M286.4,422.4 L286.4,413.4 M286.4,16.7 L286.4,25.7 '></path>
+	<g transform="translate(286.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M368.8,422.4 L368.8,413.4 M368.8,16.7 L368.8,25.7 '></path>
+	<g transform="translate(368.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M451.3,422.4 L451.3,413.4 M451.3,16.7 L451.3,25.7 '></path>
+	<g transform="translate(451.3,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5</text>
+	</g>
+	<path  d='M533.8,422.4 L533.8,413.4 M533.8,16.7 L533.8,25.7 '></path>
+	<g transform="translate(533.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 6</text>
+	</g>
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>uniform(int a, b)</text>
+	</g>
+	<g transform="translate(327.6,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(327.6,69.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>uniform(1, 6)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M121.4,422.4 L121.4,97.8 M203.9,422.4 L203.9,97.8 M286.4,422.4 L286.4,97.8 M368.8,422.4 L368.8,97.8 
+		M451.3,422.4 L451.3,97.8 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpDot' x='121.4' y='97.8'/>
+	<use xlink:href='#gpDot' x='203.9' y='97.8'/>
+	<use xlink:href='#gpDot' x='286.4' y='97.8'/>
+	<use xlink:href='#gpDot' x='368.8' y='97.8'/>
+	<use xlink:href='#gpDot' x='451.3' y='97.8'/>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<use xlink:href='#gpPt5' transform='translate(533.8,97.8) scale(4.50)'/>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M80.2,16.7 L80.2,422.4 L575.0,422.4 L575.0,16.7 L80.2,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni1.dat b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni1.dat
new file mode 100644
index 0000000..793ea65
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni1.dat
@@ -0,0 +1,17 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+1	0.2
+2	0.2
+3	0.2
+4	0.2
+5	0.2
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni2.dat b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni2.dat
new file mode 100644
index 0000000..8bf4747
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/disc_uni2.dat
@@ -0,0 +1,13 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+6	0.2
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/exponential.plt b/v0.1-M1/chi/reference-manual/distribution_plots/exponential.plt
new file mode 100644
index 0000000..8ae60eb
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/exponential.plt
@@ -0,0 +1,29 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:20]
+#set yrange [0:0.5]
+set xlabel "x"
+set ylabel "exponential(real m)"
+#set samples 2000
+set output "exponential.svg"
+set nokey
+set label "exponential(0.5)" at 0.2, 1.5
+set label "exponential(1.0)" at 0.9, 0.45
+set label "exponential(1.5)" at 2.5, 0.2
+set style data lines
+plot "exponential_0.5.dat" using 1:2 linetype 1, \
+     "exponential_1.0.dat" using 1:2 linetype 2, \
+     "exponential_1.5.dat" using 1:2 linetype 3
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/exponential.svg b/v0.1-M1/chi/reference-manual/distribution_plots/exponential.svg
new file mode 100644
index 0000000..75369b4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/exponential.svg
@@ -0,0 +1,333 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,381.8 L80.9,381.8 M575.0,381.8 L566.0,381.8 '></path>
+	<g transform="translate(63.6,386.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,341.3 L80.9,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(63.6,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,300.7 L80.9,300.7 M575.0,300.7 L566.0,300.7 '></path>
+	<g transform="translate(63.6,305.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.6</text>
+	</g>
+	<path  d='M71.9,260.1 L80.9,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(63.6,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.8</text>
+	</g>
+	<path  d='M71.9,219.5 L80.9,219.5 M575.0,219.5 L566.0,219.5 '></path>
+	<g transform="translate(63.6,224.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+	<path  d='M71.9,179.0 L80.9,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(63.6,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.2</text>
+	</g>
+	<path  d='M71.9,138.4 L80.9,138.4 M575.0,138.4 L566.0,138.4 '></path>
+	<g transform="translate(63.6,142.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.4</text>
+	</g>
+	<path  d='M71.9,97.8 L80.9,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(63.6,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.6</text>
+	</g>
+	<path  d='M71.9,57.3 L80.9,57.3 M575.0,57.3 L566.0,57.3 '></path>
+	<g transform="translate(63.6,61.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.8</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 2</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M172.5,422.4 L172.5,413.4 M172.5,16.7 L172.5,25.7 '></path>
+	<g transform="translate(172.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M273.1,422.4 L273.1,413.4 M273.1,16.7 L273.1,25.7 '></path>
+	<g transform="translate(273.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M373.8,422.4 L373.8,413.4 M373.8,16.7 L373.8,25.7 '></path>
+	<g transform="translate(373.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M474.4,422.4 L474.4,413.4 M474.4,16.7 L474.4,25.7 '></path>
+	<g transform="translate(474.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>exponential(real m)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(92.0,122.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>exponential(0.5)</text>
+	</g>
+	<g transform="translate(162.5,335.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>exponential(1.0)</text>
+	</g>
+	<g transform="translate(323.5,386.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>exponential(1.5)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L72.9,24.7 L73.9,32.6 L74.9,40.3 L75.9,47.9 L76.9,55.3 L77.9,62.6 L78.9,69.7 
+		L79.9,76.7 L81.0,83.5 L82.0,90.2 L83.0,96.8 L84.0,103.3 L85.0,109.6 L86.0,115.8 L87.0,121.9 
+		L88.0,127.8 L89.0,133.6 L90.0,139.4 L91.0,145.0 L92.0,150.5 L93.0,155.8 L94.0,161.1 L95.0,166.3 
+		L96.0,171.4 L97.1,176.3 L98.1,181.2 L99.1,186.0 L100.1,190.7 L101.1,195.2 L102.1,199.7 L103.1,204.2 
+		L104.1,208.5 L105.1,212.7 L106.1,216.9 L107.1,220.9 L108.1,224.9 L109.1,228.8 L110.1,232.7 L111.1,236.4 
+		L112.1,240.1 L113.2,243.7 L114.2,247.3 L115.2,250.7 L116.2,254.1 L117.2,257.5 L118.2,260.7 L119.2,263.9 
+		L120.2,267.1 L121.2,270.1 L122.2,273.2 L123.2,276.1 L124.2,279.0 L125.2,281.8 L126.2,284.6 L127.2,287.4 
+		L128.2,290.0 L129.3,292.6 L130.3,295.2 L131.3,297.7 L132.3,300.2 L133.3,302.6 L134.3,305.0 L135.3,307.3 
+		L136.3,309.6 L137.3,311.8 L138.3,314.0 L139.3,316.2 L140.3,318.3 L141.3,320.3 L142.3,322.4 L143.3,324.3 
+		L144.3,326.3 L145.4,328.2 L146.4,330.0 L147.4,331.9 L148.4,333.7 L149.4,335.4 L150.4,337.1 L151.4,338.8 
+		L152.4,340.5 L153.4,342.1 L154.4,343.7 L155.4,345.3 L156.4,346.8 L157.4,348.3 L158.4,349.8 L159.4,351.2 
+		L160.4,352.6 L161.5,354.0 L162.5,355.3 L163.5,356.7 L164.5,358.0 L165.5,359.2 L166.5,360.5 L167.5,361.7 
+		L168.5,362.9 L169.5,364.1 L170.5,365.3 L171.5,366.4 L172.5,367.5 L173.5,368.6 L174.5,369.6 L175.5,370.7 
+		L176.5,371.7 L177.6,372.7 L178.6,373.7 L179.6,374.7 L180.6,375.6 L181.6,376.5 L182.6,377.4 L183.6,378.3 
+		L184.6,379.2 L185.6,380.1 L186.6,380.9 L187.6,381.7 L188.6,382.5 L189.6,383.3 L190.6,384.1 L191.6,384.9 
+		L192.6,385.6 L193.7,386.3 L194.7,387.0 L195.7,387.7 L196.7,388.4 L197.7,389.1 L198.7,389.8 L199.7,390.4 
+		L200.7,391.0 L201.7,391.7 L202.7,392.3 L203.7,392.9 L204.7,393.4 L205.7,394.0 L206.7,394.6 L207.7,395.1 
+		L208.7,395.7 L209.7,396.2 L210.8,396.7 L211.8,397.2 L212.8,397.7 L213.8,398.2 L214.8,398.7 L215.8,399.2 
+		L216.8,399.6 L217.8,400.1 L218.8,400.5 L219.8,401.0 L220.8,401.4 L221.8,401.8 L222.8,402.2 L223.8,402.6 
+		L224.8,403.0 L225.8,403.4 L226.9,403.8 L227.9,404.1 L228.9,404.5 L229.9,404.8 L230.9,405.2 L231.9,405.5 
+		L232.9,405.9 L233.9,406.2 L234.9,406.5 L235.9,406.8 L236.9,407.1 L237.9,407.4 L238.9,407.7 L239.9,408.0 
+		L240.9,408.3 L241.9,408.6 L243.0,408.9 L244.0,409.1 L245.0,409.4 L246.0,409.6 L247.0,409.9 L248.0,410.1 
+		L249.0,410.4 L250.0,410.6 L251.0,410.9 L252.0,411.1 L253.0,411.3 L254.0,411.5 L255.0,411.7 L256.0,412.0 
+		L257.0,412.2 L258.0,412.4 L259.1,412.6 L260.1,412.8 L261.1,413.0 L262.1,413.1 L263.1,413.3 L264.1,413.5 
+		L265.1,413.7 L266.1,413.9 L267.1,414.0 L268.1,414.2 L269.1,414.4 L270.1,414.5 L271.1,414.7 L272.1,414.8 
+		L273.1,415.0 L274.1,415.1 L275.2,415.3 L276.2,415.4 L277.2,415.5 L278.2,415.7 L279.2,415.8 L280.2,415.9 
+		L281.2,416.1 L282.2,416.2 L283.2,416.3 L284.2,416.4 L285.2,416.6 L286.2,416.7 L287.2,416.8 L288.2,416.9 
+		L289.2,417.0 L290.2,417.1 L291.3,417.2 L292.3,417.3 L293.3,417.4 L294.3,417.5 L295.3,417.6 L296.3,417.7 
+		L297.3,417.8 L298.3,417.9 L299.3,418.0 L300.3,418.1 L301.3,418.2 L302.3,418.2 L303.3,418.3 L304.3,418.4 
+		L305.3,418.5 L306.3,418.6 L307.4,418.6 L308.4,418.7 L309.4,418.8 L310.4,418.9 L311.4,418.9 L312.4,419.0 
+		L313.4,419.1 L314.4,419.1 L315.4,419.2 L316.4,419.3 L317.4,419.3 L318.4,419.4 L319.4,419.4 L320.4,419.5 
+		L321.4,419.6 L322.4,419.6 L323.5,419.7 L324.5,419.7 L325.5,419.8 L326.5,419.8 L327.5,419.9 L328.5,419.9 
+		L329.5,420.0 L330.5,420.0 L331.5,420.1 L332.5,420.1 L333.5,420.2 L334.5,420.2 L335.5,420.2 L336.5,420.3 
+		L337.5,420.3 L338.5,420.4 L339.5,420.4 L340.6,420.5 L341.6,420.5 L342.6,420.5 L343.6,420.6 L344.6,420.6 
+		L345.6,420.6 L346.6,420.7 L347.6,420.7 L348.6,420.7 L349.6,420.8 L350.6,420.8 L351.6,420.8 L352.6,420.9 
+		L353.6,420.9 L354.6,420.9 L355.6,421.0 L356.7,421.0 L357.7,421.0 L358.7,421.0 L359.7,421.1 L360.7,421.1 
+		L361.7,421.1 L362.7,421.1 L363.7,421.2 L364.7,421.2 L365.7,421.2 L366.7,421.2 L367.7,421.3 L368.7,421.3 
+		L369.7,421.3 L370.7,421.3 L371.7,421.4 L372.8,421.4 L373.8,421.4 L374.8,421.4 L375.8,421.4 L376.8,421.5 
+		L377.8,421.5 L378.8,421.5 L379.8,421.5 L380.8,421.5 L381.8,421.5 L382.8,421.6 L383.8,421.6 L384.8,421.6 
+		L385.8,421.6 L386.8,421.6 L387.8,421.6 L388.9,421.7 L389.9,421.7 L390.9,421.7 L391.9,421.7 L392.9,421.7 
+		L393.9,421.7 L394.9,421.7 L395.9,421.8 L396.9,421.8 L397.9,421.8 L398.9,421.8 L399.9,421.8 L400.9,421.8 
+		L401.9,421.8 L402.9,421.8 L403.9,421.8 L405.0,421.9 L406.0,421.9 L407.0,421.9 L408.0,421.9 L409.0,421.9 
+		L410.0,421.9 L411.0,421.9 L412.0,421.9 L413.0,421.9 L414.0,421.9 L415.0,422.0 L416.0,422.0 L417.0,422.0 
+		L418.0,422.0 L419.0,422.0 L420.0,422.0 L421.1,422.0 L422.1,422.0 L423.1,422.0 L424.1,422.0 L425.1,422.0 
+		L426.1,422.0 L427.1,422.1 L428.1,422.1 L429.1,422.1 L430.1,422.1 L431.1,422.1 L432.1,422.1 L433.1,422.1 
+		L434.1,422.1 L435.1,422.1 L436.1,422.1 L437.2,422.1 L438.2,422.1 L439.2,422.1 L440.2,422.1 L441.2,422.1 
+		L442.2,422.1 L443.2,422.1 L444.2,422.2 L445.2,422.2 L446.2,422.2 L447.2,422.2 L448.2,422.2 L449.2,422.2 
+		L450.2,422.2 L451.2,422.2 L452.2,422.2 L453.2,422.2 L454.3,422.2 L455.3,422.2 L456.3,422.2 L457.3,422.2 
+		L458.3,422.2 L459.3,422.2 L460.3,422.2 L461.3,422.2 L462.3,422.2 L463.3,422.2 L464.3,422.2 L465.3,422.2 
+		L466.3,422.2 L467.3,422.2 L468.3,422.2 L469.3,422.2 L470.4,422.3 L471.4,422.3 L472.4,422.3 L473.4,422.3 
+		L474.4,422.3 L475.4,422.3 L476.4,422.3 L477.4,422.3 L478.4,422.3 L479.4,422.3 L480.4,422.3 L481.4,422.3 
+		L482.4,422.3 L483.4,422.3 L484.4,422.3 L485.4,422.3 L486.5,422.3 L487.5,422.3 L488.5,422.3 L489.5,422.3 
+		L490.5,422.3 L491.5,422.3 L492.5,422.3 L493.5,422.3 L494.5,422.3 L495.5,422.3 L496.5,422.3 L497.5,422.3 
+		L498.5,422.3 L499.5,422.3 L500.5,422.3 L501.5,422.3 L502.6,422.3 L503.6,422.3 L504.6,422.3 L505.6,422.3 
+		L506.6,422.3 L507.6,422.3 L508.6,422.3 L509.6,422.3 L510.6,422.3 L511.6,422.3 L512.6,422.3 L513.6,422.3 
+		L514.6,422.3 L515.6,422.3 L516.6,422.3 L517.6,422.3 L518.7,422.3 L519.7,422.3 L520.7,422.3 L521.7,422.3 
+		L522.7,422.3 L523.7,422.3 L524.7,422.3 L525.7,422.4 L526.7,422.4 L527.7,422.4 L528.7,422.4 L529.7,422.4 
+		L530.7,422.4 L531.7,422.4 L532.7,422.4 L533.7,422.4 L534.8,422.4 L535.8,422.4 L536.8,422.4 L537.8,422.4 
+		L538.8,422.4 L539.8,422.4 L540.8,422.4 L541.8,422.4 L542.8,422.4 L543.8,422.4 L544.8,422.4 L545.8,422.4 
+		L546.8,422.4 L547.8,422.4 L548.8,422.4 L549.8,422.4 L550.9,422.4 L551.9,422.4 L552.9,422.4 L553.9,422.4 
+		L554.9,422.4 L555.9,422.4 L556.9,422.4 L557.9,422.4 L558.9,422.4 L559.9,422.4 L560.9,422.4 L561.9,422.4 
+		L562.9,422.4 L563.9,422.4 L564.9,422.4 L565.9,422.4 L567.0,422.4 L568.0,422.4 L569.0,422.4 L570.0,422.4 
+		L571.0,422.4 L572.0,422.4 L573.0,422.4 L574.0,422.4 L575.0,422.4 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,219.5 L72.9,221.6 L73.9,223.6 L74.9,225.5 L75.9,227.5 L76.9,229.4 L77.9,231.4 L78.9,233.3 
+		L79.9,235.1 L81.0,237.0 L82.0,238.9 L83.0,240.7 L84.0,242.5 L85.0,244.3 L86.0,246.1 L87.0,247.8 
+		L88.0,249.5 L89.0,251.3 L90.0,253.0 L91.0,254.7 L92.0,256.3 L93.0,258.0 L94.0,259.6 L95.0,261.2 
+		L96.0,262.8 L97.1,264.4 L98.1,266.0 L99.1,267.5 L100.1,269.1 L101.1,270.6 L102.1,272.1 L103.1,273.6 
+		L104.1,275.1 L105.1,276.6 L106.1,278.0 L107.1,279.5 L108.1,280.9 L109.1,282.3 L110.1,283.7 L111.1,285.1 
+		L112.1,286.4 L113.2,287.8 L114.2,289.1 L115.2,290.4 L116.2,291.8 L117.2,293.1 L118.2,294.3 L119.2,295.6 
+		L120.2,296.9 L121.2,298.1 L122.2,299.4 L123.2,300.6 L124.2,301.8 L125.2,303.0 L126.2,304.2 L127.2,305.4 
+		L128.2,306.5 L129.3,307.7 L130.3,308.8 L131.3,310.0 L132.3,311.1 L133.3,312.2 L134.3,313.3 L135.3,314.4 
+		L136.3,315.4 L137.3,316.5 L138.3,317.6 L139.3,318.6 L140.3,319.6 L141.3,320.7 L142.3,321.7 L143.3,322.7 
+		L144.3,323.7 L145.4,324.6 L146.4,325.6 L147.4,326.6 L148.4,327.5 L149.4,328.5 L150.4,329.4 L151.4,330.3 
+		L152.4,331.3 L153.4,332.2 L154.4,333.1 L155.4,333.9 L156.4,334.8 L157.4,335.7 L158.4,336.6 L159.4,337.4 
+		L160.4,338.3 L161.5,339.1 L162.5,339.9 L163.5,340.7 L164.5,341.6 L165.5,342.4 L166.5,343.2 L167.5,343.9 
+		L168.5,344.7 L169.5,345.5 L170.5,346.3 L171.5,347.0 L172.5,347.8 L173.5,348.5 L174.5,349.3 L175.5,350.0 
+		L176.5,350.7 L177.6,351.4 L178.6,352.1 L179.6,352.8 L180.6,353.5 L181.6,354.2 L182.6,354.9 L183.6,355.5 
+		L184.6,356.2 L185.6,356.9 L186.6,357.5 L187.6,358.2 L188.6,358.8 L189.6,359.4 L190.6,360.1 L191.6,360.7 
+		L192.6,361.3 L193.7,361.9 L194.7,362.5 L195.7,363.1 L196.7,363.7 L197.7,364.3 L198.7,364.9 L199.7,365.4 
+		L200.7,366.0 L201.7,366.6 L202.7,367.1 L203.7,367.7 L204.7,368.2 L205.7,368.8 L206.7,369.3 L207.7,369.8 
+		L208.7,370.3 L209.7,370.9 L210.8,371.4 L211.8,371.9 L212.8,372.4 L213.8,372.9 L214.8,373.4 L215.8,373.9 
+		L216.8,374.3 L217.8,374.8 L218.8,375.3 L219.8,375.8 L220.8,376.2 L221.8,376.7 L222.8,377.1 L223.8,377.6 
+		L224.8,378.0 L225.8,378.5 L226.9,378.9 L227.9,379.3 L228.9,379.8 L229.9,380.2 L230.9,380.6 L231.9,381.0 
+		L232.9,381.4 L233.9,381.9 L234.9,382.3 L235.9,382.7 L236.9,383.1 L237.9,383.4 L238.9,383.8 L239.9,384.2 
+		L240.9,384.6 L241.9,385.0 L243.0,385.3 L244.0,385.7 L245.0,386.1 L246.0,386.4 L247.0,386.8 L248.0,387.1 
+		L249.0,387.5 L250.0,387.8 L251.0,388.2 L252.0,388.5 L253.0,388.9 L254.0,389.2 L255.0,389.5 L256.0,389.9 
+		L257.0,390.2 L258.0,390.5 L259.1,390.8 L260.1,391.1 L261.1,391.4 L262.1,391.8 L263.1,392.1 L264.1,392.4 
+		L265.1,392.7 L266.1,393.0 L267.1,393.2 L268.1,393.5 L269.1,393.8 L270.1,394.1 L271.1,394.4 L272.1,394.7 
+		L273.1,394.9 L274.1,395.2 L275.2,395.5 L276.2,395.8 L277.2,396.0 L278.2,396.3 L279.2,396.5 L280.2,396.8 
+		L281.2,397.1 L282.2,397.3 L283.2,397.6 L284.2,397.8 L285.2,398.1 L286.2,398.3 L287.2,398.5 L288.2,398.8 
+		L289.2,399.0 L290.2,399.2 L291.3,399.5 L292.3,399.7 L293.3,399.9 L294.3,400.1 L295.3,400.4 L296.3,400.6 
+		L297.3,400.8 L298.3,401.0 L299.3,401.2 L300.3,401.4 L301.3,401.7 L302.3,401.9 L303.3,402.1 L304.3,402.3 
+		L305.3,402.5 L306.3,402.7 L307.4,402.9 L308.4,403.1 L309.4,403.2 L310.4,403.4 L311.4,403.6 L312.4,403.8 
+		L313.4,404.0 L314.4,404.2 L315.4,404.4 L316.4,404.5 L317.4,404.7 L318.4,404.9 L319.4,405.1 L320.4,405.2 
+		L321.4,405.4 L322.4,405.6 L323.5,405.7 L324.5,405.9 L325.5,406.1 L326.5,406.2 L327.5,406.4 L328.5,406.6 
+		L329.5,406.7 L330.5,406.9 L331.5,407.0 L332.5,407.2 L333.5,407.3 L334.5,407.5 L335.5,407.6 L336.5,407.8 
+		L337.5,407.9 L338.5,408.1 L339.5,408.2 L340.6,408.4 L341.6,408.5 L342.6,408.6 L343.6,408.8 L344.6,408.9 
+		L345.6,409.0 L346.6,409.2 L347.6,409.3 L348.6,409.4 L349.6,409.6 L350.6,409.7 L351.6,409.8 L352.6,409.9 
+		L353.6,410.1 L354.6,410.2 L355.6,410.3 L356.7,410.4 L357.7,410.5 L358.7,410.7 L359.7,410.8 L360.7,410.9 
+		L361.7,411.0 L362.7,411.1 L363.7,411.2 L364.7,411.3 L365.7,411.5 L366.7,411.6 L367.7,411.7 L368.7,411.8 
+		L369.7,411.9 L370.7,412.0 L371.7,412.1 L372.8,412.2 L373.8,412.3 L374.8,412.4 L375.8,412.5 L376.8,412.6 
+		L377.8,412.7 L378.8,412.8 L379.8,412.9 L380.8,413.0 L381.8,413.1 L382.8,413.2 L383.8,413.3 L384.8,413.4 
+		L385.8,413.4 L386.8,413.5 L387.8,413.6 L388.9,413.7 L389.9,413.8 L390.9,413.9 L391.9,414.0 L392.9,414.0 
+		L393.9,414.1 L394.9,414.2 L395.9,414.3 L396.9,414.4 L397.9,414.5 L398.9,414.5 L399.9,414.6 L400.9,414.7 
+		L401.9,414.8 L402.9,414.8 L403.9,414.9 L405.0,415.0 L406.0,415.1 L407.0,415.1 L408.0,415.2 L409.0,415.3 
+		L410.0,415.4 L411.0,415.4 L412.0,415.5 L413.0,415.6 L414.0,415.6 L415.0,415.7 L416.0,415.8 L417.0,415.8 
+		L418.0,415.9 L419.0,416.0 L420.0,416.0 L421.1,416.1 L422.1,416.2 L423.1,416.2 L424.1,416.3 L425.1,416.3 
+		L426.1,416.4 L427.1,416.5 L428.1,416.5 L429.1,416.6 L430.1,416.6 L431.1,416.7 L432.1,416.7 L433.1,416.8 
+		L434.1,416.9 L435.1,416.9 L436.1,417.0 L437.2,417.0 L438.2,417.1 L439.2,417.1 L440.2,417.2 L441.2,417.2 
+		L442.2,417.3 L443.2,417.3 L444.2,417.4 L445.2,417.4 L446.2,417.5 L447.2,417.5 L448.2,417.6 L449.2,417.6 
+		L450.2,417.7 L451.2,417.7 L452.2,417.8 L453.2,417.8 L454.3,417.9 L455.3,417.9 L456.3,418.0 L457.3,418.0 
+		L458.3,418.0 L459.3,418.1 L460.3,418.1 L461.3,418.2 L462.3,418.2 L463.3,418.3 L464.3,418.3 L465.3,418.3 
+		L466.3,418.4 L467.3,418.4 L468.3,418.5 L469.3,418.5 L470.4,418.5 L471.4,418.6 L472.4,418.6 L473.4,418.6 
+		L474.4,418.7 L475.4,418.7 L476.4,418.8 L477.4,418.8 L478.4,418.8 L479.4,418.9 L480.4,418.9 L481.4,418.9 
+		L482.4,419.0 L483.4,419.0 L484.4,419.0 L485.4,419.1 L486.5,419.1 L487.5,419.1 L488.5,419.2 L489.5,419.2 
+		L490.5,419.2 L491.5,419.3 L492.5,419.3 L493.5,419.3 L494.5,419.4 L495.5,419.4 L496.5,419.4 L497.5,419.4 
+		L498.5,419.5 L499.5,419.5 L500.5,419.5 L501.5,419.6 L502.6,419.6 L503.6,419.6 L504.6,419.6 L505.6,419.7 
+		L506.6,419.7 L507.6,419.7 L508.6,419.8 L509.6,419.8 L510.6,419.8 L511.6,419.8 L512.6,419.9 L513.6,419.9 
+		L514.6,419.9 L515.6,419.9 L516.6,420.0 L517.6,420.0 L518.7,420.0 L519.7,420.0 L520.7,420.1 L521.7,420.1 
+		L522.7,420.1 L523.7,420.1 L524.7,420.1 L525.7,420.2 L526.7,420.2 L527.7,420.2 L528.7,420.2 L529.7,420.3 
+		L530.7,420.3 L531.7,420.3 L532.7,420.3 L533.7,420.3 L534.8,420.4 L535.8,420.4 L536.8,420.4 L537.8,420.4 
+		L538.8,420.4 L539.8,420.5 L540.8,420.5 L541.8,420.5 L542.8,420.5 L543.8,420.5 L544.8,420.6 L545.8,420.6 
+		L546.8,420.6 L547.8,420.6 L548.8,420.6 L549.8,420.6 L550.9,420.7 L551.9,420.7 L552.9,420.7 L553.9,420.7 
+		L554.9,420.7 L555.9,420.7 L556.9,420.8 L557.9,420.8 L558.9,420.8 L559.9,420.8 L560.9,420.8 L561.9,420.8 
+		L562.9,420.9 L563.9,420.9 L564.9,420.9 L565.9,420.9 L567.0,420.9 L568.0,420.9 L569.0,420.9 L570.0,421.0 
+		L571.0,421.0 L572.0,421.0 L573.0,421.0 L574.0,421.0 L575.0,421.0 '></path>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,287.2 L72.9,288.1 L73.9,289.0 L74.9,289.8 L75.9,290.7 L76.9,291.6 L77.9,292.5 L78.9,293.3 
+		L79.9,294.2 L81.0,295.0 L82.0,295.9 L83.0,296.7 L84.0,297.6 L85.0,298.4 L86.0,299.2 L87.0,300.0 
+		L88.0,300.8 L89.0,301.7 L90.0,302.5 L91.0,303.3 L92.0,304.0 L93.0,304.8 L94.0,305.6 L95.0,306.4 
+		L96.0,307.2 L97.1,307.9 L98.1,308.7 L99.1,309.4 L100.1,310.2 L101.1,310.9 L102.1,311.7 L103.1,312.4 
+		L104.1,313.1 L105.1,313.9 L106.1,314.6 L107.1,315.3 L108.1,316.0 L109.1,316.7 L110.1,317.4 L111.1,318.1 
+		L112.1,318.8 L113.2,319.5 L114.2,320.2 L115.2,320.9 L116.2,321.5 L117.2,322.2 L118.2,322.9 L119.2,323.5 
+		L120.2,324.2 L121.2,324.9 L122.2,325.5 L123.2,326.1 L124.2,326.8 L125.2,327.4 L126.2,328.1 L127.2,328.7 
+		L128.2,329.3 L129.3,329.9 L130.3,330.5 L131.3,331.1 L132.3,331.8 L133.3,332.4 L134.3,333.0 L135.3,333.5 
+		L136.3,334.1 L137.3,334.7 L138.3,335.3 L139.3,335.9 L140.3,336.5 L141.3,337.0 L142.3,337.6 L143.3,338.2 
+		L144.3,338.7 L145.4,339.3 L146.4,339.8 L147.4,340.4 L148.4,340.9 L149.4,341.5 L150.4,342.0 L151.4,342.5 
+		L152.4,343.1 L153.4,343.6 L154.4,344.1 L155.4,344.6 L156.4,345.2 L157.4,345.7 L158.4,346.2 L159.4,346.7 
+		L160.4,347.2 L161.5,347.7 L162.5,348.2 L163.5,348.7 L164.5,349.2 L165.5,349.7 L166.5,350.1 L167.5,350.6 
+		L168.5,351.1 L169.5,351.6 L170.5,352.0 L171.5,352.5 L172.5,353.0 L173.5,353.4 L174.5,353.9 L175.5,354.3 
+		L176.5,354.8 L177.6,355.2 L178.6,355.7 L179.6,356.1 L180.6,356.6 L181.6,357.0 L182.6,357.4 L183.6,357.9 
+		L184.6,358.3 L185.6,358.7 L186.6,359.2 L187.6,359.6 L188.6,360.0 L189.6,360.4 L190.6,360.8 L191.6,361.2 
+		L192.6,361.6 L193.7,362.0 L194.7,362.4 L195.7,362.8 L196.7,363.2 L197.7,363.6 L198.7,364.0 L199.7,364.4 
+		L200.7,364.8 L201.7,365.2 L202.7,365.6 L203.7,365.9 L204.7,366.3 L205.7,366.7 L206.7,367.1 L207.7,367.4 
+		L208.7,367.8 L209.7,368.1 L210.8,368.5 L211.8,368.9 L212.8,369.2 L213.8,369.6 L214.8,369.9 L215.8,370.3 
+		L216.8,370.6 L217.8,371.0 L218.8,371.3 L219.8,371.6 L220.8,372.0 L221.8,372.3 L222.8,372.7 L223.8,373.0 
+		L224.8,373.3 L225.8,373.6 L226.9,374.0 L227.9,374.3 L228.9,374.6 L229.9,374.9 L230.9,375.2 L231.9,375.5 
+		L232.9,375.9 L233.9,376.2 L234.9,376.5 L235.9,376.8 L236.9,377.1 L237.9,377.4 L238.9,377.7 L239.9,378.0 
+		L240.9,378.3 L241.9,378.6 L243.0,378.9 L244.0,379.1 L245.0,379.4 L246.0,379.7 L247.0,380.0 L248.0,380.3 
+		L249.0,380.6 L250.0,380.8 L251.0,381.1 L252.0,381.4 L253.0,381.7 L254.0,381.9 L255.0,382.2 L256.0,382.5 
+		L257.0,382.7 L258.0,383.0 L259.1,383.3 L260.1,383.5 L261.1,383.8 L262.1,384.0 L263.1,384.3 L264.1,384.5 
+		L265.1,384.8 L266.1,385.0 L267.1,385.3 L268.1,385.5 L269.1,385.8 L270.1,386.0 L271.1,386.3 L272.1,386.5 
+		L273.1,386.8 L274.1,387.0 L275.2,387.2 L276.2,387.5 L277.2,387.7 L278.2,387.9 L279.2,388.2 L280.2,388.4 
+		L281.2,388.6 L282.2,388.8 L283.2,389.1 L284.2,389.3 L285.2,389.5 L286.2,389.7 L287.2,389.9 L288.2,390.1 
+		L289.2,390.4 L290.2,390.6 L291.3,390.8 L292.3,391.0 L293.3,391.2 L294.3,391.4 L295.3,391.6 L296.3,391.8 
+		L297.3,392.0 L298.3,392.2 L299.3,392.4 L300.3,392.6 L301.3,392.8 L302.3,393.0 L303.3,393.2 L304.3,393.4 
+		L305.3,393.6 L306.3,393.8 L307.4,394.0 L308.4,394.2 L309.4,394.4 L310.4,394.5 L311.4,394.7 L312.4,394.9 
+		L313.4,395.1 L314.4,395.3 L315.4,395.5 L316.4,395.6 L317.4,395.8 L318.4,396.0 L319.4,396.2 L320.4,396.3 
+		L321.4,396.5 L322.4,396.7 L323.5,396.9 L324.5,397.0 L325.5,397.2 L326.5,397.4 L327.5,397.5 L328.5,397.7 
+		L329.5,397.9 L330.5,398.0 L331.5,398.2 L332.5,398.3 L333.5,398.5 L334.5,398.7 L335.5,398.8 L336.5,399.0 
+		L337.5,399.1 L338.5,399.3 L339.5,399.4 L340.6,399.6 L341.6,399.7 L342.6,399.9 L343.6,400.0 L344.6,400.2 
+		L345.6,400.3 L346.6,400.5 L347.6,400.6 L348.6,400.8 L349.6,400.9 L350.6,401.1 L351.6,401.2 L352.6,401.3 
+		L353.6,401.5 L354.6,401.6 L355.6,401.8 L356.7,401.9 L357.7,402.0 L358.7,402.2 L359.7,402.3 L360.7,402.4 
+		L361.7,402.6 L362.7,402.7 L363.7,402.8 L364.7,403.0 L365.7,403.1 L366.7,403.2 L367.7,403.4 L368.7,403.5 
+		L369.7,403.6 L370.7,403.7 L371.7,403.9 L372.8,404.0 L373.8,404.1 L374.8,404.2 L375.8,404.3 L376.8,404.5 
+		L377.8,404.6 L378.8,404.7 L379.8,404.8 L380.8,404.9 L381.8,405.0 L382.8,405.2 L383.8,405.3 L384.8,405.4 
+		L385.8,405.5 L386.8,405.6 L387.8,405.7 L388.9,405.8 L389.9,405.9 L390.9,406.1 L391.9,406.2 L392.9,406.3 
+		L393.9,406.4 L394.9,406.5 L395.9,406.6 L396.9,406.7 L397.9,406.8 L398.9,406.9 L399.9,407.0 L400.9,407.1 
+		L401.9,407.2 L402.9,407.3 L403.9,407.4 L405.0,407.5 L406.0,407.6 L407.0,407.7 L408.0,407.8 L409.0,407.9 
+		L410.0,408.0 L411.0,408.1 L412.0,408.2 L413.0,408.3 L414.0,408.4 L415.0,408.5 L416.0,408.6 L417.0,408.7 
+		L418.0,408.8 L419.0,408.8 L420.0,408.9 L421.1,409.0 L422.1,409.1 L423.1,409.2 L424.1,409.3 L425.1,409.4 
+		L426.1,409.5 L427.1,409.5 L428.1,409.6 L429.1,409.7 L430.1,409.8 L431.1,409.9 L432.1,410.0 L433.1,410.0 
+		L434.1,410.1 L435.1,410.2 L436.1,410.3 L437.2,410.4 L438.2,410.5 L439.2,410.5 L440.2,410.6 L441.2,410.7 
+		L442.2,410.8 L443.2,410.8 L444.2,410.9 L445.2,411.0 L446.2,411.1 L447.2,411.2 L448.2,411.2 L449.2,411.3 
+		L450.2,411.4 L451.2,411.4 L452.2,411.5 L453.2,411.6 L454.3,411.7 L455.3,411.7 L456.3,411.8 L457.3,411.9 
+		L458.3,411.9 L459.3,412.0 L460.3,412.1 L461.3,412.2 L462.3,412.2 L463.3,412.3 L464.3,412.4 L465.3,412.4 
+		L466.3,412.5 L467.3,412.6 L468.3,412.6 L469.3,412.7 L470.4,412.7 L471.4,412.8 L472.4,412.9 L473.4,412.9 
+		L474.4,413.0 L475.4,413.1 L476.4,413.1 L477.4,413.2 L478.4,413.3 L479.4,413.3 L480.4,413.4 L481.4,413.4 
+		L482.4,413.5 L483.4,413.6 L484.4,413.6 L485.4,413.7 L486.5,413.7 L487.5,413.8 L488.5,413.8 L489.5,413.9 
+		L490.5,414.0 L491.5,414.0 L492.5,414.1 L493.5,414.1 L494.5,414.2 L495.5,414.2 L496.5,414.3 L497.5,414.3 
+		L498.5,414.4 L499.5,414.4 L500.5,414.5 L501.5,414.6 L502.6,414.6 L503.6,414.7 L504.6,414.7 L505.6,414.8 
+		L506.6,414.8 L507.6,414.9 L508.6,414.9 L509.6,415.0 L510.6,415.0 L511.6,415.1 L512.6,415.1 L513.6,415.2 
+		L514.6,415.2 L515.6,415.3 L516.6,415.3 L517.6,415.3 L518.7,415.4 L519.7,415.4 L520.7,415.5 L521.7,415.5 
+		L522.7,415.6 L523.7,415.6 L524.7,415.7 L525.7,415.7 L526.7,415.8 L527.7,415.8 L528.7,415.8 L529.7,415.9 
+		L530.7,415.9 L531.7,416.0 L532.7,416.0 L533.7,416.1 L534.8,416.1 L535.8,416.1 L536.8,416.2 L537.8,416.2 
+		L538.8,416.3 L539.8,416.3 L540.8,416.3 L541.8,416.4 L542.8,416.4 L543.8,416.5 L544.8,416.5 L545.8,416.5 
+		L546.8,416.6 L547.8,416.6 L548.8,416.7 L549.8,416.7 L550.9,416.7 L551.9,416.8 L552.9,416.8 L553.9,416.9 
+		L554.9,416.9 L555.9,416.9 L556.9,417.0 L557.9,417.0 L558.9,417.0 L559.9,417.1 L560.9,417.1 L561.9,417.1 
+		L562.9,417.2 L563.9,417.2 L564.9,417.2 L565.9,417.3 L567.0,417.3 L568.0,417.3 L569.0,417.4 L570.0,417.4 
+		L571.0,417.4 L572.0,417.5 L573.0,417.5 L574.0,417.5 L575.0,417.6 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/exponential_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_0.5.dat
new file mode 100644
index 0000000..690c684
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_0.5.dat
@@ -0,0 +1,513 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	2.000000
+0.010000	1.960397
+0.020000	1.921579
+0.030000	1.883529
+0.040000	1.846233
+0.050000	1.809675
+0.060000	1.773841
+0.070000	1.738716
+0.080000	1.704288
+0.090000	1.670540
+0.100000	1.637462
+0.110000	1.605038
+0.120000	1.573256
+0.130000	1.542103
+0.140000	1.511567
+0.150000	1.481636
+0.160000	1.452298
+0.170000	1.423541
+0.180000	1.395353
+0.190000	1.367723
+0.200000	1.340640
+0.210000	1.314094
+0.220000	1.288073
+0.230000	1.262567
+0.240000	1.237567
+0.250000	1.213061
+0.260000	1.189041
+0.270000	1.165497
+0.280000	1.142418
+0.290000	1.119797
+0.300000	1.097623
+0.310000	1.075889
+0.320000	1.054585
+0.330000	1.033703
+0.340000	1.013234
+0.350000	0.993171
+0.360000	0.973505
+0.370000	0.954228
+0.380000	0.935333
+0.390000	0.916812
+0.400000	0.898658
+0.410000	0.880863
+0.420000	0.863421
+0.430000	0.846324
+0.440000	0.829566
+0.450000	0.813139
+0.460000	0.797038
+0.470000	0.781256
+0.480000	0.765786
+0.490000	0.750622
+0.500000	0.735759
+0.510000	0.721190
+0.520000	0.706909
+0.530000	0.692912
+0.540000	0.679191
+0.550000	0.665742
+0.560000	0.652560
+0.570000	0.639638
+0.580000	0.626972
+0.590000	0.614557
+0.600000	0.602388
+0.610000	0.590460
+0.620000	0.578768
+0.630000	0.567308
+0.640000	0.556075
+0.650000	0.545064
+0.660000	0.534271
+0.670000	0.523691
+0.680000	0.513322
+0.690000	0.503157
+0.700000	0.493194
+0.710000	0.483428
+0.720000	0.473856
+0.730000	0.464473
+0.740000	0.455275
+0.750000	0.446260
+0.760000	0.437424
+0.770000	0.428762
+0.780000	0.420272
+0.790000	0.411950
+0.800000	0.403793
+0.810000	0.395797
+0.820000	0.387960
+0.830000	0.380278
+0.840000	0.372748
+0.850000	0.365367
+0.860000	0.358132
+0.870000	0.351041
+0.880000	0.344090
+0.890000	0.337276
+0.900000	0.330598
+0.910000	0.324052
+0.920000	0.317635
+0.930000	0.311345
+0.940000	0.305180
+0.950000	0.299137
+0.960000	0.293214
+0.970000	0.287408
+0.980000	0.281717
+0.990000	0.276138
+1.000000	0.270671
+1.010000	0.265311
+1.020000	0.260057
+1.030000	0.254908
+1.040000	0.249860
+1.050000	0.244913
+1.060000	0.240063
+1.070000	0.235310
+1.080000	0.230650
+1.090000	0.226083
+1.100000	0.221606
+1.110000	0.217218
+1.120000	0.212917
+1.130000	0.208701
+1.140000	0.204568
+1.150000	0.200518
+1.160000	0.196547
+1.170000	0.192655
+1.180000	0.188840
+1.190000	0.185101
+1.200000	0.181436
+1.210000	0.177843
+1.220000	0.174322
+1.230000	0.170870
+1.240000	0.167486
+1.250000	0.164170
+1.260000	0.160919
+1.270000	0.157733
+1.280000	0.154609
+1.290000	0.151548
+1.300000	0.148547
+1.310000	0.145606
+1.320000	0.142723
+1.330000	0.139896
+1.340000	0.137126
+1.350000	0.134411
+1.360000	0.131750
+1.370000	0.129141
+1.380000	0.126584
+1.390000	0.124077
+1.400000	0.121620
+1.410000	0.119212
+1.420000	0.116851
+1.430000	0.114538
+1.440000	0.112270
+1.450000	0.110046
+1.460000	0.107867
+1.470000	0.105731
+1.480000	0.103638
+1.490000	0.101586
+1.500000	0.099574
+1.510000	0.097602
+1.520000	0.095670
+1.530000	0.093775
+1.540000	0.091919
+1.550000	0.090098
+1.560000	0.088314
+1.570000	0.086566
+1.580000	0.084851
+1.590000	0.083171
+1.600000	0.081524
+1.610000	0.079910
+1.620000	0.078328
+1.630000	0.076777
+1.640000	0.075257
+1.650000	0.073766
+1.660000	0.072306
+1.670000	0.070874
+1.680000	0.069471
+1.690000	0.068095
+1.700000	0.066747
+1.710000	0.065425
+1.720000	0.064129
+1.730000	0.062860
+1.740000	0.061615
+1.750000	0.060395
+1.760000	0.059199
+1.770000	0.058027
+1.780000	0.056878
+1.790000	0.055751
+1.800000	0.054647
+1.810000	0.053565
+1.820000	0.052505
+1.830000	0.051465
+1.840000	0.050446
+1.850000	0.049447
+1.860000	0.048468
+1.870000	0.047508
+1.880000	0.046567
+1.890000	0.045645
+1.900000	0.044742
+1.910000	0.043856
+1.920000	0.042987
+1.930000	0.042136
+1.940000	0.041302
+1.950000	0.040484
+1.960000	0.039682
+1.970000	0.038896
+1.980000	0.038126
+1.990000	0.037371
+2.000000	0.036631
+2.010000	0.035906
+2.020000	0.035195
+2.030000	0.034498
+2.040000	0.033815
+2.050000	0.033145
+2.060000	0.032489
+2.070000	0.031846
+2.080000	0.031215
+2.090000	0.030597
+2.100000	0.029991
+2.110000	0.029397
+2.120000	0.028815
+2.130000	0.028245
+2.140000	0.027685
+2.150000	0.027137
+2.160000	0.026600
+2.170000	0.026073
+2.180000	0.025557
+2.190000	0.025051
+2.200000	0.024555
+2.210000	0.024068
+2.220000	0.023592
+2.230000	0.023125
+2.240000	0.022667
+2.250000	0.022218
+2.260000	0.021778
+2.270000	0.021347
+2.280000	0.020924
+2.290000	0.020510
+2.300000	0.020104
+2.310000	0.019706
+2.320000	0.019315
+2.330000	0.018933
+2.340000	0.018558
+2.350000	0.018191
+2.360000	0.017830
+2.370000	0.017477
+2.380000	0.017131
+2.390000	0.016792
+2.400000	0.016459
+2.410000	0.016134
+2.420000	0.015814
+2.430000	0.015501
+2.440000	0.015194
+2.450000	0.014893
+2.460000	0.014598
+2.470000	0.014309
+2.480000	0.014026
+2.490000	0.013748
+2.500000	0.013476
+2.510000	0.013209
+2.520000	0.012947
+2.530000	0.012691
+2.540000	0.012440
+2.550000	0.012193
+2.560000	0.011952
+2.570000	0.011715
+2.580000	0.011483
+2.590000	0.011256
+2.600000	0.011033
+2.610000	0.010815
+2.620000	0.010601
+2.630000	0.010391
+2.640000	0.010185
+2.650000	0.009983
+2.660000	0.009786
+2.670000	0.009592
+2.680000	0.009402
+2.690000	0.009216
+2.700000	0.009033
+2.710000	0.008854
+2.720000	0.008679
+2.730000	0.008507
+2.740000	0.008339
+2.750000	0.008174
+2.760000	0.008012
+2.770000	0.007853
+2.780000	0.007698
+2.790000	0.007545
+2.800000	0.007396
+2.810000	0.007249
+2.820000	0.007106
+2.830000	0.006965
+2.840000	0.006827
+2.850000	0.006692
+2.860000	0.006559
+2.870000	0.006430
+2.880000	0.006302
+2.890000	0.006177
+2.900000	0.006055
+2.910000	0.005935
+2.920000	0.005818
+2.930000	0.005702
+2.940000	0.005590
+2.950000	0.005479
+2.960000	0.005370
+2.970000	0.005264
+2.980000	0.005160
+2.990000	0.005058
+3.000000	0.004958
+3.010000	0.004859
+3.020000	0.004763
+3.030000	0.004669
+3.040000	0.004576
+3.050000	0.004486
+3.060000	0.004397
+3.070000	0.004310
+3.080000	0.004225
+3.090000	0.004141
+3.100000	0.004059
+3.110000	0.003978
+3.120000	0.003900
+3.130000	0.003822
+3.140000	0.003747
+3.150000	0.003673
+3.160000	0.003600
+3.170000	0.003529
+3.180000	0.003459
+3.190000	0.003390
+3.200000	0.003323
+3.210000	0.003257
+3.220000	0.003193
+3.230000	0.003130
+3.240000	0.003068
+3.250000	0.003007
+3.260000	0.002947
+3.270000	0.002889
+3.280000	0.002832
+3.290000	0.002776
+3.300000	0.002721
+3.310000	0.002667
+3.320000	0.002614
+3.330000	0.002562
+3.340000	0.002512
+3.350000	0.002462
+3.360000	0.002413
+3.370000	0.002365
+3.380000	0.002318
+3.390000	0.002273
+3.400000	0.002228
+3.410000	0.002183
+3.420000	0.002140
+3.430000	0.002098
+3.440000	0.002056
+3.450000	0.002016
+3.460000	0.001976
+3.470000	0.001937
+3.480000	0.001898
+3.490000	0.001861
+3.500000	0.001824
+3.510000	0.001788
+3.520000	0.001752
+3.530000	0.001718
+3.540000	0.001684
+3.550000	0.001650
+3.560000	0.001618
+3.570000	0.001586
+3.580000	0.001554
+3.590000	0.001523
+3.600000	0.001493
+3.610000	0.001464
+3.620000	0.001435
+3.630000	0.001406
+3.640000	0.001378
+3.650000	0.001351
+3.660000	0.001324
+3.670000	0.001298
+3.680000	0.001272
+3.690000	0.001247
+3.700000	0.001223
+3.710000	0.001198
+3.720000	0.001175
+3.730000	0.001151
+3.740000	0.001129
+3.750000	0.001106
+3.760000	0.001084
+3.770000	0.001063
+3.780000	0.001042
+3.790000	0.001021
+3.800000	0.001001
+3.810000	0.000981
+3.820000	0.000962
+3.830000	0.000943
+3.840000	0.000924
+3.850000	0.000906
+3.860000	0.000888
+3.870000	0.000870
+3.880000	0.000853
+3.890000	0.000836
+3.900000	0.000819
+3.910000	0.000803
+3.920000	0.000787
+3.930000	0.000772
+3.940000	0.000756
+3.950000	0.000741
+3.960000	0.000727
+3.970000	0.000712
+3.980000	0.000698
+3.990000	0.000684
+4.000000	0.000671
+4.010000	0.000658
+4.020000	0.000645
+4.030000	0.000632
+4.040000	0.000619
+4.050000	0.000607
+4.060000	0.000595
+4.070000	0.000583
+4.080000	0.000572
+4.090000	0.000560
+4.100000	0.000549
+4.110000	0.000538
+4.120000	0.000528
+4.130000	0.000517
+4.140000	0.000507
+4.150000	0.000497
+4.160000	0.000487
+4.170000	0.000478
+4.180000	0.000468
+4.190000	0.000459
+4.200000	0.000450
+4.210000	0.000441
+4.220000	0.000432
+4.230000	0.000424
+4.240000	0.000415
+4.250000	0.000407
+4.260000	0.000399
+4.270000	0.000391
+4.280000	0.000383
+4.290000	0.000376
+4.300000	0.000368
+4.310000	0.000361
+4.320000	0.000354
+4.330000	0.000347
+4.340000	0.000340
+4.350000	0.000333
+4.360000	0.000327
+4.370000	0.000320
+4.380000	0.000314
+4.390000	0.000308
+4.400000	0.000301
+4.410000	0.000295
+4.420000	0.000290
+4.430000	0.000284
+4.440000	0.000278
+4.450000	0.000273
+4.460000	0.000267
+4.470000	0.000262
+4.480000	0.000257
+4.490000	0.000252
+4.500000	0.000247
+4.510000	0.000242
+4.520000	0.000237
+4.530000	0.000232
+4.540000	0.000228
+4.550000	0.000223
+4.560000	0.000219
+4.570000	0.000215
+4.580000	0.000210
+4.590000	0.000206
+4.600000	0.000202
+4.610000	0.000198
+4.620000	0.000194
+4.630000	0.000190
+4.640000	0.000187
+4.650000	0.000183
+4.660000	0.000179
+4.670000	0.000176
+4.680000	0.000172
+4.690000	0.000169
+4.700000	0.000165
+4.710000	0.000162
+4.720000	0.000159
+4.730000	0.000156
+4.740000	0.000153
+4.750000	0.000150
+4.760000	0.000147
+4.770000	0.000144
+4.780000	0.000141
+4.790000	0.000138
+4.800000	0.000135
+4.810000	0.000133
+4.820000	0.000130
+4.830000	0.000128
+4.840000	0.000125
+4.850000	0.000123
+4.860000	0.000120
+4.870000	0.000118
+4.880000	0.000115
+4.890000	0.000113
+4.900000	0.000111
+4.910000	0.000109
+4.920000	0.000107
+4.930000	0.000104
+4.940000	0.000102
+4.950000	0.000100
+4.960000	0.000098
+4.970000	0.000096
+4.980000	0.000095
+4.990000	0.000093
+5.000000	0.000091
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.0.dat
new file mode 100644
index 0000000..0535326
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.0.dat
@@ -0,0 +1,513 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	1.000000
+0.010000	0.990050
+0.020000	0.980199
+0.030000	0.970446
+0.040000	0.960789
+0.050000	0.951229
+0.060000	0.941765
+0.070000	0.932394
+0.080000	0.923116
+0.090000	0.913931
+0.100000	0.904837
+0.110000	0.895834
+0.120000	0.886920
+0.130000	0.878095
+0.140000	0.869358
+0.150000	0.860708
+0.160000	0.852144
+0.170000	0.843665
+0.180000	0.835270
+0.190000	0.826959
+0.200000	0.818731
+0.210000	0.810584
+0.220000	0.802519
+0.230000	0.794534
+0.240000	0.786628
+0.250000	0.778801
+0.260000	0.771052
+0.270000	0.763379
+0.280000	0.755784
+0.290000	0.748264
+0.300000	0.740818
+0.310000	0.733447
+0.320000	0.726149
+0.330000	0.718924
+0.340000	0.711770
+0.350000	0.704688
+0.360000	0.697676
+0.370000	0.690734
+0.380000	0.683861
+0.390000	0.677057
+0.400000	0.670320
+0.410000	0.663650
+0.420000	0.657047
+0.430000	0.650509
+0.440000	0.644036
+0.450000	0.637628
+0.460000	0.631284
+0.470000	0.625002
+0.480000	0.618783
+0.490000	0.612626
+0.500000	0.606531
+0.510000	0.600496
+0.520000	0.594521
+0.530000	0.588605
+0.540000	0.582748
+0.550000	0.576950
+0.560000	0.571209
+0.570000	0.565525
+0.580000	0.559898
+0.590000	0.554327
+0.600000	0.548812
+0.610000	0.543351
+0.620000	0.537944
+0.630000	0.532592
+0.640000	0.527292
+0.650000	0.522046
+0.660000	0.516851
+0.670000	0.511709
+0.680000	0.506617
+0.690000	0.501576
+0.700000	0.496585
+0.710000	0.491644
+0.720000	0.486752
+0.730000	0.481909
+0.740000	0.477114
+0.750000	0.472367
+0.760000	0.467666
+0.770000	0.463013
+0.780000	0.458406
+0.790000	0.453845
+0.800000	0.449329
+0.810000	0.444858
+0.820000	0.440432
+0.830000	0.436049
+0.840000	0.431711
+0.850000	0.427415
+0.860000	0.423162
+0.870000	0.418952
+0.880000	0.414783
+0.890000	0.410656
+0.900000	0.406570
+0.910000	0.402524
+0.920000	0.398519
+0.930000	0.394554
+0.940000	0.390628
+0.950000	0.386741
+0.960000	0.382893
+0.970000	0.379083
+0.980000	0.375311
+0.990000	0.371577
+1.000000	0.367879
+1.010000	0.364219
+1.020000	0.360595
+1.030000	0.357007
+1.040000	0.353455
+1.050000	0.349938
+1.060000	0.346456
+1.070000	0.343009
+1.080000	0.339596
+1.090000	0.336216
+1.100000	0.332871
+1.110000	0.329559
+1.120000	0.326280
+1.130000	0.323033
+1.140000	0.319819
+1.150000	0.316637
+1.160000	0.313486
+1.170000	0.310367
+1.180000	0.307279
+1.190000	0.304221
+1.200000	0.301194
+1.210000	0.298197
+1.220000	0.295230
+1.230000	0.292293
+1.240000	0.289384
+1.250000	0.286505
+1.260000	0.283654
+1.270000	0.280832
+1.280000	0.278037
+1.290000	0.275271
+1.300000	0.272532
+1.310000	0.269820
+1.320000	0.267135
+1.330000	0.264477
+1.340000	0.261846
+1.350000	0.259240
+1.360000	0.256661
+1.370000	0.254107
+1.380000	0.251579
+1.390000	0.249075
+1.400000	0.246597
+1.410000	0.244143
+1.420000	0.241714
+1.430000	0.239309
+1.440000	0.236928
+1.450000	0.234570
+1.460000	0.232236
+1.470000	0.229925
+1.480000	0.227638
+1.490000	0.225373
+1.500000	0.223130
+1.510000	0.220910
+1.520000	0.218712
+1.530000	0.216536
+1.540000	0.214381
+1.550000	0.212248
+1.560000	0.210136
+1.570000	0.208045
+1.580000	0.205975
+1.590000	0.203926
+1.600000	0.201897
+1.610000	0.199888
+1.620000	0.197899
+1.630000	0.195930
+1.640000	0.193980
+1.650000	0.192050
+1.660000	0.190139
+1.670000	0.188247
+1.680000	0.186374
+1.690000	0.184520
+1.700000	0.182684
+1.710000	0.180866
+1.720000	0.179066
+1.730000	0.177284
+1.740000	0.175520
+1.750000	0.173774
+1.760000	0.172045
+1.770000	0.170333
+1.780000	0.168638
+1.790000	0.166960
+1.800000	0.165299
+1.810000	0.163654
+1.820000	0.162026
+1.830000	0.160414
+1.840000	0.158817
+1.850000	0.157237
+1.860000	0.155673
+1.870000	0.154124
+1.880000	0.152590
+1.890000	0.151072
+1.900000	0.149569
+1.910000	0.148080
+1.920000	0.146607
+1.930000	0.145148
+1.940000	0.143704
+1.950000	0.142274
+1.960000	0.140858
+1.970000	0.139457
+1.980000	0.138069
+1.990000	0.136695
+2.000000	0.135335
+2.010000	0.133989
+2.020000	0.132655
+2.030000	0.131336
+2.040000	0.130029
+2.050000	0.128735
+2.060000	0.127454
+2.070000	0.126186
+2.080000	0.124930
+2.090000	0.123687
+2.100000	0.122456
+2.110000	0.121238
+2.120000	0.120032
+2.130000	0.118837
+2.140000	0.117655
+2.150000	0.116484
+2.160000	0.115325
+2.170000	0.114178
+2.180000	0.113042
+2.190000	0.111917
+2.200000	0.110803
+2.210000	0.109701
+2.220000	0.108609
+2.230000	0.107528
+2.240000	0.106459
+2.250000	0.105399
+2.260000	0.104350
+2.270000	0.103312
+2.280000	0.102284
+2.290000	0.101266
+2.300000	0.100259
+2.310000	0.099261
+2.320000	0.098274
+2.330000	0.097296
+2.340000	0.096328
+2.350000	0.095369
+2.360000	0.094420
+2.370000	0.093481
+2.380000	0.092551
+2.390000	0.091630
+2.400000	0.090718
+2.410000	0.089815
+2.420000	0.088922
+2.430000	0.088037
+2.440000	0.087161
+2.450000	0.086294
+2.460000	0.085435
+2.470000	0.084585
+2.480000	0.083743
+2.490000	0.082910
+2.500000	0.082085
+2.510000	0.081268
+2.520000	0.080460
+2.530000	0.079659
+2.540000	0.078866
+2.550000	0.078082
+2.560000	0.077305
+2.570000	0.076536
+2.580000	0.075774
+2.590000	0.075020
+2.600000	0.074274
+2.610000	0.073535
+2.620000	0.072803
+2.630000	0.072078
+2.640000	0.071361
+2.650000	0.070651
+2.660000	0.069948
+2.670000	0.069252
+2.680000	0.068563
+2.690000	0.067881
+2.700000	0.067206
+2.710000	0.066537
+2.720000	0.065875
+2.730000	0.065219
+2.740000	0.064570
+2.750000	0.063928
+2.760000	0.063292
+2.770000	0.062662
+2.780000	0.062039
+2.790000	0.061421
+2.800000	0.060810
+2.810000	0.060205
+2.820000	0.059606
+2.830000	0.059013
+2.840000	0.058426
+2.850000	0.057844
+2.860000	0.057269
+2.870000	0.056699
+2.880000	0.056135
+2.890000	0.055576
+2.900000	0.055023
+2.910000	0.054476
+2.920000	0.053934
+2.930000	0.053397
+2.940000	0.052866
+2.950000	0.052340
+2.960000	0.051819
+2.970000	0.051303
+2.980000	0.050793
+2.990000	0.050287
+3.000000	0.049787
+3.010000	0.049292
+3.020000	0.048801
+3.030000	0.048316
+3.040000	0.047835
+3.050000	0.047359
+3.060000	0.046888
+3.070000	0.046421
+3.080000	0.045959
+3.090000	0.045502
+3.100000	0.045049
+3.110000	0.044601
+3.120000	0.044157
+3.130000	0.043718
+3.140000	0.043283
+3.150000	0.042852
+3.160000	0.042426
+3.170000	0.042004
+3.180000	0.041586
+3.190000	0.041172
+3.200000	0.040762
+3.210000	0.040357
+3.220000	0.039955
+3.230000	0.039557
+3.240000	0.039164
+3.250000	0.038774
+3.260000	0.038388
+3.270000	0.038006
+3.280000	0.037628
+3.290000	0.037254
+3.300000	0.036883
+3.310000	0.036516
+3.320000	0.036153
+3.330000	0.035793
+3.340000	0.035437
+3.350000	0.035084
+3.360000	0.034735
+3.370000	0.034390
+3.380000	0.034047
+3.390000	0.033709
+3.400000	0.033373
+3.410000	0.033041
+3.420000	0.032712
+3.430000	0.032387
+3.440000	0.032065
+3.450000	0.031746
+3.460000	0.031430
+3.470000	0.031117
+3.480000	0.030807
+3.490000	0.030501
+3.500000	0.030197
+3.510000	0.029897
+3.520000	0.029599
+3.530000	0.029305
+3.540000	0.029013
+3.550000	0.028725
+3.560000	0.028439
+3.570000	0.028156
+3.580000	0.027876
+3.590000	0.027598
+3.600000	0.027324
+3.610000	0.027052
+3.620000	0.026783
+3.630000	0.026516
+3.640000	0.026252
+3.650000	0.025991
+3.660000	0.025733
+3.670000	0.025476
+3.680000	0.025223
+3.690000	0.024972
+3.700000	0.024724
+3.710000	0.024478
+3.720000	0.024234
+3.730000	0.023993
+3.740000	0.023754
+3.750000	0.023518
+3.760000	0.023284
+3.770000	0.023052
+3.780000	0.022823
+3.790000	0.022596
+3.800000	0.022371
+3.810000	0.022148
+3.820000	0.021928
+3.830000	0.021710
+3.840000	0.021494
+3.850000	0.021280
+3.860000	0.021068
+3.870000	0.020858
+3.880000	0.020651
+3.890000	0.020445
+3.900000	0.020242
+3.910000	0.020041
+3.920000	0.019841
+3.930000	0.019644
+3.940000	0.019448
+3.950000	0.019255
+3.960000	0.019063
+3.970000	0.018873
+3.980000	0.018686
+3.990000	0.018500
+4.000000	0.018316
+4.010000	0.018133
+4.020000	0.017953
+4.030000	0.017774
+4.040000	0.017597
+4.050000	0.017422
+4.060000	0.017249
+4.070000	0.017077
+4.080000	0.016907
+4.090000	0.016739
+4.100000	0.016573
+4.110000	0.016408
+4.120000	0.016245
+4.130000	0.016083
+4.140000	0.015923
+4.150000	0.015764
+4.160000	0.015608
+4.170000	0.015452
+4.180000	0.015299
+4.190000	0.015146
+4.200000	0.014996
+4.210000	0.014846
+4.220000	0.014699
+4.230000	0.014552
+4.240000	0.014408
+4.250000	0.014264
+4.260000	0.014122
+4.270000	0.013982
+4.280000	0.013843
+4.290000	0.013705
+4.300000	0.013569
+4.310000	0.013434
+4.320000	0.013300
+4.330000	0.013168
+4.340000	0.013037
+4.350000	0.012907
+4.360000	0.012778
+4.370000	0.012651
+4.380000	0.012525
+4.390000	0.012401
+4.400000	0.012277
+4.410000	0.012155
+4.420000	0.012034
+4.430000	0.011914
+4.440000	0.011796
+4.450000	0.011679
+4.460000	0.011562
+4.470000	0.011447
+4.480000	0.011333
+4.490000	0.011221
+4.500000	0.011109
+4.510000	0.010998
+4.520000	0.010889
+4.530000	0.010781
+4.540000	0.010673
+4.550000	0.010567
+4.560000	0.010462
+4.570000	0.010358
+4.580000	0.010255
+4.590000	0.010153
+4.600000	0.010052
+4.610000	0.009952
+4.620000	0.009853
+4.630000	0.009755
+4.640000	0.009658
+4.650000	0.009562
+4.660000	0.009466
+4.670000	0.009372
+4.680000	0.009279
+4.690000	0.009187
+4.700000	0.009095
+4.710000	0.009005
+4.720000	0.008915
+4.730000	0.008826
+4.740000	0.008739
+4.750000	0.008652
+4.760000	0.008566
+4.770000	0.008480
+4.780000	0.008396
+4.790000	0.008312
+4.800000	0.008230
+4.810000	0.008148
+4.820000	0.008067
+4.830000	0.007987
+4.840000	0.007907
+4.850000	0.007828
+4.860000	0.007750
+4.870000	0.007673
+4.880000	0.007597
+4.890000	0.007521
+4.900000	0.007447
+4.910000	0.007372
+4.920000	0.007299
+4.930000	0.007227
+4.940000	0.007155
+4.950000	0.007083
+4.960000	0.007013
+4.970000	0.006943
+4.980000	0.006874
+4.990000	0.006806
+5.000000	0.006738
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.5.dat
new file mode 100644
index 0000000..e543b77
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/exponential_1.5.dat
@@ -0,0 +1,513 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.666667
+0.010000	0.662237
+0.020000	0.657837
+0.030000	0.653466
+0.040000	0.649124
+0.050000	0.644811
+0.060000	0.640526
+0.070000	0.636270
+0.080000	0.632043
+0.090000	0.627843
+0.100000	0.623671
+0.110000	0.619527
+0.120000	0.615411
+0.130000	0.611322
+0.140000	0.607260
+0.150000	0.603225
+0.160000	0.599217
+0.170000	0.595235
+0.180000	0.591280
+0.190000	0.587352
+0.200000	0.583449
+0.210000	0.579572
+0.220000	0.575721
+0.230000	0.571896
+0.240000	0.568096
+0.250000	0.564321
+0.260000	0.560572
+0.270000	0.556847
+0.280000	0.553147
+0.290000	0.549471
+0.300000	0.545821
+0.310000	0.542194
+0.320000	0.538591
+0.330000	0.535013
+0.340000	0.531458
+0.350000	0.527926
+0.360000	0.524419
+0.370000	0.520934
+0.380000	0.517473
+0.390000	0.514034
+0.400000	0.510619
+0.410000	0.507226
+0.420000	0.503856
+0.430000	0.500508
+0.440000	0.497182
+0.450000	0.493879
+0.460000	0.490597
+0.470000	0.487337
+0.480000	0.484099
+0.490000	0.480883
+0.500000	0.477688
+0.510000	0.474514
+0.520000	0.471361
+0.530000	0.468229
+0.540000	0.465118
+0.550000	0.462027
+0.560000	0.458957
+0.570000	0.455908
+0.580000	0.452878
+0.590000	0.449869
+0.600000	0.446880
+0.610000	0.443911
+0.620000	0.440961
+0.630000	0.438031
+0.640000	0.435121
+0.650000	0.432230
+0.660000	0.429358
+0.670000	0.426505
+0.680000	0.423671
+0.690000	0.420856
+0.700000	0.418059
+0.710000	0.415282
+0.720000	0.412522
+0.730000	0.409781
+0.740000	0.407058
+0.750000	0.404354
+0.760000	0.401667
+0.770000	0.398998
+0.780000	0.396347
+0.790000	0.393714
+0.800000	0.391097
+0.810000	0.388499
+0.820000	0.385917
+0.830000	0.383353
+0.840000	0.380806
+0.850000	0.378276
+0.860000	0.375762
+0.870000	0.373266
+0.880000	0.370785
+0.890000	0.368322
+0.900000	0.365874
+0.910000	0.363443
+0.920000	0.361028
+0.930000	0.358630
+0.940000	0.356247
+0.950000	0.353880
+0.960000	0.351528
+0.970000	0.349193
+0.980000	0.346872
+0.990000	0.344568
+1.000000	0.342278
+1.010000	0.340004
+1.020000	0.337745
+1.030000	0.335501
+1.040000	0.333271
+1.050000	0.331057
+1.060000	0.328857
+1.070000	0.326672
+1.080000	0.324502
+1.090000	0.322345
+1.100000	0.320204
+1.110000	0.318076
+1.120000	0.315962
+1.130000	0.313863
+1.140000	0.311778
+1.150000	0.309706
+1.160000	0.307648
+1.170000	0.305604
+1.180000	0.303573
+1.190000	0.301556
+1.200000	0.299553
+1.210000	0.297562
+1.220000	0.295585
+1.230000	0.293621
+1.240000	0.291670
+1.250000	0.289732
+1.260000	0.287807
+1.270000	0.285895
+1.280000	0.283995
+1.290000	0.282108
+1.300000	0.280234
+1.310000	0.278372
+1.320000	0.276522
+1.330000	0.274685
+1.340000	0.272859
+1.350000	0.271046
+1.360000	0.269245
+1.370000	0.267456
+1.380000	0.265679
+1.390000	0.263914
+1.400000	0.262160
+1.410000	0.260419
+1.420000	0.258688
+1.430000	0.256969
+1.440000	0.255262
+1.450000	0.253566
+1.460000	0.251881
+1.470000	0.250207
+1.480000	0.248545
+1.490000	0.246893
+1.500000	0.245253
+1.510000	0.243623
+1.520000	0.242005
+1.530000	0.240397
+1.540000	0.238799
+1.550000	0.237213
+1.560000	0.235636
+1.570000	0.234071
+1.580000	0.232515
+1.590000	0.230971
+1.600000	0.229436
+1.610000	0.227911
+1.620000	0.226397
+1.630000	0.224893
+1.640000	0.223398
+1.650000	0.221914
+1.660000	0.220440
+1.670000	0.218975
+1.680000	0.217520
+1.690000	0.216075
+1.700000	0.214639
+1.710000	0.213213
+1.720000	0.211796
+1.730000	0.210389
+1.740000	0.208991
+1.750000	0.207602
+1.760000	0.206223
+1.770000	0.204852
+1.780000	0.203491
+1.790000	0.202139
+1.800000	0.200796
+1.810000	0.199462
+1.820000	0.198137
+1.830000	0.196820
+1.840000	0.195512
+1.850000	0.194213
+1.860000	0.192923
+1.870000	0.191641
+1.880000	0.190368
+1.890000	0.189103
+1.900000	0.187846
+1.910000	0.186598
+1.920000	0.185358
+1.930000	0.184127
+1.940000	0.182903
+1.950000	0.181688
+1.960000	0.180481
+1.970000	0.179281
+1.980000	0.178090
+1.990000	0.176907
+2.000000	0.175731
+2.010000	0.174564
+2.020000	0.173404
+2.030000	0.172252
+2.040000	0.171107
+2.050000	0.169970
+2.060000	0.168841
+2.070000	0.167719
+2.080000	0.166605
+2.090000	0.165498
+2.100000	0.164398
+2.110000	0.163306
+2.120000	0.162221
+2.130000	0.161143
+2.140000	0.160072
+2.150000	0.159008
+2.160000	0.157952
+2.170000	0.156902
+2.180000	0.155860
+2.190000	0.154824
+2.200000	0.153795
+2.210000	0.152774
+2.220000	0.151758
+2.230000	0.150750
+2.240000	0.149748
+2.250000	0.148753
+2.260000	0.147765
+2.270000	0.146783
+2.280000	0.145808
+2.290000	0.144839
+2.300000	0.143877
+2.310000	0.142921
+2.320000	0.141971
+2.330000	0.141028
+2.340000	0.140091
+2.350000	0.139160
+2.360000	0.138235
+2.370000	0.137317
+2.380000	0.136404
+2.390000	0.135498
+2.400000	0.134598
+2.410000	0.133703
+2.420000	0.132815
+2.430000	0.131932
+2.440000	0.131056
+2.450000	0.130185
+2.460000	0.129320
+2.470000	0.128461
+2.480000	0.127607
+2.490000	0.126759
+2.500000	0.125917
+2.510000	0.125080
+2.520000	0.124249
+2.530000	0.123424
+2.540000	0.122604
+2.550000	0.121789
+2.560000	0.120980
+2.570000	0.120176
+2.580000	0.119377
+2.590000	0.118584
+2.600000	0.117796
+2.610000	0.117014
+2.620000	0.116236
+2.630000	0.115464
+2.640000	0.114697
+2.650000	0.113934
+2.660000	0.113177
+2.670000	0.112425
+2.680000	0.111678
+2.690000	0.110936
+2.700000	0.110199
+2.710000	0.109467
+2.720000	0.108740
+2.730000	0.108017
+2.740000	0.107299
+2.750000	0.106586
+2.760000	0.105878
+2.770000	0.105175
+2.780000	0.104476
+2.790000	0.103782
+2.800000	0.103092
+2.810000	0.102407
+2.820000	0.101727
+2.830000	0.101051
+2.840000	0.100379
+2.850000	0.099712
+2.860000	0.099050
+2.870000	0.098392
+2.880000	0.097738
+2.890000	0.097089
+2.900000	0.096443
+2.910000	0.095803
+2.920000	0.095166
+2.930000	0.094534
+2.940000	0.093906
+2.950000	0.093282
+2.960000	0.092662
+2.970000	0.092046
+2.980000	0.091435
+2.990000	0.090827
+3.000000	0.090224
+3.010000	0.089624
+3.020000	0.089029
+3.030000	0.088437
+3.040000	0.087849
+3.050000	0.087266
+3.060000	0.086686
+3.070000	0.086110
+3.080000	0.085538
+3.090000	0.084969
+3.100000	0.084405
+3.110000	0.083844
+3.120000	0.083287
+3.130000	0.082733
+3.140000	0.082184
+3.150000	0.081638
+3.160000	0.081095
+3.170000	0.080556
+3.180000	0.080021
+3.190000	0.079489
+3.200000	0.078961
+3.210000	0.078437
+3.220000	0.077915
+3.230000	0.077398
+3.240000	0.076883
+3.250000	0.076373
+3.260000	0.075865
+3.270000	0.075361
+3.280000	0.074860
+3.290000	0.074363
+3.300000	0.073869
+3.310000	0.073378
+3.320000	0.072890
+3.330000	0.072406
+3.340000	0.071925
+3.350000	0.071447
+3.360000	0.070972
+3.370000	0.070501
+3.380000	0.070032
+3.390000	0.069567
+3.400000	0.069105
+3.410000	0.068646
+3.420000	0.068189
+3.430000	0.067736
+3.440000	0.067286
+3.450000	0.066839
+3.460000	0.066395
+3.470000	0.065954
+3.480000	0.065516
+3.490000	0.065080
+3.500000	0.064648
+3.510000	0.064218
+3.520000	0.063792
+3.530000	0.063368
+3.540000	0.062947
+3.550000	0.062529
+3.560000	0.062113
+3.570000	0.061700
+3.580000	0.061290
+3.590000	0.060883
+3.600000	0.060479
+3.610000	0.060077
+3.620000	0.059678
+3.630000	0.059281
+3.640000	0.058887
+3.650000	0.058496
+3.660000	0.058107
+3.670000	0.057721
+3.680000	0.057338
+3.690000	0.056957
+3.700000	0.056578
+3.710000	0.056202
+3.720000	0.055829
+3.730000	0.055458
+3.740000	0.055089
+3.750000	0.054723
+3.760000	0.054360
+3.770000	0.053999
+3.780000	0.053640
+3.790000	0.053283
+3.800000	0.052929
+3.810000	0.052578
+3.820000	0.052228
+3.830000	0.051881
+3.840000	0.051536
+3.850000	0.051194
+3.860000	0.050854
+3.870000	0.050516
+3.880000	0.050180
+3.890000	0.049847
+3.900000	0.049516
+3.910000	0.049187
+3.920000	0.048860
+3.930000	0.048535
+3.940000	0.048213
+3.950000	0.047892
+3.960000	0.047574
+3.970000	0.047258
+3.980000	0.046944
+3.990000	0.046632
+4.000000	0.046322
+4.010000	0.046015
+4.020000	0.045709
+4.030000	0.045405
+4.040000	0.045103
+4.050000	0.044804
+4.060000	0.044506
+4.070000	0.044210
+4.080000	0.043917
+4.090000	0.043625
+4.100000	0.043335
+4.110000	0.043047
+4.120000	0.042761
+4.130000	0.042477
+4.140000	0.042195
+4.150000	0.041914
+4.160000	0.041636
+4.170000	0.041359
+4.180000	0.041084
+4.190000	0.040811
+4.200000	0.040540
+4.210000	0.040271
+4.220000	0.040003
+4.230000	0.039737
+4.240000	0.039473
+4.250000	0.039211
+4.260000	0.038950
+4.270000	0.038692
+4.280000	0.038435
+4.290000	0.038179
+4.300000	0.037925
+4.310000	0.037673
+4.320000	0.037423
+4.330000	0.037175
+4.340000	0.036928
+4.350000	0.036682
+4.360000	0.036438
+4.370000	0.036196
+4.380000	0.035956
+4.390000	0.035717
+4.400000	0.035480
+4.410000	0.035244
+4.420000	0.035010
+4.430000	0.034777
+4.440000	0.034546
+4.450000	0.034316
+4.460000	0.034088
+4.470000	0.033862
+4.480000	0.033637
+4.490000	0.033413
+4.500000	0.033191
+4.510000	0.032971
+4.520000	0.032752
+4.530000	0.032534
+4.540000	0.032318
+4.550000	0.032103
+4.560000	0.031890
+4.570000	0.031678
+4.580000	0.031468
+4.590000	0.031258
+4.600000	0.031051
+4.610000	0.030844
+4.620000	0.030640
+4.630000	0.030436
+4.640000	0.030234
+4.650000	0.030033
+4.660000	0.029833
+4.670000	0.029635
+4.680000	0.029438
+4.690000	0.029243
+4.700000	0.029048
+4.710000	0.028855
+4.720000	0.028663
+4.730000	0.028473
+4.740000	0.028284
+4.750000	0.028096
+4.760000	0.027909
+4.770000	0.027724
+4.780000	0.027540
+4.790000	0.027357
+4.800000	0.027175
+4.810000	0.026994
+4.820000	0.026815
+4.830000	0.026637
+4.840000	0.026460
+4.850000	0.026284
+4.860000	0.026109
+4.870000	0.025936
+4.880000	0.025763
+4.890000	0.025592
+4.900000	0.025422
+4.910000	0.025253
+4.920000	0.025086
+4.930000	0.024919
+4.940000	0.024753
+4.950000	0.024589
+4.960000	0.024425
+4.970000	0.024263
+4.980000	0.024102
+4.990000	0.023942
+5.000000	0.023783
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma.plt b/v0.1-M1/chi/reference-manual/distribution_plots/gamma.plt
new file mode 100644
index 0000000..c800a07
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma.plt
@@ -0,0 +1,30 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+set nokey
+#set grid back
+#set xrange [0:20]
+#set yrange [0:0.5]
+set xlabel "x"
+set ylabel "gamma(real a, b)"
+#set samples 2000
+set output "gamma.svg"
+set label "gamma(1.0, 2.0)" at 0.8, 0.42
+set label "gamma(3.0, 2.0)" at 6, 0.13
+set label "gamma(6.0, 2.0)" at 13.0, 0.09
+set label "gamma(6.0, 0.5)" at 3.8, 0.27
+set style data lines
+plot "gamma_1.0_2.0.dat" using 1:2 linetype 1, \
+     "gamma_3.0_2.0.dat" using 1:2 linetype 2, \
+     "gamma_6.0_2.0.dat" using 1:2 linetype 3, \
+     "gamma_6.0_0.5.dat" using 1:2 linetype 4
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma.svg b/v0.1-M1/chi/reference-manual/distribution_plots/gamma.svg
new file mode 100644
index 0000000..63f740e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma.svg
@@ -0,0 +1,1155 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,341.3 L80.9,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(63.6,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M71.9,260.1 L80.9,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(63.6,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,179.0 L80.9,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(63.6,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.3</text>
+	</g>
+	<path  d='M71.9,97.8 L80.9,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(63.6,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M122.2,422.4 L122.2,413.4 M122.2,16.7 L122.2,25.7 '></path>
+	<g transform="translate(122.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M172.5,422.4 L172.5,413.4 M172.5,16.7 L172.5,25.7 '></path>
+	<g transform="translate(172.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M222.8,422.4 L222.8,413.4 M222.8,16.7 L222.8,25.7 '></path>
+	<g transform="translate(222.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 6</text>
+	</g>
+	<path  d='M273.1,422.4 L273.1,413.4 M273.1,16.7 L273.1,25.7 '></path>
+	<g transform="translate(273.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 8</text>
+	</g>
+	<path  d='M323.5,422.4 L323.5,413.4 M323.5,16.7 L323.5,25.7 '></path>
+	<g transform="translate(323.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 10</text>
+	</g>
+	<path  d='M373.8,422.4 L373.8,413.4 M373.8,16.7 L373.8,25.7 '></path>
+	<g transform="translate(373.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 12</text>
+	</g>
+	<path  d='M424.1,422.4 L424.1,413.4 M424.1,16.7 L424.1,25.7 '></path>
+	<g transform="translate(424.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 14</text>
+	</g>
+	<path  d='M474.4,422.4 L474.4,413.4 M474.4,16.7 L474.4,25.7 '></path>
+	<g transform="translate(474.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 16</text>
+	</g>
+	<path  d='M524.7,422.4 L524.7,413.4 M524.7,16.7 L524.7,25.7 '></path>
+	<g transform="translate(524.7,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 18</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 20</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>gamma(real a, b)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(92.0,86.1)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>gamma(1.0, 2.0)</text>
+	</g>
+	<g transform="translate(222.8,321.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>gamma(3.0, 2.0)</text>
+	</g>
+	<g transform="translate(398.9,353.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>gamma(6.0, 2.0)</text>
+	</g>
+	<g transform="translate(167.5,207.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>gamma(6.0, 0.5)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L72.2,18.7 L72.4,20.7 L72.7,22.7 L72.9,24.7 L73.2,26.7 L73.4,28.7 L73.7,30.7 
+		L73.9,32.6 L74.2,34.6 L74.4,36.5 L74.7,38.4 L74.9,40.3 L75.2,42.2 L75.4,44.1 L75.7,46.0 
+		L75.9,47.9 L76.2,49.8 L76.4,51.6 L76.7,53.5 L76.9,55.3 L77.2,57.1 L77.4,59.0 L77.7,60.8 
+		L77.9,62.6 L78.2,64.4 L78.4,66.2 L78.7,67.9 L78.9,69.7 L79.2,71.5 L79.4,73.2 L79.7,75.0 
+		L79.9,76.7 L80.2,78.4 L80.5,80.1 L80.7,81.8 L81.0,83.5 L81.2,85.2 L81.5,86.9 L81.7,88.6 
+		L82.0,90.2 L82.2,91.9 L82.5,93.5 L82.7,95.2 L83.0,96.8 L83.2,98.4 L83.5,100.1 L83.7,101.7 
+		L84.0,103.3 L84.2,104.9 L84.5,106.4 L84.7,108.0 L85.0,109.6 L85.2,111.1 L85.5,112.7 L85.7,114.2 
+		L86.0,115.8 L86.2,117.3 L86.5,118.8 L86.7,120.3 L87.0,121.9 L87.2,123.3 L87.5,124.8 L87.7,126.3 
+		L88.0,127.8 L88.3,129.3 L88.5,130.7 L88.8,132.2 L89.0,133.6 L89.3,135.1 L89.5,136.5 L89.8,137.9 
+		L90.0,139.4 L90.3,140.8 L90.5,142.2 L90.8,143.6 L91.0,145.0 L91.3,146.3 L91.5,147.7 L91.8,149.1 
+		L92.0,150.5 L92.3,151.8 L92.5,153.2 L92.8,154.5 L93.0,155.8 L93.3,157.2 L93.5,158.5 L93.8,159.8 
+		L94.0,161.1 L94.3,162.4 L94.5,163.7 L94.8,165.0 L95.0,166.3 L95.3,167.6 L95.5,168.8 L95.8,170.1 
+		L96.0,171.4 L96.3,172.6 L96.6,173.9 L96.8,175.1 L97.1,176.3 L97.3,177.6 L97.6,178.8 L97.8,180.0 
+		L98.1,181.2 L98.3,182.4 L98.6,183.6 L98.8,184.8 L99.1,186.0 L99.3,187.2 L99.6,188.3 L99.8,189.5 
+		L100.1,190.7 L100.3,191.8 L100.6,193.0 L100.8,194.1 L101.1,195.2 L101.3,196.4 L101.6,197.5 L101.8,198.6 
+		L102.1,199.7 L102.3,200.9 L102.6,202.0 L102.8,203.1 L103.1,204.2 L103.3,205.2 L103.6,206.3 L103.8,207.4 
+		L104.1,208.5 L104.3,209.5 L104.6,210.6 L104.9,211.7 L105.1,212.7 L105.4,213.8 L105.6,214.8 L105.9,215.8 
+		L106.1,216.9 L106.4,217.9 L106.6,218.9 L106.9,219.9 L107.1,220.9 L107.4,221.9 L107.6,222.9 L107.9,223.9 
+		L108.1,224.9 L108.4,225.9 L108.6,226.9 L108.9,227.9 L109.1,228.8 L109.4,229.8 L109.6,230.8 L109.9,231.7 
+		L110.1,232.7 L110.4,233.6 L110.6,234.6 L110.9,235.5 L111.1,236.4 L111.4,237.4 L111.6,238.3 L111.9,239.2 
+		L112.1,240.1 L112.4,241.0 L112.7,241.9 L112.9,242.8 L113.2,243.7 L113.4,244.6 L113.7,245.5 L113.9,246.4 
+		L114.2,247.3 L114.4,248.1 L114.7,249.0 L114.9,249.9 L115.2,250.7 L115.4,251.6 L115.7,252.4 L115.9,253.3 
+		L116.2,254.1 L116.4,255.0 L116.7,255.8 L116.9,256.6 L117.2,257.5 L117.4,258.3 L117.7,259.1 L117.9,259.9 
+		L118.2,260.7 L118.4,261.5 L118.7,262.3 L118.9,263.1 L119.2,263.9 L119.4,264.7 L119.7,265.5 L119.9,266.3 
+		L120.2,267.1 L120.4,267.8 L120.7,268.6 L121.0,269.4 L121.2,270.1 L121.5,270.9 L121.7,271.7 L122.0,272.4 
+		L122.2,273.2 L122.5,273.9 L122.7,274.6 L123.0,275.4 L123.2,276.1 L123.5,276.8 L123.7,277.6 L124.0,278.3 
+		L124.2,279.0 L124.5,279.7 L124.7,280.4 L125.0,281.1 L125.2,281.8 L125.5,282.5 L125.7,283.2 L126.0,283.9 
+		L126.2,284.6 L126.5,285.3 L126.7,286.0 L127.0,286.7 L127.2,287.4 L127.5,288.0 L127.7,288.7 L128.0,289.4 
+		L128.2,290.0 L128.5,290.7 L128.8,291.3 L129.0,292.0 L129.3,292.6 L129.5,293.3 L129.8,293.9 L130.0,294.6 
+		L130.3,295.2 L130.5,295.9 L130.8,296.5 L131.0,297.1 L131.3,297.7 L131.5,298.4 L131.8,299.0 L132.0,299.6 
+		L132.3,300.2 L132.5,300.8 L132.8,301.4 L133.0,302.0 L133.3,302.6 L133.5,303.2 L133.8,303.8 L134.0,304.4 
+		L134.3,305.0 L134.5,305.6 L134.8,306.2 L135.0,306.7 L135.3,307.3 L135.5,307.9 L135.8,308.5 L136.0,309.0 
+		L136.3,309.6 L136.5,310.2 L136.8,310.7 L137.1,311.3 L137.3,311.8 L137.6,312.4 L137.8,312.9 L138.1,313.5 
+		L138.3,314.0 L138.6,314.6 L138.8,315.1 L139.1,315.6 L139.3,316.2 L139.6,316.7 L139.8,317.2 L140.1,317.8 
+		L140.3,318.3 L140.6,318.8 L140.8,319.3 L141.1,319.8 L141.3,320.3 L141.6,320.8 L141.8,321.3 L142.1,321.9 
+		L142.3,322.4 L142.6,322.9 L142.8,323.4 L143.1,323.8 L143.3,324.3 L143.6,324.8 L143.8,325.3 L144.1,325.8 
+		L144.3,326.3 L144.6,326.8 L144.8,327.2 L145.1,327.7 L145.4,328.2 L145.6,328.7 L145.9,329.1 L146.1,329.6 
+		L146.4,330.0 L146.6,330.5 L146.9,331.0 L147.1,331.4 L147.4,331.9 L147.6,332.3 L147.9,332.8 L148.1,333.2 
+		L148.4,333.7 L148.6,334.1 L148.9,334.6 L149.1,335.0 L149.4,335.4 L149.6,335.9 L149.9,336.3 L150.1,336.7 
+		L150.4,337.1 L150.6,337.6 L150.9,338.0 L151.1,338.4 L151.4,338.8 L151.6,339.3 L151.9,339.7 L152.1,340.1 
+		L152.4,340.5 L152.6,340.9 L152.9,341.3 L153.2,341.7 L153.4,342.1 L153.7,342.5 L153.9,342.9 L154.2,343.3 
+		L154.4,343.7 L154.7,344.1 L154.9,344.5 L155.2,344.9 L155.4,345.3 L155.7,345.6 L155.9,346.0 L156.2,346.4 
+		L156.4,346.8 L156.7,347.2 L156.9,347.5 L157.2,347.9 L157.4,348.3 L157.7,348.7 L157.9,349.0 L158.2,349.4 
+		L158.4,349.8 L158.7,350.1 L158.9,350.5 L159.2,350.8 L159.4,351.2 L159.7,351.5 L159.9,351.9 L160.2,352.3 
+		L160.4,352.6 L160.7,352.9 L160.9,353.3 L161.2,353.6 L161.5,354.0 L161.7,354.3 L162.0,354.7 L162.2,355.0 
+		L162.5,355.3 L162.7,355.7 L163.0,356.0 L163.2,356.3 L163.5,356.7 L163.7,357.0 L164.0,357.3 L164.2,357.6 
+		L164.5,358.0 L164.7,358.3 L165.0,358.6 L165.2,358.9 L165.5,359.2 L165.7,359.6 L166.0,359.9 L166.2,360.2 
+		L166.5,360.5 L166.7,360.8 L167.0,361.1 L167.2,361.4 L167.5,361.7 L167.7,362.0 L168.0,362.3 L168.2,362.6 
+		L168.5,362.9 L168.7,363.2 L169.0,363.5 L169.2,363.8 L169.5,364.1 L169.8,364.4 L170.0,364.7 L170.3,365.0 
+		L170.5,365.3 L170.8,365.5 L171.0,365.8 L171.3,366.1 L171.5,366.4 L171.8,366.7 L172.0,366.9 L172.3,367.2 
+		L172.5,367.5 L172.8,367.8 L173.0,368.0 L173.3,368.3 L173.5,368.6 L173.8,368.9 L174.0,369.1 L174.3,369.4 
+		L174.5,369.6 L174.8,369.9 L175.0,370.2 L175.3,370.4 L175.5,370.7 L175.8,370.9 L176.0,371.2 L176.3,371.5 
+		L176.5,371.7 L176.8,372.0 L177.0,372.2 L177.3,372.5 L177.6,372.7 L177.8,373.0 L178.1,373.2 L178.3,373.5 
+		L178.6,373.7 L178.8,373.9 L179.1,374.2 L179.3,374.4 L179.6,374.7 L179.8,374.9 L180.1,375.1 L180.3,375.4 
+		L180.6,375.6 L180.8,375.8 L181.1,376.1 L181.3,376.3 L181.6,376.5 L181.8,376.8 L182.1,377.0 L182.3,377.2 
+		L182.6,377.4 L182.8,377.7 L183.1,377.9 L183.3,378.1 L183.6,378.3 L183.8,378.6 L184.1,378.8 L184.3,379.0 
+		L184.6,379.2 L184.8,379.4 L185.1,379.6 L185.3,379.9 L185.6,380.1 L185.9,380.3 L186.1,380.5 L186.4,380.7 
+		L186.6,380.9 L186.9,381.1 L187.1,381.3 L187.4,381.5 L187.6,381.7 L187.9,381.9 L188.1,382.1 L188.4,382.3 
+		L188.6,382.5 L188.9,382.7 L189.1,382.9 L189.4,383.1 L189.6,383.3 L189.9,383.5 L190.1,383.7 L190.4,383.9 
+		L190.6,384.1 L190.9,384.3 L191.1,384.5 L191.4,384.7 L191.6,384.9 L191.9,385.0 L192.1,385.2 L192.4,385.4 
+		L192.6,385.6 L192.9,385.8 L193.1,386.0 L193.4,386.1 L193.7,386.3 L193.9,386.5 L194.2,386.7 L194.4,386.9 
+		L194.7,387.0 L194.9,387.2 L195.2,387.4 L195.4,387.6 L195.7,387.7 L195.9,387.9 L196.2,388.1 L196.4,388.3 
+		L196.7,388.4 L196.9,388.6 L197.2,388.8 L197.4,388.9 L197.7,389.1 L197.9,389.3 L198.2,389.4 L198.4,389.6 
+		L198.7,389.8 L198.9,389.9 L199.2,390.1 L199.4,390.2 L199.7,390.4 L199.9,390.6 L200.2,390.7 L200.4,390.9 
+		L200.7,391.0 L200.9,391.2 L201.2,391.3 L201.4,391.5 L201.7,391.7 L202.0,391.8 L202.2,392.0 L202.5,392.1 
+		L202.7,392.3 L203.0,392.4 L203.2,392.6 L203.5,392.7 L203.7,392.9 L204.0,393.0 L204.2,393.2 L204.5,393.3 
+		L204.7,393.4 L205.0,393.6 L205.2,393.7 L205.5,393.9 L205.7,394.0 L206.0,394.2 L206.2,394.3 L206.5,394.4 
+		L206.7,394.6 L207.0,394.7 L207.2,394.9 L207.5,395.0 L207.7,395.1 L208.0,395.3 L208.2,395.4 L208.5,395.5 
+		L208.7,395.7 L209.0,395.8 L209.2,395.9 L209.5,396.1 L209.7,396.2 L210.0,396.3 L210.3,396.5 L210.5,396.6 
+		L210.8,396.7 L211.0,396.9 L211.3,397.0 L211.5,397.1 L211.8,397.2 L212.0,397.4 L212.3,397.5 L212.5,397.6 
+		L212.8,397.7 L213.0,397.9 L213.3,398.0 L213.5,398.1 L213.8,398.2 L214.0,398.3 L214.3,398.5 L214.5,398.6 
+		L214.8,398.7 L215.0,398.8 L215.3,398.9 L215.5,399.0 L215.8,399.2 L216.0,399.3 L216.3,399.4 L216.5,399.5 
+		L216.8,399.6 L217.0,399.7 L217.3,399.9 L217.5,400.0 L217.8,400.1 L218.1,400.2 L218.3,400.3 L218.6,400.4 
+		L218.8,400.5 L219.1,400.6 L219.3,400.7 L219.6,400.8 L219.8,401.0 L220.1,401.1 L220.3,401.2 L220.6,401.3 
+		L220.8,401.4 L221.1,401.5 L221.3,401.6 L221.6,401.7 L221.8,401.8 L222.1,401.9 L222.3,402.0 L222.6,402.1 
+		L222.8,402.2 L223.1,402.3 L223.3,402.4 L223.6,402.5 L223.8,402.6 L224.1,402.7 L224.3,402.8 L224.6,402.9 
+		L224.8,403.0 L225.1,403.1 L225.3,403.2 L225.6,403.3 L225.8,403.4 L226.1,403.5 L226.4,403.6 L226.6,403.7 
+		L226.9,403.8 L227.1,403.8 L227.4,403.9 L227.6,404.0 L227.9,404.1 L228.1,404.2 L228.4,404.3 L228.6,404.4 
+		L228.9,404.5 L229.1,404.6 L229.4,404.7 L229.6,404.8 L229.9,404.8 L230.1,404.9 L230.4,405.0 L230.6,405.1 
+		L230.9,405.2 L231.1,405.3 L231.4,405.4 L231.6,405.4 L231.9,405.5 L232.1,405.6 L232.4,405.7 L232.6,405.8 
+		L232.9,405.9 L233.1,405.9 L233.4,406.0 L233.6,406.1 L233.9,406.2 L234.1,406.3 L234.4,406.4 L234.7,406.4 
+		L234.9,406.5 L235.2,406.6 L235.4,406.7 L235.7,406.7 L235.9,406.8 L236.2,406.9 L236.4,407.0 L236.7,407.1 
+		L236.9,407.1 L237.2,407.2 L237.4,407.3 L237.7,407.4 L237.9,407.4 L238.2,407.5 L238.4,407.6 L238.7,407.7 
+		L238.9,407.7 L239.2,407.8 L239.4,407.9 L239.7,408.0 L239.9,408.0 L240.2,408.1 L240.4,408.2 L240.7,408.2 
+		L240.9,408.3 L241.2,408.4 L241.4,408.4 L241.7,408.5 L241.9,408.6 L242.2,408.7 L242.5,408.7 L242.7,408.8 
+		L243.0,408.9 L243.2,408.9 L243.5,409.0 L243.7,409.1 L244.0,409.1 L244.2,409.2 L244.5,409.3 L244.7,409.3 
+		L245.0,409.4 L245.2,409.5 L245.5,409.5 L245.7,409.6 L246.0,409.6 L246.2,409.7 L246.5,409.8 L246.7,409.8 
+		L247.0,409.9 L247.2,410.0 L247.5,410.0 L247.7,410.1 L248.0,410.1 L248.2,410.2 L248.5,410.3 L248.7,410.3 
+		L249.0,410.4 L249.2,410.5 L249.5,410.5 L249.7,410.6 L250.0,410.6 L250.2,410.7 L250.5,410.7 L250.8,410.8 
+		L251.0,410.9 L251.3,410.9 L251.5,411.0 L251.8,411.0 L252.0,411.1 L252.3,411.1 L252.5,411.2 L252.8,411.3 
+		L253.0,411.3 L253.3,411.4 L253.5,411.4 L253.8,411.5 L254.0,411.5 L254.3,411.6 L254.5,411.6 L254.8,411.7 
+		L255.0,411.7 L255.3,411.8 L255.5,411.9 L255.8,411.9 L256.0,412.0 L256.3,412.0 L256.5,412.1 L256.8,412.1 
+		L257.0,412.2 L257.3,412.2 L257.5,412.3 L257.8,412.3 L258.0,412.4 L258.3,412.4 L258.6,412.5 L258.8,412.5 
+		L259.1,412.6 L259.3,412.6 L259.6,412.7 L259.8,412.7 L260.1,412.8 L260.3,412.8 L260.6,412.9 L260.8,412.9 
+		L261.1,413.0 L261.3,413.0 L261.6,413.0 L261.8,413.1 L262.1,413.1 L262.3,413.2 L262.6,413.2 L262.8,413.3 
+		L263.1,413.3 L263.3,413.4 L263.6,413.4 L263.8,413.5 L264.1,413.5 L264.3,413.5 L264.6,413.6 L264.8,413.6 
+		L265.1,413.7 L265.3,413.7 L265.6,413.8 L265.8,413.8 L266.1,413.9 L266.3,413.9 L266.6,413.9 L266.9,414.0 
+		L267.1,414.0 L267.4,414.1 L267.6,414.1 L267.9,414.1 L268.1,414.2 L268.4,414.2 L268.6,414.3 L268.9,414.3 
+		L269.1,414.4 L269.4,414.4 L269.6,414.4 L269.9,414.5 L270.1,414.5 L270.4,414.5 L270.6,414.6 L270.9,414.6 
+		L271.1,414.7 L271.4,414.7 L271.6,414.7 L271.9,414.8 L272.1,414.8 L272.4,414.9 L272.6,414.9 L272.9,414.9 
+		L273.1,415.0 L273.4,415.0 L273.6,415.0 L273.9,415.1 L274.1,415.1 L274.4,415.2 L274.6,415.2 L274.9,415.2 
+		L275.2,415.3 L275.4,415.3 L275.7,415.3 L275.9,415.4 L276.2,415.4 L276.4,415.4 L276.7,415.5 L276.9,415.5 
+		L277.2,415.5 L277.4,415.6 L277.7,415.6 L277.9,415.6 L278.2,415.7 L278.4,415.7 L278.7,415.7 L278.9,415.8 
+		L279.2,415.8 L279.4,415.8 L279.7,415.9 L279.9,415.9 L280.2,415.9 L280.4,416.0 L280.7,416.0 L280.9,416.0 
+		L281.2,416.1 L281.4,416.1 L281.7,416.1 L281.9,416.2 L282.2,416.2 L282.4,416.2 L282.7,416.3 L283.0,416.3 
+		L283.2,416.3 L283.5,416.3 L283.7,416.4 L284.0,416.4 L284.2,416.4 L284.5,416.5 L284.7,416.5 L285.0,416.5 
+		L285.2,416.6 L285.5,416.6 L285.7,416.6 L286.0,416.6 L286.2,416.7 L286.5,416.7 L286.7,416.7 L287.0,416.8 
+		L287.2,416.8 L287.5,416.8 L287.7,416.8 L288.0,416.9 L288.2,416.9 L288.5,416.9 L288.7,416.9 L289.0,417.0 
+		L289.2,417.0 L289.5,417.0 L289.7,417.1 L290.0,417.1 L290.2,417.1 L290.5,417.1 L290.7,417.2 L291.0,417.2 
+		L291.3,417.2 L291.5,417.2 L291.8,417.3 L292.0,417.3 L292.3,417.3 L292.5,417.3 L292.8,417.4 L293.0,417.4 
+		L293.3,417.4 L293.5,417.4 L293.8,417.5 L294.0,417.5 L294.3,417.5 L294.5,417.5 L294.8,417.6 L295.0,417.6 
+		L295.3,417.6 L295.5,417.6 L295.8,417.7 L296.0,417.7 L296.3,417.7 L296.5,417.7 L296.8,417.8 L297.0,417.8 
+		L297.3,417.8 L297.5,417.8 L297.8,417.8 L298.0,417.9 L298.3,417.9 L298.5,417.9 L298.8,417.9 L299.0,418.0 
+		L299.3,418.0 L299.6,418.0 L299.8,418.0 L300.1,418.0 L300.3,418.1 L300.6,418.1 L300.8,418.1 L301.1,418.1 
+		L301.3,418.2 L301.6,418.2 L301.8,418.2 L302.1,418.2 L302.3,418.2 L302.6,418.3 L302.8,418.3 L303.1,418.3 
+		L303.3,418.3 L303.6,418.3 L303.8,418.4 L304.1,418.4 L304.3,418.4 L304.6,418.4 L304.8,418.4 L305.1,418.5 
+		L305.3,418.5 L305.6,418.5 L305.8,418.5 L306.1,418.5 L306.3,418.6 L306.6,418.6 L306.8,418.6 L307.1,418.6 
+		L307.4,418.6 L307.6,418.7 L307.9,418.7 L308.1,418.7 L308.4,418.7 L308.6,418.7 L308.9,418.7 L309.1,418.8 
+		L309.4,418.8 L309.6,418.8 L309.9,418.8 L310.1,418.8 L310.4,418.9 L310.6,418.9 L310.9,418.9 L311.1,418.9 
+		L311.4,418.9 L311.6,418.9 L311.9,419.0 L312.1,419.0 L312.4,419.0 L312.6,419.0 L312.9,419.0 L313.1,419.0 
+		L313.4,419.1 L313.6,419.1 L313.9,419.1 L314.1,419.1 L314.4,419.1 L314.6,419.1 L314.9,419.2 L315.1,419.2 
+		L315.4,419.2 L315.7,419.2 L315.9,419.2 L316.2,419.2 L316.4,419.3 L316.7,419.3 L316.9,419.3 L317.2,419.3 
+		L317.4,419.3 L317.7,419.3 L317.9,419.3 L318.2,419.4 L318.4,419.4 L318.7,419.4 L318.9,419.4 L319.2,419.4 
+		L319.4,419.4 L319.7,419.5 L319.9,419.5 L320.2,419.5 L320.4,419.5 L320.7,419.5 L320.9,419.5 L321.2,419.5 
+		L321.4,419.6 L321.7,419.6 L321.9,419.6 L322.2,419.6 L322.4,419.6 L322.7,419.6 L322.9,419.6 L323.2,419.7 
+		L323.5,419.7 L323.7,419.7 L324.0,419.7 L324.2,419.7 L324.5,419.7 L324.7,419.7 L325.0,419.7 L325.2,419.8 
+		L325.5,419.8 L325.7,419.8 L326.0,419.8 L326.2,419.8 L326.5,419.8 L326.7,419.8 L327.0,419.9 L327.2,419.9 
+		L327.5,419.9 L327.7,419.9 L328.0,419.9 L328.2,419.9 L328.5,419.9 L328.7,419.9 L329.0,420.0 L329.2,420.0 
+		L329.5,420.0 L329.7,420.0 L330.0,420.0 L330.2,420.0 L330.5,420.0 L330.7,420.0 L331.0,420.0 L331.2,420.1 
+		L331.5,420.1 L331.8,420.1 L332.0,420.1 L332.3,420.1 L332.5,420.1 L332.8,420.1 L333.0,420.1 L333.3,420.2 
+		L333.5,420.2 L333.8,420.2 L334.0,420.2 L334.3,420.2 L334.5,420.2 L334.8,420.2 L335.0,420.2 L335.3,420.2 
+		L335.5,420.2 L335.8,420.3 L336.0,420.3 L336.3,420.3 L336.5,420.3 L336.8,420.3 L337.0,420.3 L337.3,420.3 
+		L337.5,420.3 L337.8,420.3 L338.0,420.4 L338.3,420.4 L338.5,420.4 L338.8,420.4 L339.0,420.4 L339.3,420.4 
+		L339.5,420.4 L339.8,420.4 L340.1,420.4 L340.3,420.4 L340.6,420.5 L340.8,420.5 L341.1,420.5 L341.3,420.5 
+		L341.6,420.5 L341.8,420.5 L342.1,420.5 L342.3,420.5 L342.6,420.5 L342.8,420.5 L343.1,420.5 L343.3,420.6 
+		L343.6,420.6 L343.8,420.6 L344.1,420.6 L344.3,420.6 L344.6,420.6 L344.8,420.6 L345.1,420.6 L345.3,420.6 
+		L345.6,420.6 L345.8,420.6 L346.1,420.7 L346.3,420.7 L346.6,420.7 L346.8,420.7 L347.1,420.7 L347.3,420.7 
+		L347.6,420.7 L347.9,420.7 L348.1,420.7 L348.4,420.7 L348.6,420.7 L348.9,420.8 L349.1,420.8 L349.4,420.8 
+		L349.6,420.8 L349.9,420.8 L350.1,420.8 L350.4,420.8 L350.6,420.8 L350.9,420.8 L351.1,420.8 L351.4,420.8 
+		L351.6,420.8 L351.9,420.8 L352.1,420.9 L352.4,420.9 L352.6,420.9 L352.9,420.9 L353.1,420.9 L353.4,420.9 
+		L353.6,420.9 L353.9,420.9 L354.1,420.9 L354.4,420.9 L354.6,420.9 L354.9,420.9 L355.1,420.9 L355.4,421.0 
+		L355.6,421.0 L355.9,421.0 L356.2,421.0 L356.4,421.0 L356.7,421.0 L356.9,421.0 L357.2,421.0 L357.4,421.0 
+		L357.7,421.0 L357.9,421.0 L358.2,421.0 L358.4,421.0 L358.7,421.0 L358.9,421.0 L359.2,421.1 L359.4,421.1 
+		L359.7,421.1 L359.9,421.1 L360.2,421.1 L360.4,421.1 L360.7,421.1 L360.9,421.1 L361.2,421.1 L361.4,421.1 
+		L361.7,421.1 L361.9,421.1 L362.2,421.1 L362.4,421.1 L362.7,421.1 L362.9,421.2 L363.2,421.2 L363.4,421.2 
+		L363.7,421.2 L363.9,421.2 L364.2,421.2 L364.5,421.2 L364.7,421.2 L365.0,421.2 L365.2,421.2 L365.5,421.2 
+		L365.7,421.2 L366.0,421.2 L366.2,421.2 L366.5,421.2 L366.7,421.2 L367.0,421.2 L367.2,421.3 L367.5,421.3 
+		L367.7,421.3 L368.0,421.3 L368.2,421.3 L368.5,421.3 L368.7,421.3 L369.0,421.3 L369.2,421.3 L369.5,421.3 
+		L369.7,421.3 L370.0,421.3 L370.2,421.3 L370.5,421.3 L370.7,421.3 L371.0,421.3 L371.2,421.3 L371.5,421.3 
+		L371.7,421.4 L372.0,421.4 L372.3,421.4 L372.5,421.4 L372.8,421.4 L373.0,421.4 L373.3,421.4 L373.5,421.4 
+		L373.8,421.4 L374.0,421.4 L374.3,421.4 L374.5,421.4 L374.8,421.4 L375.0,421.4 L375.3,421.4 L375.5,421.4 
+		L375.8,421.4 L376.0,421.4 L376.3,421.4 L376.5,421.4 L376.8,421.5 L377.0,421.5 L377.3,421.5 L377.5,421.5 
+		L377.8,421.5 L378.0,421.5 L378.3,421.5 L378.5,421.5 L378.8,421.5 L379.0,421.5 L379.3,421.5 L379.5,421.5 
+		L379.8,421.5 L380.0,421.5 L380.3,421.5 L380.6,421.5 L380.8,421.5 L381.1,421.5 L381.3,421.5 L381.6,421.5 
+		L381.8,421.5 L382.1,421.5 L382.3,421.6 L382.6,421.6 L382.8,421.6 L383.1,421.6 L383.3,421.6 L383.6,421.6 
+		L383.8,421.6 L384.1,421.6 L384.3,421.6 L384.6,421.6 L384.8,421.6 L385.1,421.6 L385.3,421.6 L385.6,421.6 
+		L385.8,421.6 L386.1,421.6 L386.3,421.6 L386.6,421.6 L386.8,421.6 L387.1,421.6 L387.3,421.6 L387.6,421.6 
+		L387.8,421.6 L388.1,421.6 L388.3,421.6 L388.6,421.7 L388.9,421.7 L389.1,421.7 L389.4,421.7 L389.6,421.7 
+		L389.9,421.7 L390.1,421.7 L390.4,421.7 L390.6,421.7 L390.9,421.7 L391.1,421.7 L391.4,421.7 L391.6,421.7 
+		L391.9,421.7 L392.1,421.7 L392.4,421.7 L392.6,421.7 L392.9,421.7 L393.1,421.7 L393.4,421.7 L393.6,421.7 
+		L393.9,421.7 L394.1,421.7 L394.4,421.7 L394.6,421.7 L394.9,421.7 L395.1,421.7 L395.4,421.7 L395.6,421.7 
+		L395.9,421.8 L396.1,421.8 L396.4,421.8 L396.7,421.8 L396.9,421.8 L397.2,421.8 L397.4,421.8 L397.7,421.8 
+		L397.9,421.8 L398.2,421.8 L398.4,421.8 L398.7,421.8 L398.9,421.8 L399.2,421.8 L399.4,421.8 L399.7,421.8 
+		L399.9,421.8 L400.2,421.8 L400.4,421.8 L400.7,421.8 L400.9,421.8 L401.2,421.8 L401.4,421.8 L401.7,421.8 
+		L401.9,421.8 L402.2,421.8 L402.4,421.8 L402.7,421.8 L402.9,421.8 L403.2,421.8 L403.4,421.8 L403.7,421.8 
+		L403.9,421.8 L404.2,421.9 L404.4,421.9 L404.7,421.9 L405.0,421.9 L405.2,421.9 L405.5,421.9 L405.7,421.9 
+		L406.0,421.9 L406.2,421.9 L406.5,421.9 L406.7,421.9 L407.0,421.9 L407.2,421.9 L407.5,421.9 L407.7,421.9 
+		L408.0,421.9 L408.2,421.9 L408.5,421.9 L408.7,421.9 L409.0,421.9 L409.2,421.9 L409.5,421.9 L409.7,421.9 
+		L410.0,421.9 L410.2,421.9 L410.5,421.9 L410.7,421.9 L411.0,421.9 L411.2,421.9 L411.5,421.9 L411.7,421.9 
+		L412.0,421.9 L412.2,421.9 L412.5,421.9 L412.8,421.9 L413.0,421.9 L413.3,421.9 L413.5,421.9 L413.8,421.9 
+		L414.0,421.9 L414.3,422.0 L414.5,422.0 L414.8,422.0 L415.0,422.0 L415.3,422.0 L415.5,422.0 L415.8,422.0 
+		L416.0,422.0 L416.3,422.0 L416.5,422.0 L416.8,422.0 L417.0,422.0 L417.3,422.0 L417.5,422.0 L417.8,422.0 
+		L418.0,422.0 L418.3,422.0 L418.5,422.0 L418.8,422.0 L419.0,422.0 L419.3,422.0 L419.5,422.0 L419.8,422.0 
+		L420.0,422.0 L420.3,422.0 L420.5,422.0 L420.8,422.0 L421.1,422.0 L421.3,422.0 L421.6,422.0 L421.8,422.0 
+		L422.1,422.0 L422.3,422.0 L422.6,422.0 L422.8,422.0 L423.1,422.0 L423.3,422.0 L423.6,422.0 L423.8,422.0 
+		L424.1,422.0 L424.3,422.0 L424.6,422.0 L424.8,422.0 L425.1,422.0 L425.3,422.0 L425.6,422.0 L425.8,422.0 
+		L426.1,422.0 L426.3,422.0 L426.6,422.0 L426.8,422.0 L427.1,422.1 L427.3,422.1 L427.6,422.1 L427.8,422.1 
+		L428.1,422.1 L428.3,422.1 L428.6,422.1 L428.8,422.1 L429.1,422.1 L429.4,422.1 L429.6,422.1 L429.9,422.1 
+		L430.1,422.1 L430.4,422.1 L430.6,422.1 L430.9,422.1 L431.1,422.1 L431.4,422.1 L431.6,422.1 L431.9,422.1 
+		L432.1,422.1 L432.4,422.1 L432.6,422.1 L432.9,422.1 L433.1,422.1 L433.4,422.1 L433.6,422.1 L433.9,422.1 
+		L434.1,422.1 L434.4,422.1 L434.6,422.1 L434.9,422.1 L435.1,422.1 L435.4,422.1 L435.6,422.1 L435.9,422.1 
+		L436.1,422.1 L436.4,422.1 L436.6,422.1 L436.9,422.1 L437.2,422.1 L437.4,422.1 L437.7,422.1 L437.9,422.1 
+		L438.2,422.1 L438.4,422.1 L438.7,422.1 L438.9,422.1 L439.2,422.1 L439.4,422.1 L439.7,422.1 L439.9,422.1 
+		L440.2,422.1 L440.4,422.1 L440.7,422.1 L440.9,422.1 L441.2,422.1 L441.4,422.1 L441.7,422.1 L441.9,422.1 
+		L442.2,422.1 L442.4,422.1 L442.7,422.1 L442.9,422.1 L443.2,422.1 L443.4,422.1 L443.7,422.1 L443.9,422.2 
+		L444.2,422.2 L444.4,422.2 L444.7,422.2 L444.9,422.2 L445.2,422.2 L445.5,422.2 L445.7,422.2 L446.0,422.2 
+		L446.2,422.2 L446.5,422.2 L446.7,422.2 L447.0,422.2 L447.2,422.2 L447.5,422.2 L447.7,422.2 L448.0,422.2 
+		L448.2,422.2 L448.5,422.2 L448.7,422.2 L449.0,422.2 L449.2,422.2 L449.5,422.2 L449.7,422.2 L450.0,422.2 
+		L450.2,422.2 L450.5,422.2 L450.7,422.2 L451.0,422.2 L451.2,422.2 L451.5,422.2 L451.7,422.2 L452.0,422.2 
+		L452.2,422.2 L452.5,422.2 L452.7,422.2 L453.0,422.2 L453.2,422.2 L453.5,422.2 L453.8,422.2 L454.0,422.2 
+		L454.3,422.2 L454.5,422.2 L454.8,422.2 L455.0,422.2 L455.3,422.2 L455.5,422.2 L455.8,422.2 L456.0,422.2 
+		L456.3,422.2 L456.5,422.2 L456.8,422.2 L457.0,422.2 L457.3,422.2 L457.5,422.2 L457.8,422.2 L458.0,422.2 
+		L458.3,422.2 L458.5,422.2 L458.8,422.2 L459.0,422.2 L459.3,422.2 L459.5,422.2 L459.8,422.2 L460.0,422.2 
+		L460.3,422.2 L460.5,422.2 L460.8,422.2 L461.0,422.2 L461.3,422.2 L461.6,422.2 L461.8,422.2 L462.1,422.2 
+		L462.3,422.2 L462.6,422.2 L462.8,422.2 L463.1,422.2 L463.3,422.2 L463.6,422.2 L463.8,422.2 L464.1,422.2 
+		L464.3,422.2 L464.6,422.2 L464.8,422.2 L465.1,422.2 L465.3,422.2 L465.6,422.2 L465.8,422.2 L466.1,422.2 
+		L466.3,422.2 L466.6,422.2 L466.8,422.2 L467.1,422.2 L467.3,422.2 L467.6,422.2 L467.8,422.2 L468.1,422.2 
+		L468.3,422.2 L468.6,422.2 L468.8,422.2 L469.1,422.2 L469.3,422.2 L469.6,422.3 L469.9,422.3 L470.1,422.3 
+		L470.4,422.3 L470.6,422.3 L470.9,422.3 L471.1,422.3 L471.4,422.3 L471.6,422.3 L471.9,422.3 L472.1,422.3 
+		L472.4,422.3 L472.6,422.3 L472.9,422.3 L473.1,422.3 L473.4,422.3 L473.6,422.3 L473.9,422.3 L474.1,422.3 
+		L474.4,422.3 L474.6,422.3 L474.9,422.3 L475.1,422.3 L475.4,422.3 L475.6,422.3 L475.9,422.3 L476.1,422.3 
+		L476.4,422.3 L476.6,422.3 L476.9,422.3 L477.1,422.3 L477.4,422.3 L477.7,422.3 L477.9,422.3 L478.2,422.3 
+		L478.4,422.3 L478.7,422.3 L478.9,422.3 L479.2,422.3 L479.4,422.3 L479.7,422.3 L479.9,422.3 L480.2,422.3 
+		L480.4,422.3 L480.7,422.3 L480.9,422.3 L481.2,422.3 L481.4,422.3 L481.7,422.3 L481.9,422.3 L482.2,422.3 
+		L482.4,422.3 L482.7,422.3 L482.9,422.3 L483.2,422.3 L483.4,422.3 L483.7,422.3 L483.9,422.3 L484.2,422.3 
+		L484.4,422.3 L484.7,422.3 L484.9,422.3 L485.2,422.3 L485.4,422.3 L485.7,422.3 L486.0,422.3 L486.2,422.3 
+		L486.5,422.3 L486.7,422.3 L487.0,422.3 L487.2,422.3 L487.5,422.3 L487.7,422.3 L488.0,422.3 L488.2,422.3 
+		L488.5,422.3 L488.7,422.3 L489.0,422.3 L489.2,422.3 L489.5,422.3 L489.7,422.3 L490.0,422.3 L490.2,422.3 
+		L490.5,422.3 L490.7,422.3 L491.0,422.3 L491.2,422.3 L491.5,422.3 L491.7,422.3 L492.0,422.3 L492.2,422.3 
+		L492.5,422.3 L492.7,422.3 L493.0,422.3 L493.2,422.3 L493.5,422.3 L493.7,422.3 L494.0,422.3 L494.3,422.3 
+		L494.5,422.3 L494.8,422.3 L495.0,422.3 L495.3,422.3 L495.5,422.3 L495.8,422.3 L496.0,422.3 L496.3,422.3 
+		L496.5,422.3 L496.8,422.3 L497.0,422.3 L497.3,422.3 L497.5,422.3 L497.8,422.3 L498.0,422.3 L498.3,422.3 
+		L498.5,422.3 L498.8,422.3 L499.0,422.3 L499.3,422.3 L499.5,422.3 L499.8,422.3 L500.0,422.3 L500.3,422.3 
+		L500.5,422.3 L500.8,422.3 L501.0,422.3 L501.3,422.3 L501.5,422.3 L501.8,422.3 L502.1,422.3 L502.3,422.3 
+		L502.6,422.3 L502.8,422.3 L503.1,422.3 L503.3,422.3 L503.6,422.3 L503.8,422.3 L504.1,422.3 L504.3,422.3 
+		L504.6,422.3 L504.8,422.3 L505.1,422.3 L505.3,422.3 L505.6,422.3 L505.8,422.3 L506.1,422.3 L506.3,422.3 
+		L506.6,422.3 L506.8,422.3 L507.1,422.3 L507.3,422.3 L507.6,422.3 L507.8,422.3 L508.1,422.3 L508.3,422.3 
+		L508.6,422.3 L508.8,422.3 L509.1,422.3 L509.3,422.3 L509.6,422.3 L509.8,422.3 L510.1,422.3 L510.4,422.3 
+		L510.6,422.3 L510.9,422.3 L511.1,422.3 L511.4,422.3 L511.6,422.3 L511.9,422.3 L512.1,422.3 L512.4,422.3 
+		L512.6,422.3 L512.9,422.3 L513.1,422.3 L513.4,422.3 L513.6,422.3 L513.9,422.3 L514.1,422.3 L514.4,422.3 
+		L514.6,422.3 L514.9,422.3 L515.1,422.3 L515.4,422.3 L515.6,422.3 L515.9,422.3 L516.1,422.3 L516.4,422.3 
+		L516.6,422.3 L516.9,422.3 L517.1,422.3 L517.4,422.3 L517.6,422.3 L517.9,422.3 L518.1,422.3 L518.4,422.3 
+		L518.7,422.3 L518.9,422.3 L519.2,422.3 L519.4,422.3 L519.7,422.3 L519.9,422.3 L520.2,422.3 L520.4,422.3 
+		L520.7,422.3 L520.9,422.3 L521.2,422.3 L521.4,422.3 L521.7,422.3 L521.9,422.3 L522.2,422.3 L522.4,422.3 
+		L522.7,422.3 L522.9,422.3 L523.2,422.3 L523.4,422.3 L523.7,422.3 L523.9,422.3 L524.2,422.3 L524.4,422.3 
+		L524.7,422.3 L524.9,422.4 L525.2,422.4 L525.4,422.4 L525.7,422.4 L525.9,422.4 L526.2,422.4 L526.5,422.4 
+		L526.7,422.4 L527.0,422.4 L527.2,422.4 L527.5,422.4 L527.7,422.4 L528.0,422.4 L528.2,422.4 L528.5,422.4 
+		L528.7,422.4 L529.0,422.4 L529.2,422.4 L529.5,422.4 L529.7,422.4 L530.0,422.4 L530.2,422.4 L530.5,422.4 
+		L530.7,422.4 L531.0,422.4 L531.2,422.4 L531.5,422.4 L531.7,422.4 L532.0,422.4 L532.2,422.4 L532.5,422.4 
+		L532.7,422.4 L533.0,422.4 L533.2,422.4 L533.5,422.4 L533.7,422.4 L534.0,422.4 L534.2,422.4 L534.5,422.4 
+		L534.8,422.4 L535.0,422.4 L535.3,422.4 L535.5,422.4 L535.8,422.4 L536.0,422.4 L536.3,422.4 L536.5,422.4 
+		L536.8,422.4 L537.0,422.4 L537.3,422.4 L537.5,422.4 L537.8,422.4 L538.0,422.4 L538.3,422.4 L538.5,422.4 
+		L538.8,422.4 L539.0,422.4 L539.3,422.4 L539.5,422.4 L539.8,422.4 L540.0,422.4 L540.3,422.4 L540.5,422.4 
+		L540.8,422.4 L541.0,422.4 L541.3,422.4 L541.5,422.4 L541.8,422.4 L542.0,422.4 L542.3,422.4 L542.6,422.4 
+		L542.8,422.4 L543.1,422.4 L543.3,422.4 L543.6,422.4 L543.8,422.4 L544.1,422.4 L544.3,422.4 L544.6,422.4 
+		L544.8,422.4 L545.1,422.4 L545.3,422.4 L545.6,422.4 L545.8,422.4 L546.1,422.4 L546.3,422.4 L546.6,422.4 
+		L546.8,422.4 L547.1,422.4 L547.3,422.4 L547.6,422.4 L547.8,422.4 L548.1,422.4 L548.3,422.4 L548.6,422.4 
+		L548.8,422.4 L549.1,422.4 L549.3,422.4 L549.6,422.4 L549.8,422.4 L550.1,422.4 L550.3,422.4 L550.6,422.4 
+		L550.9,422.4 L551.1,422.4 L551.4,422.4 L551.6,422.4 L551.9,422.4 L552.1,422.4 L552.4,422.4 L552.6,422.4 
+		L552.9,422.4 L553.1,422.4 L553.4,422.4 L553.6,422.4 L553.9,422.4 L554.1,422.4 L554.4,422.4 L554.6,422.4 
+		L554.9,422.4 L555.1,422.4 L555.4,422.4 L555.6,422.4 L555.9,422.4 L556.1,422.4 L556.4,422.4 L556.6,422.4 
+		L556.9,422.4 L557.1,422.4 L557.4,422.4 L557.6,422.4 L557.9,422.4 L558.1,422.4 L558.4,422.4 L558.6,422.4 
+		L558.9,422.4 L559.2,422.4 L559.4,422.4 L559.7,422.4 L559.9,422.4 L560.2,422.4 L560.4,422.4 L560.7,422.4 
+		L560.9,422.4 L561.2,422.4 L561.4,422.4 L561.7,422.4 L561.9,422.4 L562.2,422.4 L562.4,422.4 L562.7,422.4 
+		L562.9,422.4 L563.2,422.4 L563.4,422.4 L563.7,422.4 L563.9,422.4 L564.2,422.4 L564.4,422.4 L564.7,422.4 
+		L564.9,422.4 L565.2,422.4 L565.4,422.4 L565.7,422.4 L565.9,422.4 L566.2,422.4 L566.4,422.4 L566.7,422.4 
+		L567.0,422.4 L567.2,422.4 L567.5,422.4 L567.7,422.4 L568.0,422.4 L568.2,422.4 L568.5,422.4 L568.7,422.4 
+		L569.0,422.4 L569.2,422.4 L569.5,422.4 L569.7,422.4 L570.0,422.4 L570.2,422.4 L570.5,422.4 L570.7,422.4 
+		L571.0,422.4 L571.2,422.4 L571.5,422.4 L571.7,422.4 L572.0,422.4 L572.2,422.4 L572.5,422.4 L572.7,422.4 
+		L573.0,422.4 L573.2,422.4 L573.5,422.4 L573.7,422.4 L574.0,422.4 L574.2,422.4 L574.5,422.4 L574.7,422.4 
+		'></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L72.2,422.4 L72.4,422.4 L72.7,422.4 L72.9,422.3 L73.2,422.3 L73.4,422.2 L73.7,422.2 
+		L73.9,422.1 L74.2,422.0 L74.4,421.9 L74.7,421.8 L74.9,421.7 L75.2,421.6 L75.4,421.5 L75.7,421.3 
+		L75.9,421.2 L76.2,421.1 L76.4,420.9 L76.7,420.7 L76.9,420.6 L77.2,420.4 L77.4,420.2 L77.7,420.0 
+		L77.9,419.8 L78.2,419.6 L78.4,419.4 L78.7,419.2 L78.9,418.9 L79.2,418.7 L79.4,418.5 L79.7,418.2 
+		L79.9,418.0 L80.2,417.7 L80.5,417.5 L80.7,417.2 L81.0,416.9 L81.2,416.6 L81.5,416.3 L81.7,416.1 
+		L82.0,415.8 L82.2,415.5 L82.5,415.1 L82.7,414.8 L83.0,414.5 L83.2,414.2 L83.5,413.9 L83.7,413.5 
+		L84.0,413.2 L84.2,412.9 L84.5,412.5 L84.7,412.2 L85.0,411.8 L85.2,411.5 L85.5,411.1 L85.7,410.7 
+		L86.0,410.4 L86.2,410.0 L86.5,409.6 L86.7,409.3 L87.0,408.9 L87.2,408.5 L87.5,408.1 L87.7,407.7 
+		L88.0,407.3 L88.3,406.9 L88.5,406.5 L88.8,406.1 L89.0,405.7 L89.3,405.3 L89.5,404.9 L89.8,404.5 
+		L90.0,404.1 L90.3,403.6 L90.5,403.2 L90.8,402.8 L91.0,402.4 L91.3,401.9 L91.5,401.5 L91.8,401.1 
+		L92.0,400.6 L92.3,400.2 L92.5,399.8 L92.8,399.3 L93.0,398.9 L93.3,398.4 L93.5,398.0 L93.8,397.6 
+		L94.0,397.1 L94.3,396.7 L94.5,396.2 L94.8,395.8 L95.0,395.3 L95.3,394.8 L95.5,394.4 L95.8,393.9 
+		L96.0,393.5 L96.3,393.0 L96.6,392.6 L96.8,392.1 L97.1,391.6 L97.3,391.2 L97.6,390.7 L97.8,390.3 
+		L98.1,389.8 L98.3,389.3 L98.6,388.9 L98.8,388.4 L99.1,387.9 L99.3,387.5 L99.6,387.0 L99.8,386.5 
+		L100.1,386.1 L100.3,385.6 L100.6,385.1 L100.8,384.7 L101.1,384.2 L101.3,383.7 L101.6,383.3 L101.8,382.8 
+		L102.1,382.3 L102.3,381.9 L102.6,381.4 L102.8,380.9 L103.1,380.5 L103.3,380.0 L103.6,379.5 L103.8,379.1 
+		L104.1,378.6 L104.3,378.1 L104.6,377.7 L104.9,377.2 L105.1,376.7 L105.4,376.3 L105.6,375.8 L105.9,375.3 
+		L106.1,374.9 L106.4,374.4 L106.6,374.0 L106.9,373.5 L107.1,373.0 L107.4,372.6 L107.6,372.1 L107.9,371.7 
+		L108.1,371.2 L108.4,370.8 L108.6,370.3 L108.9,369.9 L109.1,369.4 L109.4,369.0 L109.6,368.5 L109.9,368.1 
+		L110.1,367.6 L110.4,367.2 L110.6,366.7 L110.9,366.3 L111.1,365.8 L111.4,365.4 L111.6,364.9 L111.9,364.5 
+		L112.1,364.1 L112.4,363.6 L112.7,363.2 L112.9,362.8 L113.2,362.3 L113.4,361.9 L113.7,361.5 L113.9,361.0 
+		L114.2,360.6 L114.4,360.2 L114.7,359.8 L114.9,359.3 L115.2,358.9 L115.4,358.5 L115.7,358.1 L115.9,357.7 
+		L116.2,357.2 L116.4,356.8 L116.7,356.4 L116.9,356.0 L117.2,355.6 L117.4,355.2 L117.7,354.8 L117.9,354.4 
+		L118.2,354.0 L118.4,353.6 L118.7,353.2 L118.9,352.8 L119.2,352.4 L119.4,352.0 L119.7,351.6 L119.9,351.2 
+		L120.2,350.8 L120.4,350.4 L120.7,350.0 L121.0,349.7 L121.2,349.3 L121.5,348.9 L121.7,348.5 L122.0,348.1 
+		L122.2,347.8 L122.5,347.4 L122.7,347.0 L123.0,346.7 L123.2,346.3 L123.5,345.9 L123.7,345.6 L124.0,345.2 
+		L124.2,344.9 L124.5,344.5 L124.7,344.1 L125.0,343.8 L125.2,343.4 L125.5,343.1 L125.7,342.7 L126.0,342.4 
+		L126.2,342.1 L126.5,341.7 L126.7,341.4 L127.0,341.0 L127.2,340.7 L127.5,340.4 L127.7,340.0 L128.0,339.7 
+		L128.2,339.4 L128.5,339.1 L128.8,338.7 L129.0,338.4 L129.3,338.1 L129.5,337.8 L129.8,337.5 L130.0,337.1 
+		L130.3,336.8 L130.5,336.5 L130.8,336.2 L131.0,335.9 L131.3,335.6 L131.5,335.3 L131.8,335.0 L132.0,334.7 
+		L132.3,334.4 L132.5,334.1 L132.8,333.8 L133.0,333.5 L133.3,333.3 L133.5,333.0 L133.8,332.7 L134.0,332.4 
+		L134.3,332.1 L134.5,331.9 L134.8,331.6 L135.0,331.3 L135.3,331.1 L135.5,330.8 L135.8,330.5 L136.0,330.3 
+		L136.3,330.0 L136.5,329.7 L136.8,329.5 L137.1,329.2 L137.3,329.0 L137.6,328.7 L137.8,328.5 L138.1,328.2 
+		L138.3,328.0 L138.6,327.7 L138.8,327.5 L139.1,327.3 L139.3,327.0 L139.6,326.8 L139.8,326.6 L140.1,326.3 
+		L140.3,326.1 L140.6,325.9 L140.8,325.7 L141.1,325.4 L141.3,325.2 L141.6,325.0 L141.8,324.8 L142.1,324.6 
+		L142.3,324.4 L142.6,324.1 L142.8,323.9 L143.1,323.7 L143.3,323.5 L143.6,323.3 L143.8,323.1 L144.1,322.9 
+		L144.3,322.7 L144.6,322.5 L144.8,322.4 L145.1,322.2 L145.4,322.0 L145.6,321.8 L145.9,321.6 L146.1,321.4 
+		L146.4,321.3 L146.6,321.1 L146.9,320.9 L147.1,320.7 L147.4,320.6 L147.6,320.4 L147.9,320.2 L148.1,320.1 
+		L148.4,319.9 L148.6,319.7 L148.9,319.6 L149.1,319.4 L149.4,319.3 L149.6,319.1 L149.9,319.0 L150.1,318.8 
+		L150.4,318.7 L150.6,318.5 L150.9,318.4 L151.1,318.2 L151.4,318.1 L151.6,318.0 L151.9,317.8 L152.1,317.7 
+		L152.4,317.6 L152.6,317.4 L152.9,317.3 L153.2,317.2 L153.4,317.0 L153.7,316.9 L153.9,316.8 L154.2,316.7 
+		L154.4,316.6 L154.7,316.5 L154.9,316.3 L155.2,316.2 L155.4,316.1 L155.7,316.0 L155.9,315.9 L156.2,315.8 
+		L156.4,315.7 L156.7,315.6 L156.9,315.5 L157.2,315.4 L157.4,315.3 L157.7,315.2 L157.9,315.1 L158.2,315.0 
+		L158.4,314.9 L158.7,314.9 L158.9,314.8 L159.2,314.7 L159.4,314.6 L159.7,314.5 L159.9,314.4 L160.2,314.4 
+		L160.4,314.3 L160.7,314.2 L160.9,314.2 L161.2,314.1 L161.5,314.0 L161.7,313.9 L162.0,313.9 L162.2,313.8 
+		L162.5,313.8 L162.7,313.7 L163.0,313.6 L163.2,313.6 L163.5,313.5 L163.7,313.5 L164.0,313.4 L164.2,313.4 
+		L164.5,313.3 L164.7,313.3 L165.0,313.2 L165.2,313.2 L165.5,313.2 L165.7,313.1 L166.0,313.1 L166.2,313.0 
+		L166.5,313.0 L166.7,313.0 L167.0,312.9 L167.2,312.9 L167.5,312.9 L167.7,312.8 L168.0,312.8 L168.2,312.8 
+		L168.5,312.8 L168.7,312.7 L169.0,312.7 L169.2,312.7 L169.5,312.7 L169.8,312.7 L170.0,312.7 L170.3,312.6 
+		L170.5,312.6 L170.8,312.6 L171.0,312.6 L171.3,312.6 L171.5,312.6 L171.8,312.6 L172.0,312.6 L172.3,312.6 
+		L172.5,312.6 L172.8,312.6 L173.0,312.6 L173.3,312.6 L173.5,312.6 L173.8,312.6 L174.0,312.6 L174.3,312.6 
+		L174.5,312.6 L174.8,312.6 L175.0,312.7 L175.3,312.7 L175.5,312.7 L175.8,312.7 L176.0,312.7 L176.3,312.7 
+		L176.5,312.8 L176.8,312.8 L177.0,312.8 L177.3,312.8 L177.6,312.9 L177.8,312.9 L178.1,312.9 L178.3,312.9 
+		L178.6,313.0 L178.8,313.0 L179.1,313.0 L179.3,313.1 L179.6,313.1 L179.8,313.1 L180.1,313.2 L180.3,313.2 
+		L180.6,313.3 L180.8,313.3 L181.1,313.3 L181.3,313.4 L181.6,313.4 L181.8,313.5 L182.1,313.5 L182.3,313.6 
+		L182.6,313.6 L182.8,313.7 L183.1,313.7 L183.3,313.8 L183.6,313.8 L183.8,313.9 L184.1,313.9 L184.3,314.0 
+		L184.6,314.0 L184.8,314.1 L185.1,314.2 L185.3,314.2 L185.6,314.3 L185.9,314.3 L186.1,314.4 L186.4,314.5 
+		L186.6,314.5 L186.9,314.6 L187.1,314.7 L187.4,314.7 L187.6,314.8 L187.9,314.9 L188.1,315.0 L188.4,315.0 
+		L188.6,315.1 L188.9,315.2 L189.1,315.3 L189.4,315.3 L189.6,315.4 L189.9,315.5 L190.1,315.6 L190.4,315.6 
+		L190.6,315.7 L190.9,315.8 L191.1,315.9 L191.4,316.0 L191.6,316.1 L191.9,316.1 L192.1,316.2 L192.4,316.3 
+		L192.6,316.4 L192.9,316.5 L193.1,316.6 L193.4,316.7 L193.7,316.8 L193.9,316.9 L194.2,316.9 L194.4,317.0 
+		L194.7,317.1 L194.9,317.2 L195.2,317.3 L195.4,317.4 L195.7,317.5 L195.9,317.6 L196.2,317.7 L196.4,317.8 
+		L196.7,317.9 L196.9,318.0 L197.2,318.1 L197.4,318.2 L197.7,318.3 L197.9,318.4 L198.2,318.5 L198.4,318.6 
+		L198.7,318.8 L198.9,318.9 L199.2,319.0 L199.4,319.1 L199.7,319.2 L199.9,319.3 L200.2,319.4 L200.4,319.5 
+		L200.7,319.6 L200.9,319.7 L201.2,319.9 L201.4,320.0 L201.7,320.1 L202.0,320.2 L202.2,320.3 L202.5,320.4 
+		L202.7,320.6 L203.0,320.7 L203.2,320.8 L203.5,320.9 L203.7,321.0 L204.0,321.1 L204.2,321.3 L204.5,321.4 
+		L204.7,321.5 L205.0,321.6 L205.2,321.8 L205.5,321.9 L205.7,322.0 L206.0,322.1 L206.2,322.3 L206.5,322.4 
+		L206.7,322.5 L207.0,322.6 L207.2,322.8 L207.5,322.9 L207.7,323.0 L208.0,323.1 L208.2,323.3 L208.5,323.4 
+		L208.7,323.5 L209.0,323.7 L209.2,323.8 L209.5,323.9 L209.7,324.1 L210.0,324.2 L210.3,324.3 L210.5,324.5 
+		L210.8,324.6 L211.0,324.7 L211.3,324.9 L211.5,325.0 L211.8,325.1 L212.0,325.3 L212.3,325.4 L212.5,325.6 
+		L212.8,325.7 L213.0,325.8 L213.3,326.0 L213.5,326.1 L213.8,326.2 L214.0,326.4 L214.3,326.5 L214.5,326.7 
+		L214.8,326.8 L215.0,327.0 L215.3,327.1 L215.5,327.2 L215.8,327.4 L216.0,327.5 L216.3,327.7 L216.5,327.8 
+		L216.8,328.0 L217.0,328.1 L217.3,328.2 L217.5,328.4 L217.8,328.5 L218.1,328.7 L218.3,328.8 L218.6,329.0 
+		L218.8,329.1 L219.1,329.3 L219.3,329.4 L219.6,329.6 L219.8,329.7 L220.1,329.9 L220.3,330.0 L220.6,330.2 
+		L220.8,330.3 L221.1,330.5 L221.3,330.6 L221.6,330.8 L221.8,330.9 L222.1,331.1 L222.3,331.2 L222.6,331.4 
+		L222.8,331.5 L223.1,331.7 L223.3,331.8 L223.6,332.0 L223.8,332.1 L224.1,332.3 L224.3,332.4 L224.6,332.6 
+		L224.8,332.7 L225.1,332.9 L225.3,333.0 L225.6,333.2 L225.8,333.3 L226.1,333.5 L226.4,333.6 L226.6,333.8 
+		L226.9,334.0 L227.1,334.1 L227.4,334.3 L227.6,334.4 L227.9,334.6 L228.1,334.7 L228.4,334.9 L228.6,335.0 
+		L228.9,335.2 L229.1,335.4 L229.4,335.5 L229.6,335.7 L229.9,335.8 L230.1,336.0 L230.4,336.1 L230.6,336.3 
+		L230.9,336.5 L231.1,336.6 L231.4,336.8 L231.6,336.9 L231.9,337.1 L232.1,337.3 L232.4,337.4 L232.6,337.6 
+		L232.9,337.7 L233.1,337.9 L233.4,338.0 L233.6,338.2 L233.9,338.4 L234.1,338.5 L234.4,338.7 L234.7,338.8 
+		L234.9,339.0 L235.2,339.2 L235.4,339.3 L235.7,339.5 L235.9,339.6 L236.2,339.8 L236.4,340.0 L236.7,340.1 
+		L236.9,340.3 L237.2,340.4 L237.4,340.6 L237.7,340.8 L237.9,340.9 L238.2,341.1 L238.4,341.2 L238.7,341.4 
+		L238.9,341.6 L239.2,341.7 L239.4,341.9 L239.7,342.0 L239.9,342.2 L240.2,342.4 L240.4,342.5 L240.7,342.7 
+		L240.9,342.9 L241.2,343.0 L241.4,343.2 L241.7,343.3 L241.9,343.5 L242.2,343.7 L242.5,343.8 L242.7,344.0 
+		L243.0,344.1 L243.2,344.3 L243.5,344.5 L243.7,344.6 L244.0,344.8 L244.2,344.9 L244.5,345.1 L244.7,345.3 
+		L245.0,345.4 L245.2,345.6 L245.5,345.8 L245.7,345.9 L246.0,346.1 L246.2,346.2 L246.5,346.4 L246.7,346.6 
+		L247.0,346.7 L247.2,346.9 L247.5,347.0 L247.7,347.2 L248.0,347.4 L248.2,347.5 L248.5,347.7 L248.7,347.8 
+		L249.0,348.0 L249.2,348.2 L249.5,348.3 L249.7,348.5 L250.0,348.6 L250.2,348.8 L250.5,349.0 L250.8,349.1 
+		L251.0,349.3 L251.3,349.4 L251.5,349.6 L251.8,349.8 L252.0,349.9 L252.3,350.1 L252.5,350.2 L252.8,350.4 
+		L253.0,350.6 L253.3,350.7 L253.5,350.9 L253.8,351.0 L254.0,351.2 L254.3,351.4 L254.5,351.5 L254.8,351.7 
+		L255.0,351.8 L255.3,352.0 L255.5,352.2 L255.8,352.3 L256.0,352.5 L256.3,352.6 L256.5,352.8 L256.8,353.0 
+		L257.0,353.1 L257.3,353.3 L257.5,353.4 L257.8,353.6 L258.0,353.7 L258.3,353.9 L258.6,354.1 L258.8,354.2 
+		L259.1,354.4 L259.3,354.5 L259.6,354.7 L259.8,354.8 L260.1,355.0 L260.3,355.2 L260.6,355.3 L260.8,355.5 
+		L261.1,355.6 L261.3,355.8 L261.6,355.9 L261.8,356.1 L262.1,356.3 L262.3,356.4 L262.6,356.6 L262.8,356.7 
+		L263.1,356.9 L263.3,357.0 L263.6,357.2 L263.8,357.3 L264.1,357.5 L264.3,357.6 L264.6,357.8 L264.8,358.0 
+		L265.1,358.1 L265.3,358.3 L265.6,358.4 L265.8,358.6 L266.1,358.7 L266.3,358.9 L266.6,359.0 L266.9,359.2 
+		L267.1,359.3 L267.4,359.5 L267.6,359.6 L267.9,359.8 L268.1,359.9 L268.4,360.1 L268.6,360.3 L268.9,360.4 
+		L269.1,360.6 L269.4,360.7 L269.6,360.9 L269.9,361.0 L270.1,361.2 L270.4,361.3 L270.6,361.5 L270.9,361.6 
+		L271.1,361.8 L271.4,361.9 L271.6,362.1 L271.9,362.2 L272.1,362.4 L272.4,362.5 L272.6,362.7 L272.9,362.8 
+		L273.1,363.0 L273.4,363.1 L273.6,363.3 L273.9,363.4 L274.1,363.5 L274.4,363.7 L274.6,363.8 L274.9,364.0 
+		L275.2,364.1 L275.4,364.3 L275.7,364.4 L275.9,364.6 L276.2,364.7 L276.4,364.9 L276.7,365.0 L276.9,365.2 
+		L277.2,365.3 L277.4,365.5 L277.7,365.6 L277.9,365.7 L278.2,365.9 L278.4,366.0 L278.7,366.2 L278.9,366.3 
+		L279.2,366.5 L279.4,366.6 L279.7,366.8 L279.9,366.9 L280.2,367.0 L280.4,367.2 L280.7,367.3 L280.9,367.5 
+		L281.2,367.6 L281.4,367.8 L281.7,367.9 L281.9,368.0 L282.2,368.2 L282.4,368.3 L282.7,368.5 L283.0,368.6 
+		L283.2,368.7 L283.5,368.9 L283.7,369.0 L284.0,369.2 L284.2,369.3 L284.5,369.4 L284.7,369.6 L285.0,369.7 
+		L285.2,369.9 L285.5,370.0 L285.7,370.1 L286.0,370.3 L286.2,370.4 L286.5,370.5 L286.7,370.7 L287.0,370.8 
+		L287.2,371.0 L287.5,371.1 L287.7,371.2 L288.0,371.4 L288.2,371.5 L288.5,371.6 L288.7,371.8 L289.0,371.9 
+		L289.2,372.1 L289.5,372.2 L289.7,372.3 L290.0,372.5 L290.2,372.6 L290.5,372.7 L290.7,372.9 L291.0,373.0 
+		L291.3,373.1 L291.5,373.3 L291.8,373.4 L292.0,373.5 L292.3,373.7 L292.5,373.8 L292.8,373.9 L293.0,374.1 
+		L293.3,374.2 L293.5,374.3 L293.8,374.4 L294.0,374.6 L294.3,374.7 L294.5,374.8 L294.8,375.0 L295.0,375.1 
+		L295.3,375.2 L295.5,375.4 L295.8,375.5 L296.0,375.6 L296.3,375.7 L296.5,375.9 L296.8,376.0 L297.0,376.1 
+		L297.3,376.3 L297.5,376.4 L297.8,376.5 L298.0,376.6 L298.3,376.8 L298.5,376.9 L298.8,377.0 L299.0,377.1 
+		L299.3,377.3 L299.6,377.4 L299.8,377.5 L300.1,377.6 L300.3,377.8 L300.6,377.9 L300.8,378.0 L301.1,378.1 
+		L301.3,378.3 L301.6,378.4 L301.8,378.5 L302.1,378.6 L302.3,378.8 L302.6,378.9 L302.8,379.0 L303.1,379.1 
+		L303.3,379.3 L303.6,379.4 L303.8,379.5 L304.1,379.6 L304.3,379.7 L304.6,379.9 L304.8,380.0 L305.1,380.1 
+		L305.3,380.2 L305.6,380.3 L305.8,380.5 L306.1,380.6 L306.3,380.7 L306.6,380.8 L306.8,380.9 L307.1,381.1 
+		L307.4,381.2 L307.6,381.3 L307.9,381.4 L308.1,381.5 L308.4,381.6 L308.6,381.8 L308.9,381.9 L309.1,382.0 
+		L309.4,382.1 L309.6,382.2 L309.9,382.3 L310.1,382.5 L310.4,382.6 L310.6,382.7 L310.9,382.8 L311.1,382.9 
+		L311.4,383.0 L311.6,383.1 L311.9,383.3 L312.1,383.4 L312.4,383.5 L312.6,383.6 L312.9,383.7 L313.1,383.8 
+		L313.4,383.9 L313.6,384.0 L313.9,384.2 L314.1,384.3 L314.4,384.4 L314.6,384.5 L314.9,384.6 L315.1,384.7 
+		L315.4,384.8 L315.7,384.9 L315.9,385.0 L316.2,385.2 L316.4,385.3 L316.7,385.4 L316.9,385.5 L317.2,385.6 
+		L317.4,385.7 L317.7,385.8 L317.9,385.9 L318.2,386.0 L318.4,386.1 L318.7,386.2 L318.9,386.3 L319.2,386.5 
+		L319.4,386.6 L319.7,386.7 L319.9,386.8 L320.2,386.9 L320.4,387.0 L320.7,387.1 L320.9,387.2 L321.2,387.3 
+		L321.4,387.4 L321.7,387.5 L321.9,387.6 L322.2,387.7 L322.4,387.8 L322.7,387.9 L322.9,388.0 L323.2,388.1 
+		L323.5,388.2 L323.7,388.3 L324.0,388.4 L324.2,388.5 L324.5,388.6 L324.7,388.7 L325.0,388.8 L325.2,388.9 
+		L325.5,389.0 L325.7,389.1 L326.0,389.2 L326.2,389.3 L326.5,389.4 L326.7,389.5 L327.0,389.6 L327.2,389.7 
+		L327.5,389.8 L327.7,389.9 L328.0,390.0 L328.2,390.1 L328.5,390.2 L328.7,390.3 L329.0,390.4 L329.2,390.5 
+		L329.5,390.6 L329.7,390.7 L330.0,390.8 L330.2,390.9 L330.5,391.0 L330.7,391.1 L331.0,391.2 L331.2,391.3 
+		L331.5,391.4 L331.8,391.5 L332.0,391.6 L332.3,391.7 L332.5,391.8 L332.8,391.9 L333.0,392.0 L333.3,392.0 
+		L333.5,392.1 L333.8,392.2 L334.0,392.3 L334.3,392.4 L334.5,392.5 L334.8,392.6 L335.0,392.7 L335.3,392.8 
+		L335.5,392.9 L335.8,393.0 L336.0,393.1 L336.3,393.2 L336.5,393.2 L336.8,393.3 L337.0,393.4 L337.3,393.5 
+		L337.5,393.6 L337.8,393.7 L338.0,393.8 L338.3,393.9 L338.5,394.0 L338.8,394.0 L339.0,394.1 L339.3,394.2 
+		L339.5,394.3 L339.8,394.4 L340.1,394.5 L340.3,394.6 L340.6,394.7 L340.8,394.7 L341.1,394.8 L341.3,394.9 
+		L341.6,395.0 L341.8,395.1 L342.1,395.2 L342.3,395.3 L342.6,395.3 L342.8,395.4 L343.1,395.5 L343.3,395.6 
+		L343.6,395.7 L343.8,395.8 L344.1,395.9 L344.3,395.9 L344.6,396.0 L344.8,396.1 L345.1,396.2 L345.3,396.3 
+		L345.6,396.4 L345.8,396.4 L346.1,396.5 L346.3,396.6 L346.6,396.7 L346.8,396.8 L347.1,396.8 L347.3,396.9 
+		L347.6,397.0 L347.9,397.1 L348.1,397.2 L348.4,397.2 L348.6,397.3 L348.9,397.4 L349.1,397.5 L349.4,397.6 
+		L349.6,397.6 L349.9,397.7 L350.1,397.8 L350.4,397.9 L350.6,398.0 L350.9,398.0 L351.1,398.1 L351.4,398.2 
+		L351.6,398.3 L351.9,398.3 L352.1,398.4 L352.4,398.5 L352.6,398.6 L352.9,398.6 L353.1,398.7 L353.4,398.8 
+		L353.6,398.9 L353.9,399.0 L354.1,399.0 L354.4,399.1 L354.6,399.2 L354.9,399.3 L355.1,399.3 L355.4,399.4 
+		L355.6,399.5 L355.9,399.5 L356.2,399.6 L356.4,399.7 L356.7,399.8 L356.9,399.8 L357.2,399.9 L357.4,400.0 
+		L357.7,400.1 L357.9,400.1 L358.2,400.2 L358.4,400.3 L358.7,400.3 L358.9,400.4 L359.2,400.5 L359.4,400.6 
+		L359.7,400.6 L359.9,400.7 L360.2,400.8 L360.4,400.8 L360.7,400.9 L360.9,401.0 L361.2,401.1 L361.4,401.1 
+		L361.7,401.2 L361.9,401.3 L362.2,401.3 L362.4,401.4 L362.7,401.5 L362.9,401.5 L363.2,401.6 L363.4,401.7 
+		L363.7,401.7 L363.9,401.8 L364.2,401.9 L364.5,401.9 L364.7,402.0 L365.0,402.1 L365.2,402.1 L365.5,402.2 
+		L365.7,402.3 L366.0,402.3 L366.2,402.4 L366.5,402.5 L366.7,402.5 L367.0,402.6 L367.2,402.7 L367.5,402.7 
+		L367.7,402.8 L368.0,402.9 L368.2,402.9 L368.5,403.0 L368.7,403.1 L369.0,403.1 L369.2,403.2 L369.5,403.2 
+		L369.7,403.3 L370.0,403.4 L370.2,403.4 L370.5,403.5 L370.7,403.6 L371.0,403.6 L371.2,403.7 L371.5,403.7 
+		L371.7,403.8 L372.0,403.9 L372.3,403.9 L372.5,404.0 L372.8,404.1 L373.0,404.1 L373.3,404.2 L373.5,404.2 
+		L373.8,404.3 L374.0,404.4 L374.3,404.4 L374.5,404.5 L374.8,404.5 L375.0,404.6 L375.3,404.7 L375.5,404.7 
+		L375.8,404.8 L376.0,404.8 L376.3,404.9 L376.5,405.0 L376.8,405.0 L377.0,405.1 L377.3,405.1 L377.5,405.2 
+		L377.8,405.2 L378.0,405.3 L378.3,405.4 L378.5,405.4 L378.8,405.5 L379.0,405.5 L379.3,405.6 L379.5,405.6 
+		L379.8,405.7 L380.0,405.8 L380.3,405.8 L380.6,405.9 L380.8,405.9 L381.1,406.0 L381.3,406.0 L381.6,406.1 
+		L381.8,406.1 L382.1,406.2 L382.3,406.3 L382.6,406.3 L382.8,406.4 L383.1,406.4 L383.3,406.5 L383.6,406.5 
+		L383.8,406.6 L384.1,406.6 L384.3,406.7 L384.6,406.7 L384.8,406.8 L385.1,406.8 L385.3,406.9 L385.6,406.9 
+		L385.8,407.0 L386.1,407.1 L386.3,407.1 L386.6,407.2 L386.8,407.2 L387.1,407.3 L387.3,407.3 L387.6,407.4 
+		L387.8,407.4 L388.1,407.5 L388.3,407.5 L388.6,407.6 L388.9,407.6 L389.1,407.7 L389.4,407.7 L389.6,407.8 
+		L389.9,407.8 L390.1,407.9 L390.4,407.9 L390.6,408.0 L390.9,408.0 L391.1,408.1 L391.4,408.1 L391.6,408.2 
+		L391.9,408.2 L392.1,408.3 L392.4,408.3 L392.6,408.4 L392.9,408.4 L393.1,408.5 L393.4,408.5 L393.6,408.5 
+		L393.9,408.6 L394.1,408.6 L394.4,408.7 L394.6,408.7 L394.9,408.8 L395.1,408.8 L395.4,408.9 L395.6,408.9 
+		L395.9,409.0 L396.1,409.0 L396.4,409.1 L396.7,409.1 L396.9,409.2 L397.2,409.2 L397.4,409.2 L397.7,409.3 
+		L397.9,409.3 L398.2,409.4 L398.4,409.4 L398.7,409.5 L398.9,409.5 L399.2,409.6 L399.4,409.6 L399.7,409.6 
+		L399.9,409.7 L400.2,409.7 L400.4,409.8 L400.7,409.8 L400.9,409.9 L401.2,409.9 L401.4,410.0 L401.7,410.0 
+		L401.9,410.0 L402.2,410.1 L402.4,410.1 L402.7,410.2 L402.9,410.2 L403.2,410.3 L403.4,410.3 L403.7,410.3 
+		L403.9,410.4 L404.2,410.4 L404.4,410.5 L404.7,410.5 L405.0,410.5 L405.2,410.6 L405.5,410.6 L405.7,410.7 
+		L406.0,410.7 L406.2,410.8 L406.5,410.8 L406.7,410.8 L407.0,410.9 L407.2,410.9 L407.5,411.0 L407.7,411.0 
+		L408.0,411.0 L408.2,411.1 L408.5,411.1 L408.7,411.2 L409.0,411.2 L409.2,411.2 L409.5,411.3 L409.7,411.3 
+		L410.0,411.3 L410.2,411.4 L410.5,411.4 L410.7,411.5 L411.0,411.5 L411.2,411.5 L411.5,411.6 L411.7,411.6 
+		L412.0,411.7 L412.2,411.7 L412.5,411.7 L412.8,411.8 L413.0,411.8 L413.3,411.8 L413.5,411.9 L413.8,411.9 
+		L414.0,412.0 L414.3,412.0 L414.5,412.0 L414.8,412.1 L415.0,412.1 L415.3,412.1 L415.5,412.2 L415.8,412.2 
+		L416.0,412.2 L416.3,412.3 L416.5,412.3 L416.8,412.4 L417.0,412.4 L417.3,412.4 L417.5,412.5 L417.8,412.5 
+		L418.0,412.5 L418.3,412.6 L418.5,412.6 L418.8,412.6 L419.0,412.7 L419.3,412.7 L419.5,412.7 L419.8,412.8 
+		L420.0,412.8 L420.3,412.8 L420.5,412.9 L420.8,412.9 L421.1,412.9 L421.3,413.0 L421.6,413.0 L421.8,413.0 
+		L422.1,413.1 L422.3,413.1 L422.6,413.1 L422.8,413.2 L423.1,413.2 L423.3,413.2 L423.6,413.3 L423.8,413.3 
+		L424.1,413.3 L424.3,413.4 L424.6,413.4 L424.8,413.4 L425.1,413.5 L425.3,413.5 L425.6,413.5 L425.8,413.6 
+		L426.1,413.6 L426.3,413.6 L426.6,413.7 L426.8,413.7 L427.1,413.7 L427.3,413.7 L427.6,413.8 L427.8,413.8 
+		L428.1,413.8 L428.3,413.9 L428.6,413.9 L428.8,413.9 L429.1,414.0 L429.4,414.0 L429.6,414.0 L429.9,414.1 
+		L430.1,414.1 L430.4,414.1 L430.6,414.1 L430.9,414.2 L431.1,414.2 L431.4,414.2 L431.6,414.3 L431.9,414.3 
+		L432.1,414.3 L432.4,414.3 L432.6,414.4 L432.9,414.4 L433.1,414.4 L433.4,414.5 L433.6,414.5 L433.9,414.5 
+		L434.1,414.5 L434.4,414.6 L434.6,414.6 L434.9,414.6 L435.1,414.7 L435.4,414.7 L435.6,414.7 L435.9,414.7 
+		L436.1,414.8 L436.4,414.8 L436.6,414.8 L436.9,414.9 L437.2,414.9 L437.4,414.9 L437.7,414.9 L437.9,415.0 
+		L438.2,415.0 L438.4,415.0 L438.7,415.0 L438.9,415.1 L439.2,415.1 L439.4,415.1 L439.7,415.2 L439.9,415.2 
+		L440.2,415.2 L440.4,415.2 L440.7,415.3 L440.9,415.3 L441.2,415.3 L441.4,415.3 L441.7,415.4 L441.9,415.4 
+		L442.2,415.4 L442.4,415.4 L442.7,415.5 L442.9,415.5 L443.2,415.5 L443.4,415.5 L443.7,415.6 L443.9,415.6 
+		L444.2,415.6 L444.4,415.6 L444.7,415.7 L444.9,415.7 L445.2,415.7 L445.5,415.7 L445.7,415.8 L446.0,415.8 
+		L446.2,415.8 L446.5,415.8 L446.7,415.9 L447.0,415.9 L447.2,415.9 L447.5,415.9 L447.7,415.9 L448.0,416.0 
+		L448.2,416.0 L448.5,416.0 L448.7,416.0 L449.0,416.1 L449.2,416.1 L449.5,416.1 L449.7,416.1 L450.0,416.2 
+		L450.2,416.2 L450.5,416.2 L450.7,416.2 L451.0,416.2 L451.2,416.3 L451.5,416.3 L451.7,416.3 L452.0,416.3 
+		L452.2,416.4 L452.5,416.4 L452.7,416.4 L453.0,416.4 L453.2,416.4 L453.5,416.5 L453.8,416.5 L454.0,416.5 
+		L454.3,416.5 L454.5,416.6 L454.8,416.6 L455.0,416.6 L455.3,416.6 L455.5,416.6 L455.8,416.7 L456.0,416.7 
+		L456.3,416.7 L456.5,416.7 L456.8,416.7 L457.0,416.8 L457.3,416.8 L457.5,416.8 L457.8,416.8 L458.0,416.9 
+		L458.3,416.9 L458.5,416.9 L458.8,416.9 L459.0,416.9 L459.3,417.0 L459.5,417.0 L459.8,417.0 L460.0,417.0 
+		L460.3,417.0 L460.5,417.1 L460.8,417.1 L461.0,417.1 L461.3,417.1 L461.6,417.1 L461.8,417.2 L462.1,417.2 
+		L462.3,417.2 L462.6,417.2 L462.8,417.2 L463.1,417.2 L463.3,417.3 L463.6,417.3 L463.8,417.3 L464.1,417.3 
+		L464.3,417.3 L464.6,417.4 L464.8,417.4 L465.1,417.4 L465.3,417.4 L465.6,417.4 L465.8,417.5 L466.1,417.5 
+		L466.3,417.5 L466.6,417.5 L466.8,417.5 L467.1,417.5 L467.3,417.6 L467.6,417.6 L467.8,417.6 L468.1,417.6 
+		L468.3,417.6 L468.6,417.7 L468.8,417.7 L469.1,417.7 L469.3,417.7 L469.6,417.7 L469.9,417.7 L470.1,417.8 
+		L470.4,417.8 L470.6,417.8 L470.9,417.8 L471.1,417.8 L471.4,417.8 L471.6,417.9 L471.9,417.9 L472.1,417.9 
+		L472.4,417.9 L472.6,417.9 L472.9,417.9 L473.1,418.0 L473.4,418.0 L473.6,418.0 L473.9,418.0 L474.1,418.0 
+		L474.4,418.0 L474.6,418.1 L474.9,418.1 L475.1,418.1 L475.4,418.1 L475.6,418.1 L475.9,418.1 L476.1,418.2 
+		L476.4,418.2 L476.6,418.2 L476.9,418.2 L477.1,418.2 L477.4,418.2 L477.7,418.3 L477.9,418.3 L478.2,418.3 
+		L478.4,418.3 L478.7,418.3 L478.9,418.3 L479.2,418.3 L479.4,418.4 L479.7,418.4 L479.9,418.4 L480.2,418.4 
+		L480.4,418.4 L480.7,418.4 L480.9,418.5 L481.2,418.5 L481.4,418.5 L481.7,418.5 L481.9,418.5 L482.2,418.5 
+		L482.4,418.5 L482.7,418.6 L482.9,418.6 L483.2,418.6 L483.4,418.6 L483.7,418.6 L483.9,418.6 L484.2,418.6 
+		L484.4,418.7 L484.7,418.7 L484.9,418.7 L485.2,418.7 L485.4,418.7 L485.7,418.7 L486.0,418.7 L486.2,418.8 
+		L486.5,418.8 L486.7,418.8 L487.0,418.8 L487.2,418.8 L487.5,418.8 L487.7,418.8 L488.0,418.8 L488.2,418.9 
+		L488.5,418.9 L488.7,418.9 L489.0,418.9 L489.2,418.9 L489.5,418.9 L489.7,418.9 L490.0,419.0 L490.2,419.0 
+		L490.5,419.0 L490.7,419.0 L491.0,419.0 L491.2,419.0 L491.5,419.0 L491.7,419.0 L492.0,419.1 L492.2,419.1 
+		L492.5,419.1 L492.7,419.1 L493.0,419.1 L493.2,419.1 L493.5,419.1 L493.7,419.1 L494.0,419.2 L494.3,419.2 
+		L494.5,419.2 L494.8,419.2 L495.0,419.2 L495.3,419.2 L495.5,419.2 L495.8,419.2 L496.0,419.3 L496.3,419.3 
+		L496.5,419.3 L496.8,419.3 L497.0,419.3 L497.3,419.3 L497.5,419.3 L497.8,419.3 L498.0,419.3 L498.3,419.4 
+		L498.5,419.4 L498.8,419.4 L499.0,419.4 L499.3,419.4 L499.5,419.4 L499.8,419.4 L500.0,419.4 L500.3,419.5 
+		L500.5,419.5 L500.8,419.5 L501.0,419.5 L501.3,419.5 L501.5,419.5 L501.8,419.5 L502.1,419.5 L502.3,419.5 
+		L502.6,419.6 L502.8,419.6 L503.1,419.6 L503.3,419.6 L503.6,419.6 L503.8,419.6 L504.1,419.6 L504.3,419.6 
+		L504.6,419.6 L504.8,419.6 L505.1,419.7 L505.3,419.7 L505.6,419.7 L505.8,419.7 L506.1,419.7 L506.3,419.7 
+		L506.6,419.7 L506.8,419.7 L507.1,419.7 L507.3,419.8 L507.6,419.8 L507.8,419.8 L508.1,419.8 L508.3,419.8 
+		L508.6,419.8 L508.8,419.8 L509.1,419.8 L509.3,419.8 L509.6,419.8 L509.8,419.9 L510.1,419.9 L510.4,419.9 
+		L510.6,419.9 L510.9,419.9 L511.1,419.9 L511.4,419.9 L511.6,419.9 L511.9,419.9 L512.1,419.9 L512.4,419.9 
+		L512.6,420.0 L512.9,420.0 L513.1,420.0 L513.4,420.0 L513.6,420.0 L513.9,420.0 L514.1,420.0 L514.4,420.0 
+		L514.6,420.0 L514.9,420.0 L515.1,420.1 L515.4,420.1 L515.6,420.1 L515.9,420.1 L516.1,420.1 L516.4,420.1 
+		L516.6,420.1 L516.9,420.1 L517.1,420.1 L517.4,420.1 L517.6,420.1 L517.9,420.1 L518.1,420.2 L518.4,420.2 
+		L518.7,420.2 L518.9,420.2 L519.2,420.2 L519.4,420.2 L519.7,420.2 L519.9,420.2 L520.2,420.2 L520.4,420.2 
+		L520.7,420.2 L520.9,420.3 L521.2,420.3 L521.4,420.3 L521.7,420.3 L521.9,420.3 L522.2,420.3 L522.4,420.3 
+		L522.7,420.3 L522.9,420.3 L523.2,420.3 L523.4,420.3 L523.7,420.3 L523.9,420.3 L524.2,420.4 L524.4,420.4 
+		L524.7,420.4 L524.9,420.4 L525.2,420.4 L525.4,420.4 L525.7,420.4 L525.9,420.4 L526.2,420.4 L526.5,420.4 
+		L526.7,420.4 L527.0,420.4 L527.2,420.4 L527.5,420.5 L527.7,420.5 L528.0,420.5 L528.2,420.5 L528.5,420.5 
+		L528.7,420.5 L529.0,420.5 L529.2,420.5 L529.5,420.5 L529.7,420.5 L530.0,420.5 L530.2,420.5 L530.5,420.5 
+		L530.7,420.6 L531.0,420.6 L531.2,420.6 L531.5,420.6 L531.7,420.6 L532.0,420.6 L532.2,420.6 L532.5,420.6 
+		L532.7,420.6 L533.0,420.6 L533.2,420.6 L533.5,420.6 L533.7,420.6 L534.0,420.6 L534.2,420.7 L534.5,420.7 
+		L534.8,420.7 L535.0,420.7 L535.3,420.7 L535.5,420.7 L535.8,420.7 L536.0,420.7 L536.3,420.7 L536.5,420.7 
+		L536.8,420.7 L537.0,420.7 L537.3,420.7 L537.5,420.7 L537.8,420.7 L538.0,420.8 L538.3,420.8 L538.5,420.8 
+		L538.8,420.8 L539.0,420.8 L539.3,420.8 L539.5,420.8 L539.8,420.8 L540.0,420.8 L540.3,420.8 L540.5,420.8 
+		L540.8,420.8 L541.0,420.8 L541.3,420.8 L541.5,420.8 L541.8,420.8 L542.0,420.9 L542.3,420.9 L542.6,420.9 
+		L542.8,420.9 L543.1,420.9 L543.3,420.9 L543.6,420.9 L543.8,420.9 L544.1,420.9 L544.3,420.9 L544.6,420.9 
+		L544.8,420.9 L545.1,420.9 L545.3,420.9 L545.6,420.9 L545.8,420.9 L546.1,420.9 L546.3,421.0 L546.6,421.0 
+		L546.8,421.0 L547.1,421.0 L547.3,421.0 L547.6,421.0 L547.8,421.0 L548.1,421.0 L548.3,421.0 L548.6,421.0 
+		L548.8,421.0 L549.1,421.0 L549.3,421.0 L549.6,421.0 L549.8,421.0 L550.1,421.0 L550.3,421.0 L550.6,421.0 
+		L550.9,421.1 L551.1,421.1 L551.4,421.1 L551.6,421.1 L551.9,421.1 L552.1,421.1 L552.4,421.1 L552.6,421.1 
+		L552.9,421.1 L553.1,421.1 L553.4,421.1 L553.6,421.1 L553.9,421.1 L554.1,421.1 L554.4,421.1 L554.6,421.1 
+		L554.9,421.1 L555.1,421.1 L555.4,421.1 L555.6,421.1 L555.9,421.2 L556.1,421.2 L556.4,421.2 L556.6,421.2 
+		L556.9,421.2 L557.1,421.2 L557.4,421.2 L557.6,421.2 L557.9,421.2 L558.1,421.2 L558.4,421.2 L558.6,421.2 
+		L558.9,421.2 L559.2,421.2 L559.4,421.2 L559.7,421.2 L559.9,421.2 L560.2,421.2 L560.4,421.2 L560.7,421.2 
+		L560.9,421.2 L561.2,421.3 L561.4,421.3 L561.7,421.3 L561.9,421.3 L562.2,421.3 L562.4,421.3 L562.7,421.3 
+		L562.9,421.3 L563.2,421.3 L563.4,421.3 L563.7,421.3 L563.9,421.3 L564.2,421.3 L564.4,421.3 L564.7,421.3 
+		L564.9,421.3 L565.2,421.3 L565.4,421.3 L565.7,421.3 L565.9,421.3 L566.2,421.3 L566.4,421.3 L566.7,421.3 
+		L567.0,421.4 L567.2,421.4 L567.5,421.4 L567.7,421.4 L568.0,421.4 L568.2,421.4 L568.5,421.4 L568.7,421.4 
+		L569.0,421.4 L569.2,421.4 L569.5,421.4 L569.7,421.4 L570.0,421.4 L570.2,421.4 L570.5,421.4 L570.7,421.4 
+		L571.0,421.4 L571.2,421.4 L571.5,421.4 L571.7,421.4 L572.0,421.4 L572.2,421.4 L572.5,421.4 L572.7,421.4 
+		L573.0,421.4 L573.2,421.5 L573.5,421.5 L573.7,421.5 L574.0,421.5 L574.2,421.5 L574.5,421.5 L574.7,421.5 
+		'></path>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L72.2,422.4 L72.4,422.4 L72.7,422.4 L72.9,422.4 L73.2,422.4 L73.4,422.4 L73.7,422.4 
+		L73.9,422.4 L74.2,422.4 L74.4,422.4 L74.7,422.4 L74.9,422.4 L75.2,422.4 L75.4,422.4 L75.7,422.4 
+		L75.9,422.4 L76.2,422.4 L76.4,422.4 L76.7,422.4 L76.9,422.4 L77.2,422.4 L77.4,422.4 L77.7,422.4 
+		L77.9,422.4 L78.2,422.4 L78.4,422.4 L78.7,422.4 L78.9,422.4 L79.2,422.4 L79.4,422.4 L79.7,422.4 
+		L79.9,422.4 L80.2,422.4 L80.5,422.4 L80.7,422.4 L81.0,422.4 L81.2,422.4 L81.5,422.4 L81.7,422.4 
+		L82.0,422.4 L82.2,422.4 L82.5,422.4 L82.7,422.4 L83.0,422.4 L83.2,422.4 L83.5,422.4 L83.7,422.4 
+		L84.0,422.4 L84.2,422.4 L84.5,422.4 L84.7,422.4 L85.0,422.4 L85.2,422.4 L85.5,422.4 L85.7,422.4 
+		L86.0,422.4 L86.2,422.4 L86.5,422.4 L86.7,422.4 L87.0,422.4 L87.2,422.4 L87.5,422.4 L87.7,422.4 
+		L88.0,422.4 L88.3,422.4 L88.5,422.4 L88.8,422.4 L89.0,422.4 L89.3,422.4 L89.5,422.4 L89.8,422.4 
+		L90.0,422.4 L90.3,422.4 L90.5,422.4 L90.8,422.4 L91.0,422.4 L91.3,422.4 L91.5,422.4 L91.8,422.4 
+		L92.0,422.4 L92.3,422.4 L92.5,422.4 L92.8,422.4 L93.0,422.4 L93.3,422.4 L93.5,422.4 L93.8,422.4 
+		L94.0,422.4 L94.3,422.4 L94.5,422.4 L94.8,422.4 L95.0,422.4 L95.3,422.4 L95.5,422.4 L95.8,422.3 
+		L96.0,422.3 L96.3,422.3 L96.6,422.3 L96.8,422.3 L97.1,422.3 L97.3,422.3 L97.6,422.3 L97.8,422.3 
+		L98.1,422.3 L98.3,422.3 L98.6,422.3 L98.8,422.3 L99.1,422.3 L99.3,422.3 L99.6,422.3 L99.8,422.3 
+		L100.1,422.3 L100.3,422.3 L100.6,422.3 L100.8,422.3 L101.1,422.3 L101.3,422.3 L101.6,422.3 L101.8,422.3 
+		L102.1,422.3 L102.3,422.3 L102.6,422.2 L102.8,422.2 L103.1,422.2 L103.3,422.2 L103.6,422.2 L103.8,422.2 
+		L104.1,422.2 L104.3,422.2 L104.6,422.2 L104.9,422.2 L105.1,422.2 L105.4,422.2 L105.6,422.2 L105.9,422.2 
+		L106.1,422.2 L106.4,422.1 L106.6,422.1 L106.9,422.1 L107.1,422.1 L107.4,422.1 L107.6,422.1 L107.9,422.1 
+		L108.1,422.1 L108.4,422.1 L108.6,422.1 L108.9,422.1 L109.1,422.0 L109.4,422.0 L109.6,422.0 L109.9,422.0 
+		L110.1,422.0 L110.4,422.0 L110.6,422.0 L110.9,422.0 L111.1,422.0 L111.4,421.9 L111.6,421.9 L111.9,421.9 
+		L112.1,421.9 L112.4,421.9 L112.7,421.9 L112.9,421.9 L113.2,421.8 L113.4,421.8 L113.7,421.8 L113.9,421.8 
+		L114.2,421.8 L114.4,421.8 L114.7,421.8 L114.9,421.7 L115.2,421.7 L115.4,421.7 L115.7,421.7 L115.9,421.7 
+		L116.2,421.7 L116.4,421.6 L116.7,421.6 L116.9,421.6 L117.2,421.6 L117.4,421.6 L117.7,421.6 L117.9,421.5 
+		L118.2,421.5 L118.4,421.5 L118.7,421.5 L118.9,421.5 L119.2,421.4 L119.4,421.4 L119.7,421.4 L119.9,421.4 
+		L120.2,421.3 L120.4,421.3 L120.7,421.3 L121.0,421.3 L121.2,421.3 L121.5,421.2 L121.7,421.2 L122.0,421.2 
+		L122.2,421.2 L122.5,421.1 L122.7,421.1 L123.0,421.1 L123.2,421.1 L123.5,421.0 L123.7,421.0 L124.0,421.0 
+		L124.2,420.9 L124.5,420.9 L124.7,420.9 L125.0,420.9 L125.2,420.8 L125.5,420.8 L125.7,420.8 L126.0,420.7 
+		L126.2,420.7 L126.5,420.7 L126.7,420.7 L127.0,420.6 L127.2,420.6 L127.5,420.6 L127.7,420.5 L128.0,420.5 
+		L128.2,420.5 L128.5,420.4 L128.8,420.4 L129.0,420.4 L129.3,420.3 L129.5,420.3 L129.8,420.2 L130.0,420.2 
+		L130.3,420.2 L130.5,420.1 L130.8,420.1 L131.0,420.1 L131.3,420.0 L131.5,420.0 L131.8,419.9 L132.0,419.9 
+		L132.3,419.9 L132.5,419.8 L132.8,419.8 L133.0,419.7 L133.3,419.7 L133.5,419.7 L133.8,419.6 L134.0,419.6 
+		L134.3,419.5 L134.5,419.5 L134.8,419.4 L135.0,419.4 L135.3,419.4 L135.5,419.3 L135.8,419.3 L136.0,419.2 
+		L136.3,419.2 L136.5,419.1 L136.8,419.1 L137.1,419.0 L137.3,419.0 L137.6,418.9 L137.8,418.9 L138.1,418.8 
+		L138.3,418.8 L138.6,418.7 L138.8,418.7 L139.1,418.6 L139.3,418.6 L139.6,418.5 L139.8,418.5 L140.1,418.4 
+		L140.3,418.4 L140.6,418.3 L140.8,418.3 L141.1,418.2 L141.3,418.1 L141.6,418.1 L141.8,418.0 L142.1,418.0 
+		L142.3,417.9 L142.6,417.9 L142.8,417.8 L143.1,417.7 L143.3,417.7 L143.6,417.6 L143.8,417.6 L144.1,417.5 
+		L144.3,417.4 L144.6,417.4 L144.8,417.3 L145.1,417.3 L145.4,417.2 L145.6,417.1 L145.9,417.1 L146.1,417.0 
+		L146.4,416.9 L146.6,416.9 L146.9,416.8 L147.1,416.7 L147.4,416.7 L147.6,416.6 L147.9,416.5 L148.1,416.5 
+		L148.4,416.4 L148.6,416.3 L148.9,416.3 L149.1,416.2 L149.4,416.1 L149.6,416.1 L149.9,416.0 L150.1,415.9 
+		L150.4,415.8 L150.6,415.8 L150.9,415.7 L151.1,415.6 L151.4,415.5 L151.6,415.5 L151.9,415.4 L152.1,415.3 
+		L152.4,415.2 L152.6,415.2 L152.9,415.1 L153.2,415.0 L153.4,414.9 L153.7,414.9 L153.9,414.8 L154.2,414.7 
+		L154.4,414.6 L154.7,414.5 L154.9,414.5 L155.2,414.4 L155.4,414.3 L155.7,414.2 L155.9,414.1 L156.2,414.1 
+		L156.4,414.0 L156.7,413.9 L156.9,413.8 L157.2,413.7 L157.4,413.6 L157.7,413.5 L157.9,413.5 L158.2,413.4 
+		L158.4,413.3 L158.7,413.2 L158.9,413.1 L159.2,413.0 L159.4,412.9 L159.7,412.8 L159.9,412.8 L160.2,412.7 
+		L160.4,412.6 L160.7,412.5 L160.9,412.4 L161.2,412.3 L161.5,412.2 L161.7,412.1 L162.0,412.0 L162.2,411.9 
+		L162.5,411.8 L162.7,411.7 L163.0,411.7 L163.2,411.6 L163.5,411.5 L163.7,411.4 L164.0,411.3 L164.2,411.2 
+		L164.5,411.1 L164.7,411.0 L165.0,410.9 L165.2,410.8 L165.5,410.7 L165.7,410.6 L166.0,410.5 L166.2,410.4 
+		L166.5,410.3 L166.7,410.2 L167.0,410.1 L167.2,410.0 L167.5,409.9 L167.7,409.8 L168.0,409.7 L168.2,409.6 
+		L168.5,409.5 L168.7,409.4 L169.0,409.3 L169.2,409.2 L169.5,409.0 L169.8,408.9 L170.0,408.8 L170.3,408.7 
+		L170.5,408.6 L170.8,408.5 L171.0,408.4 L171.3,408.3 L171.5,408.2 L171.8,408.1 L172.0,408.0 L172.3,407.9 
+		L172.5,407.8 L172.8,407.6 L173.0,407.5 L173.3,407.4 L173.5,407.3 L173.8,407.2 L174.0,407.1 L174.3,407.0 
+		L174.5,406.9 L174.8,406.8 L175.0,406.6 L175.3,406.5 L175.5,406.4 L175.8,406.3 L176.0,406.2 L176.3,406.1 
+		L176.5,406.0 L176.8,405.8 L177.0,405.7 L177.3,405.6 L177.6,405.5 L177.8,405.4 L178.1,405.3 L178.3,405.1 
+		L178.6,405.0 L178.8,404.9 L179.1,404.8 L179.3,404.7 L179.6,404.5 L179.8,404.4 L180.1,404.3 L180.3,404.2 
+		L180.6,404.1 L180.8,403.9 L181.1,403.8 L181.3,403.7 L181.6,403.6 L181.8,403.5 L182.1,403.3 L182.3,403.2 
+		L182.6,403.1 L182.8,403.0 L183.1,402.8 L183.3,402.7 L183.6,402.6 L183.8,402.5 L184.1,402.4 L184.3,402.2 
+		L184.6,402.1 L184.8,402.0 L185.1,401.9 L185.3,401.7 L185.6,401.6 L185.9,401.5 L186.1,401.3 L186.4,401.2 
+		L186.6,401.1 L186.9,401.0 L187.1,400.8 L187.4,400.7 L187.6,400.6 L187.9,400.5 L188.1,400.3 L188.4,400.2 
+		L188.6,400.1 L188.9,399.9 L189.1,399.8 L189.4,399.7 L189.6,399.6 L189.9,399.4 L190.1,399.3 L190.4,399.2 
+		L190.6,399.0 L190.9,398.9 L191.1,398.8 L191.4,398.6 L191.6,398.5 L191.9,398.4 L192.1,398.2 L192.4,398.1 
+		L192.6,398.0 L192.9,397.8 L193.1,397.7 L193.4,397.6 L193.7,397.4 L193.9,397.3 L194.2,397.2 L194.4,397.0 
+		L194.7,396.9 L194.9,396.8 L195.2,396.6 L195.4,396.5 L195.7,396.4 L195.9,396.2 L196.2,396.1 L196.4,396.0 
+		L196.7,395.8 L196.9,395.7 L197.2,395.6 L197.4,395.4 L197.7,395.3 L197.9,395.2 L198.2,395.0 L198.4,394.9 
+		L198.7,394.8 L198.9,394.6 L199.2,394.5 L199.4,394.3 L199.7,394.2 L199.9,394.1 L200.2,393.9 L200.4,393.8 
+		L200.7,393.7 L200.9,393.5 L201.2,393.4 L201.4,393.3 L201.7,393.1 L202.0,393.0 L202.2,392.8 L202.5,392.7 
+		L202.7,392.6 L203.0,392.4 L203.2,392.3 L203.5,392.2 L203.7,392.0 L204.0,391.9 L204.2,391.7 L204.5,391.6 
+		L204.7,391.5 L205.0,391.3 L205.2,391.2 L205.5,391.0 L205.7,390.9 L206.0,390.8 L206.2,390.6 L206.5,390.5 
+		L206.7,390.4 L207.0,390.2 L207.2,390.1 L207.5,389.9 L207.7,389.8 L208.0,389.7 L208.2,389.5 L208.5,389.4 
+		L208.7,389.2 L209.0,389.1 L209.2,389.0 L209.5,388.8 L209.7,388.7 L210.0,388.5 L210.3,388.4 L210.5,388.3 
+		L210.8,388.1 L211.0,388.0 L211.3,387.9 L211.5,387.7 L211.8,387.6 L212.0,387.4 L212.3,387.3 L212.5,387.2 
+		L212.8,387.0 L213.0,386.9 L213.3,386.7 L213.5,386.6 L213.8,386.5 L214.0,386.3 L214.3,386.2 L214.5,386.0 
+		L214.8,385.9 L215.0,385.8 L215.3,385.6 L215.5,385.5 L215.8,385.4 L216.0,385.2 L216.3,385.1 L216.5,384.9 
+		L216.8,384.8 L217.0,384.7 L217.3,384.5 L217.5,384.4 L217.8,384.2 L218.1,384.1 L218.3,384.0 L218.6,383.8 
+		L218.8,383.7 L219.1,383.6 L219.3,383.4 L219.6,383.3 L219.8,383.1 L220.1,383.0 L220.3,382.9 L220.6,382.7 
+		L220.8,382.6 L221.1,382.5 L221.3,382.3 L221.6,382.2 L221.8,382.0 L222.1,381.9 L222.3,381.8 L222.6,381.6 
+		L222.8,381.5 L223.1,381.4 L223.3,381.2 L223.6,381.1 L223.8,381.0 L224.1,380.8 L224.3,380.7 L224.6,380.5 
+		L224.8,380.4 L225.1,380.3 L225.3,380.1 L225.6,380.0 L225.8,379.9 L226.1,379.7 L226.4,379.6 L226.6,379.5 
+		L226.9,379.3 L227.1,379.2 L227.4,379.1 L227.6,378.9 L227.9,378.8 L228.1,378.7 L228.4,378.5 L228.6,378.4 
+		L228.9,378.3 L229.1,378.1 L229.4,378.0 L229.6,377.9 L229.9,377.7 L230.1,377.6 L230.4,377.5 L230.6,377.3 
+		L230.9,377.2 L231.1,377.1 L231.4,376.9 L231.6,376.8 L231.9,376.7 L232.1,376.5 L232.4,376.4 L232.6,376.3 
+		L232.9,376.2 L233.1,376.0 L233.4,375.9 L233.6,375.8 L233.9,375.6 L234.1,375.5 L234.4,375.4 L234.7,375.3 
+		L234.9,375.1 L235.2,375.0 L235.4,374.9 L235.7,374.7 L235.9,374.6 L236.2,374.5 L236.4,374.4 L236.7,374.2 
+		L236.9,374.1 L237.2,374.0 L237.4,373.9 L237.7,373.7 L237.9,373.6 L238.2,373.5 L238.4,373.3 L238.7,373.2 
+		L238.9,373.1 L239.2,373.0 L239.4,372.9 L239.7,372.7 L239.9,372.6 L240.2,372.5 L240.4,372.4 L240.7,372.2 
+		L240.9,372.1 L241.2,372.0 L241.4,371.9 L241.7,371.7 L241.9,371.6 L242.2,371.5 L242.5,371.4 L242.7,371.3 
+		L243.0,371.1 L243.2,371.0 L243.5,370.9 L243.7,370.8 L244.0,370.7 L244.2,370.5 L244.5,370.4 L244.7,370.3 
+		L245.0,370.2 L245.2,370.1 L245.5,369.9 L245.7,369.8 L246.0,369.7 L246.2,369.6 L246.5,369.5 L246.7,369.4 
+		L247.0,369.2 L247.2,369.1 L247.5,369.0 L247.7,368.9 L248.0,368.8 L248.2,368.7 L248.5,368.5 L248.7,368.4 
+		L249.0,368.3 L249.2,368.2 L249.5,368.1 L249.7,368.0 L250.0,367.9 L250.2,367.8 L250.5,367.6 L250.8,367.5 
+		L251.0,367.4 L251.3,367.3 L251.5,367.2 L251.8,367.1 L252.0,367.0 L252.3,366.9 L252.5,366.8 L252.8,366.7 
+		L253.0,366.5 L253.3,366.4 L253.5,366.3 L253.8,366.2 L254.0,366.1 L254.3,366.0 L254.5,365.9 L254.8,365.8 
+		L255.0,365.7 L255.3,365.6 L255.5,365.5 L255.8,365.4 L256.0,365.3 L256.3,365.2 L256.5,365.1 L256.8,365.0 
+		L257.0,364.8 L257.3,364.7 L257.5,364.6 L257.8,364.5 L258.0,364.4 L258.3,364.3 L258.6,364.2 L258.8,364.1 
+		L259.1,364.0 L259.3,363.9 L259.6,363.8 L259.8,363.7 L260.1,363.6 L260.3,363.5 L260.6,363.4 L260.8,363.3 
+		L261.1,363.2 L261.3,363.1 L261.6,363.0 L261.8,363.0 L262.1,362.9 L262.3,362.8 L262.6,362.7 L262.8,362.6 
+		L263.1,362.5 L263.3,362.4 L263.6,362.3 L263.8,362.2 L264.1,362.1 L264.3,362.0 L264.6,361.9 L264.8,361.8 
+		L265.1,361.7 L265.3,361.6 L265.6,361.5 L265.8,361.5 L266.1,361.4 L266.3,361.3 L266.6,361.2 L266.9,361.1 
+		L267.1,361.0 L267.4,360.9 L267.6,360.8 L267.9,360.7 L268.1,360.7 L268.4,360.6 L268.6,360.5 L268.9,360.4 
+		L269.1,360.3 L269.4,360.2 L269.6,360.1 L269.9,360.1 L270.1,360.0 L270.4,359.9 L270.6,359.8 L270.9,359.7 
+		L271.1,359.6 L271.4,359.6 L271.6,359.5 L271.9,359.4 L272.1,359.3 L272.4,359.2 L272.6,359.2 L272.9,359.1 
+		L273.1,359.0 L273.4,358.9 L273.6,358.8 L273.9,358.8 L274.1,358.7 L274.4,358.6 L274.6,358.5 L274.9,358.4 
+		L275.2,358.4 L275.4,358.3 L275.7,358.2 L275.9,358.1 L276.2,358.1 L276.4,358.0 L276.7,357.9 L276.9,357.8 
+		L277.2,357.8 L277.4,357.7 L277.7,357.6 L277.9,357.6 L278.2,357.5 L278.4,357.4 L278.7,357.3 L278.9,357.3 
+		L279.2,357.2 L279.4,357.1 L279.7,357.1 L279.9,357.0 L280.2,356.9 L280.4,356.9 L280.7,356.8 L280.9,356.7 
+		L281.2,356.7 L281.4,356.6 L281.7,356.5 L281.9,356.5 L282.2,356.4 L282.4,356.3 L282.7,356.3 L283.0,356.2 
+		L283.2,356.1 L283.5,356.1 L283.7,356.0 L284.0,356.0 L284.2,355.9 L284.5,355.8 L284.7,355.8 L285.0,355.7 
+		L285.2,355.7 L285.5,355.6 L285.7,355.5 L286.0,355.5 L286.2,355.4 L286.5,355.4 L286.7,355.3 L287.0,355.2 
+		L287.2,355.2 L287.5,355.1 L287.7,355.1 L288.0,355.0 L288.2,355.0 L288.5,354.9 L288.7,354.9 L289.0,354.8 
+		L289.2,354.7 L289.5,354.7 L289.7,354.6 L290.0,354.6 L290.2,354.5 L290.5,354.5 L290.7,354.4 L291.0,354.4 
+		L291.3,354.3 L291.5,354.3 L291.8,354.2 L292.0,354.2 L292.3,354.1 L292.5,354.1 L292.8,354.0 L293.0,354.0 
+		L293.3,353.9 L293.5,353.9 L293.8,353.9 L294.0,353.8 L294.3,353.8 L294.5,353.7 L294.8,353.7 L295.0,353.6 
+		L295.3,353.6 L295.5,353.5 L295.8,353.5 L296.0,353.5 L296.3,353.4 L296.5,353.4 L296.8,353.3 L297.0,353.3 
+		L297.3,353.3 L297.5,353.2 L297.8,353.2 L298.0,353.1 L298.3,353.1 L298.5,353.1 L298.8,353.0 L299.0,353.0 
+		L299.3,352.9 L299.6,352.9 L299.8,352.9 L300.1,352.8 L300.3,352.8 L300.6,352.8 L300.8,352.7 L301.1,352.7 
+		L301.3,352.7 L301.6,352.6 L301.8,352.6 L302.1,352.6 L302.3,352.5 L302.6,352.5 L302.8,352.5 L303.1,352.4 
+		L303.3,352.4 L303.6,352.4 L303.8,352.3 L304.1,352.3 L304.3,352.3 L304.6,352.3 L304.8,352.2 L305.1,352.2 
+		L305.3,352.2 L305.6,352.1 L305.8,352.1 L306.1,352.1 L306.3,352.1 L306.6,352.0 L306.8,352.0 L307.1,352.0 
+		L307.4,352.0 L307.6,351.9 L307.9,351.9 L308.1,351.9 L308.4,351.9 L308.6,351.9 L308.9,351.8 L309.1,351.8 
+		L309.4,351.8 L309.6,351.8 L309.9,351.7 L310.1,351.7 L310.4,351.7 L310.6,351.7 L310.9,351.7 L311.1,351.7 
+		L311.4,351.6 L311.6,351.6 L311.9,351.6 L312.1,351.6 L312.4,351.6 L312.6,351.6 L312.9,351.5 L313.1,351.5 
+		L313.4,351.5 L313.6,351.5 L313.9,351.5 L314.1,351.5 L314.4,351.4 L314.6,351.4 L314.9,351.4 L315.1,351.4 
+		L315.4,351.4 L315.7,351.4 L315.9,351.4 L316.2,351.4 L316.4,351.4 L316.7,351.3 L316.9,351.3 L317.2,351.3 
+		L317.4,351.3 L317.7,351.3 L317.9,351.3 L318.2,351.3 L318.4,351.3 L318.7,351.3 L318.9,351.3 L319.2,351.3 
+		L319.4,351.3 L319.7,351.3 L319.9,351.2 L320.2,351.2 L320.4,351.2 L320.7,351.2 L320.9,351.2 L321.2,351.2 
+		L321.4,351.2 L321.7,351.2 L321.9,351.2 L322.2,351.2 L322.4,351.2 L322.7,351.2 L322.9,351.2 L323.2,351.2 
+		L323.5,351.2 L323.7,351.2 L324.0,351.2 L324.2,351.2 L324.5,351.2 L324.7,351.2 L325.0,351.2 L325.2,351.2 
+		L325.5,351.2 L325.7,351.2 L326.0,351.2 L326.2,351.2 L326.5,351.2 L326.7,351.2 L327.0,351.2 L327.2,351.3 
+		L327.5,351.3 L327.7,351.3 L328.0,351.3 L328.2,351.3 L328.5,351.3 L328.7,351.3 L329.0,351.3 L329.2,351.3 
+		L329.5,351.3 L329.7,351.3 L330.0,351.3 L330.2,351.3 L330.5,351.3 L330.7,351.4 L331.0,351.4 L331.2,351.4 
+		L331.5,351.4 L331.8,351.4 L332.0,351.4 L332.3,351.4 L332.5,351.4 L332.8,351.5 L333.0,351.5 L333.3,351.5 
+		L333.5,351.5 L333.8,351.5 L334.0,351.5 L334.3,351.5 L334.5,351.5 L334.8,351.6 L335.0,351.6 L335.3,351.6 
+		L335.5,351.6 L335.8,351.6 L336.0,351.6 L336.3,351.7 L336.5,351.7 L336.8,351.7 L337.0,351.7 L337.3,351.7 
+		L337.5,351.7 L337.8,351.8 L338.0,351.8 L338.3,351.8 L338.5,351.8 L338.8,351.8 L339.0,351.9 L339.3,351.9 
+		L339.5,351.9 L339.8,351.9 L340.1,352.0 L340.3,352.0 L340.6,352.0 L340.8,352.0 L341.1,352.0 L341.3,352.1 
+		L341.6,352.1 L341.8,352.1 L342.1,352.1 L342.3,352.2 L342.6,352.2 L342.8,352.2 L343.1,352.2 L343.3,352.3 
+		L343.6,352.3 L343.8,352.3 L344.1,352.3 L344.3,352.4 L344.6,352.4 L344.8,352.4 L345.1,352.4 L345.3,352.5 
+		L345.6,352.5 L345.8,352.5 L346.1,352.6 L346.3,352.6 L346.6,352.6 L346.8,352.6 L347.1,352.7 L347.3,352.7 
+		L347.6,352.7 L347.9,352.8 L348.1,352.8 L348.4,352.8 L348.6,352.9 L348.9,352.9 L349.1,352.9 L349.4,353.0 
+		L349.6,353.0 L349.9,353.0 L350.1,353.1 L350.4,353.1 L350.6,353.1 L350.9,353.2 L351.1,353.2 L351.4,353.2 
+		L351.6,353.3 L351.9,353.3 L352.1,353.3 L352.4,353.4 L352.6,353.4 L352.9,353.4 L353.1,353.5 L353.4,353.5 
+		L353.6,353.5 L353.9,353.6 L354.1,353.6 L354.4,353.7 L354.6,353.7 L354.9,353.7 L355.1,353.8 L355.4,353.8 
+		L355.6,353.9 L355.9,353.9 L356.2,353.9 L356.4,354.0 L356.7,354.0 L356.9,354.0 L357.2,354.1 L357.4,354.1 
+		L357.7,354.2 L357.9,354.2 L358.2,354.3 L358.4,354.3 L358.7,354.3 L358.9,354.4 L359.2,354.4 L359.4,354.5 
+		L359.7,354.5 L359.9,354.5 L360.2,354.6 L360.4,354.6 L360.7,354.7 L360.9,354.7 L361.2,354.8 L361.4,354.8 
+		L361.7,354.9 L361.9,354.9 L362.2,354.9 L362.4,355.0 L362.7,355.0 L362.9,355.1 L363.2,355.1 L363.4,355.2 
+		L363.7,355.2 L363.9,355.3 L364.2,355.3 L364.5,355.4 L364.7,355.4 L365.0,355.5 L365.2,355.5 L365.5,355.5 
+		L365.7,355.6 L366.0,355.6 L366.2,355.7 L366.5,355.7 L366.7,355.8 L367.0,355.8 L367.2,355.9 L367.5,355.9 
+		L367.7,356.0 L368.0,356.0 L368.2,356.1 L368.5,356.1 L368.7,356.2 L369.0,356.2 L369.2,356.3 L369.5,356.3 
+		L369.7,356.4 L370.0,356.4 L370.2,356.5 L370.5,356.5 L370.7,356.6 L371.0,356.6 L371.2,356.7 L371.5,356.8 
+		L371.7,356.8 L372.0,356.9 L372.3,356.9 L372.5,357.0 L372.8,357.0 L373.0,357.1 L373.3,357.1 L373.5,357.2 
+		L373.8,357.2 L374.0,357.3 L374.3,357.3 L374.5,357.4 L374.8,357.5 L375.0,357.5 L375.3,357.6 L375.5,357.6 
+		L375.8,357.7 L376.0,357.7 L376.3,357.8 L376.5,357.8 L376.8,357.9 L377.0,358.0 L377.3,358.0 L377.5,358.1 
+		L377.8,358.1 L378.0,358.2 L378.3,358.2 L378.5,358.3 L378.8,358.4 L379.0,358.4 L379.3,358.5 L379.5,358.5 
+		L379.8,358.6 L380.0,358.6 L380.3,358.7 L380.6,358.8 L380.8,358.8 L381.1,358.9 L381.3,358.9 L381.6,359.0 
+		L381.8,359.1 L382.1,359.1 L382.3,359.2 L382.6,359.2 L382.8,359.3 L383.1,359.4 L383.3,359.4 L383.6,359.5 
+		L383.8,359.5 L384.1,359.6 L384.3,359.7 L384.6,359.7 L384.8,359.8 L385.1,359.8 L385.3,359.9 L385.6,360.0 
+		L385.8,360.0 L386.1,360.1 L386.3,360.2 L386.6,360.2 L386.8,360.3 L387.1,360.3 L387.3,360.4 L387.6,360.5 
+		L387.8,360.5 L388.1,360.6 L388.3,360.7 L388.6,360.7 L388.9,360.8 L389.1,360.9 L389.4,360.9 L389.6,361.0 
+		L389.9,361.0 L390.1,361.1 L390.4,361.2 L390.6,361.2 L390.9,361.3 L391.1,361.4 L391.4,361.4 L391.6,361.5 
+		L391.9,361.6 L392.1,361.6 L392.4,361.7 L392.6,361.8 L392.9,361.8 L393.1,361.9 L393.4,362.0 L393.6,362.0 
+		L393.9,362.1 L394.1,362.1 L394.4,362.2 L394.6,362.3 L394.9,362.3 L395.1,362.4 L395.4,362.5 L395.6,362.5 
+		L395.9,362.6 L396.1,362.7 L396.4,362.7 L396.7,362.8 L396.9,362.9 L397.2,362.9 L397.4,363.0 L397.7,363.1 
+		L397.9,363.2 L398.2,363.2 L398.4,363.3 L398.7,363.4 L398.9,363.4 L399.2,363.5 L399.4,363.6 L399.7,363.6 
+		L399.9,363.7 L400.2,363.8 L400.4,363.8 L400.7,363.9 L400.9,364.0 L401.2,364.0 L401.4,364.1 L401.7,364.2 
+		L401.9,364.2 L402.2,364.3 L402.4,364.4 L402.7,364.5 L402.9,364.5 L403.2,364.6 L403.4,364.7 L403.7,364.7 
+		L403.9,364.8 L404.2,364.9 L404.4,364.9 L404.7,365.0 L405.0,365.1 L405.2,365.2 L405.5,365.2 L405.7,365.3 
+		L406.0,365.4 L406.2,365.4 L406.5,365.5 L406.7,365.6 L407.0,365.6 L407.2,365.7 L407.5,365.8 L407.7,365.9 
+		L408.0,365.9 L408.2,366.0 L408.5,366.1 L408.7,366.1 L409.0,366.2 L409.2,366.3 L409.5,366.4 L409.7,366.4 
+		L410.0,366.5 L410.2,366.6 L410.5,366.6 L410.7,366.7 L411.0,366.8 L411.2,366.9 L411.5,366.9 L411.7,367.0 
+		L412.0,367.1 L412.2,367.1 L412.5,367.2 L412.8,367.3 L413.0,367.4 L413.3,367.4 L413.5,367.5 L413.8,367.6 
+		L414.0,367.7 L414.3,367.7 L414.5,367.8 L414.8,367.9 L415.0,367.9 L415.3,368.0 L415.5,368.1 L415.8,368.2 
+		L416.0,368.2 L416.3,368.3 L416.5,368.4 L416.8,368.5 L417.0,368.5 L417.3,368.6 L417.5,368.7 L417.8,368.7 
+		L418.0,368.8 L418.3,368.9 L418.5,369.0 L418.8,369.0 L419.0,369.1 L419.3,369.2 L419.5,369.3 L419.8,369.3 
+		L420.0,369.4 L420.3,369.5 L420.5,369.6 L420.8,369.6 L421.1,369.7 L421.3,369.8 L421.6,369.8 L421.8,369.9 
+		L422.1,370.0 L422.3,370.1 L422.6,370.1 L422.8,370.2 L423.1,370.3 L423.3,370.4 L423.6,370.4 L423.8,370.5 
+		L424.1,370.6 L424.3,370.7 L424.6,370.7 L424.8,370.8 L425.1,370.9 L425.3,371.0 L425.6,371.0 L425.8,371.1 
+		L426.1,371.2 L426.3,371.3 L426.6,371.3 L426.8,371.4 L427.1,371.5 L427.3,371.5 L427.6,371.6 L427.8,371.7 
+		L428.1,371.8 L428.3,371.8 L428.6,371.9 L428.8,372.0 L429.1,372.1 L429.4,372.1 L429.6,372.2 L429.9,372.3 
+		L430.1,372.4 L430.4,372.4 L430.6,372.5 L430.9,372.6 L431.1,372.7 L431.4,372.7 L431.6,372.8 L431.9,372.9 
+		L432.1,373.0 L432.4,373.0 L432.6,373.1 L432.9,373.2 L433.1,373.3 L433.4,373.3 L433.6,373.4 L433.9,373.5 
+		L434.1,373.6 L434.4,373.6 L434.6,373.7 L434.9,373.8 L435.1,373.9 L435.4,373.9 L435.6,374.0 L435.9,374.1 
+		L436.1,374.2 L436.4,374.2 L436.6,374.3 L436.9,374.4 L437.2,374.5 L437.4,374.5 L437.7,374.6 L437.9,374.7 
+		L438.2,374.8 L438.4,374.8 L438.7,374.9 L438.9,375.0 L439.2,375.1 L439.4,375.1 L439.7,375.2 L439.9,375.3 
+		L440.2,375.4 L440.4,375.4 L440.7,375.5 L440.9,375.6 L441.2,375.6 L441.4,375.7 L441.7,375.8 L441.9,375.9 
+		L442.2,375.9 L442.4,376.0 L442.7,376.1 L442.9,376.2 L443.2,376.2 L443.4,376.3 L443.7,376.4 L443.9,376.5 
+		L444.2,376.5 L444.4,376.6 L444.7,376.7 L444.9,376.8 L445.2,376.8 L445.5,376.9 L445.7,377.0 L446.0,377.1 
+		L446.2,377.1 L446.5,377.2 L446.7,377.3 L447.0,377.4 L447.2,377.4 L447.5,377.5 L447.7,377.6 L448.0,377.7 
+		L448.2,377.7 L448.5,377.8 L448.7,377.9 L449.0,378.0 L449.2,378.0 L449.5,378.1 L449.7,378.2 L450.0,378.2 
+		L450.2,378.3 L450.5,378.4 L450.7,378.5 L451.0,378.5 L451.2,378.6 L451.5,378.7 L451.7,378.8 L452.0,378.8 
+		L452.2,378.9 L452.5,379.0 L452.7,379.1 L453.0,379.1 L453.2,379.2 L453.5,379.3 L453.8,379.4 L454.0,379.4 
+		L454.3,379.5 L454.5,379.6 L454.8,379.6 L455.0,379.7 L455.3,379.8 L455.5,379.9 L455.8,379.9 L456.0,380.0 
+		L456.3,380.1 L456.5,380.2 L456.8,380.2 L457.0,380.3 L457.3,380.4 L457.5,380.5 L457.8,380.5 L458.0,380.6 
+		L458.3,380.7 L458.5,380.7 L458.8,380.8 L459.0,380.9 L459.3,381.0 L459.5,381.0 L459.8,381.1 L460.0,381.2 
+		L460.3,381.3 L460.5,381.3 L460.8,381.4 L461.0,381.5 L461.3,381.5 L461.6,381.6 L461.8,381.7 L462.1,381.8 
+		L462.3,381.8 L462.6,381.9 L462.8,382.0 L463.1,382.0 L463.3,382.1 L463.6,382.2 L463.8,382.3 L464.1,382.3 
+		L464.3,382.4 L464.6,382.5 L464.8,382.5 L465.1,382.6 L465.3,382.7 L465.6,382.8 L465.8,382.8 L466.1,382.9 
+		L466.3,383.0 L466.6,383.0 L466.8,383.1 L467.1,383.2 L467.3,383.3 L467.6,383.3 L467.8,383.4 L468.1,383.5 
+		L468.3,383.5 L468.6,383.6 L468.8,383.7 L469.1,383.8 L469.3,383.8 L469.6,383.9 L469.9,384.0 L470.1,384.0 
+		L470.4,384.1 L470.6,384.2 L470.9,384.3 L471.1,384.3 L471.4,384.4 L471.6,384.5 L471.9,384.5 L472.1,384.6 
+		L472.4,384.7 L472.6,384.7 L472.9,384.8 L473.1,384.9 L473.4,385.0 L473.6,385.0 L473.9,385.1 L474.1,385.2 
+		L474.4,385.2 L474.6,385.3 L474.9,385.4 L475.1,385.4 L475.4,385.5 L475.6,385.6 L475.9,385.7 L476.1,385.7 
+		L476.4,385.8 L476.6,385.9 L476.9,385.9 L477.1,386.0 L477.4,386.1 L477.7,386.1 L477.9,386.2 L478.2,386.3 
+		L478.4,386.3 L478.7,386.4 L478.9,386.5 L479.2,386.5 L479.4,386.6 L479.7,386.7 L479.9,386.8 L480.2,386.8 
+		L480.4,386.9 L480.7,387.0 L480.9,387.0 L481.2,387.1 L481.4,387.2 L481.7,387.2 L481.9,387.3 L482.2,387.4 
+		L482.4,387.4 L482.7,387.5 L482.9,387.6 L483.2,387.6 L483.4,387.7 L483.7,387.8 L483.9,387.8 L484.2,387.9 
+		L484.4,388.0 L484.7,388.0 L484.9,388.1 L485.2,388.2 L485.4,388.2 L485.7,388.3 L486.0,388.4 L486.2,388.4 
+		L486.5,388.5 L486.7,388.6 L487.0,388.6 L487.2,388.7 L487.5,388.8 L487.7,388.8 L488.0,388.9 L488.2,389.0 
+		L488.5,389.0 L488.7,389.1 L489.0,389.2 L489.2,389.2 L489.5,389.3 L489.7,389.4 L490.0,389.4 L490.2,389.5 
+		L490.5,389.6 L490.7,389.6 L491.0,389.7 L491.2,389.8 L491.5,389.8 L491.7,389.9 L492.0,390.0 L492.2,390.0 
+		L492.5,390.1 L492.7,390.2 L493.0,390.2 L493.2,390.3 L493.5,390.3 L493.7,390.4 L494.0,390.5 L494.3,390.5 
+		L494.5,390.6 L494.8,390.7 L495.0,390.7 L495.3,390.8 L495.5,390.9 L495.8,390.9 L496.0,391.0 L496.3,391.1 
+		L496.5,391.1 L496.8,391.2 L497.0,391.2 L497.3,391.3 L497.5,391.4 L497.8,391.4 L498.0,391.5 L498.3,391.6 
+		L498.5,391.6 L498.8,391.7 L499.0,391.8 L499.3,391.8 L499.5,391.9 L499.8,391.9 L500.0,392.0 L500.3,392.1 
+		L500.5,392.1 L500.8,392.2 L501.0,392.3 L501.3,392.3 L501.5,392.4 L501.8,392.4 L502.1,392.5 L502.3,392.6 
+		L502.6,392.6 L502.8,392.7 L503.1,392.7 L503.3,392.8 L503.6,392.9 L503.8,392.9 L504.1,393.0 L504.3,393.1 
+		L504.6,393.1 L504.8,393.2 L505.1,393.2 L505.3,393.3 L505.6,393.4 L505.8,393.4 L506.1,393.5 L506.3,393.5 
+		L506.6,393.6 L506.8,393.7 L507.1,393.7 L507.3,393.8 L507.6,393.8 L507.8,393.9 L508.1,394.0 L508.3,394.0 
+		L508.6,394.1 L508.8,394.1 L509.1,394.2 L509.3,394.3 L509.6,394.3 L509.8,394.4 L510.1,394.4 L510.4,394.5 
+		L510.6,394.6 L510.9,394.6 L511.1,394.7 L511.4,394.7 L511.6,394.8 L511.9,394.9 L512.1,394.9 L512.4,395.0 
+		L512.6,395.0 L512.9,395.1 L513.1,395.2 L513.4,395.2 L513.6,395.3 L513.9,395.3 L514.1,395.4 L514.4,395.4 
+		L514.6,395.5 L514.9,395.6 L515.1,395.6 L515.4,395.7 L515.6,395.7 L515.9,395.8 L516.1,395.9 L516.4,395.9 
+		L516.6,396.0 L516.9,396.0 L517.1,396.1 L517.4,396.1 L517.6,396.2 L517.9,396.3 L518.1,396.3 L518.4,396.4 
+		L518.7,396.4 L518.9,396.5 L519.2,396.5 L519.4,396.6 L519.7,396.7 L519.9,396.7 L520.2,396.8 L520.4,396.8 
+		L520.7,396.9 L520.9,396.9 L521.2,397.0 L521.4,397.0 L521.7,397.1 L521.9,397.2 L522.2,397.2 L522.4,397.3 
+		L522.7,397.3 L522.9,397.4 L523.2,397.4 L523.4,397.5 L523.7,397.5 L523.9,397.6 L524.2,397.7 L524.4,397.7 
+		L524.7,397.8 L524.9,397.8 L525.2,397.9 L525.4,397.9 L525.7,398.0 L525.9,398.0 L526.2,398.1 L526.5,398.1 
+		L526.7,398.2 L527.0,398.3 L527.2,398.3 L527.5,398.4 L527.7,398.4 L528.0,398.5 L528.2,398.5 L528.5,398.6 
+		L528.7,398.6 L529.0,398.7 L529.2,398.7 L529.5,398.8 L529.7,398.8 L530.0,398.9 L530.2,398.9 L530.5,399.0 
+		L530.7,399.1 L531.0,399.1 L531.2,399.2 L531.5,399.2 L531.7,399.3 L532.0,399.3 L532.2,399.4 L532.5,399.4 
+		L532.7,399.5 L533.0,399.5 L533.2,399.6 L533.5,399.6 L533.7,399.7 L534.0,399.7 L534.2,399.8 L534.5,399.8 
+		L534.8,399.9 L535.0,399.9 L535.3,400.0 L535.5,400.0 L535.8,400.1 L536.0,400.1 L536.3,400.2 L536.5,400.2 
+		L536.8,400.3 L537.0,400.3 L537.3,400.4 L537.5,400.4 L537.8,400.5 L538.0,400.5 L538.3,400.6 L538.5,400.6 
+		L538.8,400.7 L539.0,400.7 L539.3,400.8 L539.5,400.8 L539.8,400.9 L540.0,400.9 L540.3,401.0 L540.5,401.0 
+		L540.8,401.1 L541.0,401.1 L541.3,401.2 L541.5,401.2 L541.8,401.3 L542.0,401.3 L542.3,401.4 L542.6,401.4 
+		L542.8,401.5 L543.1,401.5 L543.3,401.6 L543.6,401.6 L543.8,401.7 L544.1,401.7 L544.3,401.8 L544.6,401.8 
+		L544.8,401.9 L545.1,401.9 L545.3,402.0 L545.6,402.0 L545.8,402.1 L546.1,402.1 L546.3,402.2 L546.6,402.2 
+		L546.8,402.3 L547.1,402.3 L547.3,402.4 L547.6,402.4 L547.8,402.4 L548.1,402.5 L548.3,402.5 L548.6,402.6 
+		L548.8,402.6 L549.1,402.7 L549.3,402.7 L549.6,402.8 L549.8,402.8 L550.1,402.9 L550.3,402.9 L550.6,403.0 
+		L550.9,403.0 L551.1,403.0 L551.4,403.1 L551.6,403.1 L551.9,403.2 L552.1,403.2 L552.4,403.3 L552.6,403.3 
+		L552.9,403.4 L553.1,403.4 L553.4,403.5 L553.6,403.5 L553.9,403.6 L554.1,403.6 L554.4,403.6 L554.6,403.7 
+		L554.9,403.7 L555.1,403.8 L555.4,403.8 L555.6,403.9 L555.9,403.9 L556.1,404.0 L556.4,404.0 L556.6,404.0 
+		L556.9,404.1 L557.1,404.1 L557.4,404.2 L557.6,404.2 L557.9,404.3 L558.1,404.3 L558.4,404.3 L558.6,404.4 
+		L558.9,404.4 L559.2,404.5 L559.4,404.5 L559.7,404.6 L559.9,404.6 L560.2,404.7 L560.4,404.7 L560.7,404.7 
+		L560.9,404.8 L561.2,404.8 L561.4,404.9 L561.7,404.9 L561.9,405.0 L562.2,405.0 L562.4,405.0 L562.7,405.1 
+		L562.9,405.1 L563.2,405.2 L563.4,405.2 L563.7,405.2 L563.9,405.3 L564.2,405.3 L564.4,405.4 L564.7,405.4 
+		L564.9,405.5 L565.2,405.5 L565.4,405.5 L565.7,405.6 L565.9,405.6 L566.2,405.7 L566.4,405.7 L566.7,405.7 
+		L567.0,405.8 L567.2,405.8 L567.5,405.9 L567.7,405.9 L568.0,405.9 L568.2,406.0 L568.5,406.0 L568.7,406.1 
+		L569.0,406.1 L569.2,406.1 L569.5,406.2 L569.7,406.2 L570.0,406.3 L570.2,406.3 L570.5,406.3 L570.7,406.4 
+		L571.0,406.4 L571.2,406.5 L571.5,406.5 L571.7,406.5 L572.0,406.6 L572.2,406.6 L572.5,406.7 L572.7,406.7 
+		L573.0,406.7 L573.2,406.8 L573.5,406.8 L573.7,406.9 L574.0,406.9 L574.2,406.9 L574.5,407.0 L574.7,407.0 
+		'></path>
+</g>
+	</g>
+	<g id="Plot_4"><title>Plot_4</title>
+<g style="fill:none; color:cyan; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L72.2,422.4 L72.4,422.4 L72.7,422.4 L72.9,422.4 L73.2,422.4 L73.4,422.4 L73.7,422.4 
+		L73.9,422.4 L74.2,422.4 L74.4,422.4 L74.7,422.4 L74.9,422.4 L75.2,422.4 L75.4,422.4 L75.7,422.4 
+		L75.9,422.4 L76.2,422.4 L76.4,422.3 L76.7,422.3 L76.9,422.3 L77.2,422.3 L77.4,422.3 L77.7,422.2 
+		L77.9,422.2 L78.2,422.1 L78.4,422.1 L78.7,422.0 L78.9,422.0 L79.2,421.9 L79.4,421.8 L79.7,421.7 
+		L79.9,421.6 L80.2,421.5 L80.5,421.4 L80.7,421.3 L81.0,421.1 L81.2,421.0 L81.5,420.8 L81.7,420.6 
+		L82.0,420.4 L82.2,420.2 L82.5,420.0 L82.7,419.7 L83.0,419.4 L83.2,419.2 L83.5,418.8 L83.7,418.5 
+		L84.0,418.2 L84.2,417.8 L84.5,417.4 L84.7,417.0 L85.0,416.6 L85.2,416.1 L85.5,415.7 L85.7,415.2 
+		L86.0,414.6 L86.2,414.1 L86.5,413.5 L86.7,412.9 L87.0,412.3 L87.2,411.6 L87.5,410.9 L87.7,410.2 
+		L88.0,409.5 L88.3,408.7 L88.5,407.9 L88.8,407.1 L89.0,406.3 L89.3,405.4 L89.5,404.5 L89.8,403.5 
+		L90.0,402.6 L90.3,401.6 L90.5,400.5 L90.8,399.5 L91.0,398.4 L91.3,397.3 L91.5,396.1 L91.8,395.0 
+		L92.0,393.8 L92.3,392.5 L92.5,391.3 L92.8,390.0 L93.0,388.7 L93.3,387.3 L93.5,385.9 L93.8,384.5 
+		L94.0,383.1 L94.3,381.6 L94.5,380.2 L94.8,378.6 L95.0,377.1 L95.3,375.5 L95.5,373.9 L95.8,372.3 
+		L96.0,370.7 L96.3,369.0 L96.6,367.3 L96.8,365.6 L97.1,363.8 L97.3,362.1 L97.6,360.3 L97.8,358.5 
+		L98.1,356.6 L98.3,354.8 L98.6,352.9 L98.8,351.0 L99.1,349.1 L99.3,347.1 L99.6,345.2 L99.8,343.2 
+		L100.1,341.2 L100.3,339.2 L100.6,337.2 L100.8,335.1 L101.1,333.1 L101.3,331.0 L101.6,328.9 L101.8,326.8 
+		L102.1,324.7 L102.3,322.6 L102.6,320.5 L102.8,318.3 L103.1,316.2 L103.3,314.0 L103.6,311.8 L103.8,309.6 
+		L104.1,307.5 L104.3,305.3 L104.6,303.1 L104.9,300.9 L105.1,298.6 L105.4,296.4 L105.6,294.2 L105.9,292.0 
+		L106.1,289.8 L106.4,287.5 L106.6,285.3 L106.9,283.1 L107.1,280.9 L107.4,278.6 L107.6,276.4 L107.9,274.2 
+		L108.1,272.0 L108.4,269.8 L108.6,267.6 L108.9,265.4 L109.1,263.2 L109.4,261.0 L109.6,258.8 L109.9,256.6 
+		L110.1,254.4 L110.4,252.3 L110.6,250.1 L110.9,248.0 L111.1,245.9 L111.4,243.7 L111.6,241.6 L111.9,239.5 
+		L112.1,237.4 L112.4,235.4 L112.7,233.3 L112.9,231.3 L113.2,229.2 L113.4,227.2 L113.7,225.2 L113.9,223.2 
+		L114.2,221.2 L114.4,219.3 L114.7,217.3 L114.9,215.4 L115.2,213.5 L115.4,211.6 L115.7,209.8 L115.9,207.9 
+		L116.2,206.1 L116.4,204.3 L116.7,202.5 L116.9,200.7 L117.2,199.0 L117.4,197.2 L117.7,195.5 L117.9,193.9 
+		L118.2,192.2 L118.4,190.6 L118.7,188.9 L118.9,187.3 L119.2,185.8 L119.4,184.2 L119.7,182.7 L119.9,181.2 
+		L120.2,179.7 L120.4,178.3 L120.7,176.8 L121.0,175.4 L121.2,174.0 L121.5,172.7 L121.7,171.4 L122.0,170.0 
+		L122.2,168.8 L122.5,167.5 L122.7,166.3 L123.0,165.1 L123.2,163.9 L123.5,162.7 L123.7,161.6 L124.0,160.5 
+		L124.2,159.4 L124.5,158.4 L124.7,157.4 L125.0,156.4 L125.2,155.4 L125.5,154.5 L125.7,153.5 L126.0,152.7 
+		L126.2,151.8 L126.5,150.9 L126.7,150.1 L127.0,149.3 L127.2,148.6 L127.5,147.9 L127.7,147.1 L128.0,146.5 
+		L128.2,145.8 L128.5,145.2 L128.8,144.6 L129.0,144.0 L129.3,143.5 L129.5,142.9 L129.8,142.4 L130.0,142.0 
+		L130.3,141.5 L130.5,141.1 L130.8,140.7 L131.0,140.3 L131.3,140.0 L131.5,139.6 L131.8,139.3 L132.0,139.1 
+		L132.3,138.8 L132.5,138.6 L132.8,138.4 L133.0,138.2 L133.3,138.1 L133.5,137.9 L133.8,137.8 L134.0,137.8 
+		L134.3,137.7 L134.5,137.7 L134.8,137.7 L135.0,137.7 L135.3,137.7 L135.5,137.8 L135.8,137.8 L136.0,137.9 
+		L136.3,138.1 L136.5,138.2 L136.8,138.4 L137.1,138.6 L137.3,138.8 L137.6,139.0 L137.8,139.2 L138.1,139.5 
+		L138.3,139.8 L138.6,140.1 L138.8,140.4 L139.1,140.8 L139.3,141.2 L139.6,141.5 L139.8,141.9 L140.1,142.4 
+		L140.3,142.8 L140.6,143.3 L140.8,143.8 L141.1,144.3 L141.3,144.8 L141.6,145.3 L141.8,145.8 L142.1,146.4 
+		L142.3,147.0 L142.6,147.6 L142.8,148.2 L143.1,148.8 L143.3,149.5 L143.6,150.1 L143.8,150.8 L144.1,151.5 
+		L144.3,152.2 L144.6,152.9 L144.8,153.7 L145.1,154.4 L145.4,155.2 L145.6,156.0 L145.9,156.7 L146.1,157.5 
+		L146.4,158.4 L146.6,159.2 L146.9,160.0 L147.1,160.9 L147.4,161.7 L147.6,162.6 L147.9,163.5 L148.1,164.4 
+		L148.4,165.3 L148.6,166.2 L148.9,167.2 L149.1,168.1 L149.4,169.0 L149.6,170.0 L149.9,171.0 L150.1,171.9 
+		L150.4,172.9 L150.6,173.9 L150.9,174.9 L151.1,175.9 L151.4,177.0 L151.6,178.0 L151.9,179.0 L152.1,180.1 
+		L152.4,181.1 L152.6,182.2 L152.9,183.3 L153.2,184.3 L153.4,185.4 L153.7,186.5 L153.9,187.6 L154.2,188.7 
+		L154.4,189.8 L154.7,190.9 L154.9,192.0 L155.2,193.1 L155.4,194.3 L155.7,195.4 L155.9,196.5 L156.2,197.7 
+		L156.4,198.8 L156.7,199.9 L156.9,201.1 L157.2,202.3 L157.4,203.4 L157.7,204.6 L157.9,205.7 L158.2,206.9 
+		L158.4,208.1 L158.7,209.2 L158.9,210.4 L159.2,211.6 L159.4,212.8 L159.7,214.0 L159.9,215.1 L160.2,216.3 
+		L160.4,217.5 L160.7,218.7 L160.9,219.9 L161.2,221.1 L161.5,222.3 L161.7,223.5 L162.0,224.7 L162.2,225.9 
+		L162.5,227.0 L162.7,228.2 L163.0,229.4 L163.2,230.6 L163.5,231.8 L163.7,233.0 L164.0,234.2 L164.2,235.4 
+		L164.5,236.6 L164.7,237.8 L165.0,239.0 L165.2,240.2 L165.5,241.4 L165.7,242.5 L166.0,243.7 L166.2,244.9 
+		L166.5,246.1 L166.7,247.3 L167.0,248.4 L167.2,249.6 L167.5,250.8 L167.7,252.0 L168.0,253.1 L168.2,254.3 
+		L168.5,255.5 L168.7,256.6 L169.0,257.8 L169.2,259.0 L169.5,260.1 L169.8,261.3 L170.0,262.4 L170.3,263.6 
+		L170.5,264.7 L170.8,265.9 L171.0,267.0 L171.3,268.1 L171.5,269.3 L171.8,270.4 L172.0,271.5 L172.3,272.6 
+		L172.5,273.7 L172.8,274.9 L173.0,276.0 L173.3,277.1 L173.5,278.2 L173.8,279.3 L174.0,280.4 L174.3,281.5 
+		L174.5,282.5 L174.8,283.6 L175.0,284.7 L175.3,285.8 L175.5,286.8 L175.8,287.9 L176.0,289.0 L176.3,290.0 
+		L176.5,291.1 L176.8,292.1 L177.0,293.2 L177.3,294.2 L177.6,295.2 L177.8,296.3 L178.1,297.3 L178.3,298.3 
+		L178.6,299.3 L178.8,300.3 L179.1,301.3 L179.3,302.3 L179.6,303.3 L179.8,304.3 L180.1,305.3 L180.3,306.3 
+		L180.6,307.2 L180.8,308.2 L181.1,309.2 L181.3,310.1 L181.6,311.1 L181.8,312.0 L182.1,313.0 L182.3,313.9 
+		L182.6,314.8 L182.8,315.8 L183.1,316.7 L183.3,317.6 L183.6,318.5 L183.8,319.4 L184.1,320.3 L184.3,321.2 
+		L184.6,322.1 L184.8,323.0 L185.1,323.9 L185.3,324.7 L185.6,325.6 L185.9,326.5 L186.1,327.3 L186.4,328.2 
+		L186.6,329.0 L186.9,329.9 L187.1,330.7 L187.4,331.5 L187.6,332.3 L187.9,333.2 L188.1,334.0 L188.4,334.8 
+		L188.6,335.6 L188.9,336.4 L189.1,337.2 L189.4,338.0 L189.6,338.7 L189.9,339.5 L190.1,340.3 L190.4,341.1 
+		L190.6,341.8 L190.9,342.6 L191.1,343.3 L191.4,344.1 L191.6,344.8 L191.9,345.5 L192.1,346.3 L192.4,347.0 
+		L192.6,347.7 L192.9,348.4 L193.1,349.1 L193.4,349.8 L193.7,350.5 L193.9,351.2 L194.2,351.9 L194.4,352.6 
+		L194.7,353.3 L194.9,353.9 L195.2,354.6 L195.4,355.3 L195.7,355.9 L195.9,356.6 L196.2,357.2 L196.4,357.9 
+		L196.7,358.5 L196.9,359.1 L197.2,359.8 L197.4,360.4 L197.7,361.0 L197.9,361.6 L198.2,362.2 L198.4,362.8 
+		L198.7,363.4 L198.9,364.0 L199.2,364.6 L199.4,365.2 L199.7,365.8 L199.9,366.3 L200.2,366.9 L200.4,367.5 
+		L200.7,368.0 L200.9,368.6 L201.2,369.1 L201.4,369.7 L201.7,370.2 L202.0,370.7 L202.2,371.3 L202.5,371.8 
+		L202.7,372.3 L203.0,372.8 L203.2,373.4 L203.5,373.9 L203.7,374.4 L204.0,374.9 L204.2,375.4 L204.5,375.9 
+		L204.7,376.3 L205.0,376.8 L205.2,377.3 L205.5,377.8 L205.7,378.3 L206.0,378.7 L206.2,379.2 L206.5,379.6 
+		L206.7,380.1 L207.0,380.5 L207.2,381.0 L207.5,381.4 L207.7,381.9 L208.0,382.3 L208.2,382.7 L208.5,383.2 
+		L208.7,383.6 L209.0,384.0 L209.2,384.4 L209.5,384.8 L209.7,385.2 L210.0,385.6 L210.3,386.0 L210.5,386.4 
+		L210.8,386.8 L211.0,387.2 L211.3,387.6 L211.5,388.0 L211.8,388.3 L212.0,388.7 L212.3,389.1 L212.5,389.4 
+		L212.8,389.8 L213.0,390.2 L213.3,390.5 L213.5,390.9 L213.8,391.2 L214.0,391.6 L214.3,391.9 L214.5,392.3 
+		L214.8,392.6 L215.0,392.9 L215.3,393.2 L215.5,393.6 L215.8,393.9 L216.0,394.2 L216.3,394.5 L216.5,394.8 
+		L216.8,395.2 L217.0,395.5 L217.3,395.8 L217.5,396.1 L217.8,396.4 L218.1,396.7 L218.3,397.0 L218.6,397.2 
+		L218.8,397.5 L219.1,397.8 L219.3,398.1 L219.6,398.4 L219.8,398.6 L220.1,398.9 L220.3,399.2 L220.6,399.4 
+		L220.8,399.7 L221.1,400.0 L221.3,400.2 L221.6,400.5 L221.8,400.7 L222.1,401.0 L222.3,401.2 L222.6,401.5 
+		L222.8,401.7 L223.1,402.0 L223.3,402.2 L223.6,402.4 L223.8,402.7 L224.1,402.9 L224.3,403.1 L224.6,403.4 
+		L224.8,403.6 L225.1,403.8 L225.3,404.0 L225.6,404.2 L225.8,404.4 L226.1,404.7 L226.4,404.9 L226.6,405.1 
+		L226.9,405.3 L227.1,405.5 L227.4,405.7 L227.6,405.9 L227.9,406.1 L228.1,406.3 L228.4,406.5 L228.6,406.6 
+		L228.9,406.8 L229.1,407.0 L229.4,407.2 L229.6,407.4 L229.9,407.6 L230.1,407.7 L230.4,407.9 L230.6,408.1 
+		L230.9,408.3 L231.1,408.4 L231.4,408.6 L231.6,408.8 L231.9,408.9 L232.1,409.1 L232.4,409.3 L232.6,409.4 
+		L232.9,409.6 L233.1,409.7 L233.4,409.9 L233.6,410.0 L233.9,410.2 L234.1,410.3 L234.4,410.5 L234.7,410.6 
+		L234.9,410.8 L235.2,410.9 L235.4,411.1 L235.7,411.2 L235.9,411.3 L236.2,411.5 L236.4,411.6 L236.7,411.7 
+		L236.9,411.9 L237.2,412.0 L237.4,412.1 L237.7,412.2 L237.9,412.4 L238.2,412.5 L238.4,412.6 L238.7,412.7 
+		L238.9,412.9 L239.2,413.0 L239.4,413.1 L239.7,413.2 L239.9,413.3 L240.2,413.4 L240.4,413.5 L240.7,413.7 
+		L240.9,413.8 L241.2,413.9 L241.4,414.0 L241.7,414.1 L241.9,414.2 L242.2,414.3 L242.5,414.4 L242.7,414.5 
+		L243.0,414.6 L243.2,414.7 L243.5,414.8 L243.7,414.9 L244.0,415.0 L244.2,415.1 L244.5,415.2 L244.7,415.3 
+		L245.0,415.3 L245.2,415.4 L245.5,415.5 L245.7,415.6 L246.0,415.7 L246.2,415.8 L246.5,415.9 L246.7,416.0 
+		L247.0,416.0 L247.2,416.1 L247.5,416.2 L247.7,416.3 L248.0,416.4 L248.2,416.4 L248.5,416.5 L248.7,416.6 
+		L249.0,416.7 L249.2,416.7 L249.5,416.8 L249.7,416.9 L250.0,416.9 L250.2,417.0 L250.5,417.1 L250.8,417.2 
+		L251.0,417.2 L251.3,417.3 L251.5,417.4 L251.8,417.4 L252.0,417.5 L252.3,417.5 L252.5,417.6 L252.8,417.7 
+		L253.0,417.7 L253.3,417.8 L253.5,417.9 L253.8,417.9 L254.0,418.0 L254.3,418.0 L254.5,418.1 L254.8,418.1 
+		L255.0,418.2 L255.3,418.3 L255.5,418.3 L255.8,418.4 L256.0,418.4 L256.3,418.5 L256.5,418.5 L256.8,418.6 
+		L257.0,418.6 L257.3,418.7 L257.5,418.7 L257.8,418.8 L258.0,418.8 L258.3,418.9 L258.6,418.9 L258.8,419.0 
+		L259.1,419.0 L259.3,419.0 L259.6,419.1 L259.8,419.1 L260.1,419.2 L260.3,419.2 L260.6,419.3 L260.8,419.3 
+		L261.1,419.3 L261.3,419.4 L261.6,419.4 L261.8,419.5 L262.1,419.5 L262.3,419.5 L262.6,419.6 L262.8,419.6 
+		L263.1,419.7 L263.3,419.7 L263.6,419.7 L263.8,419.8 L264.1,419.8 L264.3,419.8 L264.6,419.9 L264.8,419.9 
+		L265.1,419.9 L265.3,420.0 L265.6,420.0 L265.8,420.0 L266.1,420.1 L266.3,420.1 L266.6,420.1 L266.9,420.2 
+		L267.1,420.2 L267.4,420.2 L267.6,420.2 L267.9,420.3 L268.1,420.3 L268.4,420.3 L268.6,420.4 L268.9,420.4 
+		L269.1,420.4 L269.4,420.4 L269.6,420.5 L269.9,420.5 L270.1,420.5 L270.4,420.5 L270.6,420.6 L270.9,420.6 
+		L271.1,420.6 L271.4,420.6 L271.6,420.7 L271.9,420.7 L272.1,420.7 L272.4,420.7 L272.6,420.8 L272.9,420.8 
+		L273.1,420.8 L273.4,420.8 L273.6,420.8 L273.9,420.9 L274.1,420.9 L274.4,420.9 L274.6,420.9 L274.9,421.0 
+		L275.2,421.0 L275.4,421.0 L275.7,421.0 L275.9,421.0 L276.2,421.0 L276.4,421.1 L276.7,421.1 L276.9,421.1 
+		L277.2,421.1 L277.4,421.1 L277.7,421.2 L277.9,421.2 L278.2,421.2 L278.4,421.2 L278.7,421.2 L278.9,421.2 
+		L279.2,421.3 L279.4,421.3 L279.7,421.3 L279.9,421.3 L280.2,421.3 L280.4,421.3 L280.7,421.3 L280.9,421.4 
+		L281.2,421.4 L281.4,421.4 L281.7,421.4 L281.9,421.4 L282.2,421.4 L282.4,421.4 L282.7,421.5 L283.0,421.5 
+		L283.2,421.5 L283.5,421.5 L283.7,421.5 L284.0,421.5 L284.2,421.5 L284.5,421.5 L284.7,421.6 L285.0,421.6 
+		L285.2,421.6 L285.5,421.6 L285.7,421.6 L286.0,421.6 L286.2,421.6 L286.5,421.6 L286.7,421.6 L287.0,421.7 
+		L287.2,421.7 L287.5,421.7 L287.7,421.7 L288.0,421.7 L288.2,421.7 L288.5,421.7 L288.7,421.7 L289.0,421.7 
+		L289.2,421.7 L289.5,421.8 L289.7,421.8 L290.0,421.8 L290.2,421.8 L290.5,421.8 L290.7,421.8 L291.0,421.8 
+		L291.3,421.8 L291.5,421.8 L291.8,421.8 L292.0,421.8 L292.3,421.9 L292.5,421.9 L292.8,421.9 L293.0,421.9 
+		L293.3,421.9 L293.5,421.9 L293.8,421.9 L294.0,421.9 L294.3,421.9 L294.5,421.9 L294.8,421.9 L295.0,421.9 
+		L295.3,421.9 L295.5,421.9 L295.8,422.0 L296.0,422.0 L296.3,422.0 L296.5,422.0 L296.8,422.0 L297.0,422.0 
+		L297.3,422.0 L297.5,422.0 L297.8,422.0 L298.0,422.0 L298.3,422.0 L298.5,422.0 L298.8,422.0 L299.0,422.0 
+		L299.3,422.0 L299.6,422.0 L299.8,422.0 L300.1,422.0 L300.3,422.1 L300.6,422.1 L300.8,422.1 L301.1,422.1 
+		L301.3,422.1 L301.6,422.1 L301.8,422.1 L302.1,422.1 L302.3,422.1 L302.6,422.1 L302.8,422.1 L303.1,422.1 
+		L303.3,422.1 L303.6,422.1 L303.8,422.1 L304.1,422.1 L304.3,422.1 L304.6,422.1 L304.8,422.1 L305.1,422.1 
+		L305.3,422.1 L305.6,422.1 L305.8,422.1 L306.1,422.2 L306.3,422.2 L306.6,422.2 L306.8,422.2 L307.1,422.2 
+		L307.4,422.2 L307.6,422.2 L307.9,422.2 L308.1,422.2 L308.4,422.2 L308.6,422.2 L308.9,422.2 L309.1,422.2 
+		L309.4,422.2 L309.6,422.2 L309.9,422.2 L310.1,422.2 L310.4,422.2 L310.6,422.2 L310.9,422.2 L311.1,422.2 
+		L311.4,422.2 L311.6,422.2 L311.9,422.2 L312.1,422.2 L312.4,422.2 L312.6,422.2 L312.9,422.2 L313.1,422.2 
+		L313.4,422.2 L313.6,422.2 L313.9,422.2 L314.1,422.2 L314.4,422.2 L314.6,422.2 L314.9,422.3 L315.1,422.3 
+		L315.4,422.3 L315.7,422.3 L315.9,422.3 L316.2,422.3 L316.4,422.3 L316.7,422.3 L316.9,422.3 L317.2,422.3 
+		L317.4,422.3 L317.7,422.3 L317.9,422.3 L318.2,422.3 L318.4,422.3 L318.7,422.3 L318.9,422.3 L319.2,422.3 
+		L319.4,422.3 L319.7,422.3 L319.9,422.3 L320.2,422.3 L320.4,422.3 L320.7,422.3 L320.9,422.3 L321.2,422.3 
+		L321.4,422.3 L321.7,422.3 L321.9,422.3 L322.2,422.3 L322.4,422.3 L322.7,422.3 L322.9,422.3 L323.2,422.3 
+		L323.5,422.3 L323.7,422.3 L324.0,422.3 L324.2,422.3 L324.5,422.3 L324.7,422.3 L325.0,422.3 L325.2,422.3 
+		L325.5,422.3 L325.7,422.3 L326.0,422.3 L326.2,422.3 L326.5,422.3 L326.7,422.3 L327.0,422.3 L327.2,422.3 
+		L327.5,422.3 L327.7,422.3 L328.0,422.3 L328.2,422.3 L328.5,422.3 L328.7,422.3 L329.0,422.3 L329.2,422.3 
+		L329.5,422.3 L329.7,422.3 L330.0,422.3 L330.2,422.3 L330.5,422.3 L330.7,422.3 L331.0,422.3 L331.2,422.3 
+		L331.5,422.3 L331.8,422.3 L332.0,422.3 L332.3,422.3 L332.5,422.3 L332.8,422.3 L333.0,422.3 L333.3,422.4 
+		L333.5,422.4 L333.8,422.4 L334.0,422.4 L334.3,422.4 L334.5,422.4 L334.8,422.4 L335.0,422.4 L335.3,422.4 
+		L335.5,422.4 L335.8,422.4 L336.0,422.4 L336.3,422.4 L336.5,422.4 L336.8,422.4 L337.0,422.4 L337.3,422.4 
+		L337.5,422.4 L337.8,422.4 L338.0,422.4 L338.3,422.4 L338.5,422.4 L338.8,422.4 L339.0,422.4 L339.3,422.4 
+		L339.5,422.4 L339.8,422.4 L340.1,422.4 L340.3,422.4 L340.6,422.4 L340.8,422.4 L341.1,422.4 L341.3,422.4 
+		L341.6,422.4 L341.8,422.4 L342.1,422.4 L342.3,422.4 L342.6,422.4 L342.8,422.4 L343.1,422.4 L343.3,422.4 
+		L343.6,422.4 L343.8,422.4 L344.1,422.4 L344.3,422.4 L344.6,422.4 L344.8,422.4 L345.1,422.4 L345.3,422.4 
+		L345.6,422.4 L345.8,422.4 L346.1,422.4 L346.3,422.4 L346.6,422.4 L346.8,422.4 L347.1,422.4 L347.3,422.4 
+		L347.6,422.4 L347.9,422.4 L348.1,422.4 L348.4,422.4 L348.6,422.4 L348.9,422.4 L349.1,422.4 L349.4,422.4 
+		L349.6,422.4 L349.9,422.4 L350.1,422.4 L350.4,422.4 L350.6,422.4 L350.9,422.4 L351.1,422.4 L351.4,422.4 
+		L351.6,422.4 L351.9,422.4 L352.1,422.4 L352.4,422.4 L352.6,422.4 L352.9,422.4 L353.1,422.4 L353.4,422.4 
+		L353.6,422.4 L353.9,422.4 L354.1,422.4 L354.4,422.4 L354.6,422.4 L354.9,422.4 L355.1,422.4 L355.4,422.4 
+		L355.6,422.4 L355.9,422.4 L356.2,422.4 L356.4,422.4 L356.7,422.4 L356.9,422.4 L357.2,422.4 L357.4,422.4 
+		L357.7,422.4 L357.9,422.4 L358.2,422.4 L358.4,422.4 L358.7,422.4 L358.9,422.4 L359.2,422.4 L359.4,422.4 
+		L359.7,422.4 L359.9,422.4 L360.2,422.4 L360.4,422.4 L360.7,422.4 L360.9,422.4 L361.2,422.4 L361.4,422.4 
+		L361.7,422.4 L361.9,422.4 L362.2,422.4 L362.4,422.4 L362.7,422.4 L362.9,422.4 L363.2,422.4 L363.4,422.4 
+		L363.7,422.4 L363.9,422.4 L364.2,422.4 L364.5,422.4 L364.7,422.4 L365.0,422.4 L365.2,422.4 L365.5,422.4 
+		L365.7,422.4 L366.0,422.4 L366.2,422.4 L366.5,422.4 L366.7,422.4 L367.0,422.4 L367.2,422.4 L367.5,422.4 
+		L367.7,422.4 L368.0,422.4 L368.2,422.4 L368.5,422.4 L368.7,422.4 L369.0,422.4 L369.2,422.4 L369.5,422.4 
+		L369.7,422.4 L370.0,422.4 L370.2,422.4 L370.5,422.4 L370.7,422.4 L371.0,422.4 L371.2,422.4 L371.5,422.4 
+		L371.7,422.4 L372.0,422.4 L372.3,422.4 L372.5,422.4 L372.8,422.4 L373.0,422.4 L373.3,422.4 L373.5,422.4 
+		L373.8,422.4 L374.0,422.4 L374.3,422.4 L374.5,422.4 L374.8,422.4 L375.0,422.4 L375.3,422.4 L375.5,422.4 
+		L375.8,422.4 L376.0,422.4 L376.3,422.4 L376.5,422.4 L376.8,422.4 L377.0,422.4 L377.3,422.4 L377.5,422.4 
+		L377.8,422.4 L378.0,422.4 L378.3,422.4 L378.5,422.4 L378.8,422.4 L379.0,422.4 L379.3,422.4 L379.5,422.4 
+		L379.8,422.4 L380.0,422.4 L380.3,422.4 L380.6,422.4 L380.8,422.4 L381.1,422.4 L381.3,422.4 L381.6,422.4 
+		L381.8,422.4 L382.1,422.4 L382.3,422.4 L382.6,422.4 L382.8,422.4 L383.1,422.4 L383.3,422.4 L383.6,422.4 
+		L383.8,422.4 L384.1,422.4 L384.3,422.4 L384.6,422.4 L384.8,422.4 L385.1,422.4 L385.3,422.4 L385.6,422.4 
+		L385.8,422.4 L386.1,422.4 L386.3,422.4 L386.6,422.4 L386.8,422.4 L387.1,422.4 L387.3,422.4 L387.6,422.4 
+		L387.8,422.4 L388.1,422.4 L388.3,422.4 L388.6,422.4 L388.9,422.4 L389.1,422.4 L389.4,422.4 L389.6,422.4 
+		L389.9,422.4 L390.1,422.4 L390.4,422.4 L390.6,422.4 L390.9,422.4 L391.1,422.4 L391.4,422.4 L391.6,422.4 
+		L391.9,422.4 L392.1,422.4 L392.4,422.4 L392.6,422.4 L392.9,422.4 L393.1,422.4 L393.4,422.4 L393.6,422.4 
+		L393.9,422.4 L394.1,422.4 L394.4,422.4 L394.6,422.4 L394.9,422.4 L395.1,422.4 L395.4,422.4 L395.6,422.4 
+		L395.9,422.4 L396.1,422.4 L396.4,422.4 L396.7,422.4 L396.9,422.4 L397.2,422.4 L397.4,422.4 L397.7,422.4 
+		L397.9,422.4 L398.2,422.4 L398.4,422.4 L398.7,422.4 L398.9,422.4 L399.2,422.4 L399.4,422.4 L399.7,422.4 
+		L399.9,422.4 L400.2,422.4 L400.4,422.4 L400.7,422.4 L400.9,422.4 L401.2,422.4 L401.4,422.4 L401.7,422.4 
+		L401.9,422.4 L402.2,422.4 L402.4,422.4 L402.7,422.4 L402.9,422.4 L403.2,422.4 L403.4,422.4 L403.7,422.4 
+		L403.9,422.4 L404.2,422.4 L404.4,422.4 L404.7,422.4 L405.0,422.4 L405.2,422.4 L405.5,422.4 L405.7,422.4 
+		L406.0,422.4 L406.2,422.4 L406.5,422.4 L406.7,422.4 L407.0,422.4 L407.2,422.4 L407.5,422.4 L407.7,422.4 
+		L408.0,422.4 L408.2,422.4 L408.5,422.4 L408.7,422.4 L409.0,422.4 L409.2,422.4 L409.5,422.4 L409.7,422.4 
+		L410.0,422.4 L410.2,422.4 L410.5,422.4 L410.7,422.4 L411.0,422.4 L411.2,422.4 L411.5,422.4 L411.7,422.4 
+		L412.0,422.4 L412.2,422.4 L412.5,422.4 L412.8,422.4 L413.0,422.4 L413.3,422.4 L413.5,422.4 L413.8,422.4 
+		L414.0,422.4 L414.3,422.4 L414.5,422.4 L414.8,422.4 L415.0,422.4 L415.3,422.4 L415.5,422.4 L415.8,422.4 
+		L416.0,422.4 L416.3,422.4 L416.5,422.4 L416.8,422.4 L417.0,422.4 L417.3,422.4 L417.5,422.4 L417.8,422.4 
+		L418.0,422.4 L418.3,422.4 L418.5,422.4 L418.8,422.4 L419.0,422.4 L419.3,422.4 L419.5,422.4 L419.8,422.4 
+		L420.0,422.4 L420.3,422.4 L420.5,422.4 L420.8,422.4 L421.1,422.4 L421.3,422.4 L421.6,422.4 L421.8,422.4 
+		L422.1,422.4 L422.3,422.4 L422.6,422.4 L422.8,422.4 L423.1,422.4 L423.3,422.4 L423.6,422.4 L423.8,422.4 
+		L424.1,422.4 L424.3,422.4 L424.6,422.4 L424.8,422.4 L425.1,422.4 L425.3,422.4 L425.6,422.4 L425.8,422.4 
+		L426.1,422.4 L426.3,422.4 L426.6,422.4 L426.8,422.4 L427.1,422.4 L427.3,422.4 L427.6,422.4 L427.8,422.4 
+		L428.1,422.4 L428.3,422.4 L428.6,422.4 L428.8,422.4 L429.1,422.4 L429.4,422.4 L429.6,422.4 L429.9,422.4 
+		L430.1,422.4 L430.4,422.4 L430.6,422.4 L430.9,422.4 L431.1,422.4 L431.4,422.4 L431.6,422.4 L431.9,422.4 
+		L432.1,422.4 L432.4,422.4 L432.6,422.4 L432.9,422.4 L433.1,422.4 L433.4,422.4 L433.6,422.4 L433.9,422.4 
+		L434.1,422.4 L434.4,422.4 L434.6,422.4 L434.9,422.4 L435.1,422.4 L435.4,422.4 L435.6,422.4 L435.9,422.4 
+		L436.1,422.4 L436.4,422.4 L436.6,422.4 L436.9,422.4 L437.2,422.4 L437.4,422.4 L437.7,422.4 L437.9,422.4 
+		L438.2,422.4 L438.4,422.4 L438.7,422.4 L438.9,422.4 L439.2,422.4 L439.4,422.4 L439.7,422.4 L439.9,422.4 
+		L440.2,422.4 L440.4,422.4 L440.7,422.4 L440.9,422.4 L441.2,422.4 L441.4,422.4 L441.7,422.4 L441.9,422.4 
+		L442.2,422.4 L442.4,422.4 L442.7,422.4 L442.9,422.4 L443.2,422.4 L443.4,422.4 L443.7,422.4 L443.9,422.4 
+		L444.2,422.4 L444.4,422.4 L444.7,422.4 L444.9,422.4 L445.2,422.4 L445.5,422.4 L445.7,422.4 L446.0,422.4 
+		L446.2,422.4 L446.5,422.4 L446.7,422.4 L447.0,422.4 L447.2,422.4 L447.5,422.4 L447.7,422.4 L448.0,422.4 
+		L448.2,422.4 L448.5,422.4 L448.7,422.4 L449.0,422.4 L449.2,422.4 L449.5,422.4 L449.7,422.4 L450.0,422.4 
+		L450.2,422.4 L450.5,422.4 L450.7,422.4 L451.0,422.4 L451.2,422.4 L451.5,422.4 L451.7,422.4 L452.0,422.4 
+		L452.2,422.4 L452.5,422.4 L452.7,422.4 L453.0,422.4 L453.2,422.4 L453.5,422.4 L453.8,422.4 L454.0,422.4 
+		L454.3,422.4 L454.5,422.4 L454.8,422.4 L455.0,422.4 L455.3,422.4 L455.5,422.4 L455.8,422.4 L456.0,422.4 
+		L456.3,422.4 L456.5,422.4 L456.8,422.4 L457.0,422.4 L457.3,422.4 L457.5,422.4 L457.8,422.4 L458.0,422.4 
+		L458.3,422.4 L458.5,422.4 L458.8,422.4 L459.0,422.4 L459.3,422.4 L459.5,422.4 L459.8,422.4 L460.0,422.4 
+		L460.3,422.4 L460.5,422.4 L460.8,422.4 L461.0,422.4 L461.3,422.4 L461.6,422.4 L461.8,422.4 L462.1,422.4 
+		L462.3,422.4 L462.6,422.4 L462.8,422.4 L463.1,422.4 L463.3,422.4 L463.6,422.4 L463.8,422.4 L464.1,422.4 
+		L464.3,422.4 L464.6,422.4 L464.8,422.4 L465.1,422.4 L465.3,422.4 L465.6,422.4 L465.8,422.4 L466.1,422.4 
+		L466.3,422.4 L466.6,422.4 L466.8,422.4 L467.1,422.4 L467.3,422.4 L467.6,422.4 L467.8,422.4 L468.1,422.4 
+		L468.3,422.4 L468.6,422.4 L468.8,422.4 L469.1,422.4 L469.3,422.4 L469.6,422.4 L469.9,422.4 L470.1,422.4 
+		L470.4,422.4 L470.6,422.4 L470.9,422.4 L471.1,422.4 L471.4,422.4 L471.6,422.4 L471.9,422.4 L472.1,422.4 
+		L472.4,422.4 L472.6,422.4 L472.9,422.4 L473.1,422.4 L473.4,422.4 L473.6,422.4 L473.9,422.4 L474.1,422.4 
+		L474.4,422.4 L474.6,422.4 L474.9,422.4 L475.1,422.4 L475.4,422.4 L475.6,422.4 L475.9,422.4 L476.1,422.4 
+		L476.4,422.4 L476.6,422.4 L476.9,422.4 L477.1,422.4 L477.4,422.4 L477.7,422.4 L477.9,422.4 L478.2,422.4 
+		L478.4,422.4 L478.7,422.4 L478.9,422.4 L479.2,422.4 L479.4,422.4 L479.7,422.4 L479.9,422.4 L480.2,422.4 
+		L480.4,422.4 L480.7,422.4 L480.9,422.4 L481.2,422.4 L481.4,422.4 L481.7,422.4 L481.9,422.4 L482.2,422.4 
+		L482.4,422.4 L482.7,422.4 L482.9,422.4 L483.2,422.4 L483.4,422.4 L483.7,422.4 L483.9,422.4 L484.2,422.4 
+		L484.4,422.4 L484.7,422.4 L484.9,422.4 L485.2,422.4 L485.4,422.4 L485.7,422.4 L486.0,422.4 L486.2,422.4 
+		L486.5,422.4 L486.7,422.4 L487.0,422.4 L487.2,422.4 L487.5,422.4 L487.7,422.4 L488.0,422.4 L488.2,422.4 
+		L488.5,422.4 L488.7,422.4 L489.0,422.4 L489.2,422.4 L489.5,422.4 L489.7,422.4 L490.0,422.4 L490.2,422.4 
+		L490.5,422.4 L490.7,422.4 L491.0,422.4 L491.2,422.4 L491.5,422.4 L491.7,422.4 L492.0,422.4 L492.2,422.4 
+		L492.5,422.4 L492.7,422.4 L493.0,422.4 L493.2,422.4 L493.5,422.4 L493.7,422.4 L494.0,422.4 L494.3,422.4 
+		L494.5,422.4 L494.8,422.4 L495.0,422.4 L495.3,422.4 L495.5,422.4 L495.8,422.4 L496.0,422.4 L496.3,422.4 
+		L496.5,422.4 L496.8,422.4 L497.0,422.4 L497.3,422.4 L497.5,422.4 L497.8,422.4 L498.0,422.4 L498.3,422.4 
+		L498.5,422.4 L498.8,422.4 L499.0,422.4 L499.3,422.4 L499.5,422.4 L499.8,422.4 L500.0,422.4 L500.3,422.4 
+		L500.5,422.4 L500.8,422.4 L501.0,422.4 L501.3,422.4 L501.5,422.4 L501.8,422.4 L502.1,422.4 L502.3,422.4 
+		L502.6,422.4 L502.8,422.4 L503.1,422.4 L503.3,422.4 L503.6,422.4 L503.8,422.4 L504.1,422.4 L504.3,422.4 
+		L504.6,422.4 L504.8,422.4 L505.1,422.4 L505.3,422.4 L505.6,422.4 L505.8,422.4 L506.1,422.4 L506.3,422.4 
+		L506.6,422.4 L506.8,422.4 L507.1,422.4 L507.3,422.4 L507.6,422.4 L507.8,422.4 L508.1,422.4 L508.3,422.4 
+		L508.6,422.4 L508.8,422.4 L509.1,422.4 L509.3,422.4 L509.6,422.4 L509.8,422.4 L510.1,422.4 L510.4,422.4 
+		L510.6,422.4 L510.9,422.4 L511.1,422.4 L511.4,422.4 L511.6,422.4 L511.9,422.4 L512.1,422.4 L512.4,422.4 
+		L512.6,422.4 L512.9,422.4 L513.1,422.4 L513.4,422.4 L513.6,422.4 L513.9,422.4 L514.1,422.4 L514.4,422.4 
+		L514.6,422.4 L514.9,422.4 L515.1,422.4 L515.4,422.4 L515.6,422.4 L515.9,422.4 L516.1,422.4 L516.4,422.4 
+		L516.6,422.4 L516.9,422.4 L517.1,422.4 L517.4,422.4 L517.6,422.4 L517.9,422.4 L518.1,422.4 L518.4,422.4 
+		L518.7,422.4 L518.9,422.4 L519.2,422.4 L519.4,422.4 L519.7,422.4 L519.9,422.4 L520.2,422.4 L520.4,422.4 
+		L520.7,422.4 L520.9,422.4 L521.2,422.4 L521.4,422.4 L521.7,422.4 L521.9,422.4 L522.2,422.4 L522.4,422.4 
+		L522.7,422.4 L522.9,422.4 L523.2,422.4 L523.4,422.4 L523.7,422.4 L523.9,422.4 L524.2,422.4 L524.4,422.4 
+		L524.7,422.4 L524.9,422.4 L525.2,422.4 L525.4,422.4 L525.7,422.4 L525.9,422.4 L526.2,422.4 L526.5,422.4 
+		L526.7,422.4 L527.0,422.4 L527.2,422.4 L527.5,422.4 L527.7,422.4 L528.0,422.4 L528.2,422.4 L528.5,422.4 
+		L528.7,422.4 L529.0,422.4 L529.2,422.4 L529.5,422.4 L529.7,422.4 L530.0,422.4 L530.2,422.4 L530.5,422.4 
+		L530.7,422.4 L531.0,422.4 L531.2,422.4 L531.5,422.4 L531.7,422.4 L532.0,422.4 L532.2,422.4 L532.5,422.4 
+		L532.7,422.4 L533.0,422.4 L533.2,422.4 L533.5,422.4 L533.7,422.4 L534.0,422.4 L534.2,422.4 L534.5,422.4 
+		L534.8,422.4 L535.0,422.4 L535.3,422.4 L535.5,422.4 L535.8,422.4 L536.0,422.4 L536.3,422.4 L536.5,422.4 
+		L536.8,422.4 L537.0,422.4 L537.3,422.4 L537.5,422.4 L537.8,422.4 L538.0,422.4 L538.3,422.4 L538.5,422.4 
+		L538.8,422.4 L539.0,422.4 L539.3,422.4 L539.5,422.4 L539.8,422.4 L540.0,422.4 L540.3,422.4 L540.5,422.4 
+		L540.8,422.4 L541.0,422.4 L541.3,422.4 L541.5,422.4 L541.8,422.4 L542.0,422.4 L542.3,422.4 L542.6,422.4 
+		L542.8,422.4 L543.1,422.4 L543.3,422.4 L543.6,422.4 L543.8,422.4 L544.1,422.4 L544.3,422.4 L544.6,422.4 
+		L544.8,422.4 L545.1,422.4 L545.3,422.4 L545.6,422.4 L545.8,422.4 L546.1,422.4 L546.3,422.4 L546.6,422.4 
+		L546.8,422.4 L547.1,422.4 L547.3,422.4 L547.6,422.4 L547.8,422.4 L548.1,422.4 L548.3,422.4 L548.6,422.4 
+		L548.8,422.4 L549.1,422.4 L549.3,422.4 L549.6,422.4 L549.8,422.4 L550.1,422.4 L550.3,422.4 L550.6,422.4 
+		L550.9,422.4 L551.1,422.4 L551.4,422.4 L551.6,422.4 L551.9,422.4 L552.1,422.4 L552.4,422.4 L552.6,422.4 
+		L552.9,422.4 L553.1,422.4 L553.4,422.4 L553.6,422.4 L553.9,422.4 L554.1,422.4 L554.4,422.4 L554.6,422.4 
+		L554.9,422.4 L555.1,422.4 L555.4,422.4 L555.6,422.4 L555.9,422.4 L556.1,422.4 L556.4,422.4 L556.6,422.4 
+		L556.9,422.4 L557.1,422.4 L557.4,422.4 L557.6,422.4 L557.9,422.4 L558.1,422.4 L558.4,422.4 L558.6,422.4 
+		L558.9,422.4 L559.2,422.4 L559.4,422.4 L559.7,422.4 L559.9,422.4 L560.2,422.4 L560.4,422.4 L560.7,422.4 
+		L560.9,422.4 L561.2,422.4 L561.4,422.4 L561.7,422.4 L561.9,422.4 L562.2,422.4 L562.4,422.4 L562.7,422.4 
+		L562.9,422.4 L563.2,422.4 L563.4,422.4 L563.7,422.4 L563.9,422.4 L564.2,422.4 L564.4,422.4 L564.7,422.4 
+		L564.9,422.4 L565.2,422.4 L565.4,422.4 L565.7,422.4 L565.9,422.4 L566.2,422.4 L566.4,422.4 L566.7,422.4 
+		L567.0,422.4 L567.2,422.4 L567.5,422.4 L567.7,422.4 L568.0,422.4 L568.2,422.4 L568.5,422.4 L568.7,422.4 
+		L569.0,422.4 L569.2,422.4 L569.5,422.4 L569.7,422.4 L570.0,422.4 L570.2,422.4 L570.5,422.4 L570.7,422.4 
+		L571.0,422.4 L571.2,422.4 L571.5,422.4 L571.7,422.4 L572.0,422.4 L572.2,422.4 L572.5,422.4 L572.7,422.4 
+		L573.0,422.4 L573.2,422.4 L573.5,422.4 L573.7,422.4 L574.0,422.4 L574.2,422.4 L574.5,422.4 L574.7,422.4 
+		'></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma_1.0_2.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_1.0_2.0.dat
new file mode 100644
index 0000000..db3087f
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_1.0_2.0.dat
@@ -0,0 +1,2012 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.500000
+0.010000	0.497506
+0.020000	0.495025
+0.030000	0.492556
+0.040000	0.490099
+0.050000	0.487655
+0.060000	0.485223
+0.070000	0.482803
+0.080000	0.480395
+0.090000	0.477999
+0.100000	0.475615
+0.110000	0.473243
+0.120000	0.470882
+0.130000	0.468534
+0.140000	0.466197
+0.150000	0.463872
+0.160000	0.461558
+0.170000	0.459256
+0.180000	0.456966
+0.190000	0.454686
+0.200000	0.452419
+0.210000	0.450162
+0.220000	0.447917
+0.230000	0.445683
+0.240000	0.443460
+0.250000	0.441248
+0.260000	0.439048
+0.270000	0.436858
+0.280000	0.434679
+0.290000	0.432511
+0.300000	0.430354
+0.310000	0.428208
+0.320000	0.426072
+0.330000	0.423947
+0.340000	0.421832
+0.350000	0.419729
+0.360000	0.417635
+0.370000	0.415552
+0.380000	0.413480
+0.390000	0.411417
+0.400000	0.409365
+0.410000	0.407324
+0.420000	0.405292
+0.430000	0.403271
+0.440000	0.401259
+0.450000	0.399258
+0.460000	0.397267
+0.470000	0.395285
+0.480000	0.393314
+0.490000	0.391352
+0.500000	0.389400
+0.510000	0.387458
+0.520000	0.385526
+0.530000	0.383603
+0.540000	0.381690
+0.550000	0.379786
+0.560000	0.377892
+0.570000	0.376007
+0.580000	0.374132
+0.590000	0.372266
+0.600000	0.370409
+0.610000	0.368562
+0.620000	0.366723
+0.630000	0.364894
+0.640000	0.363075
+0.650000	0.361264
+0.660000	0.359462
+0.670000	0.357669
+0.680000	0.355885
+0.690000	0.354110
+0.700000	0.352344
+0.710000	0.350587
+0.720000	0.348838
+0.730000	0.347098
+0.740000	0.345367
+0.750000	0.343645
+0.760000	0.341931
+0.770000	0.340225
+0.780000	0.338528
+0.790000	0.336840
+0.800000	0.335160
+0.810000	0.333488
+0.820000	0.331825
+0.830000	0.330170
+0.840000	0.328523
+0.850000	0.326885
+0.860000	0.325255
+0.870000	0.323632
+0.880000	0.322018
+0.890000	0.320412
+0.900000	0.318814
+0.910000	0.317224
+0.920000	0.315642
+0.930000	0.314068
+0.940000	0.312501
+0.950000	0.310943
+0.960000	0.309392
+0.970000	0.307849
+0.980000	0.306313
+0.990000	0.304785
+1.000000	0.303265
+1.010000	0.301753
+1.020000	0.300248
+1.030000	0.298750
+1.040000	0.297260
+1.050000	0.295778
+1.060000	0.294302
+1.070000	0.292835
+1.080000	0.291374
+1.090000	0.289921
+1.100000	0.288475
+1.110000	0.287036
+1.120000	0.285605
+1.130000	0.284180
+1.140000	0.282763
+1.150000	0.281352
+1.160000	0.279949
+1.170000	0.278553
+1.180000	0.277164
+1.190000	0.275781
+1.200000	0.274406
+1.210000	0.273037
+1.220000	0.271675
+1.230000	0.270320
+1.240000	0.268972
+1.250000	0.267631
+1.260000	0.266296
+1.270000	0.264968
+1.280000	0.263646
+1.290000	0.262331
+1.300000	0.261023
+1.310000	0.259721
+1.320000	0.258426
+1.330000	0.257137
+1.340000	0.255854
+1.350000	0.254578
+1.360000	0.253308
+1.370000	0.252045
+1.380000	0.250788
+1.390000	0.249537
+1.400000	0.248293
+1.410000	0.247054
+1.420000	0.245822
+1.430000	0.244596
+1.440000	0.243376
+1.450000	0.242162
+1.460000	0.240954
+1.470000	0.239753
+1.480000	0.238557
+1.490000	0.237367
+1.500000	0.236183
+1.510000	0.235005
+1.520000	0.233833
+1.530000	0.232667
+1.540000	0.231507
+1.550000	0.230352
+1.560000	0.229203
+1.570000	0.228060
+1.580000	0.226922
+1.590000	0.225791
+1.600000	0.224664
+1.610000	0.223544
+1.620000	0.222429
+1.630000	0.221320
+1.640000	0.220216
+1.650000	0.219117
+1.660000	0.218025
+1.670000	0.216937
+1.680000	0.215855
+1.690000	0.214779
+1.700000	0.213707
+1.710000	0.212642
+1.720000	0.211581
+1.730000	0.210526
+1.740000	0.209476
+1.750000	0.208431
+1.760000	0.207391
+1.770000	0.206357
+1.780000	0.205328
+1.790000	0.204304
+1.800000	0.203285
+1.810000	0.202271
+1.820000	0.201262
+1.830000	0.200258
+1.840000	0.199260
+1.850000	0.198266
+1.860000	0.197277
+1.870000	0.196293
+1.880000	0.195314
+1.890000	0.194340
+1.900000	0.193371
+1.910000	0.192406
+1.920000	0.191446
+1.930000	0.190492
+1.940000	0.189542
+1.950000	0.188596
+1.960000	0.187656
+1.970000	0.186720
+1.980000	0.185788
+1.990000	0.184862
+2.000000	0.183940
+2.010000	0.183022
+2.020000	0.182109
+2.030000	0.181201
+2.040000	0.180297
+2.050000	0.179398
+2.060000	0.178503
+2.070000	0.177613
+2.080000	0.176727
+2.090000	0.175846
+2.100000	0.174969
+2.110000	0.174096
+2.120000	0.173228
+2.130000	0.172364
+2.140000	0.171504
+2.150000	0.170649
+2.160000	0.169798
+2.170000	0.168951
+2.180000	0.168108
+2.190000	0.167270
+2.200000	0.166436
+2.210000	0.165605
+2.220000	0.164779
+2.230000	0.163958
+2.240000	0.163140
+2.250000	0.162326
+2.260000	0.161517
+2.270000	0.160711
+2.280000	0.159910
+2.290000	0.159112
+2.300000	0.158318
+2.310000	0.157529
+2.320000	0.156743
+2.330000	0.155961
+2.340000	0.155183
+2.350000	0.154409
+2.360000	0.153639
+2.370000	0.152873
+2.380000	0.152111
+2.390000	0.151352
+2.400000	0.150597
+2.410000	0.149846
+2.420000	0.149099
+2.430000	0.148355
+2.440000	0.147615
+2.450000	0.146879
+2.460000	0.146146
+2.470000	0.145417
+2.480000	0.144692
+2.490000	0.143970
+2.500000	0.143252
+2.510000	0.142538
+2.520000	0.141827
+2.530000	0.141120
+2.540000	0.140416
+2.550000	0.139715
+2.560000	0.139019
+2.570000	0.138325
+2.580000	0.137635
+2.590000	0.136949
+2.600000	0.136266
+2.610000	0.135586
+2.620000	0.134910
+2.630000	0.134237
+2.640000	0.133568
+2.650000	0.132901
+2.660000	0.132239
+2.670000	0.131579
+2.680000	0.130923
+2.690000	0.130270
+2.700000	0.129620
+2.710000	0.128974
+2.720000	0.128330
+2.730000	0.127690
+2.740000	0.127053
+2.750000	0.126420
+2.760000	0.125789
+2.770000	0.125162
+2.780000	0.124538
+2.790000	0.123917
+2.800000	0.123298
+2.810000	0.122684
+2.820000	0.122072
+2.830000	0.121463
+2.840000	0.120857
+2.850000	0.120254
+2.860000	0.119654
+2.870000	0.119058
+2.880000	0.118464
+2.890000	0.117873
+2.900000	0.117285
+2.910000	0.116700
+2.920000	0.116118
+2.930000	0.115539
+2.940000	0.114963
+2.950000	0.114389
+2.960000	0.113819
+2.970000	0.113251
+2.980000	0.112686
+2.990000	0.112124
+3.000000	0.111565
+3.010000	0.111009
+3.020000	0.110455
+3.030000	0.109904
+3.040000	0.109356
+3.050000	0.108811
+3.060000	0.108268
+3.070000	0.107728
+3.080000	0.107191
+3.090000	0.106656
+3.100000	0.106124
+3.110000	0.105595
+3.120000	0.105068
+3.130000	0.104544
+3.140000	0.104023
+3.150000	0.103504
+3.160000	0.102988
+3.170000	0.102474
+3.180000	0.101963
+3.190000	0.101454
+3.200000	0.100948
+3.210000	0.100445
+3.220000	0.099944
+3.230000	0.099445
+3.240000	0.098949
+3.250000	0.098456
+3.260000	0.097965
+3.270000	0.097476
+3.280000	0.096990
+3.290000	0.096506
+3.300000	0.096025
+3.310000	0.095546
+3.320000	0.095069
+3.330000	0.094595
+3.340000	0.094124
+3.350000	0.093654
+3.360000	0.093187
+3.370000	0.092722
+3.380000	0.092260
+3.390000	0.091800
+3.400000	0.091342
+3.410000	0.090886
+3.420000	0.090433
+3.430000	0.089982
+3.440000	0.089533
+3.450000	0.089087
+3.460000	0.088642
+3.470000	0.088200
+3.480000	0.087760
+3.490000	0.087322
+3.500000	0.086887
+3.510000	0.086454
+3.520000	0.086022
+3.530000	0.085593
+3.540000	0.085166
+3.550000	0.084742
+3.560000	0.084319
+3.570000	0.083899
+3.580000	0.083480
+3.590000	0.083064
+3.600000	0.082649
+3.610000	0.082237
+3.620000	0.081827
+3.630000	0.081419
+3.640000	0.081013
+3.650000	0.080609
+3.660000	0.080207
+3.670000	0.079807
+3.680000	0.079409
+3.690000	0.079013
+3.700000	0.078619
+3.710000	0.078226
+3.720000	0.077836
+3.730000	0.077448
+3.740000	0.077062
+3.750000	0.076677
+3.760000	0.076295
+3.770000	0.075915
+3.780000	0.075536
+3.790000	0.075159
+3.800000	0.074784
+3.810000	0.074411
+3.820000	0.074040
+3.830000	0.073671
+3.840000	0.073303
+3.850000	0.072938
+3.860000	0.072574
+3.870000	0.072212
+3.880000	0.071852
+3.890000	0.071494
+3.900000	0.071137
+3.910000	0.070782
+3.920000	0.070429
+3.930000	0.070078
+3.940000	0.069728
+3.950000	0.069381
+3.960000	0.069035
+3.970000	0.068690
+3.980000	0.068348
+3.990000	0.068007
+4.000000	0.067668
+4.010000	0.067330
+4.020000	0.066994
+4.030000	0.066660
+4.040000	0.066328
+4.050000	0.065997
+4.060000	0.065668
+4.070000	0.065340
+4.080000	0.065014
+4.090000	0.064690
+4.100000	0.064367
+4.110000	0.064046
+4.120000	0.063727
+4.130000	0.063409
+4.140000	0.063093
+4.150000	0.062778
+4.160000	0.062465
+4.170000	0.062154
+4.180000	0.061844
+4.190000	0.061535
+4.200000	0.061228
+4.210000	0.060923
+4.220000	0.060619
+4.230000	0.060317
+4.240000	0.060016
+4.250000	0.059716
+4.260000	0.059419
+4.270000	0.059122
+4.280000	0.058827
+4.290000	0.058534
+4.300000	0.058242
+4.310000	0.057952
+4.320000	0.057663
+4.330000	0.057375
+4.340000	0.057089
+4.350000	0.056804
+4.360000	0.056521
+4.370000	0.056239
+4.380000	0.055958
+4.390000	0.055679
+4.400000	0.055402
+4.410000	0.055125
+4.420000	0.054850
+4.430000	0.054577
+4.440000	0.054305
+4.450000	0.054034
+4.460000	0.053764
+4.470000	0.053496
+4.480000	0.053229
+4.490000	0.052964
+4.500000	0.052700
+4.510000	0.052437
+4.520000	0.052175
+4.530000	0.051915
+4.540000	0.051656
+4.550000	0.051398
+4.560000	0.051142
+4.570000	0.050887
+4.580000	0.050633
+4.590000	0.050381
+4.600000	0.050129
+4.610000	0.049879
+4.620000	0.049631
+4.630000	0.049383
+4.640000	0.049137
+4.650000	0.048892
+4.660000	0.048648
+4.670000	0.048405
+4.680000	0.048164
+4.690000	0.047924
+4.700000	0.047685
+4.710000	0.047447
+4.720000	0.047210
+4.730000	0.046975
+4.740000	0.046740
+4.750000	0.046507
+4.760000	0.046275
+4.770000	0.046044
+4.780000	0.045815
+4.790000	0.045586
+4.800000	0.045359
+4.810000	0.045133
+4.820000	0.044908
+4.830000	0.044684
+4.840000	0.044461
+4.850000	0.044239
+4.860000	0.044018
+4.870000	0.043799
+4.880000	0.043580
+4.890000	0.043363
+4.900000	0.043147
+4.910000	0.042932
+4.920000	0.042717
+4.930000	0.042504
+4.940000	0.042292
+4.950000	0.042081
+4.960000	0.041872
+4.970000	0.041663
+4.980000	0.041455
+4.990000	0.041248
+5.000000	0.041042
+5.010000	0.040838
+5.020000	0.040634
+5.030000	0.040431
+5.040000	0.040230
+5.050000	0.040029
+5.060000	0.039830
+5.070000	0.039631
+5.080000	0.039433
+5.090000	0.039237
+5.100000	0.039041
+5.110000	0.038846
+5.120000	0.038652
+5.130000	0.038460
+5.140000	0.038268
+5.150000	0.038077
+5.160000	0.037887
+5.170000	0.037698
+5.180000	0.037510
+5.190000	0.037323
+5.200000	0.037137
+5.210000	0.036952
+5.220000	0.036767
+5.230000	0.036584
+5.240000	0.036401
+5.250000	0.036220
+5.260000	0.036039
+5.270000	0.035859
+5.280000	0.035681
+5.290000	0.035503
+5.300000	0.035326
+5.310000	0.035149
+5.320000	0.034974
+5.330000	0.034800
+5.340000	0.034626
+5.350000	0.034453
+5.360000	0.034282
+5.370000	0.034111
+5.380000	0.033940
+5.390000	0.033771
+5.400000	0.033603
+5.410000	0.033435
+5.420000	0.033268
+5.430000	0.033102
+5.440000	0.032937
+5.450000	0.032773
+5.460000	0.032610
+5.470000	0.032447
+5.480000	0.032285
+5.490000	0.032124
+5.500000	0.031964
+5.510000	0.031805
+5.520000	0.031646
+5.530000	0.031488
+5.540000	0.031331
+5.550000	0.031175
+5.560000	0.031019
+5.570000	0.030865
+5.580000	0.030711
+5.590000	0.030557
+5.600000	0.030405
+5.610000	0.030253
+5.620000	0.030102
+5.630000	0.029952
+5.640000	0.029803
+5.650000	0.029654
+5.660000	0.029506
+5.670000	0.029359
+5.680000	0.029213
+5.690000	0.029067
+5.700000	0.028922
+5.710000	0.028778
+5.720000	0.028634
+5.730000	0.028492
+5.740000	0.028349
+5.750000	0.028208
+5.760000	0.028067
+5.770000	0.027927
+5.780000	0.027788
+5.790000	0.027650
+5.800000	0.027512
+5.810000	0.027374
+5.820000	0.027238
+5.830000	0.027102
+5.840000	0.026967
+5.850000	0.026832
+5.860000	0.026699
+5.870000	0.026565
+5.880000	0.026433
+5.890000	0.026301
+5.900000	0.026170
+5.910000	0.026039
+5.920000	0.025909
+5.930000	0.025780
+5.940000	0.025652
+5.950000	0.025524
+5.960000	0.025396
+5.970000	0.025270
+5.980000	0.025144
+5.990000	0.025018
+6.000000	0.024894
+6.010000	0.024769
+6.020000	0.024646
+6.030000	0.024523
+6.040000	0.024401
+6.050000	0.024279
+6.060000	0.024158
+6.070000	0.024037
+6.080000	0.023917
+6.090000	0.023798
+6.100000	0.023679
+6.110000	0.023561
+6.120000	0.023444
+6.130000	0.023327
+6.140000	0.023211
+6.150000	0.023095
+6.160000	0.022980
+6.170000	0.022865
+6.180000	0.022751
+6.190000	0.022638
+6.200000	0.022525
+6.210000	0.022412
+6.220000	0.022300
+6.230000	0.022189
+6.240000	0.022079
+6.250000	0.021968
+6.260000	0.021859
+6.270000	0.021750
+6.280000	0.021641
+6.290000	0.021533
+6.300000	0.021426
+6.310000	0.021319
+6.320000	0.021213
+6.330000	0.021107
+6.340000	0.021002
+6.350000	0.020897
+6.360000	0.020793
+6.370000	0.020689
+6.380000	0.020586
+6.390000	0.020483
+6.400000	0.020381
+6.410000	0.020279
+6.420000	0.020178
+6.430000	0.020078
+6.440000	0.019978
+6.450000	0.019878
+6.460000	0.019779
+6.470000	0.019680
+6.480000	0.019582
+6.490000	0.019484
+6.500000	0.019387
+6.510000	0.019290
+6.520000	0.019194
+6.530000	0.019098
+6.540000	0.019003
+6.550000	0.018908
+6.560000	0.018814
+6.570000	0.018720
+6.580000	0.018627
+6.590000	0.018534
+6.600000	0.018442
+6.610000	0.018350
+6.620000	0.018258
+6.630000	0.018167
+6.640000	0.018076
+6.650000	0.017986
+6.660000	0.017897
+6.670000	0.017807
+6.680000	0.017718
+6.690000	0.017630
+6.700000	0.017542
+6.710000	0.017455
+6.720000	0.017368
+6.730000	0.017281
+6.740000	0.017195
+6.750000	0.017109
+6.760000	0.017024
+6.770000	0.016939
+6.780000	0.016854
+6.790000	0.016770
+6.800000	0.016687
+6.810000	0.016603
+6.820000	0.016521
+6.830000	0.016438
+6.840000	0.016356
+6.850000	0.016275
+6.860000	0.016193
+6.870000	0.016113
+6.880000	0.016032
+6.890000	0.015952
+6.900000	0.015873
+6.910000	0.015794
+6.920000	0.015715
+6.930000	0.015637
+6.940000	0.015559
+6.950000	0.015481
+6.960000	0.015404
+6.970000	0.015327
+6.980000	0.015250
+6.990000	0.015174
+7.000000	0.015099
+7.010000	0.015023
+7.020000	0.014948
+7.030000	0.014874
+7.040000	0.014800
+7.050000	0.014726
+7.060000	0.014652
+7.070000	0.014579
+7.080000	0.014507
+7.090000	0.014434
+7.100000	0.014362
+7.110000	0.014291
+7.120000	0.014219
+7.130000	0.014148
+7.140000	0.014078
+7.150000	0.014008
+7.160000	0.013938
+7.170000	0.013868
+7.180000	0.013799
+7.190000	0.013730
+7.200000	0.013662
+7.210000	0.013594
+7.220000	0.013526
+7.230000	0.013458
+7.240000	0.013391
+7.250000	0.013325
+7.260000	0.013258
+7.270000	0.013192
+7.280000	0.013126
+7.290000	0.013061
+7.300000	0.012996
+7.310000	0.012931
+7.320000	0.012866
+7.330000	0.012802
+7.340000	0.012738
+7.350000	0.012675
+7.360000	0.012611
+7.370000	0.012549
+7.380000	0.012486
+7.390000	0.012424
+7.400000	0.012362
+7.410000	0.012300
+7.420000	0.012239
+7.430000	0.012178
+7.440000	0.012117
+7.450000	0.012057
+7.460000	0.011996
+7.470000	0.011937
+7.480000	0.011877
+7.490000	0.011818
+7.500000	0.011759
+7.510000	0.011700
+7.520000	0.011642
+7.530000	0.011584
+7.540000	0.011526
+7.550000	0.011469
+7.560000	0.011411
+7.570000	0.011354
+7.580000	0.011298
+7.590000	0.011241
+7.600000	0.011185
+7.610000	0.011130
+7.620000	0.011074
+7.630000	0.011019
+7.640000	0.010964
+7.650000	0.010909
+7.660000	0.010855
+7.670000	0.010801
+7.680000	0.010747
+7.690000	0.010693
+7.700000	0.010640
+7.710000	0.010587
+7.720000	0.010534
+7.730000	0.010481
+7.740000	0.010429
+7.750000	0.010377
+7.760000	0.010325
+7.770000	0.010274
+7.780000	0.010223
+7.790000	0.010172
+7.800000	0.010121
+7.810000	0.010070
+7.820000	0.010020
+7.830000	0.009970
+7.840000	0.009921
+7.850000	0.009871
+7.860000	0.009822
+7.870000	0.009773
+7.880000	0.009724
+7.890000	0.009676
+7.900000	0.009627
+7.910000	0.009579
+7.920000	0.009532
+7.930000	0.009484
+7.940000	0.009437
+7.950000	0.009390
+7.960000	0.009343
+7.970000	0.009296
+7.980000	0.009250
+7.990000	0.009204
+8.000000	0.009158
+8.010000	0.009112
+8.020000	0.009067
+8.030000	0.009021
+8.040000	0.008976
+8.050000	0.008932
+8.060000	0.008887
+8.070000	0.008843
+8.080000	0.008799
+8.090000	0.008755
+8.100000	0.008711
+8.110000	0.008668
+8.120000	0.008625
+8.130000	0.008581
+8.140000	0.008539
+8.150000	0.008496
+8.160000	0.008454
+8.170000	0.008412
+8.180000	0.008370
+8.190000	0.008328
+8.200000	0.008286
+8.210000	0.008245
+8.220000	0.008204
+8.230000	0.008163
+8.240000	0.008122
+8.250000	0.008082
+8.260000	0.008041
+8.270000	0.008001
+8.280000	0.007961
+8.290000	0.007922
+8.300000	0.007882
+8.310000	0.007843
+8.320000	0.007804
+8.330000	0.007765
+8.340000	0.007726
+8.350000	0.007688
+8.360000	0.007649
+8.370000	0.007611
+8.380000	0.007573
+8.390000	0.007535
+8.400000	0.007498
+8.410000	0.007460
+8.420000	0.007423
+8.430000	0.007386
+8.440000	0.007349
+8.450000	0.007313
+8.460000	0.007276
+8.470000	0.007240
+8.480000	0.007204
+8.490000	0.007168
+8.500000	0.007132
+8.510000	0.007097
+8.520000	0.007061
+8.530000	0.007026
+8.540000	0.006991
+8.550000	0.006956
+8.560000	0.006921
+8.570000	0.006887
+8.580000	0.006852
+8.590000	0.006818
+8.600000	0.006784
+8.610000	0.006750
+8.620000	0.006717
+8.630000	0.006683
+8.640000	0.006650
+8.650000	0.006617
+8.660000	0.006584
+8.670000	0.006551
+8.680000	0.006518
+8.690000	0.006486
+8.700000	0.006453
+8.710000	0.006421
+8.720000	0.006389
+8.730000	0.006357
+8.740000	0.006326
+8.750000	0.006294
+8.760000	0.006263
+8.770000	0.006231
+8.780000	0.006200
+8.790000	0.006169
+8.800000	0.006139
+8.810000	0.006108
+8.820000	0.006078
+8.830000	0.006047
+8.840000	0.006017
+8.850000	0.005987
+8.860000	0.005957
+8.870000	0.005928
+8.880000	0.005898
+8.890000	0.005869
+8.900000	0.005839
+8.910000	0.005810
+8.920000	0.005781
+8.930000	0.005752
+8.940000	0.005724
+8.950000	0.005695
+8.960000	0.005667
+8.970000	0.005638
+8.980000	0.005610
+8.990000	0.005582
+9.000000	0.005554
+9.010000	0.005527
+9.020000	0.005499
+9.030000	0.005472
+9.040000	0.005445
+9.050000	0.005417
+9.060000	0.005390
+9.070000	0.005363
+9.080000	0.005337
+9.090000	0.005310
+9.100000	0.005284
+9.110000	0.005257
+9.120000	0.005231
+9.130000	0.005205
+9.140000	0.005179
+9.150000	0.005153
+9.160000	0.005127
+9.170000	0.005102
+9.180000	0.005076
+9.190000	0.005051
+9.200000	0.005026
+9.210000	0.005001
+9.220000	0.004976
+9.230000	0.004951
+9.240000	0.004926
+9.250000	0.004902
+9.260000	0.004877
+9.270000	0.004853
+9.280000	0.004829
+9.290000	0.004805
+9.300000	0.004781
+9.310000	0.004757
+9.320000	0.004733
+9.330000	0.004710
+9.340000	0.004686
+9.350000	0.004663
+9.360000	0.004640
+9.370000	0.004616
+9.380000	0.004593
+9.390000	0.004570
+9.400000	0.004548
+9.410000	0.004525
+9.420000	0.004502
+9.430000	0.004480
+9.440000	0.004458
+9.450000	0.004435
+9.460000	0.004413
+9.470000	0.004391
+9.480000	0.004369
+9.490000	0.004348
+9.500000	0.004326
+9.510000	0.004304
+9.520000	0.004283
+9.530000	0.004261
+9.540000	0.004240
+9.550000	0.004219
+9.560000	0.004198
+9.570000	0.004177
+9.580000	0.004156
+9.590000	0.004135
+9.600000	0.004115
+9.610000	0.004094
+9.620000	0.004074
+9.630000	0.004054
+9.640000	0.004033
+9.650000	0.004013
+9.660000	0.003993
+9.670000	0.003973
+9.680000	0.003954
+9.690000	0.003934
+9.700000	0.003914
+9.710000	0.003895
+9.720000	0.003875
+9.730000	0.003856
+9.740000	0.003837
+9.750000	0.003818
+9.760000	0.003799
+9.770000	0.003780
+9.780000	0.003761
+9.790000	0.003742
+9.800000	0.003723
+9.810000	0.003705
+9.820000	0.003686
+9.830000	0.003668
+9.840000	0.003650
+9.850000	0.003631
+9.860000	0.003613
+9.870000	0.003595
+9.880000	0.003577
+9.890000	0.003559
+9.900000	0.003542
+9.910000	0.003524
+9.920000	0.003506
+9.930000	0.003489
+9.940000	0.003472
+9.950000	0.003454
+9.960000	0.003437
+9.970000	0.003420
+9.980000	0.003403
+9.990000	0.003386
+10.000000	0.003369
+10.010000	0.003352
+10.020000	0.003335
+10.030000	0.003319
+10.040000	0.003302
+10.050000	0.003286
+10.060000	0.003269
+10.070000	0.003253
+10.080000	0.003237
+10.090000	0.003221
+10.100000	0.003205
+10.110000	0.003189
+10.120000	0.003173
+10.130000	0.003157
+10.140000	0.003141
+10.150000	0.003126
+10.160000	0.003110
+10.170000	0.003094
+10.180000	0.003079
+10.190000	0.003064
+10.200000	0.003048
+10.210000	0.003033
+10.220000	0.003018
+10.230000	0.003003
+10.240000	0.002988
+10.250000	0.002973
+10.260000	0.002958
+10.270000	0.002944
+10.280000	0.002929
+10.290000	0.002914
+10.300000	0.002900
+10.310000	0.002885
+10.320000	0.002871
+10.330000	0.002857
+10.340000	0.002842
+10.350000	0.002828
+10.360000	0.002814
+10.370000	0.002800
+10.380000	0.002786
+10.390000	0.002772
+10.400000	0.002758
+10.410000	0.002745
+10.420000	0.002731
+10.430000	0.002717
+10.440000	0.002704
+10.450000	0.002690
+10.460000	0.002677
+10.470000	0.002663
+10.480000	0.002650
+10.490000	0.002637
+10.500000	0.002624
+10.510000	0.002611
+10.520000	0.002598
+10.530000	0.002585
+10.540000	0.002572
+10.550000	0.002559
+10.560000	0.002546
+10.570000	0.002534
+10.580000	0.002521
+10.590000	0.002508
+10.600000	0.002496
+10.610000	0.002483
+10.620000	0.002471
+10.630000	0.002459
+10.640000	0.002446
+10.650000	0.002434
+10.660000	0.002422
+10.670000	0.002410
+10.680000	0.002398
+10.690000	0.002386
+10.700000	0.002374
+10.710000	0.002362
+10.720000	0.002350
+10.730000	0.002339
+10.740000	0.002327
+10.750000	0.002315
+10.760000	0.002304
+10.770000	0.002292
+10.780000	0.002281
+10.790000	0.002270
+10.800000	0.002258
+10.810000	0.002247
+10.820000	0.002236
+10.830000	0.002225
+10.840000	0.002214
+10.850000	0.002203
+10.860000	0.002192
+10.870000	0.002181
+10.880000	0.002170
+10.890000	0.002159
+10.900000	0.002148
+10.910000	0.002137
+10.920000	0.002127
+10.930000	0.002116
+10.940000	0.002106
+10.950000	0.002095
+10.960000	0.002085
+10.970000	0.002074
+10.980000	0.002064
+10.990000	0.002054
+11.000000	0.002043
+11.010000	0.002033
+11.020000	0.002023
+11.030000	0.002013
+11.040000	0.002003
+11.050000	0.001993
+11.060000	0.001983
+11.070000	0.001973
+11.080000	0.001963
+11.090000	0.001953
+11.100000	0.001944
+11.110000	0.001934
+11.120000	0.001924
+11.130000	0.001915
+11.140000	0.001905
+11.150000	0.001896
+11.160000	0.001886
+11.170000	0.001877
+11.180000	0.001868
+11.190000	0.001858
+11.200000	0.001849
+11.210000	0.001840
+11.220000	0.001831
+11.230000	0.001821
+11.240000	0.001812
+11.250000	0.001803
+11.260000	0.001794
+11.270000	0.001785
+11.280000	0.001776
+11.290000	0.001768
+11.300000	0.001759
+11.310000	0.001750
+11.320000	0.001741
+11.330000	0.001733
+11.340000	0.001724
+11.350000	0.001715
+11.360000	0.001707
+11.370000	0.001698
+11.380000	0.001690
+11.390000	0.001681
+11.400000	0.001673
+11.410000	0.001665
+11.420000	0.001656
+11.430000	0.001648
+11.440000	0.001640
+11.450000	0.001632
+11.460000	0.001624
+11.470000	0.001615
+11.480000	0.001607
+11.490000	0.001599
+11.500000	0.001591
+11.510000	0.001583
+11.520000	0.001576
+11.530000	0.001568
+11.540000	0.001560
+11.550000	0.001552
+11.560000	0.001544
+11.570000	0.001537
+11.580000	0.001529
+11.590000	0.001521
+11.600000	0.001514
+11.610000	0.001506
+11.620000	0.001499
+11.630000	0.001491
+11.640000	0.001484
+11.650000	0.001476
+11.660000	0.001469
+11.670000	0.001462
+11.680000	0.001454
+11.690000	0.001447
+11.700000	0.001440
+11.710000	0.001433
+11.720000	0.001426
+11.730000	0.001419
+11.740000	0.001411
+11.750000	0.001404
+11.760000	0.001397
+11.770000	0.001390
+11.780000	0.001383
+11.790000	0.001377
+11.800000	0.001370
+11.810000	0.001363
+11.820000	0.001356
+11.830000	0.001349
+11.840000	0.001343
+11.850000	0.001336
+11.860000	0.001329
+11.870000	0.001323
+11.880000	0.001316
+11.890000	0.001309
+11.900000	0.001303
+11.910000	0.001296
+11.920000	0.001290
+11.930000	0.001284
+11.940000	0.001277
+11.950000	0.001271
+11.960000	0.001264
+11.970000	0.001258
+11.980000	0.001252
+11.990000	0.001246
+12.000000	0.001239
+12.010000	0.001233
+12.020000	0.001227
+12.030000	0.001221
+12.040000	0.001215
+12.050000	0.001209
+12.060000	0.001203
+12.070000	0.001197
+12.080000	0.001191
+12.090000	0.001185
+12.100000	0.001179
+12.110000	0.001173
+12.120000	0.001167
+12.130000	0.001161
+12.140000	0.001156
+12.150000	0.001150
+12.160000	0.001144
+12.170000	0.001138
+12.180000	0.001133
+12.190000	0.001127
+12.200000	0.001121
+12.210000	0.001116
+12.220000	0.001110
+12.230000	0.001105
+12.240000	0.001099
+12.250000	0.001094
+12.260000	0.001088
+12.270000	0.001083
+12.280000	0.001077
+12.290000	0.001072
+12.300000	0.001067
+12.310000	0.001061
+12.320000	0.001056
+12.330000	0.001051
+12.340000	0.001046
+12.350000	0.001040
+12.360000	0.001035
+12.370000	0.001030
+12.380000	0.001025
+12.390000	0.001020
+12.400000	0.001015
+12.410000	0.001010
+12.420000	0.001005
+12.430000	0.001000
+12.440000	0.000995
+12.450000	0.000990
+12.460000	0.000985
+12.470000	0.000980
+12.480000	0.000975
+12.490000	0.000970
+12.500000	0.000965
+12.510000	0.000960
+12.520000	0.000956
+12.530000	0.000951
+12.540000	0.000946
+12.550000	0.000941
+12.560000	0.000937
+12.570000	0.000932
+12.580000	0.000927
+12.590000	0.000923
+12.600000	0.000918
+12.610000	0.000914
+12.620000	0.000909
+12.630000	0.000904
+12.640000	0.000900
+12.650000	0.000895
+12.660000	0.000891
+12.670000	0.000887
+12.680000	0.000882
+12.690000	0.000878
+12.700000	0.000873
+12.710000	0.000869
+12.720000	0.000865
+12.730000	0.000860
+12.740000	0.000856
+12.750000	0.000852
+12.760000	0.000848
+12.770000	0.000843
+12.780000	0.000839
+12.790000	0.000835
+12.800000	0.000831
+12.810000	0.000827
+12.820000	0.000823
+12.830000	0.000818
+12.840000	0.000814
+12.850000	0.000810
+12.860000	0.000806
+12.870000	0.000802
+12.880000	0.000798
+12.890000	0.000794
+12.900000	0.000790
+12.910000	0.000786
+12.920000	0.000782
+12.930000	0.000778
+12.940000	0.000775
+12.950000	0.000771
+12.960000	0.000767
+12.970000	0.000763
+12.980000	0.000759
+12.990000	0.000755
+13.000000	0.000752
+13.010000	0.000748
+13.020000	0.000744
+13.030000	0.000741
+13.040000	0.000737
+13.050000	0.000733
+13.060000	0.000730
+13.070000	0.000726
+13.080000	0.000722
+13.090000	0.000719
+13.100000	0.000715
+13.110000	0.000711
+13.120000	0.000708
+13.130000	0.000704
+13.140000	0.000701
+13.150000	0.000697
+13.160000	0.000694
+13.170000	0.000690
+13.180000	0.000687
+13.190000	0.000684
+13.200000	0.000680
+13.210000	0.000677
+13.220000	0.000673
+13.230000	0.000670
+13.240000	0.000667
+13.250000	0.000663
+13.260000	0.000660
+13.270000	0.000657
+13.280000	0.000654
+13.290000	0.000650
+13.300000	0.000647
+13.310000	0.000644
+13.320000	0.000641
+13.330000	0.000637
+13.340000	0.000634
+13.350000	0.000631
+13.360000	0.000628
+13.370000	0.000625
+13.380000	0.000622
+13.390000	0.000619
+13.400000	0.000615
+13.410000	0.000612
+13.420000	0.000609
+13.430000	0.000606
+13.440000	0.000603
+13.450000	0.000600
+13.460000	0.000597
+13.470000	0.000594
+13.480000	0.000591
+13.490000	0.000588
+13.500000	0.000585
+13.510000	0.000583
+13.520000	0.000580
+13.530000	0.000577
+13.540000	0.000574
+13.550000	0.000571
+13.560000	0.000568
+13.570000	0.000565
+13.580000	0.000562
+13.590000	0.000560
+13.600000	0.000557
+13.610000	0.000554
+13.620000	0.000551
+13.630000	0.000549
+13.640000	0.000546
+13.650000	0.000543
+13.660000	0.000540
+13.670000	0.000538
+13.680000	0.000535
+13.690000	0.000532
+13.700000	0.000530
+13.710000	0.000527
+13.720000	0.000524
+13.730000	0.000522
+13.740000	0.000519
+13.750000	0.000517
+13.760000	0.000514
+13.770000	0.000512
+13.780000	0.000509
+13.790000	0.000506
+13.800000	0.000504
+13.810000	0.000501
+13.820000	0.000499
+13.830000	0.000496
+13.840000	0.000494
+13.850000	0.000491
+13.860000	0.000489
+13.870000	0.000487
+13.880000	0.000484
+13.890000	0.000482
+13.900000	0.000479
+13.910000	0.000477
+13.920000	0.000475
+13.930000	0.000472
+13.940000	0.000470
+13.950000	0.000467
+13.960000	0.000465
+13.970000	0.000463
+13.980000	0.000461
+13.990000	0.000458
+14.000000	0.000456
+14.010000	0.000454
+14.020000	0.000451
+14.030000	0.000449
+14.040000	0.000447
+14.050000	0.000445
+14.060000	0.000442
+14.070000	0.000440
+14.080000	0.000438
+14.090000	0.000436
+14.100000	0.000434
+14.110000	0.000432
+14.120000	0.000429
+14.130000	0.000427
+14.140000	0.000425
+14.150000	0.000423
+14.160000	0.000421
+14.170000	0.000419
+14.180000	0.000417
+14.190000	0.000415
+14.200000	0.000413
+14.210000	0.000410
+14.220000	0.000408
+14.230000	0.000406
+14.240000	0.000404
+14.250000	0.000402
+14.260000	0.000400
+14.270000	0.000398
+14.280000	0.000396
+14.290000	0.000394
+14.300000	0.000392
+14.310000	0.000390
+14.320000	0.000389
+14.330000	0.000387
+14.340000	0.000385
+14.350000	0.000383
+14.360000	0.000381
+14.370000	0.000379
+14.380000	0.000377
+14.390000	0.000375
+14.400000	0.000373
+14.410000	0.000371
+14.420000	0.000370
+14.430000	0.000368
+14.440000	0.000366
+14.450000	0.000364
+14.460000	0.000362
+14.470000	0.000360
+14.480000	0.000359
+14.490000	0.000357
+14.500000	0.000355
+14.510000	0.000353
+14.520000	0.000352
+14.530000	0.000350
+14.540000	0.000348
+14.550000	0.000346
+14.560000	0.000345
+14.570000	0.000343
+14.580000	0.000341
+14.590000	0.000339
+14.600000	0.000338
+14.610000	0.000336
+14.620000	0.000334
+14.630000	0.000333
+14.640000	0.000331
+14.650000	0.000329
+14.660000	0.000328
+14.670000	0.000326
+14.680000	0.000325
+14.690000	0.000323
+14.700000	0.000321
+14.710000	0.000320
+14.720000	0.000318
+14.730000	0.000317
+14.740000	0.000315
+14.750000	0.000313
+14.760000	0.000312
+14.770000	0.000310
+14.780000	0.000309
+14.790000	0.000307
+14.800000	0.000306
+14.810000	0.000304
+14.820000	0.000303
+14.830000	0.000301
+14.840000	0.000300
+14.850000	0.000298
+14.860000	0.000297
+14.870000	0.000295
+14.880000	0.000294
+14.890000	0.000292
+14.900000	0.000291
+14.910000	0.000289
+14.920000	0.000288
+14.930000	0.000286
+14.940000	0.000285
+14.950000	0.000284
+14.960000	0.000282
+14.970000	0.000281
+14.980000	0.000279
+14.990000	0.000278
+15.000000	0.000277
+15.010000	0.000275
+15.020000	0.000274
+15.030000	0.000272
+15.040000	0.000271
+15.050000	0.000270
+15.060000	0.000268
+15.070000	0.000267
+15.080000	0.000266
+15.090000	0.000264
+15.100000	0.000263
+15.110000	0.000262
+15.120000	0.000260
+15.130000	0.000259
+15.140000	0.000258
+15.150000	0.000257
+15.160000	0.000255
+15.170000	0.000254
+15.180000	0.000253
+15.190000	0.000251
+15.200000	0.000250
+15.210000	0.000249
+15.220000	0.000248
+15.230000	0.000247
+15.240000	0.000245
+15.250000	0.000244
+15.260000	0.000243
+15.270000	0.000242
+15.280000	0.000240
+15.290000	0.000239
+15.300000	0.000238
+15.310000	0.000237
+15.320000	0.000236
+15.330000	0.000234
+15.340000	0.000233
+15.350000	0.000232
+15.360000	0.000231
+15.370000	0.000230
+15.380000	0.000229
+15.390000	0.000228
+15.400000	0.000226
+15.410000	0.000225
+15.420000	0.000224
+15.430000	0.000223
+15.440000	0.000222
+15.450000	0.000221
+15.460000	0.000220
+15.470000	0.000219
+15.480000	0.000218
+15.490000	0.000216
+15.500000	0.000215
+15.510000	0.000214
+15.520000	0.000213
+15.530000	0.000212
+15.540000	0.000211
+15.550000	0.000210
+15.560000	0.000209
+15.570000	0.000208
+15.580000	0.000207
+15.590000	0.000206
+15.600000	0.000205
+15.610000	0.000204
+15.620000	0.000203
+15.630000	0.000202
+15.640000	0.000201
+15.650000	0.000200
+15.660000	0.000199
+15.670000	0.000198
+15.680000	0.000197
+15.690000	0.000196
+15.700000	0.000195
+15.710000	0.000194
+15.720000	0.000193
+15.730000	0.000192
+15.740000	0.000191
+15.750000	0.000190
+15.760000	0.000189
+15.770000	0.000188
+15.780000	0.000187
+15.790000	0.000186
+15.800000	0.000185
+15.810000	0.000184
+15.820000	0.000184
+15.830000	0.000183
+15.840000	0.000182
+15.850000	0.000181
+15.860000	0.000180
+15.870000	0.000179
+15.880000	0.000178
+15.890000	0.000177
+15.900000	0.000176
+15.910000	0.000175
+15.920000	0.000175
+15.930000	0.000174
+15.940000	0.000173
+15.950000	0.000172
+15.960000	0.000171
+15.970000	0.000170
+15.980000	0.000169
+15.990000	0.000169
+16.000000	0.000168
+16.010000	0.000167
+16.020000	0.000166
+16.030000	0.000165
+16.040000	0.000164
+16.050000	0.000164
+16.060000	0.000163
+16.070000	0.000162
+16.080000	0.000161
+16.090000	0.000160
+16.100000	0.000160
+16.110000	0.000159
+16.120000	0.000158
+16.130000	0.000157
+16.140000	0.000156
+16.150000	0.000156
+16.160000	0.000155
+16.170000	0.000154
+16.180000	0.000153
+16.190000	0.000153
+16.200000	0.000152
+16.210000	0.000151
+16.220000	0.000150
+16.230000	0.000150
+16.240000	0.000149
+16.250000	0.000148
+16.260000	0.000147
+16.270000	0.000147
+16.280000	0.000146
+16.290000	0.000145
+16.300000	0.000144
+16.310000	0.000144
+16.320000	0.000143
+16.330000	0.000142
+16.340000	0.000142
+16.350000	0.000141
+16.360000	0.000140
+16.370000	0.000139
+16.380000	0.000139
+16.390000	0.000138
+16.400000	0.000137
+16.410000	0.000137
+16.420000	0.000136
+16.430000	0.000135
+16.440000	0.000135
+16.450000	0.000134
+16.460000	0.000133
+16.470000	0.000133
+16.480000	0.000132
+16.490000	0.000131
+16.500000	0.000131
+16.510000	0.000130
+16.520000	0.000129
+16.530000	0.000129
+16.540000	0.000128
+16.550000	0.000127
+16.560000	0.000127
+16.570000	0.000126
+16.580000	0.000126
+16.590000	0.000125
+16.600000	0.000124
+16.610000	0.000124
+16.620000	0.000123
+16.630000	0.000122
+16.640000	0.000122
+16.650000	0.000121
+16.660000	0.000121
+16.670000	0.000120
+16.680000	0.000119
+16.690000	0.000119
+16.700000	0.000118
+16.710000	0.000118
+16.720000	0.000117
+16.730000	0.000116
+16.740000	0.000116
+16.750000	0.000115
+16.760000	0.000115
+16.770000	0.000114
+16.780000	0.000114
+16.790000	0.000113
+16.800000	0.000112
+16.810000	0.000112
+16.820000	0.000111
+16.830000	0.000111
+16.840000	0.000110
+16.850000	0.000110
+16.860000	0.000109
+16.870000	0.000109
+16.880000	0.000108
+16.890000	0.000107
+16.900000	0.000107
+16.910000	0.000106
+16.920000	0.000106
+16.930000	0.000105
+16.940000	0.000105
+16.950000	0.000104
+16.960000	0.000104
+16.970000	0.000103
+16.980000	0.000103
+16.990000	0.000102
+17.000000	0.000102
+17.010000	0.000101
+17.020000	0.000101
+17.030000	0.000100
+17.040000	0.000100
+17.050000	0.000099
+17.060000	0.000099
+17.070000	0.000098
+17.080000	0.000098
+17.090000	0.000097
+17.100000	0.000097
+17.110000	0.000096
+17.120000	0.000096
+17.130000	0.000095
+17.140000	0.000095
+17.150000	0.000094
+17.160000	0.000094
+17.170000	0.000093
+17.180000	0.000093
+17.190000	0.000093
+17.200000	0.000092
+17.210000	0.000092
+17.220000	0.000091
+17.230000	0.000091
+17.240000	0.000090
+17.250000	0.000090
+17.260000	0.000089
+17.270000	0.000089
+17.280000	0.000088
+17.290000	0.000088
+17.300000	0.000088
+17.310000	0.000087
+17.320000	0.000087
+17.330000	0.000086
+17.340000	0.000086
+17.350000	0.000085
+17.360000	0.000085
+17.370000	0.000085
+17.380000	0.000084
+17.390000	0.000084
+17.400000	0.000083
+17.410000	0.000083
+17.420000	0.000082
+17.430000	0.000082
+17.440000	0.000082
+17.450000	0.000081
+17.460000	0.000081
+17.470000	0.000080
+17.480000	0.000080
+17.490000	0.000080
+17.500000	0.000079
+17.510000	0.000079
+17.520000	0.000078
+17.530000	0.000078
+17.540000	0.000078
+17.550000	0.000077
+17.560000	0.000077
+17.570000	0.000077
+17.580000	0.000076
+17.590000	0.000076
+17.600000	0.000075
+17.610000	0.000075
+17.620000	0.000075
+17.630000	0.000074
+17.640000	0.000074
+17.650000	0.000074
+17.660000	0.000073
+17.670000	0.000073
+17.680000	0.000072
+17.690000	0.000072
+17.700000	0.000072
+17.710000	0.000071
+17.720000	0.000071
+17.730000	0.000071
+17.740000	0.000070
+17.750000	0.000070
+17.760000	0.000070
+17.770000	0.000069
+17.780000	0.000069
+17.790000	0.000069
+17.800000	0.000068
+17.810000	0.000068
+17.820000	0.000068
+17.830000	0.000067
+17.840000	0.000067
+17.850000	0.000067
+17.860000	0.000066
+17.870000	0.000066
+17.880000	0.000066
+17.890000	0.000065
+17.900000	0.000065
+17.910000	0.000065
+17.920000	0.000064
+17.930000	0.000064
+17.940000	0.000064
+17.950000	0.000063
+17.960000	0.000063
+17.970000	0.000063
+17.980000	0.000062
+17.990000	0.000062
+18.000000	0.000062
+18.010000	0.000061
+18.020000	0.000061
+18.030000	0.000061
+18.040000	0.000060
+18.050000	0.000060
+18.060000	0.000060
+18.070000	0.000060
+18.080000	0.000059
+18.090000	0.000059
+18.100000	0.000059
+18.110000	0.000058
+18.120000	0.000058
+18.130000	0.000058
+18.140000	0.000058
+18.150000	0.000057
+18.160000	0.000057
+18.170000	0.000057
+18.180000	0.000056
+18.190000	0.000056
+18.200000	0.000056
+18.210000	0.000056
+18.220000	0.000055
+18.230000	0.000055
+18.240000	0.000055
+18.250000	0.000054
+18.260000	0.000054
+18.270000	0.000054
+18.280000	0.000054
+18.290000	0.000053
+18.300000	0.000053
+18.310000	0.000053
+18.320000	0.000053
+18.330000	0.000052
+18.340000	0.000052
+18.350000	0.000052
+18.360000	0.000052
+18.370000	0.000051
+18.380000	0.000051
+18.390000	0.000051
+18.400000	0.000051
+18.410000	0.000050
+18.420000	0.000050
+18.430000	0.000050
+18.440000	0.000050
+18.450000	0.000049
+18.460000	0.000049
+18.470000	0.000049
+18.480000	0.000049
+18.490000	0.000048
+18.500000	0.000048
+18.510000	0.000048
+18.520000	0.000048
+18.530000	0.000047
+18.540000	0.000047
+18.550000	0.000047
+18.560000	0.000047
+18.570000	0.000046
+18.580000	0.000046
+18.590000	0.000046
+18.600000	0.000046
+18.610000	0.000045
+18.620000	0.000045
+18.630000	0.000045
+18.640000	0.000045
+18.650000	0.000045
+18.660000	0.000044
+18.670000	0.000044
+18.680000	0.000044
+18.690000	0.000044
+18.700000	0.000043
+18.710000	0.000043
+18.720000	0.000043
+18.730000	0.000043
+18.740000	0.000043
+18.750000	0.000042
+18.760000	0.000042
+18.770000	0.000042
+18.780000	0.000042
+18.790000	0.000042
+18.800000	0.000041
+18.810000	0.000041
+18.820000	0.000041
+18.830000	0.000041
+18.840000	0.000041
+18.850000	0.000040
+18.860000	0.000040
+18.870000	0.000040
+18.880000	0.000040
+18.890000	0.000040
+18.900000	0.000039
+18.910000	0.000039
+18.920000	0.000039
+18.930000	0.000039
+18.940000	0.000039
+18.950000	0.000038
+18.960000	0.000038
+18.970000	0.000038
+18.980000	0.000038
+18.990000	0.000038
+19.000000	0.000037
+19.010000	0.000037
+19.020000	0.000037
+19.030000	0.000037
+19.040000	0.000037
+19.050000	0.000037
+19.060000	0.000036
+19.070000	0.000036
+19.080000	0.000036
+19.090000	0.000036
+19.100000	0.000036
+19.110000	0.000035
+19.120000	0.000035
+19.130000	0.000035
+19.140000	0.000035
+19.150000	0.000035
+19.160000	0.000035
+19.170000	0.000034
+19.180000	0.000034
+19.190000	0.000034
+19.200000	0.000034
+19.210000	0.000034
+19.220000	0.000034
+19.230000	0.000033
+19.240000	0.000033
+19.250000	0.000033
+19.260000	0.000033
+19.270000	0.000033
+19.280000	0.000033
+19.290000	0.000032
+19.300000	0.000032
+19.310000	0.000032
+19.320000	0.000032
+19.330000	0.000032
+19.340000	0.000032
+19.350000	0.000031
+19.360000	0.000031
+19.370000	0.000031
+19.380000	0.000031
+19.390000	0.000031
+19.400000	0.000031
+19.410000	0.000030
+19.420000	0.000030
+19.430000	0.000030
+19.440000	0.000030
+19.450000	0.000030
+19.460000	0.000030
+19.470000	0.000030
+19.480000	0.000029
+19.490000	0.000029
+19.500000	0.000029
+19.510000	0.000029
+19.520000	0.000029
+19.530000	0.000029
+19.540000	0.000029
+19.550000	0.000028
+19.560000	0.000028
+19.570000	0.000028
+19.580000	0.000028
+19.590000	0.000028
+19.600000	0.000028
+19.610000	0.000028
+19.620000	0.000027
+19.630000	0.000027
+19.640000	0.000027
+19.650000	0.000027
+19.660000	0.000027
+19.670000	0.000027
+19.680000	0.000027
+19.690000	0.000027
+19.700000	0.000026
+19.710000	0.000026
+19.720000	0.000026
+19.730000	0.000026
+19.740000	0.000026
+19.750000	0.000026
+19.760000	0.000026
+19.770000	0.000025
+19.780000	0.000025
+19.790000	0.000025
+19.800000	0.000025
+19.810000	0.000025
+19.820000	0.000025
+19.830000	0.000025
+19.840000	0.000025
+19.850000	0.000024
+19.860000	0.000024
+19.870000	0.000024
+19.880000	0.000024
+19.890000	0.000024
+19.900000	0.000024
+19.910000	0.000024
+19.920000	0.000024
+19.930000	0.000024
+19.940000	0.000023
+19.950000	0.000023
+19.960000	0.000023
+19.970000	0.000023
+19.980000	0.000023
+19.990000	0.000023
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma_3.0_2.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_3.0_2.0.dat
new file mode 100644
index 0000000..4ec5ba7
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_3.0_2.0.dat
@@ -0,0 +1,2012 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000006
+0.020000	0.000025
+0.030000	0.000055
+0.040000	0.000098
+0.050000	0.000152
+0.060000	0.000218
+0.070000	0.000296
+0.080000	0.000384
+0.090000	0.000484
+0.100000	0.000595
+0.110000	0.000716
+0.120000	0.000848
+0.130000	0.000990
+0.140000	0.001142
+0.150000	0.001305
+0.160000	0.001477
+0.170000	0.001659
+0.180000	0.001851
+0.190000	0.002052
+0.200000	0.002262
+0.210000	0.002482
+0.220000	0.002710
+0.230000	0.002947
+0.240000	0.003193
+0.250000	0.003447
+0.260000	0.003710
+0.270000	0.003981
+0.280000	0.004260
+0.290000	0.004547
+0.300000	0.004841
+0.310000	0.005144
+0.320000	0.005454
+0.330000	0.005771
+0.340000	0.006095
+0.350000	0.006427
+0.360000	0.006766
+0.370000	0.007111
+0.380000	0.007463
+0.390000	0.007822
+0.400000	0.008187
+0.410000	0.008559
+0.420000	0.008937
+0.430000	0.009321
+0.440000	0.009710
+0.450000	0.010106
+0.460000	0.010508
+0.470000	0.010915
+0.480000	0.011327
+0.490000	0.011745
+0.500000	0.012169
+0.510000	0.012597
+0.520000	0.013031
+0.530000	0.013469
+0.540000	0.013913
+0.550000	0.014361
+0.560000	0.014813
+0.570000	0.015271
+0.580000	0.015732
+0.590000	0.016198
+0.600000	0.016668
+0.610000	0.017143
+0.620000	0.017621
+0.630000	0.018103
+0.640000	0.018589
+0.650000	0.019079
+0.660000	0.019573
+0.670000	0.020070
+0.680000	0.020570
+0.690000	0.021074
+0.700000	0.021581
+0.710000	0.022091
+0.720000	0.022605
+0.730000	0.023121
+0.740000	0.023640
+0.750000	0.024163
+0.760000	0.024687
+0.770000	0.025215
+0.780000	0.025745
+0.790000	0.026278
+0.800000	0.026813
+0.810000	0.027350
+0.820000	0.027890
+0.830000	0.028432
+0.840000	0.028976
+0.850000	0.029522
+0.860000	0.030070
+0.870000	0.030620
+0.880000	0.031171
+0.890000	0.031725
+0.900000	0.032280
+0.910000	0.032837
+0.920000	0.033395
+0.930000	0.033955
+0.940000	0.034516
+0.950000	0.035078
+0.960000	0.035642
+0.970000	0.036207
+0.980000	0.036773
+0.990000	0.037340
+1.000000	0.037908
+1.010000	0.038477
+1.020000	0.039047
+1.030000	0.039618
+1.040000	0.040190
+1.050000	0.040762
+1.060000	0.041335
+1.070000	0.041908
+1.080000	0.042482
+1.090000	0.043057
+1.100000	0.043632
+1.110000	0.044207
+1.120000	0.044783
+1.130000	0.045359
+1.140000	0.045935
+1.150000	0.046511
+1.160000	0.047087
+1.170000	0.047664
+1.180000	0.048240
+1.190000	0.048817
+1.200000	0.049393
+1.210000	0.049969
+1.220000	0.050545
+1.230000	0.051121
+1.240000	0.051696
+1.250000	0.052272
+1.260000	0.052846
+1.270000	0.053421
+1.280000	0.053995
+1.290000	0.054568
+1.300000	0.055141
+1.310000	0.055713
+1.320000	0.056285
+1.330000	0.056856
+1.340000	0.057426
+1.350000	0.057996
+1.360000	0.058565
+1.370000	0.059133
+1.380000	0.059700
+1.390000	0.060266
+1.400000	0.060832
+1.410000	0.061396
+1.420000	0.061959
+1.430000	0.062522
+1.440000	0.063083
+1.450000	0.063643
+1.460000	0.064202
+1.470000	0.064760
+1.480000	0.065317
+1.490000	0.065872
+1.500000	0.066427
+1.510000	0.066979
+1.520000	0.067531
+1.530000	0.068081
+1.540000	0.068630
+1.550000	0.069178
+1.560000	0.069724
+1.570000	0.070268
+1.580000	0.070811
+1.590000	0.071353
+1.600000	0.071893
+1.610000	0.072431
+1.620000	0.072968
+1.630000	0.073503
+1.640000	0.074037
+1.650000	0.074568
+1.660000	0.075099
+1.670000	0.075627
+1.680000	0.076154
+1.690000	0.076679
+1.700000	0.077202
+1.710000	0.077723
+1.720000	0.078243
+1.730000	0.078760
+1.740000	0.079276
+1.750000	0.079790
+1.760000	0.080302
+1.770000	0.080812
+1.780000	0.081320
+1.790000	0.081826
+1.800000	0.082330
+1.810000	0.082832
+1.820000	0.083333
+1.830000	0.083831
+1.840000	0.084327
+1.850000	0.084821
+1.860000	0.085312
+1.870000	0.085802
+1.880000	0.086290
+1.890000	0.086775
+1.900000	0.087258
+1.910000	0.087740
+1.920000	0.088219
+1.930000	0.088695
+1.940000	0.089170
+1.950000	0.089642
+1.960000	0.090112
+1.970000	0.090580
+1.980000	0.091046
+1.990000	0.091509
+2.000000	0.091970
+2.010000	0.092429
+2.020000	0.092885
+2.030000	0.093339
+2.040000	0.093791
+2.050000	0.094240
+2.060000	0.094687
+2.070000	0.095132
+2.080000	0.095574
+2.090000	0.096014
+2.100000	0.096452
+2.110000	0.096887
+2.120000	0.097319
+2.130000	0.097750
+2.140000	0.098178
+2.150000	0.098603
+2.160000	0.099026
+2.170000	0.099447
+2.180000	0.099865
+2.190000	0.100280
+2.200000	0.100694
+2.210000	0.101104
+2.220000	0.101512
+2.230000	0.101918
+2.240000	0.102321
+2.250000	0.102722
+2.260000	0.103120
+2.270000	0.103516
+2.280000	0.103909
+2.290000	0.104300
+2.300000	0.104688
+2.310000	0.105074
+2.320000	0.105457
+2.330000	0.105837
+2.340000	0.106215
+2.350000	0.106591
+2.360000	0.106964
+2.370000	0.107334
+2.380000	0.107702
+2.390000	0.108067
+2.400000	0.108430
+2.410000	0.108790
+2.420000	0.109148
+2.430000	0.109503
+2.440000	0.109855
+2.450000	0.110205
+2.460000	0.110552
+2.470000	0.110897
+2.480000	0.111239
+2.490000	0.111579
+2.500000	0.111916
+2.510000	0.112250
+2.520000	0.112582
+2.530000	0.112912
+2.540000	0.113238
+2.550000	0.113562
+2.560000	0.113884
+2.570000	0.114203
+2.580000	0.114520
+2.590000	0.114833
+2.600000	0.115145
+2.610000	0.115453
+2.620000	0.115760
+2.630000	0.116063
+2.640000	0.116364
+2.650000	0.116663
+2.660000	0.116958
+2.670000	0.117252
+2.680000	0.117543
+2.690000	0.117831
+2.700000	0.118116
+2.710000	0.118399
+2.720000	0.118680
+2.730000	0.118958
+2.740000	0.119233
+2.750000	0.119506
+2.760000	0.119777
+2.770000	0.120044
+2.780000	0.120310
+2.790000	0.120572
+2.800000	0.120833
+2.810000	0.121090
+2.820000	0.121345
+2.830000	0.121598
+2.840000	0.121848
+2.850000	0.122096
+2.860000	0.122341
+2.870000	0.122583
+2.880000	0.122823
+2.890000	0.123061
+2.900000	0.123296
+2.910000	0.123529
+2.920000	0.123759
+2.930000	0.123986
+2.940000	0.124211
+2.950000	0.124434
+2.960000	0.124654
+2.970000	0.124872
+2.980000	0.125087
+2.990000	0.125300
+3.000000	0.125511
+3.010000	0.125719
+3.020000	0.125924
+3.030000	0.126127
+3.040000	0.126328
+3.050000	0.126526
+3.060000	0.126722
+3.070000	0.126916
+3.080000	0.127107
+3.090000	0.127295
+3.100000	0.127481
+3.110000	0.127665
+3.120000	0.127847
+3.130000	0.128026
+3.140000	0.128203
+3.150000	0.128377
+3.160000	0.128549
+3.170000	0.128719
+3.180000	0.128886
+3.190000	0.129051
+3.200000	0.129214
+3.210000	0.129374
+3.220000	0.129532
+3.230000	0.129688
+3.240000	0.129841
+3.250000	0.129992
+3.260000	0.130141
+3.270000	0.130288
+3.280000	0.130432
+3.290000	0.130574
+3.300000	0.130714
+3.310000	0.130851
+3.320000	0.130987
+3.330000	0.131120
+3.340000	0.131251
+3.350000	0.131379
+3.360000	0.131505
+3.370000	0.131630
+3.380000	0.131752
+3.390000	0.131871
+3.400000	0.131989
+3.410000	0.132104
+3.420000	0.132217
+3.430000	0.132328
+3.440000	0.132437
+3.450000	0.132544
+3.460000	0.132649
+3.470000	0.132751
+3.480000	0.132851
+3.490000	0.132950
+3.500000	0.133046
+3.510000	0.133140
+3.520000	0.133232
+3.530000	0.133321
+3.540000	0.133409
+3.550000	0.133495
+3.560000	0.133578
+3.570000	0.133660
+3.580000	0.133739
+3.590000	0.133817
+3.600000	0.133892
+3.610000	0.133965
+3.620000	0.134037
+3.630000	0.134106
+3.640000	0.134174
+3.650000	0.134239
+3.660000	0.134302
+3.670000	0.134364
+3.680000	0.134423
+3.690000	0.134481
+3.700000	0.134536
+3.710000	0.134590
+3.720000	0.134641
+3.730000	0.134691
+3.740000	0.134739
+3.750000	0.134785
+3.760000	0.134829
+3.770000	0.134871
+3.780000	0.134911
+3.790000	0.134949
+3.800000	0.134986
+3.810000	0.135020
+3.820000	0.135053
+3.830000	0.135084
+3.840000	0.135113
+3.850000	0.135140
+3.860000	0.135166
+3.870000	0.135189
+3.880000	0.135211
+3.890000	0.135231
+3.900000	0.135249
+3.910000	0.135266
+3.920000	0.135280
+3.930000	0.135293
+3.940000	0.135305
+3.950000	0.135314
+3.960000	0.135322
+3.970000	0.135328
+3.980000	0.135332
+3.990000	0.135334
+4.000000	0.135335
+4.010000	0.135334
+4.020000	0.135332
+4.030000	0.135328
+4.040000	0.135322
+4.050000	0.135314
+4.060000	0.135305
+4.070000	0.135294
+4.080000	0.135282
+4.090000	0.135268
+4.100000	0.135252
+4.110000	0.135235
+4.120000	0.135216
+4.130000	0.135195
+4.140000	0.135173
+4.150000	0.135150
+4.160000	0.135125
+4.170000	0.135098
+4.180000	0.135069
+4.190000	0.135040
+4.200000	0.135008
+4.210000	0.134975
+4.220000	0.134941
+4.230000	0.134905
+4.240000	0.134868
+4.250000	0.134829
+4.260000	0.134788
+4.270000	0.134746
+4.280000	0.134703
+4.290000	0.134658
+4.300000	0.134612
+4.310000	0.134564
+4.320000	0.134515
+4.330000	0.134465
+4.340000	0.134413
+4.350000	0.134359
+4.360000	0.134305
+4.370000	0.134249
+4.380000	0.134191
+4.390000	0.134132
+4.400000	0.134072
+4.410000	0.134010
+4.420000	0.133947
+4.430000	0.133883
+4.440000	0.133817
+4.450000	0.133750
+4.460000	0.133682
+4.470000	0.133612
+4.480000	0.133542
+4.490000	0.133469
+4.500000	0.133396
+4.510000	0.133321
+4.520000	0.133245
+4.530000	0.133168
+4.540000	0.133089
+4.550000	0.133010
+4.560000	0.132929
+4.570000	0.132846
+4.580000	0.132763
+4.590000	0.132678
+4.600000	0.132592
+4.610000	0.132505
+4.620000	0.132417
+4.630000	0.132328
+4.640000	0.132237
+4.650000	0.132145
+4.660000	0.132052
+4.670000	0.131958
+4.680000	0.131863
+4.690000	0.131767
+4.700000	0.131669
+4.710000	0.131570
+4.720000	0.131471
+4.730000	0.131370
+4.740000	0.131268
+4.750000	0.131165
+4.760000	0.131061
+4.770000	0.130956
+4.780000	0.130849
+4.790000	0.130742
+4.800000	0.130634
+4.810000	0.130524
+4.820000	0.130414
+4.830000	0.130303
+4.840000	0.130190
+4.850000	0.130077
+4.860000	0.129962
+4.870000	0.129847
+4.880000	0.129730
+4.890000	0.129613
+4.900000	0.129494
+4.910000	0.129375
+4.920000	0.129255
+4.930000	0.129133
+4.940000	0.129011
+4.950000	0.128888
+4.960000	0.128764
+4.970000	0.128639
+4.980000	0.128513
+4.990000	0.128386
+5.000000	0.128258
+5.010000	0.128129
+5.020000	0.128000
+5.030000	0.127869
+5.040000	0.127738
+5.050000	0.127605
+5.060000	0.127472
+5.070000	0.127338
+5.080000	0.127204
+5.090000	0.127068
+5.100000	0.126932
+5.110000	0.126794
+5.120000	0.126656
+5.130000	0.126517
+5.140000	0.126377
+5.150000	0.126237
+5.160000	0.126096
+5.170000	0.125953
+5.180000	0.125810
+5.190000	0.125667
+5.200000	0.125522
+5.210000	0.125377
+5.220000	0.125231
+5.230000	0.125084
+5.240000	0.124937
+5.250000	0.124789
+5.260000	0.124640
+5.270000	0.124490
+5.280000	0.124340
+5.290000	0.124189
+5.300000	0.124037
+5.310000	0.123885
+5.320000	0.123731
+5.330000	0.123578
+5.340000	0.123423
+5.350000	0.123268
+5.360000	0.123112
+5.370000	0.122955
+5.380000	0.122798
+5.390000	0.122641
+5.400000	0.122482
+5.410000	0.122323
+5.420000	0.122163
+5.430000	0.122003
+5.440000	0.121842
+5.450000	0.121680
+5.460000	0.121518
+5.470000	0.121355
+5.480000	0.121192
+5.490000	0.121028
+5.500000	0.120864
+5.510000	0.120699
+5.520000	0.120533
+5.530000	0.120367
+5.540000	0.120200
+5.550000	0.120032
+5.560000	0.119865
+5.570000	0.119696
+5.580000	0.119527
+5.590000	0.119358
+5.600000	0.119188
+5.610000	0.119017
+5.620000	0.118846
+5.630000	0.118675
+5.640000	0.118503
+5.650000	0.118330
+5.660000	0.118157
+5.670000	0.117984
+5.680000	0.117810
+5.690000	0.117635
+5.700000	0.117460
+5.710000	0.117285
+5.720000	0.117109
+5.730000	0.116933
+5.740000	0.116756
+5.750000	0.116579
+5.760000	0.116401
+5.770000	0.116223
+5.780000	0.116045
+5.790000	0.115866
+5.800000	0.115686
+5.810000	0.115507
+5.820000	0.115326
+5.830000	0.115146
+5.840000	0.114965
+5.850000	0.114784
+5.860000	0.114602
+5.870000	0.114420
+5.880000	0.114238
+5.890000	0.114055
+5.900000	0.113872
+5.910000	0.113688
+5.920000	0.113504
+5.930000	0.113320
+5.940000	0.113135
+5.950000	0.112950
+5.960000	0.112765
+5.970000	0.112580
+5.980000	0.112394
+5.990000	0.112207
+6.000000	0.112021
+6.010000	0.111834
+6.020000	0.111647
+6.030000	0.111459
+6.040000	0.111272
+6.050000	0.111084
+6.060000	0.110895
+6.070000	0.110707
+6.080000	0.110518
+6.090000	0.110329
+6.100000	0.110139
+6.110000	0.109949
+6.120000	0.109759
+6.130000	0.109569
+6.140000	0.109379
+6.150000	0.109188
+6.160000	0.108997
+6.170000	0.108806
+6.180000	0.108614
+6.190000	0.108423
+6.200000	0.108231
+6.210000	0.108039
+6.220000	0.107846
+6.230000	0.107654
+6.240000	0.107461
+6.250000	0.107268
+6.260000	0.107075
+6.270000	0.106881
+6.280000	0.106688
+6.290000	0.106494
+6.300000	0.106300
+6.310000	0.106106
+6.320000	0.105912
+6.330000	0.105717
+6.340000	0.105522
+6.350000	0.105328
+6.360000	0.105133
+6.370000	0.104938
+6.380000	0.104742
+6.390000	0.104547
+6.400000	0.104351
+6.410000	0.104156
+6.420000	0.103960
+6.430000	0.103764
+6.440000	0.103568
+6.450000	0.103371
+6.460000	0.103175
+6.470000	0.102978
+6.480000	0.102782
+6.490000	0.102585
+6.500000	0.102388
+6.510000	0.102191
+6.520000	0.101994
+6.530000	0.101797
+6.540000	0.101600
+6.550000	0.101402
+6.560000	0.101205
+6.570000	0.101007
+6.580000	0.100810
+6.590000	0.100612
+6.600000	0.100414
+6.610000	0.100217
+6.620000	0.100019
+6.630000	0.099821
+6.640000	0.099623
+6.650000	0.099425
+6.660000	0.099227
+6.670000	0.099028
+6.680000	0.098830
+6.690000	0.098632
+6.700000	0.098434
+6.710000	0.098235
+6.720000	0.098037
+6.730000	0.097838
+6.740000	0.097640
+6.750000	0.097441
+6.760000	0.097243
+6.770000	0.097044
+6.780000	0.096846
+6.790000	0.096647
+6.800000	0.096449
+6.810000	0.096250
+6.820000	0.096052
+6.830000	0.095853
+6.840000	0.095654
+6.850000	0.095456
+6.860000	0.095257
+6.870000	0.095059
+6.880000	0.094860
+6.890000	0.094662
+6.900000	0.094463
+6.910000	0.094265
+6.920000	0.094066
+6.930000	0.093868
+6.940000	0.093669
+6.950000	0.093471
+6.960000	0.093273
+6.970000	0.093074
+6.980000	0.092876
+6.990000	0.092678
+7.000000	0.092479
+7.010000	0.092281
+7.020000	0.092083
+7.030000	0.091885
+7.040000	0.091687
+7.050000	0.091489
+7.060000	0.091291
+7.070000	0.091094
+7.080000	0.090896
+7.090000	0.090698
+7.100000	0.090501
+7.110000	0.090303
+7.120000	0.090106
+7.130000	0.089908
+7.140000	0.089711
+7.150000	0.089514
+7.160000	0.089317
+7.170000	0.089119
+7.180000	0.088923
+7.190000	0.088726
+7.200000	0.088529
+7.210000	0.088332
+7.220000	0.088136
+7.230000	0.087939
+7.240000	0.087743
+7.250000	0.087546
+7.260000	0.087350
+7.270000	0.087154
+7.280000	0.086958
+7.290000	0.086762
+7.300000	0.086567
+7.310000	0.086371
+7.320000	0.086176
+7.330000	0.085980
+7.340000	0.085785
+7.350000	0.085590
+7.360000	0.085395
+7.370000	0.085200
+7.380000	0.085005
+7.390000	0.084811
+7.400000	0.084616
+7.410000	0.084422
+7.420000	0.084228
+7.430000	0.084034
+7.440000	0.083840
+7.450000	0.083646
+7.460000	0.083452
+7.470000	0.083259
+7.480000	0.083066
+7.490000	0.082873
+7.500000	0.082680
+7.510000	0.082487
+7.520000	0.082294
+7.530000	0.082102
+7.540000	0.081909
+7.550000	0.081717
+7.560000	0.081525
+7.570000	0.081333
+7.580000	0.081141
+7.590000	0.080950
+7.600000	0.080758
+7.610000	0.080567
+7.620000	0.080376
+7.630000	0.080185
+7.640000	0.079995
+7.650000	0.079804
+7.660000	0.079614
+7.670000	0.079424
+7.680000	0.079234
+7.690000	0.079044
+7.700000	0.078855
+7.710000	0.078665
+7.720000	0.078476
+7.730000	0.078287
+7.740000	0.078098
+7.750000	0.077910
+7.760000	0.077721
+7.770000	0.077533
+7.780000	0.077345
+7.790000	0.077157
+7.800000	0.076970
+7.810000	0.076782
+7.820000	0.076595
+7.830000	0.076408
+7.840000	0.076222
+7.850000	0.076035
+7.860000	0.075849
+7.870000	0.075663
+7.880000	0.075477
+7.890000	0.075291
+7.900000	0.075105
+7.910000	0.074920
+7.920000	0.074735
+7.930000	0.074550
+7.940000	0.074366
+7.950000	0.074181
+7.960000	0.073997
+7.970000	0.073813
+7.980000	0.073629
+7.990000	0.073446
+8.000000	0.073263
+8.010000	0.073080
+8.020000	0.072897
+8.030000	0.072714
+8.040000	0.072532
+8.050000	0.072350
+8.060000	0.072168
+8.070000	0.071986
+8.080000	0.071805
+8.090000	0.071624
+8.100000	0.071443
+8.110000	0.071262
+8.120000	0.071081
+8.130000	0.070901
+8.140000	0.070721
+8.150000	0.070542
+8.160000	0.070362
+8.170000	0.070183
+8.180000	0.070004
+8.190000	0.069825
+8.200000	0.069647
+8.210000	0.069468
+8.220000	0.069290
+8.230000	0.069113
+8.240000	0.068935
+8.250000	0.068758
+8.260000	0.068581
+8.270000	0.068404
+8.280000	0.068228
+8.290000	0.068052
+8.300000	0.067876
+8.310000	0.067700
+8.320000	0.067525
+8.330000	0.067349
+8.340000	0.067174
+8.350000	0.067000
+8.360000	0.066825
+8.370000	0.066651
+8.380000	0.066477
+8.390000	0.066304
+8.400000	0.066130
+8.410000	0.065957
+8.420000	0.065785
+8.430000	0.065612
+8.440000	0.065440
+8.450000	0.065268
+8.460000	0.065096
+8.470000	0.064925
+8.480000	0.064753
+8.490000	0.064583
+8.500000	0.064412
+8.510000	0.064242
+8.520000	0.064071
+8.530000	0.063902
+8.540000	0.063732
+8.550000	0.063563
+8.560000	0.063394
+8.570000	0.063225
+8.580000	0.063057
+8.590000	0.062889
+8.600000	0.062721
+8.610000	0.062553
+8.620000	0.062386
+8.630000	0.062219
+8.640000	0.062052
+8.650000	0.061885
+8.660000	0.061719
+8.670000	0.061553
+8.680000	0.061388
+8.690000	0.061222
+8.700000	0.061057
+8.710000	0.060893
+8.720000	0.060728
+8.730000	0.060564
+8.740000	0.060400
+8.750000	0.060236
+8.760000	0.060073
+8.770000	0.059910
+8.780000	0.059747
+8.790000	0.059585
+8.800000	0.059422
+8.810000	0.059260
+8.820000	0.059099
+8.830000	0.058937
+8.840000	0.058776
+8.850000	0.058616
+8.860000	0.058455
+8.870000	0.058295
+8.880000	0.058135
+8.890000	0.057976
+8.900000	0.057816
+8.910000	0.057657
+8.920000	0.057498
+8.930000	0.057340
+8.940000	0.057182
+8.950000	0.057024
+8.960000	0.056867
+8.970000	0.056709
+8.980000	0.056552
+8.990000	0.056396
+9.000000	0.056239
+9.010000	0.056083
+9.020000	0.055927
+9.030000	0.055772
+9.040000	0.055617
+9.050000	0.055462
+9.060000	0.055307
+9.070000	0.055153
+9.080000	0.054999
+9.090000	0.054845
+9.100000	0.054692
+9.110000	0.054539
+9.120000	0.054386
+9.130000	0.054233
+9.140000	0.054081
+9.150000	0.053929
+9.160000	0.053778
+9.170000	0.053626
+9.180000	0.053475
+9.190000	0.053325
+9.200000	0.053174
+9.210000	0.053024
+9.220000	0.052874
+9.230000	0.052725
+9.240000	0.052576
+9.250000	0.052427
+9.260000	0.052278
+9.270000	0.052130
+9.280000	0.051982
+9.290000	0.051834
+9.300000	0.051686
+9.310000	0.051539
+9.320000	0.051392
+9.330000	0.051246
+9.340000	0.051100
+9.350000	0.050954
+9.360000	0.050808
+9.370000	0.050663
+9.380000	0.050518
+9.390000	0.050373
+9.400000	0.050229
+9.410000	0.050085
+9.420000	0.049941
+9.430000	0.049797
+9.440000	0.049654
+9.450000	0.049511
+9.460000	0.049368
+9.470000	0.049226
+9.480000	0.049084
+9.490000	0.048942
+9.500000	0.048801
+9.510000	0.048660
+9.520000	0.048519
+9.530000	0.048379
+9.540000	0.048238
+9.550000	0.048098
+9.560000	0.047959
+9.570000	0.047819
+9.580000	0.047680
+9.590000	0.047542
+9.600000	0.047403
+9.610000	0.047265
+9.620000	0.047127
+9.630000	0.046990
+9.640000	0.046853
+9.650000	0.046716
+9.660000	0.046579
+9.670000	0.046443
+9.680000	0.046307
+9.690000	0.046171
+9.700000	0.046036
+9.710000	0.045901
+9.720000	0.045766
+9.730000	0.045631
+9.740000	0.045497
+9.750000	0.045363
+9.760000	0.045230
+9.770000	0.045096
+9.780000	0.044963
+9.790000	0.044831
+9.800000	0.044698
+9.810000	0.044566
+9.820000	0.044434
+9.830000	0.044303
+9.840000	0.044171
+9.850000	0.044040
+9.860000	0.043910
+9.870000	0.043780
+9.880000	0.043649
+9.890000	0.043520
+9.900000	0.043390
+9.910000	0.043261
+9.920000	0.043132
+9.930000	0.043004
+9.940000	0.042876
+9.950000	0.042748
+9.960000	0.042620
+9.970000	0.042493
+9.980000	0.042365
+9.990000	0.042239
+10.000000	0.042112
+10.010000	0.041986
+10.020000	0.041860
+10.030000	0.041734
+10.040000	0.041609
+10.050000	0.041484
+10.060000	0.041359
+10.070000	0.041235
+10.080000	0.041111
+10.090000	0.040987
+10.100000	0.040864
+10.110000	0.040740
+10.120000	0.040617
+10.130000	0.040495
+10.140000	0.040372
+10.150000	0.040250
+10.160000	0.040128
+10.170000	0.040007
+10.180000	0.039886
+10.190000	0.039765
+10.200000	0.039644
+10.210000	0.039524
+10.220000	0.039404
+10.230000	0.039284
+10.240000	0.039164
+10.250000	0.039045
+10.260000	0.038926
+10.270000	0.038808
+10.280000	0.038689
+10.290000	0.038571
+10.300000	0.038454
+10.310000	0.038336
+10.320000	0.038219
+10.330000	0.038102
+10.340000	0.037986
+10.350000	0.037869
+10.360000	0.037753
+10.370000	0.037637
+10.380000	0.037522
+10.390000	0.037407
+10.400000	0.037292
+10.410000	0.037177
+10.420000	0.037063
+10.430000	0.036949
+10.440000	0.036835
+10.450000	0.036722
+10.460000	0.036609
+10.470000	0.036496
+10.480000	0.036383
+10.490000	0.036271
+10.500000	0.036159
+10.510000	0.036047
+10.520000	0.035935
+10.530000	0.035824
+10.540000	0.035713
+10.550000	0.035603
+10.560000	0.035492
+10.570000	0.035382
+10.580000	0.035272
+10.590000	0.035163
+10.600000	0.035053
+10.610000	0.034944
+10.620000	0.034836
+10.630000	0.034727
+10.640000	0.034619
+10.650000	0.034511
+10.660000	0.034404
+10.670000	0.034296
+10.680000	0.034189
+10.690000	0.034082
+10.700000	0.033976
+10.710000	0.033870
+10.720000	0.033764
+10.730000	0.033658
+10.740000	0.033553
+10.750000	0.033448
+10.760000	0.033343
+10.770000	0.033238
+10.780000	0.033134
+10.790000	0.033030
+10.800000	0.032926
+10.810000	0.032822
+10.820000	0.032719
+10.830000	0.032616
+10.840000	0.032513
+10.850000	0.032411
+10.860000	0.032309
+10.870000	0.032207
+10.880000	0.032105
+10.890000	0.032004
+10.900000	0.031903
+10.910000	0.031802
+10.920000	0.031701
+10.930000	0.031601
+10.940000	0.031501
+10.950000	0.031401
+10.960000	0.031302
+10.970000	0.031202
+10.980000	0.031103
+10.990000	0.031005
+11.000000	0.030906
+11.010000	0.030808
+11.020000	0.030710
+11.030000	0.030612
+11.040000	0.030515
+11.050000	0.030418
+11.060000	0.030321
+11.070000	0.030224
+11.080000	0.030128
+11.090000	0.030032
+11.100000	0.029936
+11.110000	0.029840
+11.120000	0.029745
+11.130000	0.029650
+11.140000	0.029555
+11.150000	0.029460
+11.160000	0.029366
+11.170000	0.029272
+11.180000	0.029178
+11.190000	0.029085
+11.200000	0.028991
+11.210000	0.028898
+11.220000	0.028805
+11.230000	0.028713
+11.240000	0.028621
+11.250000	0.028528
+11.260000	0.028437
+11.270000	0.028345
+11.280000	0.028254
+11.290000	0.028163
+11.300000	0.028072
+11.310000	0.027981
+11.320000	0.027891
+11.330000	0.027801
+11.340000	0.027711
+11.350000	0.027622
+11.360000	0.027532
+11.370000	0.027443
+11.380000	0.027355
+11.390000	0.027266
+11.400000	0.027178
+11.410000	0.027090
+11.420000	0.027002
+11.430000	0.026914
+11.440000	0.026827
+11.450000	0.026740
+11.460000	0.026653
+11.470000	0.026566
+11.480000	0.026480
+11.490000	0.026394
+11.500000	0.026308
+11.510000	0.026222
+11.520000	0.026137
+11.530000	0.026051
+11.540000	0.025966
+11.550000	0.025882
+11.560000	0.025797
+11.570000	0.025713
+11.580000	0.025629
+11.590000	0.025545
+11.600000	0.025462
+11.610000	0.025378
+11.620000	0.025295
+11.630000	0.025213
+11.640000	0.025130
+11.650000	0.025048
+11.660000	0.024966
+11.670000	0.024884
+11.680000	0.024802
+11.690000	0.024721
+11.700000	0.024639
+11.710000	0.024558
+11.720000	0.024478
+11.730000	0.024397
+11.740000	0.024317
+11.750000	0.024237
+11.760000	0.024157
+11.770000	0.024077
+11.780000	0.023998
+11.790000	0.023919
+11.800000	0.023840
+11.810000	0.023761
+11.820000	0.023683
+11.830000	0.023605
+11.840000	0.023527
+11.850000	0.023449
+11.860000	0.023371
+11.870000	0.023294
+11.880000	0.023217
+11.890000	0.023140
+11.900000	0.023063
+11.910000	0.022987
+11.920000	0.022911
+11.930000	0.022835
+11.940000	0.022759
+11.950000	0.022683
+11.960000	0.022608
+11.970000	0.022533
+11.980000	0.022458
+11.990000	0.022383
+12.000000	0.022309
+12.010000	0.022235
+12.020000	0.022160
+12.030000	0.022087
+12.040000	0.022013
+12.050000	0.021940
+12.060000	0.021866
+12.070000	0.021794
+12.080000	0.021721
+12.090000	0.021648
+12.100000	0.021576
+12.110000	0.021504
+12.120000	0.021432
+12.130000	0.021360
+12.140000	0.021289
+12.150000	0.021217
+12.160000	0.021146
+12.170000	0.021076
+12.180000	0.021005
+12.190000	0.020934
+12.200000	0.020864
+12.210000	0.020794
+12.220000	0.020724
+12.230000	0.020655
+12.240000	0.020585
+12.250000	0.020516
+12.260000	0.020447
+12.270000	0.020379
+12.280000	0.020310
+12.290000	0.020242
+12.300000	0.020173
+12.310000	0.020105
+12.320000	0.020038
+12.330000	0.019970
+12.340000	0.019903
+12.350000	0.019836
+12.360000	0.019769
+12.370000	0.019702
+12.380000	0.019635
+12.390000	0.019569
+12.400000	0.019503
+12.410000	0.019437
+12.420000	0.019371
+12.430000	0.019306
+12.440000	0.019240
+12.450000	0.019175
+12.460000	0.019110
+12.470000	0.019045
+12.480000	0.018981
+12.490000	0.018916
+12.500000	0.018852
+12.510000	0.018788
+12.520000	0.018724
+12.530000	0.018661
+12.540000	0.018597
+12.550000	0.018534
+12.560000	0.018471
+12.570000	0.018408
+12.580000	0.018345
+12.590000	0.018283
+12.600000	0.018221
+12.610000	0.018159
+12.620000	0.018097
+12.630000	0.018035
+12.640000	0.017974
+12.650000	0.017912
+12.660000	0.017851
+12.670000	0.017790
+12.680000	0.017729
+12.690000	0.017669
+12.700000	0.017608
+12.710000	0.017548
+12.720000	0.017488
+12.730000	0.017428
+12.740000	0.017369
+12.750000	0.017309
+12.760000	0.017250
+12.770000	0.017191
+12.780000	0.017132
+12.790000	0.017073
+12.800000	0.017014
+12.810000	0.016956
+12.820000	0.016898
+12.830000	0.016840
+12.840000	0.016782
+12.850000	0.016724
+12.860000	0.016667
+12.870000	0.016609
+12.880000	0.016552
+12.890000	0.016495
+12.900000	0.016438
+12.910000	0.016382
+12.920000	0.016325
+12.930000	0.016269
+12.940000	0.016213
+12.950000	0.016157
+12.960000	0.016101
+12.970000	0.016046
+12.980000	0.015990
+12.990000	0.015935
+13.000000	0.015880
+13.010000	0.015825
+13.020000	0.015770
+13.030000	0.015716
+13.040000	0.015662
+13.050000	0.015607
+13.060000	0.015553
+13.070000	0.015499
+13.080000	0.015446
+13.090000	0.015392
+13.100000	0.015339
+13.110000	0.015286
+13.120000	0.015233
+13.130000	0.015180
+13.140000	0.015127
+13.150000	0.015075
+13.160000	0.015022
+13.170000	0.014970
+13.180000	0.014918
+13.190000	0.014866
+13.200000	0.014814
+13.210000	0.014763
+13.220000	0.014711
+13.230000	0.014660
+13.240000	0.014609
+13.250000	0.014558
+13.260000	0.014508
+13.270000	0.014457
+13.280000	0.014407
+13.290000	0.014356
+13.300000	0.014306
+13.310000	0.014256
+13.320000	0.014207
+13.330000	0.014157
+13.340000	0.014107
+13.350000	0.014058
+13.360000	0.014009
+13.370000	0.013960
+13.380000	0.013911
+13.390000	0.013862
+13.400000	0.013814
+13.410000	0.013766
+13.420000	0.013717
+13.430000	0.013669
+13.440000	0.013621
+13.450000	0.013574
+13.460000	0.013526
+13.470000	0.013479
+13.480000	0.013431
+13.490000	0.013384
+13.500000	0.013337
+13.510000	0.013290
+13.520000	0.013243
+13.530000	0.013197
+13.540000	0.013151
+13.550000	0.013104
+13.560000	0.013058
+13.570000	0.013012
+13.580000	0.012966
+13.590000	0.012921
+13.600000	0.012875
+13.610000	0.012830
+13.620000	0.012785
+13.630000	0.012740
+13.640000	0.012695
+13.650000	0.012650
+13.660000	0.012605
+13.670000	0.012561
+13.680000	0.012516
+13.690000	0.012472
+13.700000	0.012428
+13.710000	0.012384
+13.720000	0.012340
+13.730000	0.012297
+13.740000	0.012253
+13.750000	0.012210
+13.760000	0.012167
+13.770000	0.012124
+13.780000	0.012081
+13.790000	0.012038
+13.800000	0.011995
+13.810000	0.011953
+13.820000	0.011910
+13.830000	0.011868
+13.840000	0.011826
+13.850000	0.011784
+13.860000	0.011742
+13.870000	0.011700
+13.880000	0.011659
+13.890000	0.011617
+13.900000	0.011576
+13.910000	0.011535
+13.920000	0.011494
+13.930000	0.011453
+13.940000	0.011412
+13.950000	0.011372
+13.960000	0.011331
+13.970000	0.011291
+13.980000	0.011251
+13.990000	0.011211
+14.000000	0.011171
+14.010000	0.011131
+14.020000	0.011091
+14.030000	0.011051
+14.040000	0.011012
+14.050000	0.010973
+14.060000	0.010934
+14.070000	0.010894
+14.080000	0.010856
+14.090000	0.010817
+14.100000	0.010778
+14.110000	0.010740
+14.120000	0.010701
+14.130000	0.010663
+14.140000	0.010625
+14.150000	0.010587
+14.160000	0.010549
+14.170000	0.010511
+14.180000	0.010473
+14.190000	0.010436
+14.200000	0.010398
+14.210000	0.010361
+14.220000	0.010324
+14.230000	0.010287
+14.240000	0.010250
+14.250000	0.010213
+14.260000	0.010177
+14.270000	0.010140
+14.280000	0.010104
+14.290000	0.010067
+14.300000	0.010031
+14.310000	0.009995
+14.320000	0.009959
+14.330000	0.009923
+14.340000	0.009888
+14.350000	0.009852
+14.360000	0.009816
+14.370000	0.009781
+14.380000	0.009746
+14.390000	0.009711
+14.400000	0.009676
+14.410000	0.009641
+14.420000	0.009606
+14.430000	0.009571
+14.440000	0.009537
+14.450000	0.009503
+14.460000	0.009468
+14.470000	0.009434
+14.480000	0.009400
+14.490000	0.009366
+14.500000	0.009332
+14.510000	0.009298
+14.520000	0.009265
+14.530000	0.009231
+14.540000	0.009198
+14.550000	0.009165
+14.560000	0.009131
+14.570000	0.009098
+14.580000	0.009065
+14.590000	0.009033
+14.600000	0.009000
+14.610000	0.008967
+14.620000	0.008935
+14.630000	0.008902
+14.640000	0.008870
+14.650000	0.008838
+14.660000	0.008806
+14.670000	0.008774
+14.680000	0.008742
+14.690000	0.008710
+14.700000	0.008679
+14.710000	0.008647
+14.720000	0.008616
+14.730000	0.008584
+14.740000	0.008553
+14.750000	0.008522
+14.760000	0.008491
+14.770000	0.008460
+14.780000	0.008429
+14.790000	0.008399
+14.800000	0.008368
+14.810000	0.008338
+14.820000	0.008307
+14.830000	0.008277
+14.840000	0.008247
+14.850000	0.008217
+14.860000	0.008187
+14.870000	0.008157
+14.880000	0.008127
+14.890000	0.008097
+14.900000	0.008068
+14.910000	0.008038
+14.920000	0.008009
+14.930000	0.007980
+14.940000	0.007951
+14.950000	0.007922
+14.960000	0.007893
+14.970000	0.007864
+14.980000	0.007835
+14.990000	0.007806
+15.000000	0.007778
+15.010000	0.007749
+15.020000	0.007721
+15.030000	0.007693
+15.040000	0.007664
+15.050000	0.007636
+15.060000	0.007608
+15.070000	0.007580
+15.080000	0.007553
+15.090000	0.007525
+15.100000	0.007497
+15.110000	0.007470
+15.120000	0.007442
+15.130000	0.007415
+15.140000	0.007388
+15.150000	0.007361
+15.160000	0.007334
+15.170000	0.007307
+15.180000	0.007280
+15.190000	0.007253
+15.200000	0.007227
+15.210000	0.007200
+15.220000	0.007173
+15.230000	0.007147
+15.240000	0.007121
+15.250000	0.007095
+15.260000	0.007068
+15.270000	0.007042
+15.280000	0.007016
+15.290000	0.006991
+15.300000	0.006965
+15.310000	0.006939
+15.320000	0.006914
+15.330000	0.006888
+15.340000	0.006863
+15.350000	0.006837
+15.360000	0.006812
+15.370000	0.006787
+15.380000	0.006762
+15.390000	0.006737
+15.400000	0.006712
+15.410000	0.006687
+15.420000	0.006663
+15.430000	0.006638
+15.440000	0.006613
+15.450000	0.006589
+15.460000	0.006565
+15.470000	0.006540
+15.480000	0.006516
+15.490000	0.006492
+15.500000	0.006468
+15.510000	0.006444
+15.520000	0.006420
+15.530000	0.006396
+15.540000	0.006373
+15.550000	0.006349
+15.560000	0.006325
+15.570000	0.006302
+15.580000	0.006279
+15.590000	0.006255
+15.600000	0.006232
+15.610000	0.006209
+15.620000	0.006186
+15.630000	0.006163
+15.640000	0.006140
+15.650000	0.006117
+15.660000	0.006094
+15.670000	0.006072
+15.680000	0.006049
+15.690000	0.006027
+15.700000	0.006004
+15.710000	0.005982
+15.720000	0.005960
+15.730000	0.005938
+15.740000	0.005916
+15.750000	0.005893
+15.760000	0.005872
+15.770000	0.005850
+15.780000	0.005828
+15.790000	0.005806
+15.800000	0.005785
+15.810000	0.005763
+15.820000	0.005741
+15.830000	0.005720
+15.840000	0.005699
+15.850000	0.005677
+15.860000	0.005656
+15.870000	0.005635
+15.880000	0.005614
+15.890000	0.005593
+15.900000	0.005572
+15.910000	0.005551
+15.920000	0.005531
+15.930000	0.005510
+15.940000	0.005489
+15.950000	0.005469
+15.960000	0.005448
+15.970000	0.005428
+15.980000	0.005408
+15.990000	0.005388
+16.000000	0.005367
+16.010000	0.005347
+16.020000	0.005327
+16.030000	0.005307
+16.040000	0.005287
+16.050000	0.005268
+16.060000	0.005248
+16.070000	0.005228
+16.080000	0.005209
+16.090000	0.005189
+16.100000	0.005170
+16.110000	0.005150
+16.120000	0.005131
+16.130000	0.005112
+16.140000	0.005092
+16.150000	0.005073
+16.160000	0.005054
+16.170000	0.005035
+16.180000	0.005016
+16.190000	0.004998
+16.200000	0.004979
+16.210000	0.004960
+16.220000	0.004941
+16.230000	0.004923
+16.240000	0.004904
+16.250000	0.004886
+16.260000	0.004868
+16.270000	0.004849
+16.280000	0.004831
+16.290000	0.004813
+16.300000	0.004795
+16.310000	0.004777
+16.320000	0.004759
+16.330000	0.004741
+16.340000	0.004723
+16.350000	0.004705
+16.360000	0.004687
+16.370000	0.004670
+16.380000	0.004652
+16.390000	0.004634
+16.400000	0.004617
+16.410000	0.004600
+16.420000	0.004582
+16.430000	0.004565
+16.440000	0.004548
+16.450000	0.004530
+16.460000	0.004513
+16.470000	0.004496
+16.480000	0.004479
+16.490000	0.004462
+16.500000	0.004445
+16.510000	0.004429
+16.520000	0.004412
+16.530000	0.004395
+16.540000	0.004379
+16.550000	0.004362
+16.560000	0.004346
+16.570000	0.004329
+16.580000	0.004313
+16.590000	0.004296
+16.600000	0.004280
+16.610000	0.004264
+16.620000	0.004248
+16.630000	0.004232
+16.640000	0.004216
+16.650000	0.004200
+16.660000	0.004184
+16.670000	0.004168
+16.680000	0.004152
+16.690000	0.004136
+16.700000	0.004121
+16.710000	0.004105
+16.720000	0.004089
+16.730000	0.004074
+16.740000	0.004058
+16.750000	0.004043
+16.760000	0.004028
+16.770000	0.004012
+16.780000	0.003997
+16.790000	0.003982
+16.800000	0.003967
+16.810000	0.003952
+16.820000	0.003937
+16.830000	0.003922
+16.840000	0.003907
+16.850000	0.003892
+16.860000	0.003877
+16.870000	0.003862
+16.880000	0.003848
+16.890000	0.003833
+16.900000	0.003818
+16.910000	0.003804
+16.920000	0.003789
+16.930000	0.003775
+16.940000	0.003760
+16.950000	0.003746
+16.960000	0.003732
+16.970000	0.003718
+16.980000	0.003703
+16.990000	0.003689
+17.000000	0.003675
+17.010000	0.003661
+17.020000	0.003647
+17.030000	0.003633
+17.040000	0.003619
+17.050000	0.003606
+17.060000	0.003592
+17.070000	0.003578
+17.080000	0.003564
+17.090000	0.003551
+17.100000	0.003537
+17.110000	0.003524
+17.120000	0.003510
+17.130000	0.003497
+17.140000	0.003483
+17.150000	0.003470
+17.160000	0.003457
+17.170000	0.003444
+17.180000	0.003430
+17.190000	0.003417
+17.200000	0.003404
+17.210000	0.003391
+17.220000	0.003378
+17.230000	0.003365
+17.240000	0.003352
+17.250000	0.003339
+17.260000	0.003327
+17.270000	0.003314
+17.280000	0.003301
+17.290000	0.003288
+17.300000	0.003276
+17.310000	0.003263
+17.320000	0.003251
+17.330000	0.003238
+17.340000	0.003226
+17.350000	0.003213
+17.360000	0.003201
+17.370000	0.003189
+17.380000	0.003177
+17.390000	0.003164
+17.400000	0.003152
+17.410000	0.003140
+17.420000	0.003128
+17.430000	0.003116
+17.440000	0.003104
+17.450000	0.003092
+17.460000	0.003080
+17.470000	0.003068
+17.480000	0.003057
+17.490000	0.003045
+17.500000	0.003033
+17.510000	0.003021
+17.520000	0.003010
+17.530000	0.002998
+17.540000	0.002987
+17.550000	0.002975
+17.560000	0.002964
+17.570000	0.002952
+17.580000	0.002941
+17.590000	0.002929
+17.600000	0.002918
+17.610000	0.002907
+17.620000	0.002896
+17.630000	0.002885
+17.640000	0.002873
+17.650000	0.002862
+17.660000	0.002851
+17.670000	0.002840
+17.680000	0.002829
+17.690000	0.002818
+17.700000	0.002808
+17.710000	0.002797
+17.720000	0.002786
+17.730000	0.002775
+17.740000	0.002764
+17.750000	0.002754
+17.760000	0.002743
+17.770000	0.002732
+17.780000	0.002722
+17.790000	0.002711
+17.800000	0.002701
+17.810000	0.002690
+17.820000	0.002680
+17.830000	0.002670
+17.840000	0.002659
+17.850000	0.002649
+17.860000	0.002639
+17.870000	0.002628
+17.880000	0.002618
+17.890000	0.002608
+17.900000	0.002598
+17.910000	0.002588
+17.920000	0.002578
+17.930000	0.002568
+17.940000	0.002558
+17.950000	0.002548
+17.960000	0.002538
+17.970000	0.002528
+17.980000	0.002519
+17.990000	0.002509
+18.000000	0.002499
+18.010000	0.002489
+18.020000	0.002480
+18.030000	0.002470
+18.040000	0.002460
+18.050000	0.002451
+18.060000	0.002441
+18.070000	0.002432
+18.080000	0.002422
+18.090000	0.002413
+18.100000	0.002404
+18.110000	0.002394
+18.120000	0.002385
+18.130000	0.002376
+18.140000	0.002366
+18.150000	0.002357
+18.160000	0.002348
+18.170000	0.002339
+18.180000	0.002330
+18.190000	0.002321
+18.200000	0.002312
+18.210000	0.002303
+18.220000	0.002294
+18.230000	0.002285
+18.240000	0.002276
+18.250000	0.002267
+18.260000	0.002258
+18.270000	0.002249
+18.280000	0.002241
+18.290000	0.002232
+18.300000	0.002223
+18.310000	0.002215
+18.320000	0.002206
+18.330000	0.002197
+18.340000	0.002189
+18.350000	0.002180
+18.360000	0.002172
+18.370000	0.002163
+18.380000	0.002155
+18.390000	0.002146
+18.400000	0.002138
+18.410000	0.002130
+18.420000	0.002121
+18.430000	0.002113
+18.440000	0.002105
+18.450000	0.002097
+18.460000	0.002088
+18.470000	0.002080
+18.480000	0.002072
+18.490000	0.002064
+18.500000	0.002056
+18.510000	0.002048
+18.520000	0.002040
+18.530000	0.002032
+18.540000	0.002024
+18.550000	0.002016
+18.560000	0.002008
+18.570000	0.002000
+18.580000	0.001992
+18.590000	0.001985
+18.600000	0.001977
+18.610000	0.001969
+18.620000	0.001961
+18.630000	0.001954
+18.640000	0.001946
+18.650000	0.001938
+18.660000	0.001931
+18.670000	0.001923
+18.680000	0.001916
+18.690000	0.001908
+18.700000	0.001901
+18.710000	0.001893
+18.720000	0.001886
+18.730000	0.001878
+18.740000	0.001871
+18.750000	0.001864
+18.760000	0.001856
+18.770000	0.001849
+18.780000	0.001842
+18.790000	0.001835
+18.800000	0.001827
+18.810000	0.001820
+18.820000	0.001813
+18.830000	0.001806
+18.840000	0.001799
+18.850000	0.001792
+18.860000	0.001785
+18.870000	0.001778
+18.880000	0.001771
+18.890000	0.001764
+18.900000	0.001757
+18.910000	0.001750
+18.920000	0.001743
+18.930000	0.001736
+18.940000	0.001729
+18.950000	0.001722
+18.960000	0.001716
+18.970000	0.001709
+18.980000	0.001702
+18.990000	0.001696
+19.000000	0.001689
+19.010000	0.001682
+19.020000	0.001676
+19.030000	0.001669
+19.040000	0.001662
+19.050000	0.001656
+19.060000	0.001649
+19.070000	0.001643
+19.080000	0.001636
+19.090000	0.001630
+19.100000	0.001623
+19.110000	0.001617
+19.120000	0.001611
+19.130000	0.001604
+19.140000	0.001598
+19.150000	0.001592
+19.160000	0.001585
+19.170000	0.001579
+19.180000	0.001573
+19.190000	0.001567
+19.200000	0.001560
+19.210000	0.001554
+19.220000	0.001548
+19.230000	0.001542
+19.240000	0.001536
+19.250000	0.001530
+19.260000	0.001524
+19.270000	0.001518
+19.280000	0.001512
+19.290000	0.001506
+19.300000	0.001500
+19.310000	0.001494
+19.320000	0.001488
+19.330000	0.001482
+19.340000	0.001476
+19.350000	0.001470
+19.360000	0.001465
+19.370000	0.001459
+19.380000	0.001453
+19.390000	0.001447
+19.400000	0.001442
+19.410000	0.001436
+19.420000	0.001430
+19.430000	0.001424
+19.440000	0.001419
+19.450000	0.001413
+19.460000	0.001408
+19.470000	0.001402
+19.480000	0.001396
+19.490000	0.001391
+19.500000	0.001385
+19.510000	0.001380
+19.520000	0.001374
+19.530000	0.001369
+19.540000	0.001364
+19.550000	0.001358
+19.560000	0.001353
+19.570000	0.001347
+19.580000	0.001342
+19.590000	0.001337
+19.600000	0.001331
+19.610000	0.001326
+19.620000	0.001321
+19.630000	0.001316
+19.640000	0.001310
+19.650000	0.001305
+19.660000	0.001300
+19.670000	0.001295
+19.680000	0.001290
+19.690000	0.001285
+19.700000	0.001279
+19.710000	0.001274
+19.720000	0.001269
+19.730000	0.001264
+19.740000	0.001259
+19.750000	0.001254
+19.760000	0.001249
+19.770000	0.001244
+19.780000	0.001239
+19.790000	0.001234
+19.800000	0.001229
+19.810000	0.001225
+19.820000	0.001220
+19.830000	0.001215
+19.840000	0.001210
+19.850000	0.001205
+19.860000	0.001200
+19.870000	0.001196
+19.880000	0.001191
+19.890000	0.001186
+19.900000	0.001181
+19.910000	0.001177
+19.920000	0.001172
+19.930000	0.001167
+19.940000	0.001163
+19.950000	0.001158
+19.960000	0.001153
+19.970000	0.001149
+19.980000	0.001144
+19.990000	0.001140
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_0.5.dat
new file mode 100644
index 0000000..aadb4d9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_0.5.dat
@@ -0,0 +1,2012 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000000
+0.020000	0.000000
+0.030000	0.000000
+0.040000	0.000000
+0.050000	0.000000
+0.060000	0.000000
+0.070000	0.000001
+0.080000	0.000001
+0.090000	0.000003
+0.100000	0.000004
+0.110000	0.000007
+0.120000	0.000010
+0.130000	0.000015
+0.140000	0.000022
+0.150000	0.000030
+0.160000	0.000041
+0.170000	0.000054
+0.180000	0.000070
+0.190000	0.000090
+0.200000	0.000114
+0.210000	0.000143
+0.220000	0.000177
+0.230000	0.000217
+0.240000	0.000263
+0.250000	0.000316
+0.260000	0.000377
+0.270000	0.000446
+0.280000	0.000524
+0.290000	0.000612
+0.300000	0.000711
+0.310000	0.000821
+0.320000	0.000944
+0.330000	0.001079
+0.340000	0.001228
+0.350000	0.001391
+0.360000	0.001570
+0.370000	0.001765
+0.380000	0.001976
+0.390000	0.002206
+0.400000	0.002454
+0.410000	0.002721
+0.420000	0.003009
+0.430000	0.003318
+0.440000	0.003648
+0.450000	0.004001
+0.460000	0.004378
+0.470000	0.004778
+0.480000	0.005203
+0.490000	0.005654
+0.500000	0.006131
+0.510000	0.006635
+0.520000	0.007167
+0.530000	0.007727
+0.540000	0.008316
+0.550000	0.008935
+0.560000	0.009584
+0.570000	0.010263
+0.580000	0.010974
+0.590000	0.011716
+0.600000	0.012491
+0.610000	0.013299
+0.620000	0.014139
+0.630000	0.015014
+0.640000	0.015922
+0.650000	0.016865
+0.660000	0.017842
+0.670000	0.018855
+0.680000	0.019902
+0.690000	0.020985
+0.700000	0.022104
+0.710000	0.023259
+0.720000	0.024450
+0.730000	0.025677
+0.740000	0.026940
+0.750000	0.028240
+0.760000	0.029576
+0.770000	0.030948
+0.780000	0.032357
+0.790000	0.033803
+0.800000	0.035284
+0.810000	0.036802
+0.820000	0.038355
+0.830000	0.039945
+0.840000	0.041570
+0.850000	0.043231
+0.860000	0.044927
+0.870000	0.046658
+0.880000	0.048423
+0.890000	0.050223
+0.900000	0.052057
+0.910000	0.053925
+0.920000	0.055826
+0.930000	0.057760
+0.940000	0.059726
+0.950000	0.061724
+0.960000	0.063754
+0.970000	0.065815
+0.980000	0.067907
+0.990000	0.070028
+1.000000	0.072179
+1.010000	0.074359
+1.020000	0.076567
+1.030000	0.078802
+1.040000	0.081065
+1.050000	0.083354
+1.060000	0.085669
+1.070000	0.088009
+1.080000	0.090374
+1.090000	0.092762
+1.100000	0.095173
+1.110000	0.097607
+1.120000	0.100062
+1.130000	0.102538
+1.140000	0.105034
+1.150000	0.107550
+1.160000	0.110084
+1.170000	0.112636
+1.180000	0.115206
+1.190000	0.117791
+1.200000	0.120392
+1.210000	0.123008
+1.220000	0.125638
+1.230000	0.128280
+1.240000	0.130935
+1.250000	0.133602
+1.260000	0.136279
+1.270000	0.138966
+1.280000	0.141662
+1.290000	0.144367
+1.300000	0.147079
+1.310000	0.149797
+1.320000	0.152521
+1.330000	0.155251
+1.340000	0.157984
+1.350000	0.160721
+1.360000	0.163460
+1.370000	0.166201
+1.380000	0.168943
+1.390000	0.171686
+1.400000	0.174427
+1.410000	0.177167
+1.420000	0.179905
+1.430000	0.182640
+1.440000	0.185372
+1.450000	0.188098
+1.460000	0.190820
+1.470000	0.193535
+1.480000	0.196244
+1.490000	0.198945
+1.500000	0.201638
+1.510000	0.204322
+1.520000	0.206996
+1.530000	0.209660
+1.540000	0.212312
+1.550000	0.214953
+1.560000	0.217582
+1.570000	0.220197
+1.580000	0.222799
+1.590000	0.225386
+1.600000	0.227959
+1.610000	0.230515
+1.620000	0.233056
+1.630000	0.235579
+1.640000	0.238085
+1.650000	0.240573
+1.660000	0.243042
+1.670000	0.245492
+1.680000	0.247922
+1.690000	0.250332
+1.700000	0.252721
+1.710000	0.255089
+1.720000	0.257435
+1.730000	0.259759
+1.740000	0.262060
+1.750000	0.264337
+1.760000	0.266591
+1.770000	0.268821
+1.780000	0.271026
+1.790000	0.273206
+1.800000	0.275360
+1.810000	0.277489
+1.820000	0.279591
+1.830000	0.281667
+1.840000	0.283716
+1.850000	0.285738
+1.860000	0.287732
+1.870000	0.289698
+1.880000	0.291636
+1.890000	0.293545
+1.900000	0.295425
+1.910000	0.297277
+1.920000	0.299098
+1.930000	0.300891
+1.940000	0.302653
+1.950000	0.304385
+1.960000	0.306087
+1.970000	0.307758
+1.980000	0.309399
+1.990000	0.311008
+2.000000	0.312587
+2.010000	0.314134
+2.020000	0.315650
+2.030000	0.317134
+2.040000	0.318587
+2.050000	0.320008
+2.060000	0.321397
+2.070000	0.322754
+2.080000	0.324079
+2.090000	0.325371
+2.100000	0.326632
+2.110000	0.327860
+2.120000	0.329056
+2.130000	0.330219
+2.140000	0.331350
+2.150000	0.332449
+2.160000	0.333515
+2.170000	0.334549
+2.180000	0.335550
+2.190000	0.336519
+2.200000	0.337455
+2.210000	0.338360
+2.220000	0.339231
+2.230000	0.340071
+2.240000	0.340878
+2.250000	0.341654
+2.260000	0.342397
+2.270000	0.343108
+2.280000	0.343788
+2.290000	0.344435
+2.300000	0.345051
+2.310000	0.345635
+2.320000	0.346188
+2.330000	0.346710
+2.340000	0.347200
+2.350000	0.347659
+2.360000	0.348088
+2.370000	0.348485
+2.380000	0.348852
+2.390000	0.349189
+2.400000	0.349495
+2.410000	0.349772
+2.420000	0.350018
+2.430000	0.350234
+2.440000	0.350422
+2.450000	0.350579
+2.460000	0.350708
+2.470000	0.350807
+2.480000	0.350878
+2.490000	0.350921
+2.500000	0.350935
+2.510000	0.350921
+2.520000	0.350879
+2.530000	0.350809
+2.540000	0.350713
+2.550000	0.350589
+2.560000	0.350438
+2.570000	0.350260
+2.580000	0.350056
+2.590000	0.349826
+2.600000	0.349570
+2.610000	0.349288
+2.620000	0.348981
+2.630000	0.348649
+2.640000	0.348292
+2.650000	0.347910
+2.660000	0.347504
+2.670000	0.347074
+2.680000	0.346621
+2.690000	0.346143
+2.700000	0.345643
+2.710000	0.345119
+2.720000	0.344573
+2.730000	0.344004
+2.740000	0.343414
+2.750000	0.342801
+2.760000	0.342167
+2.770000	0.341512
+2.780000	0.340836
+2.790000	0.340139
+2.800000	0.339422
+2.810000	0.338685
+2.820000	0.337927
+2.830000	0.337151
+2.840000	0.336355
+2.850000	0.335540
+2.860000	0.334707
+2.870000	0.333855
+2.880000	0.332985
+2.890000	0.332098
+2.900000	0.331193
+2.910000	0.330271
+2.920000	0.329331
+2.930000	0.328376
+2.940000	0.327404
+2.950000	0.326416
+2.960000	0.325412
+2.970000	0.324393
+2.980000	0.323359
+2.990000	0.322310
+3.000000	0.321246
+3.010000	0.320168
+3.020000	0.319076
+3.030000	0.317971
+3.040000	0.316852
+3.050000	0.315720
+3.060000	0.314575
+3.070000	0.313417
+3.080000	0.312247
+3.090000	0.311065
+3.100000	0.309871
+3.110000	0.308666
+3.120000	0.307450
+3.130000	0.306222
+3.140000	0.304984
+3.150000	0.303736
+3.160000	0.302477
+3.170000	0.301209
+3.180000	0.299931
+3.190000	0.298644
+3.200000	0.297347
+3.210000	0.296042
+3.220000	0.294728
+3.230000	0.293406
+3.240000	0.292076
+3.250000	0.290738
+3.260000	0.289392
+3.270000	0.288039
+3.280000	0.286679
+3.290000	0.285312
+3.300000	0.283939
+3.310000	0.282559
+3.320000	0.281173
+3.330000	0.279781
+3.340000	0.278384
+3.350000	0.276981
+3.360000	0.275573
+3.370000	0.274160
+3.380000	0.272742
+3.390000	0.271319
+3.400000	0.269893
+3.410000	0.268462
+3.420000	0.267027
+3.430000	0.265588
+3.440000	0.264147
+3.450000	0.262701
+3.460000	0.261253
+3.470000	0.259802
+3.480000	0.258348
+3.490000	0.256892
+3.500000	0.255433
+3.510000	0.253973
+3.520000	0.252510
+3.530000	0.251046
+3.540000	0.249580
+3.550000	0.248113
+3.560000	0.246645
+3.570000	0.245176
+3.580000	0.243706
+3.590000	0.242235
+3.600000	0.240764
+3.610000	0.239292
+3.620000	0.237821
+3.630000	0.236349
+3.640000	0.234878
+3.650000	0.233407
+3.660000	0.231936
+3.670000	0.230466
+3.680000	0.228997
+3.690000	0.227529
+3.700000	0.226062
+3.710000	0.224597
+3.720000	0.223132
+3.730000	0.221670
+3.740000	0.220208
+3.750000	0.218749
+3.760000	0.217292
+3.770000	0.215837
+3.780000	0.214384
+3.790000	0.212933
+3.800000	0.211485
+3.810000	0.210039
+3.820000	0.208596
+3.830000	0.207156
+3.840000	0.205718
+3.850000	0.204284
+3.860000	0.202853
+3.870000	0.201425
+3.880000	0.200001
+3.890000	0.198580
+3.900000	0.197163
+3.910000	0.195749
+3.920000	0.194339
+3.930000	0.192933
+3.940000	0.191531
+3.950000	0.190133
+3.960000	0.188739
+3.970000	0.187350
+3.980000	0.185964
+3.990000	0.184584
+4.000000	0.183207
+4.010000	0.181836
+4.020000	0.180468
+4.030000	0.179106
+4.040000	0.177749
+4.050000	0.176396
+4.060000	0.175048
+4.070000	0.173706
+4.080000	0.172368
+4.090000	0.171036
+4.100000	0.169708
+4.110000	0.168386
+4.120000	0.167070
+4.130000	0.165759
+4.140000	0.164453
+4.150000	0.163153
+4.160000	0.161858
+4.170000	0.160569
+4.180000	0.159286
+4.190000	0.158009
+4.200000	0.156737
+4.210000	0.155471
+4.220000	0.154211
+4.230000	0.152957
+4.240000	0.151709
+4.250000	0.150467
+4.260000	0.149231
+4.270000	0.148001
+4.280000	0.146777
+4.290000	0.145559
+4.300000	0.144347
+4.310000	0.143142
+4.320000	0.141943
+4.330000	0.140750
+4.340000	0.139563
+4.350000	0.138383
+4.360000	0.137209
+4.370000	0.136042
+4.380000	0.134881
+4.390000	0.133726
+4.400000	0.132578
+4.410000	0.131436
+4.420000	0.130301
+4.430000	0.129172
+4.440000	0.128050
+4.450000	0.126934
+4.460000	0.125825
+4.470000	0.124722
+4.480000	0.123626
+4.490000	0.122537
+4.500000	0.121454
+4.510000	0.120377
+4.520000	0.119308
+4.530000	0.118245
+4.540000	0.117188
+4.550000	0.116138
+4.560000	0.115095
+4.570000	0.114059
+4.580000	0.113029
+4.590000	0.112005
+4.600000	0.110989
+4.610000	0.109979
+4.620000	0.108975
+4.630000	0.107978
+4.640000	0.106988
+4.650000	0.106005
+4.660000	0.105028
+4.670000	0.104057
+4.680000	0.103094
+4.690000	0.102136
+4.700000	0.101186
+4.710000	0.100242
+4.720000	0.099304
+4.730000	0.098374
+4.740000	0.097449
+4.750000	0.096532
+4.760000	0.095620
+4.770000	0.094716
+4.780000	0.093817
+4.790000	0.092926
+4.800000	0.092040
+4.810000	0.091161
+4.820000	0.090289
+4.830000	0.089423
+4.840000	0.088564
+4.850000	0.087710
+4.860000	0.086864
+4.870000	0.086023
+4.880000	0.085189
+4.890000	0.084361
+4.900000	0.083540
+4.910000	0.082725
+4.920000	0.081916
+4.930000	0.081113
+4.940000	0.080316
+4.950000	0.079526
+4.960000	0.078742
+4.970000	0.077964
+4.980000	0.077192
+4.990000	0.076426
+5.000000	0.075667
+5.010000	0.074913
+5.020000	0.074165
+5.030000	0.073424
+5.040000	0.072688
+5.050000	0.071958
+5.060000	0.071235
+5.070000	0.070517
+5.080000	0.069805
+5.090000	0.069099
+5.100000	0.068398
+5.110000	0.067704
+5.120000	0.067015
+5.130000	0.066332
+5.140000	0.065655
+5.150000	0.064983
+5.160000	0.064317
+5.170000	0.063657
+5.180000	0.063002
+5.190000	0.062353
+5.200000	0.061710
+5.210000	0.061072
+5.220000	0.060439
+5.230000	0.059812
+5.240000	0.059190
+5.250000	0.058574
+5.260000	0.057963
+5.270000	0.057357
+5.280000	0.056757
+5.290000	0.056162
+5.300000	0.055572
+5.310000	0.054987
+5.320000	0.054408
+5.330000	0.053834
+5.340000	0.053265
+5.350000	0.052701
+5.360000	0.052142
+5.370000	0.051588
+5.380000	0.051039
+5.390000	0.050495
+5.400000	0.049956
+5.410000	0.049422
+5.420000	0.048893
+5.430000	0.048368
+5.440000	0.047849
+5.450000	0.047334
+5.460000	0.046824
+5.470000	0.046318
+5.480000	0.045818
+5.490000	0.045322
+5.500000	0.044830
+5.510000	0.044344
+5.520000	0.043861
+5.530000	0.043384
+5.540000	0.042911
+5.550000	0.042442
+5.560000	0.041978
+5.570000	0.041518
+5.580000	0.041062
+5.590000	0.040611
+5.600000	0.040164
+5.610000	0.039722
+5.620000	0.039284
+5.630000	0.038849
+5.640000	0.038420
+5.650000	0.037994
+5.660000	0.037572
+5.670000	0.037155
+5.680000	0.036741
+5.690000	0.036332
+5.700000	0.035927
+5.710000	0.035525
+5.720000	0.035128
+5.730000	0.034734
+5.740000	0.034345
+5.750000	0.033959
+5.760000	0.033577
+5.770000	0.033199
+5.780000	0.032824
+5.790000	0.032453
+5.800000	0.032087
+5.810000	0.031723
+5.820000	0.031364
+5.830000	0.031008
+5.840000	0.030655
+5.850000	0.030306
+5.860000	0.029961
+5.870000	0.029619
+5.880000	0.029281
+5.890000	0.028946
+5.900000	0.028614
+5.910000	0.028286
+5.920000	0.027962
+5.930000	0.027640
+5.940000	0.027322
+5.950000	0.027007
+5.960000	0.026696
+5.970000	0.026387
+5.980000	0.026082
+5.990000	0.025780
+6.000000	0.025481
+6.010000	0.025186
+6.020000	0.024893
+6.030000	0.024603
+6.040000	0.024317
+6.050000	0.024033
+6.060000	0.023753
+6.070000	0.023475
+6.080000	0.023200
+6.090000	0.022929
+6.100000	0.022660
+6.110000	0.022394
+6.120000	0.022131
+6.130000	0.021870
+6.140000	0.021612
+6.150000	0.021358
+6.160000	0.021105
+6.170000	0.020856
+6.180000	0.020609
+6.190000	0.020365
+6.200000	0.020124
+6.210000	0.019885
+6.220000	0.019648
+6.230000	0.019415
+6.240000	0.019183
+6.250000	0.018955
+6.260000	0.018729
+6.270000	0.018505
+6.280000	0.018283
+6.290000	0.018065
+6.300000	0.017848
+6.310000	0.017634
+6.320000	0.017422
+6.330000	0.017213
+6.340000	0.017006
+6.350000	0.016801
+6.360000	0.016598
+6.370000	0.016398
+6.380000	0.016200
+6.390000	0.016004
+6.400000	0.015810
+6.410000	0.015618
+6.420000	0.015429
+6.430000	0.015241
+6.440000	0.015056
+6.450000	0.014873
+6.460000	0.014692
+6.470000	0.014513
+6.480000	0.014336
+6.490000	0.014161
+6.500000	0.013987
+6.510000	0.013816
+6.520000	0.013647
+6.530000	0.013480
+6.540000	0.013314
+6.550000	0.013151
+6.560000	0.012989
+6.570000	0.012829
+6.580000	0.012671
+6.590000	0.012515
+6.600000	0.012360
+6.610000	0.012208
+6.620000	0.012057
+6.630000	0.011908
+6.640000	0.011760
+6.650000	0.011614
+6.660000	0.011470
+6.670000	0.011328
+6.680000	0.011187
+6.690000	0.011048
+6.700000	0.010910
+6.710000	0.010774
+6.720000	0.010640
+6.730000	0.010507
+6.740000	0.010375
+6.750000	0.010246
+6.760000	0.010117
+6.770000	0.009991
+6.780000	0.009865
+6.790000	0.009742
+6.800000	0.009619
+6.810000	0.009498
+6.820000	0.009379
+6.830000	0.009261
+6.840000	0.009144
+6.850000	0.009029
+6.860000	0.008915
+6.870000	0.008802
+6.880000	0.008691
+6.890000	0.008581
+6.900000	0.008472
+6.910000	0.008364
+6.920000	0.008258
+6.930000	0.008153
+6.940000	0.008050
+6.950000	0.007947
+6.960000	0.007846
+6.970000	0.007746
+6.980000	0.007648
+6.990000	0.007550
+7.000000	0.007454
+7.010000	0.007358
+7.020000	0.007264
+7.030000	0.007171
+7.040000	0.007079
+7.050000	0.006989
+7.060000	0.006899
+7.070000	0.006810
+7.080000	0.006723
+7.090000	0.006636
+7.100000	0.006551
+7.110000	0.006467
+7.120000	0.006383
+7.130000	0.006301
+7.140000	0.006220
+7.150000	0.006139
+7.160000	0.006060
+7.170000	0.005982
+7.180000	0.005904
+7.190000	0.005828
+7.200000	0.005752
+7.210000	0.005677
+7.220000	0.005604
+7.230000	0.005531
+7.240000	0.005459
+7.250000	0.005388
+7.260000	0.005318
+7.270000	0.005248
+7.280000	0.005180
+7.290000	0.005112
+7.300000	0.005046
+7.310000	0.004980
+7.320000	0.004915
+7.330000	0.004850
+7.340000	0.004787
+7.350000	0.004724
+7.360000	0.004662
+7.370000	0.004601
+7.380000	0.004540
+7.390000	0.004481
+7.400000	0.004422
+7.410000	0.004364
+7.420000	0.004306
+7.430000	0.004249
+7.440000	0.004193
+7.450000	0.004138
+7.460000	0.004083
+7.470000	0.004029
+7.480000	0.003976
+7.490000	0.003924
+7.500000	0.003872
+7.510000	0.003820
+7.520000	0.003770
+7.530000	0.003720
+7.540000	0.003670
+7.550000	0.003621
+7.560000	0.003573
+7.570000	0.003526
+7.580000	0.003479
+7.590000	0.003433
+7.600000	0.003387
+7.610000	0.003342
+7.620000	0.003297
+7.630000	0.003253
+7.640000	0.003210
+7.650000	0.003167
+7.660000	0.003124
+7.670000	0.003082
+7.680000	0.003041
+7.690000	0.003000
+7.700000	0.002960
+7.710000	0.002920
+7.720000	0.002881
+7.730000	0.002843
+7.740000	0.002804
+7.750000	0.002767
+7.760000	0.002729
+7.770000	0.002693
+7.780000	0.002656
+7.790000	0.002620
+7.800000	0.002585
+7.810000	0.002550
+7.820000	0.002516
+7.830000	0.002482
+7.840000	0.002448
+7.850000	0.002415
+7.860000	0.002382
+7.870000	0.002350
+7.880000	0.002318
+7.890000	0.002287
+7.900000	0.002256
+7.910000	0.002225
+7.920000	0.002195
+7.930000	0.002165
+7.940000	0.002136
+7.950000	0.002106
+7.960000	0.002078
+7.970000	0.002049
+7.980000	0.002021
+7.990000	0.001994
+8.000000	0.001967
+8.010000	0.001940
+8.020000	0.001913
+8.030000	0.001887
+8.040000	0.001861
+8.050000	0.001836
+8.060000	0.001811
+8.070000	0.001786
+8.080000	0.001761
+8.090000	0.001737
+8.100000	0.001713
+8.110000	0.001690
+8.120000	0.001667
+8.130000	0.001644
+8.140000	0.001621
+8.150000	0.001599
+8.160000	0.001577
+8.170000	0.001555
+8.180000	0.001534
+8.190000	0.001512
+8.200000	0.001492
+8.210000	0.001471
+8.220000	0.001451
+8.230000	0.001431
+8.240000	0.001411
+8.250000	0.001391
+8.260000	0.001372
+8.270000	0.001353
+8.280000	0.001334
+8.290000	0.001316
+8.300000	0.001297
+8.310000	0.001279
+8.320000	0.001262
+8.330000	0.001244
+8.340000	0.001227
+8.350000	0.001210
+8.360000	0.001193
+8.370000	0.001176
+8.380000	0.001160
+8.390000	0.001144
+8.400000	0.001128
+8.410000	0.001112
+8.420000	0.001097
+8.430000	0.001081
+8.440000	0.001066
+8.450000	0.001051
+8.460000	0.001037
+8.470000	0.001022
+8.480000	0.001008
+8.490000	0.000994
+8.500000	0.000980
+8.510000	0.000966
+8.520000	0.000952
+8.530000	0.000939
+8.540000	0.000926
+8.550000	0.000913
+8.560000	0.000900
+8.570000	0.000887
+8.580000	0.000875
+8.590000	0.000863
+8.600000	0.000850
+8.610000	0.000838
+8.620000	0.000827
+8.630000	0.000815
+8.640000	0.000803
+8.650000	0.000792
+8.660000	0.000781
+8.670000	0.000770
+8.680000	0.000759
+8.690000	0.000748
+8.700000	0.000738
+8.710000	0.000727
+8.720000	0.000717
+8.730000	0.000707
+8.740000	0.000697
+8.750000	0.000687
+8.760000	0.000677
+8.770000	0.000668
+8.780000	0.000658
+8.790000	0.000649
+8.800000	0.000639
+8.810000	0.000630
+8.820000	0.000621
+8.830000	0.000613
+8.840000	0.000604
+8.850000	0.000595
+8.860000	0.000587
+8.870000	0.000578
+8.880000	0.000570
+8.890000	0.000562
+8.900000	0.000554
+8.910000	0.000546
+8.920000	0.000538
+8.930000	0.000531
+8.940000	0.000523
+8.950000	0.000516
+8.960000	0.000508
+8.970000	0.000501
+8.980000	0.000494
+8.990000	0.000487
+9.000000	0.000480
+9.010000	0.000473
+9.020000	0.000466
+9.030000	0.000459
+9.040000	0.000453
+9.050000	0.000446
+9.060000	0.000440
+9.070000	0.000433
+9.080000	0.000427
+9.090000	0.000421
+9.100000	0.000415
+9.110000	0.000409
+9.120000	0.000403
+9.130000	0.000397
+9.140000	0.000392
+9.150000	0.000386
+9.160000	0.000380
+9.170000	0.000375
+9.180000	0.000369
+9.190000	0.000364
+9.200000	0.000359
+9.210000	0.000354
+9.220000	0.000349
+9.230000	0.000344
+9.240000	0.000339
+9.250000	0.000334
+9.260000	0.000329
+9.270000	0.000324
+9.280000	0.000319
+9.290000	0.000315
+9.300000	0.000310
+9.310000	0.000306
+9.320000	0.000301
+9.330000	0.000297
+9.340000	0.000292
+9.350000	0.000288
+9.360000	0.000284
+9.370000	0.000280
+9.380000	0.000276
+9.390000	0.000272
+9.400000	0.000268
+9.410000	0.000264
+9.420000	0.000260
+9.430000	0.000256
+9.440000	0.000253
+9.450000	0.000249
+9.460000	0.000245
+9.470000	0.000242
+9.480000	0.000238
+9.490000	0.000235
+9.500000	0.000231
+9.510000	0.000228
+9.520000	0.000225
+9.530000	0.000221
+9.540000	0.000218
+9.550000	0.000215
+9.560000	0.000212
+9.570000	0.000209
+9.580000	0.000205
+9.590000	0.000202
+9.600000	0.000199
+9.610000	0.000197
+9.620000	0.000194
+9.630000	0.000191
+9.640000	0.000188
+9.650000	0.000185
+9.660000	0.000183
+9.670000	0.000180
+9.680000	0.000177
+9.690000	0.000175
+9.700000	0.000172
+9.710000	0.000169
+9.720000	0.000167
+9.730000	0.000165
+9.740000	0.000162
+9.750000	0.000160
+9.760000	0.000157
+9.770000	0.000155
+9.780000	0.000153
+9.790000	0.000150
+9.800000	0.000148
+9.810000	0.000146
+9.820000	0.000144
+9.830000	0.000142
+9.840000	0.000140
+9.850000	0.000138
+9.860000	0.000136
+9.870000	0.000134
+9.880000	0.000132
+9.890000	0.000130
+9.900000	0.000128
+9.910000	0.000126
+9.920000	0.000124
+9.930000	0.000122
+9.940000	0.000120
+9.950000	0.000118
+9.960000	0.000117
+9.970000	0.000115
+9.980000	0.000113
+9.990000	0.000112
+10.000000	0.000110
+10.010000	0.000108
+10.020000	0.000107
+10.030000	0.000105
+10.040000	0.000104
+10.050000	0.000102
+10.060000	0.000100
+10.070000	0.000099
+10.080000	0.000097
+10.090000	0.000096
+10.100000	0.000095
+10.110000	0.000093
+10.120000	0.000092
+10.130000	0.000090
+10.140000	0.000089
+10.150000	0.000088
+10.160000	0.000086
+10.170000	0.000085
+10.180000	0.000084
+10.190000	0.000083
+10.200000	0.000081
+10.210000	0.000080
+10.220000	0.000079
+10.230000	0.000078
+10.240000	0.000077
+10.250000	0.000075
+10.260000	0.000074
+10.270000	0.000073
+10.280000	0.000072
+10.290000	0.000071
+10.300000	0.000070
+10.310000	0.000069
+10.320000	0.000068
+10.330000	0.000067
+10.340000	0.000066
+10.350000	0.000065
+10.360000	0.000064
+10.370000	0.000063
+10.380000	0.000062
+10.390000	0.000061
+10.400000	0.000060
+10.410000	0.000059
+10.420000	0.000058
+10.430000	0.000057
+10.440000	0.000057
+10.450000	0.000056
+10.460000	0.000055
+10.470000	0.000054
+10.480000	0.000053
+10.490000	0.000052
+10.500000	0.000052
+10.510000	0.000051
+10.520000	0.000050
+10.530000	0.000049
+10.540000	0.000049
+10.550000	0.000048
+10.560000	0.000047
+10.570000	0.000046
+10.580000	0.000046
+10.590000	0.000045
+10.600000	0.000044
+10.610000	0.000044
+10.620000	0.000043
+10.630000	0.000042
+10.640000	0.000042
+10.650000	0.000041
+10.660000	0.000040
+10.670000	0.000040
+10.680000	0.000039
+10.690000	0.000039
+10.700000	0.000038
+10.710000	0.000037
+10.720000	0.000037
+10.730000	0.000036
+10.740000	0.000036
+10.750000	0.000035
+10.760000	0.000035
+10.770000	0.000034
+10.780000	0.000034
+10.790000	0.000033
+10.800000	0.000033
+10.810000	0.000032
+10.820000	0.000032
+10.830000	0.000031
+10.840000	0.000031
+10.850000	0.000030
+10.860000	0.000030
+10.870000	0.000029
+10.880000	0.000029
+10.890000	0.000028
+10.900000	0.000028
+10.910000	0.000028
+10.920000	0.000027
+10.930000	0.000027
+10.940000	0.000026
+10.950000	0.000026
+10.960000	0.000025
+10.970000	0.000025
+10.980000	0.000025
+10.990000	0.000024
+11.000000	0.000024
+11.010000	0.000024
+11.020000	0.000023
+11.030000	0.000023
+11.040000	0.000023
+11.050000	0.000022
+11.060000	0.000022
+11.070000	0.000022
+11.080000	0.000021
+11.090000	0.000021
+11.100000	0.000021
+11.110000	0.000020
+11.120000	0.000020
+11.130000	0.000020
+11.140000	0.000019
+11.150000	0.000019
+11.160000	0.000019
+11.170000	0.000018
+11.180000	0.000018
+11.190000	0.000018
+11.200000	0.000018
+11.210000	0.000017
+11.220000	0.000017
+11.230000	0.000017
+11.240000	0.000017
+11.250000	0.000016
+11.260000	0.000016
+11.270000	0.000016
+11.280000	0.000016
+11.290000	0.000015
+11.300000	0.000015
+11.310000	0.000015
+11.320000	0.000015
+11.330000	0.000014
+11.340000	0.000014
+11.350000	0.000014
+11.360000	0.000014
+11.370000	0.000013
+11.380000	0.000013
+11.390000	0.000013
+11.400000	0.000013
+11.410000	0.000013
+11.420000	0.000012
+11.430000	0.000012
+11.440000	0.000012
+11.450000	0.000012
+11.460000	0.000012
+11.470000	0.000012
+11.480000	0.000011
+11.490000	0.000011
+11.500000	0.000011
+11.510000	0.000011
+11.520000	0.000011
+11.530000	0.000011
+11.540000	0.000010
+11.550000	0.000010
+11.560000	0.000010
+11.570000	0.000010
+11.580000	0.000010
+11.590000	0.000010
+11.600000	0.000009
+11.610000	0.000009
+11.620000	0.000009
+11.630000	0.000009
+11.640000	0.000009
+11.650000	0.000009
+11.660000	0.000009
+11.670000	0.000008
+11.680000	0.000008
+11.690000	0.000008
+11.700000	0.000008
+11.710000	0.000008
+11.720000	0.000008
+11.730000	0.000008
+11.740000	0.000008
+11.750000	0.000007
+11.760000	0.000007
+11.770000	0.000007
+11.780000	0.000007
+11.790000	0.000007
+11.800000	0.000007
+11.810000	0.000007
+11.820000	0.000007
+11.830000	0.000007
+11.840000	0.000006
+11.850000	0.000006
+11.860000	0.000006
+11.870000	0.000006
+11.880000	0.000006
+11.890000	0.000006
+11.900000	0.000006
+11.910000	0.000006
+11.920000	0.000006
+11.930000	0.000006
+11.940000	0.000006
+11.950000	0.000005
+11.960000	0.000005
+11.970000	0.000005
+11.980000	0.000005
+11.990000	0.000005
+12.000000	0.000005
+12.010000	0.000005
+12.020000	0.000005
+12.030000	0.000005
+12.040000	0.000005
+12.050000	0.000005
+12.060000	0.000005
+12.070000	0.000004
+12.080000	0.000004
+12.090000	0.000004
+12.100000	0.000004
+12.110000	0.000004
+12.120000	0.000004
+12.130000	0.000004
+12.140000	0.000004
+12.150000	0.000004
+12.160000	0.000004
+12.170000	0.000004
+12.180000	0.000004
+12.190000	0.000004
+12.200000	0.000004
+12.210000	0.000004
+12.220000	0.000004
+12.230000	0.000003
+12.240000	0.000003
+12.250000	0.000003
+12.260000	0.000003
+12.270000	0.000003
+12.280000	0.000003
+12.290000	0.000003
+12.300000	0.000003
+12.310000	0.000003
+12.320000	0.000003
+12.330000	0.000003
+12.340000	0.000003
+12.350000	0.000003
+12.360000	0.000003
+12.370000	0.000003
+12.380000	0.000003
+12.390000	0.000003
+12.400000	0.000003
+12.410000	0.000003
+12.420000	0.000003
+12.430000	0.000003
+12.440000	0.000002
+12.450000	0.000002
+12.460000	0.000002
+12.470000	0.000002
+12.480000	0.000002
+12.490000	0.000002
+12.500000	0.000002
+12.510000	0.000002
+12.520000	0.000002
+12.530000	0.000002
+12.540000	0.000002
+12.550000	0.000002
+12.560000	0.000002
+12.570000	0.000002
+12.580000	0.000002
+12.590000	0.000002
+12.600000	0.000002
+12.610000	0.000002
+12.620000	0.000002
+12.630000	0.000002
+12.640000	0.000002
+12.650000	0.000002
+12.660000	0.000002
+12.670000	0.000002
+12.680000	0.000002
+12.690000	0.000002
+12.700000	0.000002
+12.710000	0.000002
+12.720000	0.000002
+12.730000	0.000002
+12.740000	0.000002
+12.750000	0.000002
+12.760000	0.000001
+12.770000	0.000001
+12.780000	0.000001
+12.790000	0.000001
+12.800000	0.000001
+12.810000	0.000001
+12.820000	0.000001
+12.830000	0.000001
+12.840000	0.000001
+12.850000	0.000001
+12.860000	0.000001
+12.870000	0.000001
+12.880000	0.000001
+12.890000	0.000001
+12.900000	0.000001
+12.910000	0.000001
+12.920000	0.000001
+12.930000	0.000001
+12.940000	0.000001
+12.950000	0.000001
+12.960000	0.000001
+12.970000	0.000001
+12.980000	0.000001
+12.990000	0.000001
+13.000000	0.000001
+13.010000	0.000001
+13.020000	0.000001
+13.030000	0.000001
+13.040000	0.000001
+13.050000	0.000001
+13.060000	0.000001
+13.070000	0.000001
+13.080000	0.000001
+13.090000	0.000001
+13.100000	0.000001
+13.110000	0.000001
+13.120000	0.000001
+13.130000	0.000001
+13.140000	0.000001
+13.150000	0.000001
+13.160000	0.000001
+13.170000	0.000001
+13.180000	0.000001
+13.190000	0.000001
+13.200000	0.000001
+13.210000	0.000001
+13.220000	0.000001
+13.230000	0.000001
+13.240000	0.000001
+13.250000	0.000001
+13.260000	0.000001
+13.270000	0.000001
+13.280000	0.000001
+13.290000	0.000001
+13.300000	0.000001
+13.310000	0.000001
+13.320000	0.000001
+13.330000	0.000001
+13.340000	0.000001
+13.350000	0.000001
+13.360000	0.000001
+13.370000	0.000001
+13.380000	0.000001
+13.390000	0.000001
+13.400000	0.000001
+13.410000	0.000001
+13.420000	0.000001
+13.430000	0.000001
+13.440000	0.000000
+13.450000	0.000000
+13.460000	0.000000
+13.470000	0.000000
+13.480000	0.000000
+13.490000	0.000000
+13.500000	0.000000
+13.510000	0.000000
+13.520000	0.000000
+13.530000	0.000000
+13.540000	0.000000
+13.550000	0.000000
+13.560000	0.000000
+13.570000	0.000000
+13.580000	0.000000
+13.590000	0.000000
+13.600000	0.000000
+13.610000	0.000000
+13.620000	0.000000
+13.630000	0.000000
+13.640000	0.000000
+13.650000	0.000000
+13.660000	0.000000
+13.670000	0.000000
+13.680000	0.000000
+13.690000	0.000000
+13.700000	0.000000
+13.710000	0.000000
+13.720000	0.000000
+13.730000	0.000000
+13.740000	0.000000
+13.750000	0.000000
+13.760000	0.000000
+13.770000	0.000000
+13.780000	0.000000
+13.790000	0.000000
+13.800000	0.000000
+13.810000	0.000000
+13.820000	0.000000
+13.830000	0.000000
+13.840000	0.000000
+13.850000	0.000000
+13.860000	0.000000
+13.870000	0.000000
+13.880000	0.000000
+13.890000	0.000000
+13.900000	0.000000
+13.910000	0.000000
+13.920000	0.000000
+13.930000	0.000000
+13.940000	0.000000
+13.950000	0.000000
+13.960000	0.000000
+13.970000	0.000000
+13.980000	0.000000
+13.990000	0.000000
+14.000000	0.000000
+14.010000	0.000000
+14.020000	0.000000
+14.030000	0.000000
+14.040000	0.000000
+14.050000	0.000000
+14.060000	0.000000
+14.070000	0.000000
+14.080000	0.000000
+14.090000	0.000000
+14.100000	0.000000
+14.110000	0.000000
+14.120000	0.000000
+14.130000	0.000000
+14.140000	0.000000
+14.150000	0.000000
+14.160000	0.000000
+14.170000	0.000000
+14.180000	0.000000
+14.190000	0.000000
+14.200000	0.000000
+14.210000	0.000000
+14.220000	0.000000
+14.230000	0.000000
+14.240000	0.000000
+14.250000	0.000000
+14.260000	0.000000
+14.270000	0.000000
+14.280000	0.000000
+14.290000	0.000000
+14.300000	0.000000
+14.310000	0.000000
+14.320000	0.000000
+14.330000	0.000000
+14.340000	0.000000
+14.350000	0.000000
+14.360000	0.000000
+14.370000	0.000000
+14.380000	0.000000
+14.390000	0.000000
+14.400000	0.000000
+14.410000	0.000000
+14.420000	0.000000
+14.430000	0.000000
+14.440000	0.000000
+14.450000	0.000000
+14.460000	0.000000
+14.470000	0.000000
+14.480000	0.000000
+14.490000	0.000000
+14.500000	0.000000
+14.510000	0.000000
+14.520000	0.000000
+14.530000	0.000000
+14.540000	0.000000
+14.550000	0.000000
+14.560000	0.000000
+14.570000	0.000000
+14.580000	0.000000
+14.590000	0.000000
+14.600000	0.000000
+14.610000	0.000000
+14.620000	0.000000
+14.630000	0.000000
+14.640000	0.000000
+14.650000	0.000000
+14.660000	0.000000
+14.670000	0.000000
+14.680000	0.000000
+14.690000	0.000000
+14.700000	0.000000
+14.710000	0.000000
+14.720000	0.000000
+14.730000	0.000000
+14.740000	0.000000
+14.750000	0.000000
+14.760000	0.000000
+14.770000	0.000000
+14.780000	0.000000
+14.790000	0.000000
+14.800000	0.000000
+14.810000	0.000000
+14.820000	0.000000
+14.830000	0.000000
+14.840000	0.000000
+14.850000	0.000000
+14.860000	0.000000
+14.870000	0.000000
+14.880000	0.000000
+14.890000	0.000000
+14.900000	0.000000
+14.910000	0.000000
+14.920000	0.000000
+14.930000	0.000000
+14.940000	0.000000
+14.950000	0.000000
+14.960000	0.000000
+14.970000	0.000000
+14.980000	0.000000
+14.990000	0.000000
+15.000000	0.000000
+15.010000	0.000000
+15.020000	0.000000
+15.030000	0.000000
+15.040000	0.000000
+15.050000	0.000000
+15.060000	0.000000
+15.070000	0.000000
+15.080000	0.000000
+15.090000	0.000000
+15.100000	0.000000
+15.110000	0.000000
+15.120000	0.000000
+15.130000	0.000000
+15.140000	0.000000
+15.150000	0.000000
+15.160000	0.000000
+15.170000	0.000000
+15.180000	0.000000
+15.190000	0.000000
+15.200000	0.000000
+15.210000	0.000000
+15.220000	0.000000
+15.230000	0.000000
+15.240000	0.000000
+15.250000	0.000000
+15.260000	0.000000
+15.270000	0.000000
+15.280000	0.000000
+15.290000	0.000000
+15.300000	0.000000
+15.310000	0.000000
+15.320000	0.000000
+15.330000	0.000000
+15.340000	0.000000
+15.350000	0.000000
+15.360000	0.000000
+15.370000	0.000000
+15.380000	0.000000
+15.390000	0.000000
+15.400000	0.000000
+15.410000	0.000000
+15.420000	0.000000
+15.430000	0.000000
+15.440000	0.000000
+15.450000	0.000000
+15.460000	0.000000
+15.470000	0.000000
+15.480000	0.000000
+15.490000	0.000000
+15.500000	0.000000
+15.510000	0.000000
+15.520000	0.000000
+15.530000	0.000000
+15.540000	0.000000
+15.550000	0.000000
+15.560000	0.000000
+15.570000	0.000000
+15.580000	0.000000
+15.590000	0.000000
+15.600000	0.000000
+15.610000	0.000000
+15.620000	0.000000
+15.630000	0.000000
+15.640000	0.000000
+15.650000	0.000000
+15.660000	0.000000
+15.670000	0.000000
+15.680000	0.000000
+15.690000	0.000000
+15.700000	0.000000
+15.710000	0.000000
+15.720000	0.000000
+15.730000	0.000000
+15.740000	0.000000
+15.750000	0.000000
+15.760000	0.000000
+15.770000	0.000000
+15.780000	0.000000
+15.790000	0.000000
+15.800000	0.000000
+15.810000	0.000000
+15.820000	0.000000
+15.830000	0.000000
+15.840000	0.000000
+15.850000	0.000000
+15.860000	0.000000
+15.870000	0.000000
+15.880000	0.000000
+15.890000	0.000000
+15.900000	0.000000
+15.910000	0.000000
+15.920000	0.000000
+15.930000	0.000000
+15.940000	0.000000
+15.950000	0.000000
+15.960000	0.000000
+15.970000	0.000000
+15.980000	0.000000
+15.990000	0.000000
+16.000000	0.000000
+16.010000	0.000000
+16.020000	0.000000
+16.030000	0.000000
+16.040000	0.000000
+16.050000	0.000000
+16.060000	0.000000
+16.070000	0.000000
+16.080000	0.000000
+16.090000	0.000000
+16.100000	0.000000
+16.110000	0.000000
+16.120000	0.000000
+16.130000	0.000000
+16.140000	0.000000
+16.150000	0.000000
+16.160000	0.000000
+16.170000	0.000000
+16.180000	0.000000
+16.190000	0.000000
+16.200000	0.000000
+16.210000	0.000000
+16.220000	0.000000
+16.230000	0.000000
+16.240000	0.000000
+16.250000	0.000000
+16.260000	0.000000
+16.270000	0.000000
+16.280000	0.000000
+16.290000	0.000000
+16.300000	0.000000
+16.310000	0.000000
+16.320000	0.000000
+16.330000	0.000000
+16.340000	0.000000
+16.350000	0.000000
+16.360000	0.000000
+16.370000	0.000000
+16.380000	0.000000
+16.390000	0.000000
+16.400000	0.000000
+16.410000	0.000000
+16.420000	0.000000
+16.430000	0.000000
+16.440000	0.000000
+16.450000	0.000000
+16.460000	0.000000
+16.470000	0.000000
+16.480000	0.000000
+16.490000	0.000000
+16.500000	0.000000
+16.510000	0.000000
+16.520000	0.000000
+16.530000	0.000000
+16.540000	0.000000
+16.550000	0.000000
+16.560000	0.000000
+16.570000	0.000000
+16.580000	0.000000
+16.590000	0.000000
+16.600000	0.000000
+16.610000	0.000000
+16.620000	0.000000
+16.630000	0.000000
+16.640000	0.000000
+16.650000	0.000000
+16.660000	0.000000
+16.670000	0.000000
+16.680000	0.000000
+16.690000	0.000000
+16.700000	0.000000
+16.710000	0.000000
+16.720000	0.000000
+16.730000	0.000000
+16.740000	0.000000
+16.750000	0.000000
+16.760000	0.000000
+16.770000	0.000000
+16.780000	0.000000
+16.790000	0.000000
+16.800000	0.000000
+16.810000	0.000000
+16.820000	0.000000
+16.830000	0.000000
+16.840000	0.000000
+16.850000	0.000000
+16.860000	0.000000
+16.870000	0.000000
+16.880000	0.000000
+16.890000	0.000000
+16.900000	0.000000
+16.910000	0.000000
+16.920000	0.000000
+16.930000	0.000000
+16.940000	0.000000
+16.950000	0.000000
+16.960000	0.000000
+16.970000	0.000000
+16.980000	0.000000
+16.990000	0.000000
+17.000000	0.000000
+17.010000	0.000000
+17.020000	0.000000
+17.030000	0.000000
+17.040000	0.000000
+17.050000	0.000000
+17.060000	0.000000
+17.070000	0.000000
+17.080000	0.000000
+17.090000	0.000000
+17.100000	0.000000
+17.110000	0.000000
+17.120000	0.000000
+17.130000	0.000000
+17.140000	0.000000
+17.150000	0.000000
+17.160000	0.000000
+17.170000	0.000000
+17.180000	0.000000
+17.190000	0.000000
+17.200000	0.000000
+17.210000	0.000000
+17.220000	0.000000
+17.230000	0.000000
+17.240000	0.000000
+17.250000	0.000000
+17.260000	0.000000
+17.270000	0.000000
+17.280000	0.000000
+17.290000	0.000000
+17.300000	0.000000
+17.310000	0.000000
+17.320000	0.000000
+17.330000	0.000000
+17.340000	0.000000
+17.350000	0.000000
+17.360000	0.000000
+17.370000	0.000000
+17.380000	0.000000
+17.390000	0.000000
+17.400000	0.000000
+17.410000	0.000000
+17.420000	0.000000
+17.430000	0.000000
+17.440000	0.000000
+17.450000	0.000000
+17.460000	0.000000
+17.470000	0.000000
+17.480000	0.000000
+17.490000	0.000000
+17.500000	0.000000
+17.510000	0.000000
+17.520000	0.000000
+17.530000	0.000000
+17.540000	0.000000
+17.550000	0.000000
+17.560000	0.000000
+17.570000	0.000000
+17.580000	0.000000
+17.590000	0.000000
+17.600000	0.000000
+17.610000	0.000000
+17.620000	0.000000
+17.630000	0.000000
+17.640000	0.000000
+17.650000	0.000000
+17.660000	0.000000
+17.670000	0.000000
+17.680000	0.000000
+17.690000	0.000000
+17.700000	0.000000
+17.710000	0.000000
+17.720000	0.000000
+17.730000	0.000000
+17.740000	0.000000
+17.750000	0.000000
+17.760000	0.000000
+17.770000	0.000000
+17.780000	0.000000
+17.790000	0.000000
+17.800000	0.000000
+17.810000	0.000000
+17.820000	0.000000
+17.830000	0.000000
+17.840000	0.000000
+17.850000	0.000000
+17.860000	0.000000
+17.870000	0.000000
+17.880000	0.000000
+17.890000	0.000000
+17.900000	0.000000
+17.910000	0.000000
+17.920000	0.000000
+17.930000	0.000000
+17.940000	0.000000
+17.950000	0.000000
+17.960000	0.000000
+17.970000	0.000000
+17.980000	0.000000
+17.990000	0.000000
+18.000000	0.000000
+18.010000	0.000000
+18.020000	0.000000
+18.030000	0.000000
+18.040000	0.000000
+18.050000	0.000000
+18.060000	0.000000
+18.070000	0.000000
+18.080000	0.000000
+18.090000	0.000000
+18.100000	0.000000
+18.110000	0.000000
+18.120000	0.000000
+18.130000	0.000000
+18.140000	0.000000
+18.150000	0.000000
+18.160000	0.000000
+18.170000	0.000000
+18.180000	0.000000
+18.190000	0.000000
+18.200000	0.000000
+18.210000	0.000000
+18.220000	0.000000
+18.230000	0.000000
+18.240000	0.000000
+18.250000	0.000000
+18.260000	0.000000
+18.270000	0.000000
+18.280000	0.000000
+18.290000	0.000000
+18.300000	0.000000
+18.310000	0.000000
+18.320000	0.000000
+18.330000	0.000000
+18.340000	0.000000
+18.350000	0.000000
+18.360000	0.000000
+18.370000	0.000000
+18.380000	0.000000
+18.390000	0.000000
+18.400000	0.000000
+18.410000	0.000000
+18.420000	0.000000
+18.430000	0.000000
+18.440000	0.000000
+18.450000	0.000000
+18.460000	0.000000
+18.470000	0.000000
+18.480000	0.000000
+18.490000	0.000000
+18.500000	0.000000
+18.510000	0.000000
+18.520000	0.000000
+18.530000	0.000000
+18.540000	0.000000
+18.550000	0.000000
+18.560000	0.000000
+18.570000	0.000000
+18.580000	0.000000
+18.590000	0.000000
+18.600000	0.000000
+18.610000	0.000000
+18.620000	0.000000
+18.630000	0.000000
+18.640000	0.000000
+18.650000	0.000000
+18.660000	0.000000
+18.670000	0.000000
+18.680000	0.000000
+18.690000	0.000000
+18.700000	0.000000
+18.710000	0.000000
+18.720000	0.000000
+18.730000	0.000000
+18.740000	0.000000
+18.750000	0.000000
+18.760000	0.000000
+18.770000	0.000000
+18.780000	0.000000
+18.790000	0.000000
+18.800000	0.000000
+18.810000	0.000000
+18.820000	0.000000
+18.830000	0.000000
+18.840000	0.000000
+18.850000	0.000000
+18.860000	0.000000
+18.870000	0.000000
+18.880000	0.000000
+18.890000	0.000000
+18.900000	0.000000
+18.910000	0.000000
+18.920000	0.000000
+18.930000	0.000000
+18.940000	0.000000
+18.950000	0.000000
+18.960000	0.000000
+18.970000	0.000000
+18.980000	0.000000
+18.990000	0.000000
+19.000000	0.000000
+19.010000	0.000000
+19.020000	0.000000
+19.030000	0.000000
+19.040000	0.000000
+19.050000	0.000000
+19.060000	0.000000
+19.070000	0.000000
+19.080000	0.000000
+19.090000	0.000000
+19.100000	0.000000
+19.110000	0.000000
+19.120000	0.000000
+19.130000	0.000000
+19.140000	0.000000
+19.150000	0.000000
+19.160000	0.000000
+19.170000	0.000000
+19.180000	0.000000
+19.190000	0.000000
+19.200000	0.000000
+19.210000	0.000000
+19.220000	0.000000
+19.230000	0.000000
+19.240000	0.000000
+19.250000	0.000000
+19.260000	0.000000
+19.270000	0.000000
+19.280000	0.000000
+19.290000	0.000000
+19.300000	0.000000
+19.310000	0.000000
+19.320000	0.000000
+19.330000	0.000000
+19.340000	0.000000
+19.350000	0.000000
+19.360000	0.000000
+19.370000	0.000000
+19.380000	0.000000
+19.390000	0.000000
+19.400000	0.000000
+19.410000	0.000000
+19.420000	0.000000
+19.430000	0.000000
+19.440000	0.000000
+19.450000	0.000000
+19.460000	0.000000
+19.470000	0.000000
+19.480000	0.000000
+19.490000	0.000000
+19.500000	0.000000
+19.510000	0.000000
+19.520000	0.000000
+19.530000	0.000000
+19.540000	0.000000
+19.550000	0.000000
+19.560000	0.000000
+19.570000	0.000000
+19.580000	0.000000
+19.590000	0.000000
+19.600000	0.000000
+19.610000	0.000000
+19.620000	0.000000
+19.630000	0.000000
+19.640000	0.000000
+19.650000	0.000000
+19.660000	0.000000
+19.670000	0.000000
+19.680000	0.000000
+19.690000	0.000000
+19.700000	0.000000
+19.710000	0.000000
+19.720000	0.000000
+19.730000	0.000000
+19.740000	0.000000
+19.750000	0.000000
+19.760000	0.000000
+19.770000	0.000000
+19.780000	0.000000
+19.790000	0.000000
+19.800000	0.000000
+19.810000	0.000000
+19.820000	0.000000
+19.830000	0.000000
+19.840000	0.000000
+19.850000	0.000000
+19.860000	0.000000
+19.870000	0.000000
+19.880000	0.000000
+19.890000	0.000000
+19.900000	0.000000
+19.910000	0.000000
+19.920000	0.000000
+19.930000	0.000000
+19.940000	0.000000
+19.950000	0.000000
+19.960000	0.000000
+19.970000	0.000000
+19.980000	0.000000
+19.990000	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_2.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_2.0.dat
new file mode 100644
index 0000000..58066e9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/gamma_6.0_2.0.dat
@@ -0,0 +1,2012 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000000
+0.020000	0.000000
+0.030000	0.000000
+0.040000	0.000000
+0.050000	0.000000
+0.060000	0.000000
+0.070000	0.000000
+0.080000	0.000000
+0.090000	0.000000
+0.100000	0.000000
+0.110000	0.000000
+0.120000	0.000000
+0.130000	0.000000
+0.140000	0.000000
+0.150000	0.000000
+0.160000	0.000000
+0.170000	0.000000
+0.180000	0.000000
+0.190000	0.000000
+0.200000	0.000000
+0.210000	0.000000
+0.220000	0.000000
+0.230000	0.000000
+0.240000	0.000000
+0.250000	0.000000
+0.260000	0.000000
+0.270000	0.000000
+0.280000	0.000000
+0.290000	0.000000
+0.300000	0.000000
+0.310000	0.000000
+0.320000	0.000000
+0.330000	0.000000
+0.340000	0.000000
+0.350000	0.000001
+0.360000	0.000001
+0.370000	0.000001
+0.380000	0.000001
+0.390000	0.000001
+0.400000	0.000001
+0.410000	0.000001
+0.420000	0.000001
+0.430000	0.000002
+0.440000	0.000002
+0.450000	0.000002
+0.460000	0.000002
+0.470000	0.000002
+0.480000	0.000003
+0.490000	0.000003
+0.500000	0.000003
+0.510000	0.000003
+0.520000	0.000004
+0.530000	0.000004
+0.540000	0.000005
+0.550000	0.000005
+0.560000	0.000005
+0.570000	0.000006
+0.580000	0.000006
+0.590000	0.000007
+0.600000	0.000008
+0.610000	0.000008
+0.620000	0.000009
+0.630000	0.000009
+0.640000	0.000010
+0.650000	0.000011
+0.660000	0.000012
+0.670000	0.000013
+0.680000	0.000013
+0.690000	0.000014
+0.700000	0.000015
+0.710000	0.000016
+0.720000	0.000018
+0.730000	0.000019
+0.740000	0.000020
+0.750000	0.000021
+0.760000	0.000023
+0.770000	0.000024
+0.780000	0.000025
+0.790000	0.000027
+0.800000	0.000029
+0.810000	0.000030
+0.820000	0.000032
+0.830000	0.000034
+0.840000	0.000036
+0.850000	0.000038
+0.860000	0.000040
+0.870000	0.000042
+0.880000	0.000044
+0.890000	0.000047
+0.900000	0.000049
+0.910000	0.000052
+0.920000	0.000054
+0.930000	0.000057
+0.940000	0.000060
+0.950000	0.000063
+0.960000	0.000066
+0.970000	0.000069
+0.980000	0.000072
+0.990000	0.000075
+1.000000	0.000079
+1.010000	0.000083
+1.020000	0.000086
+1.030000	0.000090
+1.040000	0.000094
+1.050000	0.000098
+1.060000	0.000103
+1.070000	0.000107
+1.080000	0.000111
+1.090000	0.000116
+1.100000	0.000121
+1.110000	0.000126
+1.120000	0.000131
+1.130000	0.000136
+1.140000	0.000142
+1.150000	0.000147
+1.160000	0.000153
+1.170000	0.000159
+1.180000	0.000165
+1.190000	0.000171
+1.200000	0.000178
+1.210000	0.000184
+1.220000	0.000191
+1.230000	0.000198
+1.240000	0.000205
+1.250000	0.000213
+1.260000	0.000220
+1.270000	0.000228
+1.280000	0.000236
+1.290000	0.000244
+1.300000	0.000252
+1.310000	0.000261
+1.320000	0.000270
+1.330000	0.000279
+1.340000	0.000288
+1.350000	0.000297
+1.360000	0.000307
+1.370000	0.000317
+1.380000	0.000327
+1.390000	0.000337
+1.400000	0.000348
+1.410000	0.000359
+1.420000	0.000370
+1.430000	0.000381
+1.440000	0.000392
+1.450000	0.000404
+1.460000	0.000416
+1.470000	0.000429
+1.480000	0.000441
+1.490000	0.000454
+1.500000	0.000467
+1.510000	0.000480
+1.520000	0.000494
+1.530000	0.000508
+1.540000	0.000522
+1.550000	0.000537
+1.560000	0.000551
+1.570000	0.000567
+1.580000	0.000582
+1.590000	0.000598
+1.600000	0.000613
+1.610000	0.000630
+1.620000	0.000646
+1.630000	0.000663
+1.640000	0.000680
+1.650000	0.000698
+1.660000	0.000716
+1.670000	0.000734
+1.680000	0.000752
+1.690000	0.000771
+1.700000	0.000790
+1.710000	0.000810
+1.720000	0.000829
+1.730000	0.000850
+1.740000	0.000870
+1.750000	0.000891
+1.760000	0.000912
+1.770000	0.000934
+1.780000	0.000955
+1.790000	0.000978
+1.800000	0.001000
+1.810000	0.001023
+1.820000	0.001047
+1.830000	0.001070
+1.840000	0.001094
+1.850000	0.001119
+1.860000	0.001144
+1.870000	0.001169
+1.880000	0.001195
+1.890000	0.001221
+1.900000	0.001247
+1.910000	0.001274
+1.920000	0.001301
+1.930000	0.001328
+1.940000	0.001356
+1.950000	0.001385
+1.960000	0.001414
+1.970000	0.001443
+1.980000	0.001472
+1.990000	0.001502
+2.000000	0.001533
+2.010000	0.001564
+2.020000	0.001595
+2.030000	0.001627
+2.040000	0.001659
+2.050000	0.001691
+2.060000	0.001724
+2.070000	0.001758
+2.080000	0.001792
+2.090000	0.001826
+2.100000	0.001861
+2.110000	0.001896
+2.120000	0.001932
+2.130000	0.001968
+2.140000	0.002005
+2.150000	0.002042
+2.160000	0.002079
+2.170000	0.002117
+2.180000	0.002155
+2.190000	0.002194
+2.200000	0.002234
+2.210000	0.002274
+2.220000	0.002314
+2.230000	0.002355
+2.240000	0.002396
+2.250000	0.002438
+2.260000	0.002480
+2.270000	0.002523
+2.280000	0.002566
+2.290000	0.002609
+2.300000	0.002654
+2.310000	0.002698
+2.320000	0.002743
+2.330000	0.002789
+2.340000	0.002835
+2.350000	0.002882
+2.360000	0.002929
+2.370000	0.002977
+2.380000	0.003025
+2.390000	0.003074
+2.400000	0.003123
+2.410000	0.003172
+2.420000	0.003223
+2.430000	0.003273
+2.440000	0.003325
+2.450000	0.003376
+2.460000	0.003429
+2.470000	0.003482
+2.480000	0.003535
+2.490000	0.003589
+2.500000	0.003643
+2.510000	0.003698
+2.520000	0.003753
+2.530000	0.003809
+2.540000	0.003866
+2.550000	0.003923
+2.560000	0.003981
+2.570000	0.004039
+2.580000	0.004097
+2.590000	0.004156
+2.600000	0.004216
+2.610000	0.004276
+2.620000	0.004337
+2.630000	0.004399
+2.640000	0.004461
+2.650000	0.004523
+2.660000	0.004586
+2.670000	0.004650
+2.680000	0.004714
+2.690000	0.004778
+2.700000	0.004844
+2.710000	0.004909
+2.720000	0.004976
+2.730000	0.005042
+2.740000	0.005110
+2.750000	0.005178
+2.760000	0.005246
+2.770000	0.005315
+2.780000	0.005385
+2.790000	0.005455
+2.800000	0.005526
+2.810000	0.005597
+2.820000	0.005669
+2.830000	0.005742
+2.840000	0.005815
+2.850000	0.005888
+2.860000	0.005962
+2.870000	0.006037
+2.880000	0.006112
+2.890000	0.006188
+2.900000	0.006265
+2.910000	0.006342
+2.920000	0.006419
+2.930000	0.006497
+2.940000	0.006576
+2.950000	0.006655
+2.960000	0.006735
+2.970000	0.006815
+2.980000	0.006896
+2.990000	0.006978
+3.000000	0.007060
+3.010000	0.007143
+3.020000	0.007226
+3.030000	0.007310
+3.040000	0.007394
+3.050000	0.007479
+3.060000	0.007564
+3.070000	0.007650
+3.080000	0.007737
+3.090000	0.007824
+3.100000	0.007912
+3.110000	0.008000
+3.120000	0.008089
+3.130000	0.008179
+3.140000	0.008269
+3.150000	0.008359
+3.160000	0.008451
+3.170000	0.008542
+3.180000	0.008635
+3.190000	0.008728
+3.200000	0.008821
+3.210000	0.008915
+3.220000	0.009010
+3.230000	0.009105
+3.240000	0.009200
+3.250000	0.009297
+3.260000	0.009393
+3.270000	0.009491
+3.280000	0.009589
+3.290000	0.009687
+3.300000	0.009786
+3.310000	0.009886
+3.320000	0.009986
+3.330000	0.010087
+3.340000	0.010188
+3.350000	0.010290
+3.360000	0.010393
+3.370000	0.010495
+3.380000	0.010599
+3.390000	0.010703
+3.400000	0.010808
+3.410000	0.010913
+3.420000	0.011019
+3.430000	0.011125
+3.440000	0.011232
+3.450000	0.011339
+3.460000	0.011447
+3.470000	0.011555
+3.480000	0.011664
+3.490000	0.011774
+3.500000	0.011884
+3.510000	0.011995
+3.520000	0.012106
+3.530000	0.012218
+3.540000	0.012330
+3.550000	0.012443
+3.560000	0.012556
+3.570000	0.012670
+3.580000	0.012784
+3.590000	0.012899
+3.600000	0.013014
+3.610000	0.013130
+3.620000	0.013247
+3.630000	0.013364
+3.640000	0.013481
+3.650000	0.013599
+3.660000	0.013718
+3.670000	0.013837
+3.680000	0.013956
+3.690000	0.014077
+3.700000	0.014197
+3.710000	0.014318
+3.720000	0.014440
+3.730000	0.014562
+3.740000	0.014685
+3.750000	0.014808
+3.760000	0.014932
+3.770000	0.015056
+3.780000	0.015180
+3.790000	0.015305
+3.800000	0.015431
+3.810000	0.015557
+3.820000	0.015684
+3.830000	0.015811
+3.840000	0.015939
+3.850000	0.016067
+3.860000	0.016195
+3.870000	0.016324
+3.880000	0.016454
+3.890000	0.016584
+3.900000	0.016714
+3.910000	0.016845
+3.920000	0.016977
+3.930000	0.017109
+3.940000	0.017241
+3.950000	0.017374
+3.960000	0.017507
+3.970000	0.017641
+3.980000	0.017775
+3.990000	0.017910
+4.000000	0.018045
+4.010000	0.018180
+4.020000	0.018316
+4.030000	0.018453
+4.040000	0.018590
+4.050000	0.018727
+4.060000	0.018865
+4.070000	0.019003
+4.080000	0.019142
+4.090000	0.019281
+4.100000	0.019420
+4.110000	0.019560
+4.120000	0.019701
+4.130000	0.019841
+4.140000	0.019983
+4.150000	0.020124
+4.160000	0.020266
+4.170000	0.020409
+4.180000	0.020552
+4.190000	0.020695
+4.200000	0.020839
+4.210000	0.020983
+4.220000	0.021127
+4.230000	0.021272
+4.240000	0.021417
+4.250000	0.021563
+4.260000	0.021709
+4.270000	0.021855
+4.280000	0.022002
+4.290000	0.022149
+4.300000	0.022297
+4.310000	0.022445
+4.320000	0.022593
+4.330000	0.022742
+4.340000	0.022891
+4.350000	0.023041
+4.360000	0.023190
+4.370000	0.023341
+4.380000	0.023491
+4.390000	0.023642
+4.400000	0.023793
+4.410000	0.023945
+4.420000	0.024097
+4.430000	0.024249
+4.440000	0.024402
+4.450000	0.024555
+4.460000	0.024708
+4.470000	0.024862
+4.480000	0.025016
+4.490000	0.025170
+4.500000	0.025324
+4.510000	0.025479
+4.520000	0.025635
+4.530000	0.025790
+4.540000	0.025946
+4.550000	0.026102
+4.560000	0.026259
+4.570000	0.026415
+4.580000	0.026572
+4.590000	0.026730
+4.600000	0.026888
+4.610000	0.027045
+4.620000	0.027204
+4.630000	0.027362
+4.640000	0.027521
+4.650000	0.027680
+4.660000	0.027840
+4.670000	0.027999
+4.680000	0.028159
+4.690000	0.028319
+4.700000	0.028480
+4.710000	0.028640
+4.720000	0.028801
+4.730000	0.028963
+4.740000	0.029124
+4.750000	0.029286
+4.760000	0.029448
+4.770000	0.029610
+4.780000	0.029772
+4.790000	0.029935
+4.800000	0.030098
+4.810000	0.030261
+4.820000	0.030425
+4.830000	0.030588
+4.840000	0.030752
+4.850000	0.030916
+4.860000	0.031080
+4.870000	0.031245
+4.880000	0.031409
+4.890000	0.031574
+4.900000	0.031739
+4.910000	0.031905
+4.920000	0.032070
+4.930000	0.032236
+4.940000	0.032402
+4.950000	0.032568
+4.960000	0.032734
+4.970000	0.032900
+4.980000	0.033067
+4.990000	0.033234
+5.000000	0.033400
+5.010000	0.033568
+5.020000	0.033735
+5.030000	0.033902
+5.040000	0.034070
+5.050000	0.034238
+5.060000	0.034405
+5.070000	0.034573
+5.080000	0.034742
+5.090000	0.034910
+5.100000	0.035078
+5.110000	0.035247
+5.120000	0.035416
+5.130000	0.035584
+5.140000	0.035753
+5.150000	0.035923
+5.160000	0.036092
+5.170000	0.036261
+5.180000	0.036430
+5.190000	0.036600
+5.200000	0.036770
+5.210000	0.036939
+5.220000	0.037109
+5.230000	0.037279
+5.240000	0.037449
+5.250000	0.037619
+5.260000	0.037790
+5.270000	0.037960
+5.280000	0.038130
+5.290000	0.038301
+5.300000	0.038471
+5.310000	0.038642
+5.320000	0.038813
+5.330000	0.038983
+5.340000	0.039154
+5.350000	0.039325
+5.360000	0.039496
+5.370000	0.039667
+5.380000	0.039838
+5.390000	0.040009
+5.400000	0.040180
+5.410000	0.040351
+5.420000	0.040523
+5.430000	0.040694
+5.440000	0.040865
+5.450000	0.041036
+5.460000	0.041208
+5.470000	0.041379
+5.480000	0.041550
+5.490000	0.041722
+5.500000	0.041893
+5.510000	0.042064
+5.520000	0.042236
+5.530000	0.042407
+5.540000	0.042579
+5.550000	0.042750
+5.560000	0.042921
+5.570000	0.043093
+5.580000	0.043264
+5.590000	0.043435
+5.600000	0.043607
+5.610000	0.043778
+5.620000	0.043949
+5.630000	0.044121
+5.640000	0.044292
+5.650000	0.044463
+5.660000	0.044634
+5.670000	0.044805
+5.680000	0.044976
+5.690000	0.045147
+5.700000	0.045318
+5.710000	0.045489
+5.720000	0.045660
+5.730000	0.045831
+5.740000	0.046002
+5.750000	0.046172
+5.760000	0.046343
+5.770000	0.046513
+5.780000	0.046684
+5.790000	0.046854
+5.800000	0.047025
+5.810000	0.047195
+5.820000	0.047365
+5.830000	0.047535
+5.840000	0.047705
+5.850000	0.047875
+5.860000	0.048045
+5.870000	0.048214
+5.880000	0.048384
+5.890000	0.048553
+5.900000	0.048723
+5.910000	0.048892
+5.920000	0.049061
+5.930000	0.049230
+5.940000	0.049399
+5.950000	0.049568
+5.960000	0.049736
+5.970000	0.049905
+5.980000	0.050073
+5.990000	0.050241
+6.000000	0.050409
+6.010000	0.050577
+6.020000	0.050745
+6.030000	0.050913
+6.040000	0.051080
+6.050000	0.051248
+6.060000	0.051415
+6.070000	0.051582
+6.080000	0.051749
+6.090000	0.051916
+6.100000	0.052082
+6.110000	0.052249
+6.120000	0.052415
+6.130000	0.052581
+6.140000	0.052747
+6.150000	0.052913
+6.160000	0.053078
+6.170000	0.053243
+6.180000	0.053409
+6.190000	0.053574
+6.200000	0.053738
+6.210000	0.053903
+6.220000	0.054067
+6.230000	0.054232
+6.240000	0.054395
+6.250000	0.054559
+6.260000	0.054723
+6.270000	0.054886
+6.280000	0.055049
+6.290000	0.055212
+6.300000	0.055375
+6.310000	0.055538
+6.320000	0.055700
+6.330000	0.055862
+6.340000	0.056024
+6.350000	0.056185
+6.360000	0.056347
+6.370000	0.056508
+6.380000	0.056669
+6.390000	0.056829
+6.400000	0.056990
+6.410000	0.057150
+6.420000	0.057310
+6.430000	0.057469
+6.440000	0.057629
+6.450000	0.057788
+6.460000	0.057947
+6.470000	0.058106
+6.480000	0.058264
+6.490000	0.058422
+6.500000	0.058580
+6.510000	0.058737
+6.520000	0.058895
+6.530000	0.059052
+6.540000	0.059209
+6.550000	0.059365
+6.560000	0.059521
+6.570000	0.059677
+6.580000	0.059833
+6.590000	0.059988
+6.600000	0.060143
+6.610000	0.060298
+6.620000	0.060452
+6.630000	0.060607
+6.640000	0.060761
+6.650000	0.060914
+6.660000	0.061067
+6.670000	0.061220
+6.680000	0.061373
+6.690000	0.061525
+6.700000	0.061677
+6.710000	0.061829
+6.720000	0.061981
+6.730000	0.062132
+6.740000	0.062282
+6.750000	0.062433
+6.760000	0.062583
+6.770000	0.062733
+6.780000	0.062882
+6.790000	0.063032
+6.800000	0.063180
+6.810000	0.063329
+6.820000	0.063477
+6.830000	0.063625
+6.840000	0.063772
+6.850000	0.063919
+6.860000	0.064066
+6.870000	0.064213
+6.880000	0.064359
+6.890000	0.064505
+6.900000	0.064650
+6.910000	0.064795
+6.920000	0.064940
+6.930000	0.065084
+6.940000	0.065228
+6.950000	0.065372
+6.960000	0.065515
+6.970000	0.065658
+6.980000	0.065800
+6.990000	0.065943
+7.000000	0.066084
+7.010000	0.066226
+7.020000	0.066367
+7.030000	0.066507
+7.040000	0.066648
+7.050000	0.066788
+7.060000	0.066927
+7.070000	0.067066
+7.080000	0.067205
+7.090000	0.067344
+7.100000	0.067482
+7.110000	0.067619
+7.120000	0.067756
+7.130000	0.067893
+7.140000	0.068030
+7.150000	0.068166
+7.160000	0.068301
+7.170000	0.068437
+7.180000	0.068572
+7.190000	0.068706
+7.200000	0.068840
+7.210000	0.068974
+7.220000	0.069107
+7.230000	0.069240
+7.240000	0.069372
+7.250000	0.069504
+7.260000	0.069636
+7.270000	0.069767
+7.280000	0.069898
+7.290000	0.070028
+7.300000	0.070158
+7.310000	0.070288
+7.320000	0.070417
+7.330000	0.070546
+7.340000	0.070674
+7.350000	0.070802
+7.360000	0.070929
+7.370000	0.071056
+7.380000	0.071183
+7.390000	0.071309
+7.400000	0.071434
+7.410000	0.071560
+7.420000	0.071685
+7.430000	0.071809
+7.440000	0.071933
+7.450000	0.072057
+7.460000	0.072180
+7.470000	0.072302
+7.480000	0.072424
+7.490000	0.072546
+7.500000	0.072668
+7.510000	0.072788
+7.520000	0.072909
+7.530000	0.073029
+7.540000	0.073148
+7.550000	0.073268
+7.560000	0.073386
+7.570000	0.073504
+7.580000	0.073622
+7.590000	0.073739
+7.600000	0.073856
+7.610000	0.073973
+7.620000	0.074089
+7.630000	0.074204
+7.640000	0.074319
+7.650000	0.074434
+7.660000	0.074548
+7.670000	0.074661
+7.680000	0.074775
+7.690000	0.074887
+7.700000	0.075000
+7.710000	0.075111
+7.720000	0.075223
+7.730000	0.075333
+7.740000	0.075444
+7.750000	0.075554
+7.760000	0.075663
+7.770000	0.075772
+7.780000	0.075881
+7.790000	0.075989
+7.800000	0.076096
+7.810000	0.076203
+7.820000	0.076310
+7.830000	0.076416
+7.840000	0.076522
+7.850000	0.076627
+7.860000	0.076732
+7.870000	0.076836
+7.880000	0.076940
+7.890000	0.077043
+7.900000	0.077146
+7.910000	0.077248
+7.920000	0.077350
+7.930000	0.077451
+7.940000	0.077552
+7.950000	0.077652
+7.960000	0.077752
+7.970000	0.077851
+7.980000	0.077950
+7.990000	0.078049
+8.000000	0.078147
+8.010000	0.078244
+8.020000	0.078341
+8.030000	0.078438
+8.040000	0.078534
+8.050000	0.078629
+8.060000	0.078724
+8.070000	0.078819
+8.080000	0.078913
+8.090000	0.079006
+8.100000	0.079099
+8.110000	0.079192
+8.120000	0.079284
+8.130000	0.079375
+8.140000	0.079466
+8.150000	0.079557
+8.160000	0.079647
+8.170000	0.079736
+8.180000	0.079825
+8.190000	0.079914
+8.200000	0.080002
+8.210000	0.080090
+8.220000	0.080177
+8.230000	0.080263
+8.240000	0.080349
+8.250000	0.080435
+8.260000	0.080520
+8.270000	0.080604
+8.280000	0.080688
+8.290000	0.080772
+8.300000	0.080855
+8.310000	0.080938
+8.320000	0.081020
+8.330000	0.081101
+8.340000	0.081182
+8.350000	0.081263
+8.360000	0.081343
+8.370000	0.081422
+8.380000	0.081501
+8.390000	0.081580
+8.400000	0.081658
+8.410000	0.081735
+8.420000	0.081812
+8.430000	0.081889
+8.440000	0.081965
+8.450000	0.082040
+8.460000	0.082115
+8.470000	0.082190
+8.480000	0.082264
+8.490000	0.082337
+8.500000	0.082410
+8.510000	0.082483
+8.520000	0.082555
+8.530000	0.082626
+8.540000	0.082697
+8.550000	0.082768
+8.560000	0.082838
+8.570000	0.082907
+8.580000	0.082976
+8.590000	0.083044
+8.600000	0.083112
+8.610000	0.083180
+8.620000	0.083246
+8.630000	0.083313
+8.640000	0.083379
+8.650000	0.083444
+8.660000	0.083509
+8.670000	0.083573
+8.680000	0.083637
+8.690000	0.083701
+8.700000	0.083763
+8.710000	0.083826
+8.720000	0.083888
+8.730000	0.083949
+8.740000	0.084010
+8.750000	0.084070
+8.760000	0.084130
+8.770000	0.084189
+8.780000	0.084248
+8.790000	0.084306
+8.800000	0.084364
+8.810000	0.084421
+8.820000	0.084478
+8.830000	0.084534
+8.840000	0.084590
+8.850000	0.084645
+8.860000	0.084700
+8.870000	0.084754
+8.880000	0.084808
+8.890000	0.084861
+8.900000	0.084914
+8.910000	0.084966
+8.920000	0.085018
+8.930000	0.085069
+8.940000	0.085120
+8.950000	0.085170
+8.960000	0.085220
+8.970000	0.085269
+8.980000	0.085318
+8.990000	0.085366
+9.000000	0.085413
+9.010000	0.085461
+9.020000	0.085507
+9.030000	0.085554
+9.040000	0.085599
+9.050000	0.085644
+9.060000	0.085689
+9.070000	0.085733
+9.080000	0.085777
+9.090000	0.085820
+9.100000	0.085863
+9.110000	0.085905
+9.120000	0.085947
+9.130000	0.085988
+9.140000	0.086029
+9.150000	0.086069
+9.160000	0.086109
+9.170000	0.086148
+9.180000	0.086187
+9.190000	0.086225
+9.200000	0.086263
+9.210000	0.086300
+9.220000	0.086337
+9.230000	0.086373
+9.240000	0.086409
+9.250000	0.086444
+9.260000	0.086479
+9.270000	0.086513
+9.280000	0.086547
+9.290000	0.086580
+9.300000	0.086613
+9.310000	0.086646
+9.320000	0.086677
+9.330000	0.086709
+9.340000	0.086740
+9.350000	0.086770
+9.360000	0.086800
+9.370000	0.086829
+9.380000	0.086858
+9.390000	0.086887
+9.400000	0.086915
+9.410000	0.086942
+9.420000	0.086969
+9.430000	0.086996
+9.440000	0.087022
+9.450000	0.087048
+9.460000	0.087073
+9.470000	0.087097
+9.480000	0.087121
+9.490000	0.087145
+9.500000	0.087168
+9.510000	0.087191
+9.520000	0.087213
+9.530000	0.087235
+9.540000	0.087256
+9.550000	0.087277
+9.560000	0.087297
+9.570000	0.087317
+9.580000	0.087336
+9.590000	0.087355
+9.600000	0.087374
+9.610000	0.087392
+9.620000	0.087409
+9.630000	0.087426
+9.640000	0.087443
+9.650000	0.087459
+9.660000	0.087475
+9.670000	0.087490
+9.680000	0.087504
+9.690000	0.087519
+9.700000	0.087532
+9.710000	0.087546
+9.720000	0.087559
+9.730000	0.087571
+9.740000	0.087583
+9.750000	0.087594
+9.760000	0.087605
+9.770000	0.087616
+9.780000	0.087626
+9.790000	0.087636
+9.800000	0.087645
+9.810000	0.087654
+9.820000	0.087662
+9.830000	0.087670
+9.840000	0.087677
+9.850000	0.087684
+9.860000	0.087690
+9.870000	0.087696
+9.880000	0.087702
+9.890000	0.087707
+9.900000	0.087712
+9.910000	0.087716
+9.920000	0.087720
+9.930000	0.087723
+9.940000	0.087726
+9.950000	0.087728
+9.960000	0.087730
+9.970000	0.087732
+9.980000	0.087733
+9.990000	0.087733
+10.000000	0.087734
+10.010000	0.087733
+10.020000	0.087733
+10.030000	0.087732
+10.040000	0.087730
+10.050000	0.087728
+10.060000	0.087726
+10.070000	0.087723
+10.080000	0.087720
+10.090000	0.087716
+10.100000	0.087712
+10.110000	0.087707
+10.120000	0.087702
+10.130000	0.087697
+10.140000	0.087691
+10.150000	0.087685
+10.160000	0.087678
+10.170000	0.087671
+10.180000	0.087663
+10.190000	0.087656
+10.200000	0.087647
+10.210000	0.087638
+10.220000	0.087629
+10.230000	0.087619
+10.240000	0.087609
+10.250000	0.087599
+10.260000	0.087588
+10.270000	0.087577
+10.280000	0.087565
+10.290000	0.087553
+10.300000	0.087540
+10.310000	0.087527
+10.320000	0.087514
+10.330000	0.087500
+10.340000	0.087486
+10.350000	0.087472
+10.360000	0.087457
+10.370000	0.087441
+10.380000	0.087425
+10.390000	0.087409
+10.400000	0.087393
+10.410000	0.087375
+10.420000	0.087358
+10.430000	0.087340
+10.440000	0.087322
+10.450000	0.087303
+10.460000	0.087284
+10.470000	0.087265
+10.480000	0.087245
+10.490000	0.087225
+10.500000	0.087205
+10.510000	0.087184
+10.520000	0.087162
+10.530000	0.087141
+10.540000	0.087118
+10.550000	0.087096
+10.560000	0.087073
+10.570000	0.087050
+10.580000	0.087026
+10.590000	0.087002
+10.600000	0.086978
+10.610000	0.086953
+10.620000	0.086928
+10.630000	0.086902
+10.640000	0.086876
+10.650000	0.086850
+10.660000	0.086823
+10.670000	0.086796
+10.680000	0.086769
+10.690000	0.086741
+10.700000	0.086713
+10.710000	0.086684
+10.720000	0.086655
+10.730000	0.086626
+10.740000	0.086596
+10.750000	0.086566
+10.760000	0.086536
+10.770000	0.086505
+10.780000	0.086474
+10.790000	0.086442
+10.800000	0.086411
+10.810000	0.086378
+10.820000	0.086346
+10.830000	0.086313
+10.840000	0.086280
+10.850000	0.086246
+10.860000	0.086212
+10.870000	0.086178
+10.880000	0.086143
+10.890000	0.086108
+10.900000	0.086073
+10.910000	0.086037
+10.920000	0.086001
+10.930000	0.085965
+10.940000	0.085928
+10.950000	0.085891
+10.960000	0.085853
+10.970000	0.085816
+10.980000	0.085778
+10.990000	0.085739
+11.000000	0.085700
+11.010000	0.085661
+11.020000	0.085622
+11.030000	0.085582
+11.040000	0.085542
+11.050000	0.085501
+11.060000	0.085461
+11.070000	0.085419
+11.080000	0.085378
+11.090000	0.085336
+11.100000	0.085294
+11.110000	0.085252
+11.120000	0.085209
+11.130000	0.085166
+11.140000	0.085123
+11.150000	0.085079
+11.160000	0.085035
+11.170000	0.084990
+11.180000	0.084946
+11.190000	0.084901
+11.200000	0.084855
+11.210000	0.084810
+11.220000	0.084764
+11.230000	0.084718
+11.240000	0.084671
+11.250000	0.084624
+11.260000	0.084577
+11.270000	0.084530
+11.280000	0.084482
+11.290000	0.084434
+11.300000	0.084385
+11.310000	0.084337
+11.320000	0.084288
+11.330000	0.084238
+11.340000	0.084189
+11.350000	0.084139
+11.360000	0.084089
+11.370000	0.084038
+11.380000	0.083987
+11.390000	0.083936
+11.400000	0.083885
+11.410000	0.083833
+11.420000	0.083781
+11.430000	0.083729
+11.440000	0.083677
+11.450000	0.083624
+11.460000	0.083571
+11.470000	0.083517
+11.480000	0.083464
+11.490000	0.083410
+11.500000	0.083356
+11.510000	0.083301
+11.520000	0.083246
+11.530000	0.083191
+11.540000	0.083136
+11.550000	0.083080
+11.560000	0.083024
+11.570000	0.082968
+11.580000	0.082912
+11.590000	0.082855
+11.600000	0.082798
+11.610000	0.082741
+11.620000	0.082683
+11.630000	0.082626
+11.640000	0.082568
+11.650000	0.082509
+11.660000	0.082451
+11.670000	0.082392
+11.680000	0.082333
+11.690000	0.082274
+11.700000	0.082214
+11.710000	0.082154
+11.720000	0.082094
+11.730000	0.082034
+11.740000	0.081973
+11.750000	0.081912
+11.760000	0.081851
+11.770000	0.081790
+11.780000	0.081728
+11.790000	0.081666
+11.800000	0.081604
+11.810000	0.081542
+11.820000	0.081479
+11.830000	0.081416
+11.840000	0.081353
+11.850000	0.081290
+11.860000	0.081226
+11.870000	0.081162
+11.880000	0.081098
+11.890000	0.081034
+11.900000	0.080969
+11.910000	0.080905
+11.920000	0.080840
+11.930000	0.080775
+11.940000	0.080709
+11.950000	0.080643
+11.960000	0.080577
+11.970000	0.080511
+11.980000	0.080445
+11.990000	0.080378
+12.000000	0.080312
+12.010000	0.080245
+12.020000	0.080177
+12.030000	0.080110
+12.040000	0.080042
+12.050000	0.079974
+12.060000	0.079906
+12.070000	0.079838
+12.080000	0.079769
+12.090000	0.079700
+12.100000	0.079631
+12.110000	0.079562
+12.120000	0.079493
+12.130000	0.079423
+12.140000	0.079353
+12.150000	0.079283
+12.160000	0.079213
+12.170000	0.079142
+12.180000	0.079072
+12.190000	0.079001
+12.200000	0.078930
+12.210000	0.078859
+12.220000	0.078787
+12.230000	0.078716
+12.240000	0.078644
+12.250000	0.078572
+12.260000	0.078499
+12.270000	0.078427
+12.280000	0.078354
+12.290000	0.078281
+12.300000	0.078208
+12.310000	0.078135
+12.320000	0.078062
+12.330000	0.077988
+12.340000	0.077914
+12.350000	0.077840
+12.360000	0.077766
+12.370000	0.077692
+12.380000	0.077617
+12.390000	0.077543
+12.400000	0.077468
+12.410000	0.077393
+12.420000	0.077318
+12.430000	0.077242
+12.440000	0.077167
+12.450000	0.077091
+12.460000	0.077015
+12.470000	0.076939
+12.480000	0.076862
+12.490000	0.076786
+12.500000	0.076709
+12.510000	0.076633
+12.520000	0.076556
+12.530000	0.076478
+12.540000	0.076401
+12.550000	0.076324
+12.560000	0.076246
+12.570000	0.076168
+12.580000	0.076090
+12.590000	0.076012
+12.600000	0.075934
+12.610000	0.075856
+12.620000	0.075777
+12.630000	0.075698
+12.640000	0.075619
+12.650000	0.075540
+12.660000	0.075461
+12.670000	0.075382
+12.680000	0.075302
+12.690000	0.075223
+12.700000	0.075143
+12.710000	0.075063
+12.720000	0.074983
+12.730000	0.074903
+12.740000	0.074822
+12.750000	0.074742
+12.760000	0.074661
+12.770000	0.074580
+12.780000	0.074499
+12.790000	0.074418
+12.800000	0.074337
+12.810000	0.074255
+12.820000	0.074174
+12.830000	0.074092
+12.840000	0.074010
+12.850000	0.073929
+12.860000	0.073847
+12.870000	0.073764
+12.880000	0.073682
+12.890000	0.073600
+12.900000	0.073517
+12.910000	0.073434
+12.920000	0.073351
+12.930000	0.073269
+12.940000	0.073185
+12.950000	0.073102
+12.960000	0.073019
+12.970000	0.072935
+12.980000	0.072852
+12.990000	0.072768
+13.000000	0.072684
+13.010000	0.072601
+13.020000	0.072516
+13.030000	0.072432
+13.040000	0.072348
+13.050000	0.072264
+13.060000	0.072179
+13.070000	0.072095
+13.080000	0.072010
+13.090000	0.071925
+13.100000	0.071840
+13.110000	0.071755
+13.120000	0.071670
+13.130000	0.071585
+13.140000	0.071499
+13.150000	0.071414
+13.160000	0.071328
+13.170000	0.071242
+13.180000	0.071157
+13.190000	0.071071
+13.200000	0.070985
+13.210000	0.070899
+13.220000	0.070812
+13.230000	0.070726
+13.240000	0.070640
+13.250000	0.070553
+13.260000	0.070467
+13.270000	0.070380
+13.280000	0.070293
+13.290000	0.070206
+13.300000	0.070119
+13.310000	0.070032
+13.320000	0.069945
+13.330000	0.069858
+13.340000	0.069771
+13.350000	0.069683
+13.360000	0.069596
+13.370000	0.069508
+13.380000	0.069421
+13.390000	0.069333
+13.400000	0.069245
+13.410000	0.069157
+13.420000	0.069069
+13.430000	0.068981
+13.440000	0.068893
+13.450000	0.068805
+13.460000	0.068717
+13.470000	0.068628
+13.480000	0.068540
+13.490000	0.068451
+13.500000	0.068363
+13.510000	0.068274
+13.520000	0.068185
+13.530000	0.068097
+13.540000	0.068008
+13.550000	0.067919
+13.560000	0.067830
+13.570000	0.067741
+13.580000	0.067652
+13.590000	0.067562
+13.600000	0.067473
+13.610000	0.067384
+13.620000	0.067294
+13.630000	0.067205
+13.640000	0.067115
+13.650000	0.067026
+13.660000	0.066936
+13.670000	0.066846
+13.680000	0.066757
+13.690000	0.066667
+13.700000	0.066577
+13.710000	0.066487
+13.720000	0.066397
+13.730000	0.066307
+13.740000	0.066217
+13.750000	0.066127
+13.760000	0.066037
+13.770000	0.065946
+13.780000	0.065856
+13.790000	0.065766
+13.800000	0.065675
+13.810000	0.065585
+13.820000	0.065494
+13.830000	0.065404
+13.840000	0.065313
+13.850000	0.065223
+13.860000	0.065132
+13.870000	0.065041
+13.880000	0.064950
+13.890000	0.064860
+13.900000	0.064769
+13.910000	0.064678
+13.920000	0.064587
+13.930000	0.064496
+13.940000	0.064405
+13.950000	0.064314
+13.960000	0.064223
+13.970000	0.064132
+13.980000	0.064041
+13.990000	0.063950
+14.000000	0.063858
+14.010000	0.063767
+14.020000	0.063676
+14.030000	0.063585
+14.040000	0.063493
+14.050000	0.063402
+14.060000	0.063310
+14.070000	0.063219
+14.080000	0.063128
+14.090000	0.063036
+14.100000	0.062945
+14.110000	0.062853
+14.120000	0.062761
+14.130000	0.062670
+14.140000	0.062578
+14.150000	0.062487
+14.160000	0.062395
+14.170000	0.062303
+14.180000	0.062212
+14.190000	0.062120
+14.200000	0.062028
+14.210000	0.061937
+14.220000	0.061845
+14.230000	0.061753
+14.240000	0.061661
+14.250000	0.061569
+14.260000	0.061478
+14.270000	0.061386
+14.280000	0.061294
+14.290000	0.061202
+14.300000	0.061110
+14.310000	0.061018
+14.320000	0.060926
+14.330000	0.060834
+14.340000	0.060743
+14.350000	0.060651
+14.360000	0.060559
+14.370000	0.060467
+14.380000	0.060375
+14.390000	0.060283
+14.400000	0.060191
+14.410000	0.060099
+14.420000	0.060007
+14.430000	0.059915
+14.440000	0.059823
+14.450000	0.059731
+14.460000	0.059639
+14.470000	0.059547
+14.480000	0.059455
+14.490000	0.059363
+14.500000	0.059271
+14.510000	0.059179
+14.520000	0.059087
+14.530000	0.058995
+14.540000	0.058903
+14.550000	0.058811
+14.560000	0.058719
+14.570000	0.058627
+14.580000	0.058536
+14.590000	0.058444
+14.600000	0.058352
+14.610000	0.058260
+14.620000	0.058168
+14.630000	0.058076
+14.640000	0.057984
+14.650000	0.057892
+14.660000	0.057800
+14.670000	0.057708
+14.680000	0.057617
+14.690000	0.057525
+14.700000	0.057433
+14.710000	0.057341
+14.720000	0.057249
+14.730000	0.057158
+14.740000	0.057066
+14.750000	0.056974
+14.760000	0.056882
+14.770000	0.056791
+14.780000	0.056699
+14.790000	0.056607
+14.800000	0.056516
+14.810000	0.056424
+14.820000	0.056332
+14.830000	0.056241
+14.840000	0.056149
+14.850000	0.056058
+14.860000	0.055966
+14.870000	0.055875
+14.880000	0.055783
+14.890000	0.055692
+14.900000	0.055600
+14.910000	0.055509
+14.920000	0.055417
+14.930000	0.055326
+14.940000	0.055235
+14.950000	0.055143
+14.960000	0.055052
+14.970000	0.054961
+14.980000	0.054870
+14.990000	0.054778
+15.000000	0.054687
+15.010000	0.054596
+15.020000	0.054505
+15.030000	0.054414
+15.040000	0.054323
+15.050000	0.054232
+15.060000	0.054141
+15.070000	0.054050
+15.080000	0.053959
+15.090000	0.053868
+15.100000	0.053777
+15.110000	0.053687
+15.120000	0.053596
+15.130000	0.053505
+15.140000	0.053414
+15.150000	0.053324
+15.160000	0.053233
+15.170000	0.053143
+15.180000	0.053052
+15.190000	0.052962
+15.200000	0.052871
+15.210000	0.052781
+15.220000	0.052690
+15.230000	0.052600
+15.240000	0.052510
+15.250000	0.052419
+15.260000	0.052329
+15.270000	0.052239
+15.280000	0.052149
+15.290000	0.052059
+15.300000	0.051969
+15.310000	0.051879
+15.320000	0.051789
+15.330000	0.051699
+15.340000	0.051609
+15.350000	0.051519
+15.360000	0.051430
+15.370000	0.051340
+15.380000	0.051250
+15.390000	0.051161
+15.400000	0.051071
+15.410000	0.050982
+15.420000	0.050892
+15.430000	0.050803
+15.440000	0.050713
+15.450000	0.050624
+15.460000	0.050535
+15.470000	0.050446
+15.480000	0.050356
+15.490000	0.050267
+15.500000	0.050178
+15.510000	0.050089
+15.520000	0.050000
+15.530000	0.049911
+15.540000	0.049823
+15.550000	0.049734
+15.560000	0.049645
+15.570000	0.049556
+15.580000	0.049468
+15.590000	0.049379
+15.600000	0.049291
+15.610000	0.049202
+15.620000	0.049114
+15.630000	0.049026
+15.640000	0.048937
+15.650000	0.048849
+15.660000	0.048761
+15.670000	0.048673
+15.680000	0.048585
+15.690000	0.048497
+15.700000	0.048409
+15.710000	0.048321
+15.720000	0.048233
+15.730000	0.048146
+15.740000	0.048058
+15.750000	0.047970
+15.760000	0.047883
+15.770000	0.047795
+15.780000	0.047708
+15.790000	0.047621
+15.800000	0.047533
+15.810000	0.047446
+15.820000	0.047359
+15.830000	0.047272
+15.840000	0.047185
+15.850000	0.047098
+15.860000	0.047011
+15.870000	0.046924
+15.880000	0.046837
+15.890000	0.046751
+15.900000	0.046664
+15.910000	0.046578
+15.920000	0.046491
+15.930000	0.046405
+15.940000	0.046318
+15.950000	0.046232
+15.960000	0.046146
+15.970000	0.046060
+15.980000	0.045974
+15.990000	0.045888
+16.000000	0.045802
+16.010000	0.045716
+16.020000	0.045630
+16.030000	0.045545
+16.040000	0.045459
+16.050000	0.045373
+16.060000	0.045288
+16.070000	0.045202
+16.080000	0.045117
+16.090000	0.045032
+16.100000	0.044947
+16.110000	0.044862
+16.120000	0.044777
+16.130000	0.044692
+16.140000	0.044607
+16.150000	0.044522
+16.160000	0.044437
+16.170000	0.044352
+16.180000	0.044268
+16.190000	0.044183
+16.200000	0.044099
+16.210000	0.044015
+16.220000	0.043930
+16.230000	0.043846
+16.240000	0.043762
+16.250000	0.043678
+16.260000	0.043594
+16.270000	0.043510
+16.280000	0.043426
+16.290000	0.043343
+16.300000	0.043259
+16.310000	0.043175
+16.320000	0.043092
+16.330000	0.043009
+16.340000	0.042925
+16.350000	0.042842
+16.360000	0.042759
+16.370000	0.042676
+16.380000	0.042593
+16.390000	0.042510
+16.400000	0.042427
+16.410000	0.042344
+16.420000	0.042262
+16.430000	0.042179
+16.440000	0.042097
+16.450000	0.042014
+16.460000	0.041932
+16.470000	0.041850
+16.480000	0.041767
+16.490000	0.041685
+16.500000	0.041603
+16.510000	0.041522
+16.520000	0.041440
+16.530000	0.041358
+16.540000	0.041276
+16.550000	0.041195
+16.560000	0.041113
+16.570000	0.041032
+16.580000	0.040951
+16.590000	0.040869
+16.600000	0.040788
+16.610000	0.040707
+16.620000	0.040626
+16.630000	0.040545
+16.640000	0.040465
+16.650000	0.040384
+16.660000	0.040303
+16.670000	0.040223
+16.680000	0.040142
+16.690000	0.040062
+16.700000	0.039982
+16.710000	0.039902
+16.720000	0.039822
+16.730000	0.039742
+16.740000	0.039662
+16.750000	0.039582
+16.760000	0.039502
+16.770000	0.039423
+16.780000	0.039343
+16.790000	0.039264
+16.800000	0.039184
+16.810000	0.039105
+16.820000	0.039026
+16.830000	0.038947
+16.840000	0.038868
+16.850000	0.038789
+16.860000	0.038710
+16.870000	0.038631
+16.880000	0.038553
+16.890000	0.038474
+16.900000	0.038396
+16.910000	0.038317
+16.920000	0.038239
+16.930000	0.038161
+16.940000	0.038083
+16.950000	0.038005
+16.960000	0.037927
+16.970000	0.037849
+16.980000	0.037772
+16.990000	0.037694
+17.000000	0.037617
+17.010000	0.037539
+17.020000	0.037462
+17.030000	0.037385
+17.040000	0.037308
+17.050000	0.037231
+17.060000	0.037154
+17.070000	0.037077
+17.080000	0.037000
+17.090000	0.036923
+17.100000	0.036847
+17.110000	0.036770
+17.120000	0.036694
+17.130000	0.036618
+17.140000	0.036542
+17.150000	0.036466
+17.160000	0.036390
+17.170000	0.036314
+17.180000	0.036238
+17.190000	0.036162
+17.200000	0.036087
+17.210000	0.036011
+17.220000	0.035936
+17.230000	0.035861
+17.240000	0.035785
+17.250000	0.035710
+17.260000	0.035635
+17.270000	0.035560
+17.280000	0.035486
+17.290000	0.035411
+17.300000	0.035336
+17.310000	0.035262
+17.320000	0.035187
+17.330000	0.035113
+17.340000	0.035039
+17.350000	0.034965
+17.360000	0.034891
+17.370000	0.034817
+17.380000	0.034743
+17.390000	0.034669
+17.400000	0.034596
+17.410000	0.034522
+17.420000	0.034449
+17.430000	0.034376
+17.440000	0.034302
+17.450000	0.034229
+17.460000	0.034156
+17.470000	0.034083
+17.480000	0.034010
+17.490000	0.033938
+17.500000	0.033865
+17.510000	0.033793
+17.520000	0.033720
+17.530000	0.033648
+17.540000	0.033576
+17.550000	0.033504
+17.560000	0.033431
+17.570000	0.033360
+17.580000	0.033288
+17.590000	0.033216
+17.600000	0.033144
+17.610000	0.033073
+17.620000	0.033002
+17.630000	0.032930
+17.640000	0.032859
+17.650000	0.032788
+17.660000	0.032717
+17.670000	0.032646
+17.680000	0.032575
+17.690000	0.032504
+17.700000	0.032434
+17.710000	0.032363
+17.720000	0.032293
+17.730000	0.032223
+17.740000	0.032153
+17.750000	0.032082
+17.760000	0.032012
+17.770000	0.031943
+17.780000	0.031873
+17.790000	0.031803
+17.800000	0.031733
+17.810000	0.031664
+17.820000	0.031595
+17.830000	0.031525
+17.840000	0.031456
+17.850000	0.031387
+17.860000	0.031318
+17.870000	0.031249
+17.880000	0.031181
+17.890000	0.031112
+17.900000	0.031043
+17.910000	0.030975
+17.920000	0.030907
+17.930000	0.030838
+17.940000	0.030770
+17.950000	0.030702
+17.960000	0.030634
+17.970000	0.030566
+17.980000	0.030499
+17.990000	0.030431
+18.000000	0.030363
+18.010000	0.030296
+18.020000	0.030229
+18.030000	0.030161
+18.040000	0.030094
+18.050000	0.030027
+18.060000	0.029960
+18.070000	0.029894
+18.080000	0.029827
+18.090000	0.029760
+18.100000	0.029694
+18.110000	0.029627
+18.120000	0.029561
+18.130000	0.029495
+18.140000	0.029429
+18.150000	0.029363
+18.160000	0.029297
+18.170000	0.029231
+18.180000	0.029166
+18.190000	0.029100
+18.200000	0.029035
+18.210000	0.028969
+18.220000	0.028904
+18.230000	0.028839
+18.240000	0.028774
+18.250000	0.028709
+18.260000	0.028644
+18.270000	0.028579
+18.280000	0.028515
+18.290000	0.028450
+18.300000	0.028386
+18.310000	0.028321
+18.320000	0.028257
+18.330000	0.028193
+18.340000	0.028129
+18.350000	0.028065
+18.360000	0.028001
+18.370000	0.027938
+18.380000	0.027874
+18.390000	0.027811
+18.400000	0.027747
+18.410000	0.027684
+18.420000	0.027621
+18.430000	0.027558
+18.440000	0.027495
+18.450000	0.027432
+18.460000	0.027369
+18.470000	0.027306
+18.480000	0.027244
+18.490000	0.027181
+18.500000	0.027119
+18.510000	0.027057
+18.520000	0.026995
+18.530000	0.026933
+18.540000	0.026871
+18.550000	0.026809
+18.560000	0.026747
+18.570000	0.026685
+18.580000	0.026624
+18.590000	0.026562
+18.600000	0.026501
+18.610000	0.026440
+18.620000	0.026379
+18.630000	0.026318
+18.640000	0.026257
+18.650000	0.026196
+18.660000	0.026135
+18.670000	0.026075
+18.680000	0.026014
+18.690000	0.025954
+18.700000	0.025894
+18.710000	0.025833
+18.720000	0.025773
+18.730000	0.025713
+18.740000	0.025654
+18.750000	0.025594
+18.760000	0.025534
+18.770000	0.025475
+18.780000	0.025415
+18.790000	0.025356
+18.800000	0.025296
+18.810000	0.025237
+18.820000	0.025178
+18.830000	0.025119
+18.840000	0.025060
+18.850000	0.025002
+18.860000	0.024943
+18.870000	0.024885
+18.880000	0.024826
+18.890000	0.024768
+18.900000	0.024710
+18.910000	0.024651
+18.920000	0.024593
+18.930000	0.024535
+18.940000	0.024478
+18.950000	0.024420
+18.960000	0.024362
+18.970000	0.024305
+18.980000	0.024247
+18.990000	0.024190
+19.000000	0.024133
+19.010000	0.024076
+19.020000	0.024019
+19.030000	0.023962
+19.040000	0.023905
+19.050000	0.023848
+19.060000	0.023792
+19.070000	0.023735
+19.080000	0.023679
+19.090000	0.023623
+19.100000	0.023566
+19.110000	0.023510
+19.120000	0.023454
+19.130000	0.023398
+19.140000	0.023343
+19.150000	0.023287
+19.160000	0.023231
+19.170000	0.023176
+19.180000	0.023121
+19.190000	0.023065
+19.200000	0.023010
+19.210000	0.022955
+19.220000	0.022900
+19.230000	0.022845
+19.240000	0.022790
+19.250000	0.022736
+19.260000	0.022681
+19.270000	0.022627
+19.280000	0.022572
+19.290000	0.022518
+19.300000	0.022464
+19.310000	0.022410
+19.320000	0.022356
+19.330000	0.022302
+19.340000	0.022248
+19.350000	0.022194
+19.360000	0.022141
+19.370000	0.022087
+19.380000	0.022034
+19.390000	0.021981
+19.400000	0.021928
+19.410000	0.021875
+19.420000	0.021822
+19.430000	0.021769
+19.440000	0.021716
+19.450000	0.021663
+19.460000	0.021611
+19.470000	0.021558
+19.480000	0.021506
+19.490000	0.021454
+19.500000	0.021401
+19.510000	0.021349
+19.520000	0.021297
+19.530000	0.021245
+19.540000	0.021194
+19.550000	0.021142
+19.560000	0.021090
+19.570000	0.021039
+19.580000	0.020987
+19.590000	0.020936
+19.600000	0.020885
+19.610000	0.020834
+19.620000	0.020783
+19.630000	0.020732
+19.640000	0.020681
+19.650000	0.020630
+19.660000	0.020580
+19.670000	0.020529
+19.680000	0.020479
+19.690000	0.020429
+19.700000	0.020378
+19.710000	0.020328
+19.720000	0.020278
+19.730000	0.020228
+19.740000	0.020178
+19.750000	0.020129
+19.760000	0.020079
+19.770000	0.020030
+19.780000	0.019980
+19.790000	0.019931
+19.800000	0.019882
+19.810000	0.019832
+19.820000	0.019783
+19.830000	0.019734
+19.840000	0.019685
+19.850000	0.019637
+19.860000	0.019588
+19.870000	0.019539
+19.880000	0.019491
+19.890000	0.019443
+19.900000	0.019394
+19.910000	0.019346
+19.920000	0.019298
+19.930000	0.019250
+19.940000	0.019202
+19.950000	0.019154
+19.960000	0.019107
+19.970000	0.019059
+19.980000	0.019011
+19.990000	0.018964
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.plt b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.plt
new file mode 100644
index 0000000..055cc91
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.plt
@@ -0,0 +1,29 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:20]
+#set yrange [0:0.5]
+set xlabel "x"
+set ylabel "lognormal(real m, v2)"
+#set samples 2000
+set output "lognormal.svg"
+set nokey
+set label "lognormal(0.0, 1.0)" at 2.7, 0.17
+set label "lognormal(0.0, 0.5)" at 1.7, 0.35
+set label "lognormal(0.0, 0.25)" at 1.25, 1.2
+set style data lines
+plot "lognormal_0.0_1.0.dat" using 1:2 linetype 1, \
+     "lognormal_0.0_0.5.dat" using 1:2 linetype 2, \
+     "lognormal_0.0_0.25.dat" using 1:2 linetype 3
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.svg b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.svg
new file mode 100644
index 0000000..ec0c303
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal.svg
@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,377.3 L80.9,377.3 M575.0,377.3 L566.0,377.3 '></path>
+	<g transform="translate(63.6,381.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,332.2 L80.9,332.2 M575.0,332.2 L566.0,332.2 '></path>
+	<g transform="translate(63.6,336.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,287.2 L80.9,287.2 M575.0,287.2 L566.0,287.2 '></path>
+	<g transform="translate(63.6,291.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.6</text>
+	</g>
+	<path  d='M71.9,242.1 L80.9,242.1 M575.0,242.1 L566.0,242.1 '></path>
+	<g transform="translate(63.6,246.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.8</text>
+	</g>
+	<path  d='M71.9,197.0 L80.9,197.0 M575.0,197.0 L566.0,197.0 '></path>
+	<g transform="translate(63.6,201.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+	<path  d='M71.9,151.9 L80.9,151.9 M575.0,151.9 L566.0,151.9 '></path>
+	<g transform="translate(63.6,156.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.2</text>
+	</g>
+	<path  d='M71.9,106.9 L80.9,106.9 M575.0,106.9 L566.0,106.9 '></path>
+	<g transform="translate(63.6,111.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.4</text>
+	</g>
+	<path  d='M71.9,61.8 L80.9,61.8 M575.0,61.8 L566.0,61.8 '></path>
+	<g transform="translate(63.6,66.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.6</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.8</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M134.8,422.4 L134.8,413.4 M134.8,16.7 L134.8,25.7 '></path>
+	<g transform="translate(134.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.5</text>
+	</g>
+	<path  d='M197.7,422.4 L197.7,413.4 M197.7,16.7 L197.7,25.7 '></path>
+	<g transform="translate(197.7,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M260.6,422.4 L260.6,413.4 M260.6,16.7 L260.6,25.7 '></path>
+	<g transform="translate(260.6,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1.5</text>
+	</g>
+	<path  d='M323.5,422.4 L323.5,413.4 M323.5,16.7 L323.5,25.7 '></path>
+	<g transform="translate(323.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M386.3,422.4 L386.3,413.4 M386.3,16.7 L386.3,25.7 '></path>
+	<g transform="translate(386.3,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2.5</text>
+	</g>
+	<path  d='M449.2,422.4 L449.2,413.4 M449.2,16.7 L449.2,25.7 '></path>
+	<g transform="translate(449.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M512.1,422.4 L512.1,413.4 M512.1,16.7 L512.1,25.7 '></path>
+	<g transform="translate(512.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3.5</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>lognormal(real m, v2)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(411.5,388.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>lognormal(0.0, 1.0)</text>
+	</g>
+	<g transform="translate(285.7,348.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>lognormal(0.0, 0.5)</text>
+	</g>
+	<g transform="translate(229.1,156.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>lognormal(0.0, 0.25)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L73.2,422.2 L74.4,420.3 L75.7,416.0 L76.9,409.8 L78.2,402.2 L79.4,393.8 L80.7,385.0 
+		L82.0,376.1 L83.2,367.4 L84.5,358.9 L85.7,350.9 L87.0,343.2 L88.3,336.1 L89.5,329.4 L90.8,323.3 
+		L92.0,317.6 L93.3,312.4 L94.5,307.6 L95.8,303.2 L97.1,299.3 L98.3,295.7 L99.6,292.5 L100.8,289.6 
+		L102.1,287.1 L103.3,284.8 L104.6,282.8 L105.9,281.1 L107.1,279.6 L108.4,278.3 L109.6,277.2 L110.9,276.3 
+		L112.1,275.6 L113.4,275.0 L114.7,274.6 L115.9,274.3 L117.2,274.2 L118.4,274.2 L119.7,274.2 L121.0,274.4 
+		L122.2,274.7 L123.5,275.0 L124.7,275.4 L126.0,275.9 L127.2,276.5 L128.5,277.1 L129.8,277.8 L131.0,278.5 
+		L132.3,279.3 L133.5,280.1 L134.8,281.0 L136.0,281.9 L137.3,282.8 L138.6,283.7 L139.8,284.7 L141.1,285.7 
+		L142.3,286.7 L143.6,287.7 L144.8,288.7 L146.1,289.8 L147.4,290.9 L148.6,291.9 L149.9,293.0 L151.1,294.1 
+		L152.4,295.2 L153.7,296.3 L154.9,297.4 L156.2,298.5 L157.4,299.6 L158.7,300.8 L159.9,301.9 L161.2,303.0 
+		L162.5,304.1 L163.7,305.2 L165.0,306.3 L166.2,307.4 L167.5,308.5 L168.7,309.5 L170.0,310.6 L171.3,311.7 
+		L172.5,312.8 L173.8,313.8 L175.0,314.9 L176.3,315.9 L177.6,317.0 L178.8,318.0 L180.1,319.0 L181.3,320.0 
+		L182.6,321.1 L183.8,322.1 L185.1,323.0 L186.4,324.0 L187.6,325.0 L188.9,326.0 L190.1,326.9 L191.4,327.9 
+		L192.6,328.8 L193.9,329.7 L195.2,330.7 L196.4,331.6 L197.7,332.5 L198.9,333.4 L200.2,334.3 L201.4,335.1 
+		L202.7,336.0 L204.0,336.9 L205.2,337.7 L206.5,338.6 L207.7,339.4 L209.0,340.2 L210.3,341.0 L211.5,341.8 
+		L212.8,342.6 L214.0,343.4 L215.3,344.2 L216.5,345.0 L217.8,345.7 L219.1,346.5 L220.3,347.2 L221.6,348.0 
+		L222.8,348.7 L224.1,349.4 L225.3,350.1 L226.6,350.8 L227.9,351.5 L229.1,352.2 L230.4,352.9 L231.6,353.6 
+		L232.9,354.3 L234.1,354.9 L235.4,355.6 L236.7,356.2 L237.9,356.9 L239.2,357.5 L240.4,358.1 L241.7,358.7 
+		L243.0,359.3 L244.2,359.9 L245.5,360.5 L246.7,361.1 L248.0,361.7 L249.2,362.3 L250.5,362.9 L251.8,363.4 
+		L253.0,364.0 L254.3,364.5 L255.5,365.1 L256.8,365.6 L258.0,366.1 L259.3,366.7 L260.6,367.2 L261.8,367.7 
+		L263.1,368.2 L264.3,368.7 L265.6,369.2 L266.9,369.7 L268.1,370.2 L269.4,370.7 L270.6,371.1 L271.9,371.6 
+		L273.1,372.1 L274.4,372.5 L275.7,373.0 L276.9,373.4 L278.2,373.9 L279.4,374.3 L280.7,374.8 L281.9,375.2 
+		L283.2,375.6 L284.5,376.0 L285.7,376.5 L287.0,376.9 L288.2,377.3 L289.5,377.7 L290.7,378.1 L292.0,378.5 
+		L293.3,378.9 L294.5,379.2 L295.8,379.6 L297.0,380.0 L298.3,380.4 L299.6,380.7 L300.8,381.1 L302.1,381.5 
+		L303.3,381.8 L304.6,382.2 L305.8,382.5 L307.1,382.9 L308.4,383.2 L309.6,383.6 L310.9,383.9 L312.1,384.2 
+		L313.4,384.5 L314.6,384.9 L315.9,385.2 L317.2,385.5 L318.4,385.8 L319.7,386.1 L320.9,386.4 L322.2,386.7 
+		L323.5,387.0 L324.7,387.3 L326.0,387.6 L327.2,387.9 L328.5,388.2 L329.7,388.5 L331.0,388.8 L332.3,389.1 
+		L333.5,389.3 L334.8,389.6 L336.0,389.9 L337.3,390.2 L338.5,390.4 L339.8,390.7 L341.1,390.9 L342.3,391.2 
+		L343.6,391.5 L344.8,391.7 L346.1,392.0 L347.3,392.2 L348.6,392.4 L349.9,392.7 L351.1,392.9 L352.4,393.2 
+		L353.6,393.4 L354.9,393.6 L356.2,393.9 L357.4,394.1 L358.7,394.3 L359.9,394.5 L361.2,394.8 L362.4,395.0 
+		L363.7,395.2 L365.0,395.4 L366.2,395.6 L367.5,395.8 L368.7,396.0 L370.0,396.3 L371.2,396.5 L372.5,396.7 
+		L373.8,396.9 L375.0,397.1 L376.3,397.3 L377.5,397.5 L378.8,397.6 L380.0,397.8 L381.3,398.0 L382.6,398.2 
+		L383.8,398.4 L385.1,398.6 L386.3,398.8 L387.6,398.9 L388.9,399.1 L390.1,399.3 L391.4,399.5 L392.6,399.6 
+		L393.9,399.8 L395.1,400.0 L396.4,400.2 L397.7,400.3 L398.9,400.5 L400.2,400.7 L401.4,400.8 L402.7,401.0 
+		L403.9,401.1 L405.2,401.3 L406.5,401.5 L407.7,401.6 L409.0,401.8 L410.2,401.9 L411.5,402.1 L412.8,402.2 
+		L414.0,402.4 L415.3,402.5 L416.5,402.7 L417.8,402.8 L419.0,402.9 L420.3,403.1 L421.6,403.2 L422.8,403.4 
+		L424.1,403.5 L425.3,403.6 L426.6,403.8 L427.8,403.9 L429.1,404.0 L430.4,404.2 L431.6,404.3 L432.9,404.4 
+		L434.1,404.6 L435.4,404.7 L436.6,404.8 L437.9,404.9 L439.2,405.1 L440.4,405.2 L441.7,405.3 L442.9,405.4 
+		L444.2,405.5 L445.5,405.7 L446.7,405.8 L448.0,405.9 L449.2,406.0 L450.5,406.1 L451.7,406.2 L453.0,406.3 
+		L454.3,406.5 L455.5,406.6 L456.8,406.7 L458.0,406.8 L459.3,406.9 L460.5,407.0 L461.8,407.1 L463.1,407.2 
+		L464.3,407.3 L465.6,407.4 L466.8,407.5 L468.1,407.6 L469.3,407.7 L470.6,407.8 L471.9,407.9 L473.1,408.0 
+		L474.4,408.1 L475.6,408.2 L476.9,408.3 L478.2,408.4 L479.4,408.5 L480.7,408.6 L481.9,408.7 L483.2,408.8 
+		L484.4,408.9 L485.7,409.0 L487.0,409.0 L488.2,409.1 L489.5,409.2 L490.7,409.3 L492.0,409.4 L493.2,409.5 
+		L494.5,409.6 L495.8,409.6 L497.0,409.7 L498.3,409.8 L499.5,409.9 L500.8,410.0 L502.1,410.1 L503.3,410.1 
+		L504.6,410.2 L505.8,410.3 L507.1,410.4 L508.3,410.4 L509.6,410.5 L510.9,410.6 L512.1,410.7 L513.4,410.8 
+		L514.6,410.8 L515.9,410.9 L517.1,411.0 L518.4,411.0 L519.7,411.1 L520.9,411.2 L522.2,411.3 L523.4,411.3 
+		L524.7,411.4 L525.9,411.5 L527.2,411.5 L528.5,411.6 L529.7,411.7 L531.0,411.7 L532.2,411.8 L533.5,411.9 
+		L534.8,411.9 L536.0,412.0 L537.3,412.1 L538.5,412.1 L539.8,412.2 L541.0,412.3 L542.3,412.3 L543.6,412.4 
+		L544.8,412.5 L546.1,412.5 L547.3,412.6 L548.6,412.6 L549.8,412.7 L551.1,412.8 L552.4,412.8 L553.6,412.9 
+		L554.9,412.9 L556.1,413.0 L557.4,413.0 L558.6,413.1 L559.9,413.2 L561.2,413.2 L562.4,413.3 L563.7,413.3 
+		L564.9,413.4 L566.2,413.4 L567.5,413.5 L568.7,413.5 L570.0,413.6 L571.2,413.6 L572.5,413.7 L573.7,413.7 
+		L575.0,413.8 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L73.2,422.4 L74.4,422.4 L75.7,422.4 L76.9,422.4 L78.2,422.4 L79.4,422.4 L80.7,422.4 
+		L82.0,422.4 L83.2,422.4 L84.5,422.4 L85.7,422.3 L87.0,422.2 L88.3,422.1 L89.5,421.8 L90.8,421.5 
+		L92.0,421.0 L93.3,420.4 L94.5,419.6 L95.8,418.6 L97.1,417.3 L98.3,415.8 L99.6,414.1 L100.8,412.0 
+		L102.1,409.6 L103.3,407.0 L104.6,404.0 L105.9,400.8 L107.1,397.3 L108.4,393.5 L109.6,389.4 L110.9,385.1 
+		L112.1,380.5 L113.4,375.8 L114.7,370.8 L115.9,365.7 L117.2,360.5 L118.4,355.1 L119.7,349.6 L121.0,344.1 
+		L122.2,338.5 L123.5,332.9 L124.7,327.3 L126.0,321.8 L127.2,316.2 L128.5,310.8 L129.8,305.4 L131.0,300.0 
+		L132.3,294.8 L133.5,289.8 L134.8,284.8 L136.0,280.0 L137.3,275.4 L138.6,270.9 L139.8,266.6 L141.1,262.4 
+		L142.3,258.5 L143.6,254.7 L144.8,251.1 L146.1,247.7 L147.4,244.5 L148.6,241.5 L149.9,238.7 L151.1,236.1 
+		L152.4,233.7 L153.7,231.5 L154.9,229.5 L156.2,227.6 L157.4,226.0 L158.7,224.5 L159.9,223.2 L161.2,222.1 
+		L162.5,221.1 L163.7,220.3 L165.0,219.7 L166.2,219.2 L167.5,218.9 L168.7,218.7 L170.0,218.6 L171.3,218.7 
+		L172.5,218.9 L173.8,219.2 L175.0,219.7 L176.3,220.3 L177.6,220.9 L178.8,221.7 L180.1,222.6 L181.3,223.6 
+		L182.6,224.6 L183.8,225.8 L185.1,227.0 L186.4,228.3 L187.6,229.6 L188.9,231.1 L190.1,232.5 L191.4,234.1 
+		L192.6,235.7 L193.9,237.3 L195.2,239.0 L196.4,240.8 L197.7,242.6 L198.9,244.4 L200.2,246.2 L201.4,248.1 
+		L202.7,250.0 L204.0,251.9 L205.2,253.9 L206.5,255.9 L207.7,257.8 L209.0,259.8 L210.3,261.9 L211.5,263.9 
+		L212.8,265.9 L214.0,267.9 L215.3,270.0 L216.5,272.0 L217.8,274.1 L219.1,276.1 L220.3,278.1 L221.6,280.2 
+		L222.8,282.2 L224.1,284.2 L225.3,286.2 L226.6,288.2 L227.9,290.2 L229.1,292.2 L230.4,294.1 L231.6,296.1 
+		L232.9,298.0 L234.1,299.9 L235.4,301.9 L236.7,303.7 L237.9,305.6 L239.2,307.5 L240.4,309.3 L241.7,311.1 
+		L243.0,313.0 L244.2,314.7 L245.5,316.5 L246.7,318.2 L248.0,320.0 L249.2,321.7 L250.5,323.4 L251.8,325.0 
+		L253.0,326.7 L254.3,328.3 L255.5,329.9 L256.8,331.5 L258.0,333.0 L259.3,334.6 L260.6,336.1 L261.8,337.6 
+		L263.1,339.1 L264.3,340.5 L265.6,342.0 L266.9,343.4 L268.1,344.8 L269.4,346.1 L270.6,347.5 L271.9,348.8 
+		L273.1,350.1 L274.4,351.4 L275.7,352.7 L276.9,354.0 L278.2,355.2 L279.4,356.4 L280.7,357.6 L281.9,358.8 
+		L283.2,359.9 L284.5,361.0 L285.7,362.2 L287.0,363.3 L288.2,364.3 L289.5,365.4 L290.7,366.4 L292.0,367.5 
+		L293.3,368.5 L294.5,369.5 L295.8,370.4 L297.0,371.4 L298.3,372.3 L299.6,373.3 L300.8,374.2 L302.1,375.1 
+		L303.3,375.9 L304.6,376.8 L305.8,377.6 L307.1,378.5 L308.4,379.3 L309.6,380.1 L310.9,380.9 L312.1,381.7 
+		L313.4,382.4 L314.6,383.2 L315.9,383.9 L317.2,384.6 L318.4,385.3 L319.7,386.0 L320.9,386.7 L322.2,387.3 
+		L323.5,388.0 L324.7,388.6 L326.0,389.3 L327.2,389.9 L328.5,390.5 L329.7,391.1 L331.0,391.7 L332.3,392.3 
+		L333.5,392.8 L334.8,393.4 L336.0,393.9 L337.3,394.5 L338.5,395.0 L339.8,395.5 L341.1,396.0 L342.3,396.5 
+		L343.6,397.0 L344.8,397.4 L346.1,397.9 L347.3,398.4 L348.6,398.8 L349.9,399.3 L351.1,399.7 L352.4,400.1 
+		L353.6,400.5 L354.9,400.9 L356.2,401.3 L357.4,401.7 L358.7,402.1 L359.9,402.5 L361.2,402.9 L362.4,403.2 
+		L363.7,403.6 L365.0,403.9 L366.2,404.3 L367.5,404.6 L368.7,405.0 L370.0,405.3 L371.2,405.6 L372.5,405.9 
+		L373.8,406.2 L375.0,406.5 L376.3,406.8 L377.5,407.1 L378.8,407.4 L380.0,407.7 L381.3,407.9 L382.6,408.2 
+		L383.8,408.5 L385.1,408.7 L386.3,409.0 L387.6,409.2 L388.9,409.5 L390.1,409.7 L391.4,409.9 L392.6,410.2 
+		L393.9,410.4 L395.1,410.6 L396.4,410.8 L397.7,411.1 L398.9,411.3 L400.2,411.5 L401.4,411.7 L402.7,411.9 
+		L403.9,412.1 L405.2,412.2 L406.5,412.4 L407.7,412.6 L409.0,412.8 L410.2,413.0 L411.5,413.1 L412.8,413.3 
+		L414.0,413.5 L415.3,413.6 L416.5,413.8 L417.8,414.0 L419.0,414.1 L420.3,414.3 L421.6,414.4 L422.8,414.6 
+		L424.1,414.7 L425.3,414.8 L426.6,415.0 L427.8,415.1 L429.1,415.2 L430.4,415.4 L431.6,415.5 L432.9,415.6 
+		L434.1,415.7 L435.4,415.9 L436.6,416.0 L437.9,416.1 L439.2,416.2 L440.4,416.3 L441.7,416.4 L442.9,416.5 
+		L444.2,416.6 L445.5,416.7 L446.7,416.8 L448.0,416.9 L449.2,417.0 L450.5,417.1 L451.7,417.2 L453.0,417.3 
+		L454.3,417.4 L455.5,417.5 L456.8,417.6 L458.0,417.7 L459.3,417.8 L460.5,417.8 L461.8,417.9 L463.1,418.0 
+		L464.3,418.1 L465.6,418.1 L466.8,418.2 L468.1,418.3 L469.3,418.4 L470.6,418.4 L471.9,418.5 L473.1,418.6 
+		L474.4,418.6 L475.6,418.7 L476.9,418.8 L478.2,418.8 L479.4,418.9 L480.7,419.0 L481.9,419.0 L483.2,419.1 
+		L484.4,419.1 L485.7,419.2 L487.0,419.3 L488.2,419.3 L489.5,419.4 L490.7,419.4 L492.0,419.5 L493.2,419.5 
+		L494.5,419.6 L495.8,419.6 L497.0,419.7 L498.3,419.7 L499.5,419.8 L500.8,419.8 L502.1,419.8 L503.3,419.9 
+		L504.6,419.9 L505.8,420.0 L507.1,420.0 L508.3,420.1 L509.6,420.1 L510.9,420.1 L512.1,420.2 L513.4,420.2 
+		L514.6,420.2 L515.9,420.3 L517.1,420.3 L518.4,420.4 L519.7,420.4 L520.9,420.4 L522.2,420.5 L523.4,420.5 
+		L524.7,420.5 L525.9,420.6 L527.2,420.6 L528.5,420.6 L529.7,420.6 L531.0,420.7 L532.2,420.7 L533.5,420.7 
+		L534.8,420.8 L536.0,420.8 L537.3,420.8 L538.5,420.8 L539.8,420.9 L541.0,420.9 L542.3,420.9 L543.6,420.9 
+		L544.8,421.0 L546.1,421.0 L547.3,421.0 L548.6,421.0 L549.8,421.1 L551.1,421.1 L552.4,421.1 L553.6,421.1 
+		L554.9,421.1 L556.1,421.2 L557.4,421.2 L558.6,421.2 L559.9,421.2 L561.2,421.2 L562.4,421.3 L563.7,421.3 
+		L564.9,421.3 L566.2,421.3 L567.5,421.3 L568.7,421.4 L570.0,421.4 L571.2,421.4 L572.5,421.4 L573.7,421.4 
+		L575.0,421.4 '></path>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L73.2,422.4 L74.4,422.4 L75.7,422.4 L76.9,422.4 L78.2,422.4 L79.4,422.4 L80.7,422.4 
+		L82.0,422.4 L83.2,422.4 L84.5,422.4 L85.7,422.4 L87.0,422.4 L88.3,422.4 L89.5,422.4 L90.8,422.4 
+		L92.0,422.4 L93.3,422.4 L94.5,422.4 L95.8,422.4 L97.1,422.4 L98.3,422.4 L99.6,422.4 L100.8,422.4 
+		L102.1,422.4 L103.3,422.4 L104.6,422.4 L105.9,422.4 L107.1,422.4 L108.4,422.4 L109.6,422.4 L110.9,422.4 
+		L112.1,422.4 L113.4,422.3 L114.7,422.3 L115.9,422.2 L117.2,422.2 L118.4,422.0 L119.7,421.9 L121.0,421.6 
+		L122.2,421.3 L123.5,420.9 L124.7,420.3 L126.0,419.6 L127.2,418.7 L128.5,417.5 L129.8,416.1 L131.0,414.4 
+		L132.3,412.3 L133.5,409.9 L134.8,407.0 L136.0,403.6 L137.3,399.8 L138.6,395.4 L139.8,390.5 L141.1,384.9 
+		L142.3,378.8 L143.6,372.0 L144.8,364.7 L146.1,356.7 L147.4,348.1 L148.6,338.9 L149.9,329.2 L151.1,318.9 
+		L152.4,308.2 L153.7,297.0 L154.9,285.5 L156.2,273.6 L157.4,261.5 L158.7,249.1 L159.9,236.7 L161.2,224.2 
+		L162.5,211.7 L163.7,199.3 L165.0,187.1 L166.2,175.1 L167.5,163.3 L168.7,152.0 L170.0,141.0 L171.3,130.5 
+		L172.5,120.5 L173.8,111.1 L175.0,102.3 L176.3,94.2 L177.6,86.7 L178.8,79.9 L180.1,73.8 L181.3,68.4 
+		L182.6,63.8 L183.8,59.9 L185.1,56.7 L186.4,54.3 L187.6,52.6 L188.9,51.6 L190.1,51.3 L191.4,51.7 
+		L192.6,52.7 L193.9,54.3 L195.2,56.6 L196.4,59.4 L197.7,62.7 L198.9,66.6 L200.2,70.9 L201.4,75.6 
+		L202.7,80.8 L204.0,86.3 L205.2,92.2 L206.5,98.3 L207.7,104.8 L209.0,111.5 L210.3,118.3 L211.5,125.4 
+		L212.8,132.6 L214.0,140.0 L215.3,147.4 L216.5,154.9 L217.8,162.4 L219.1,170.0 L220.3,177.6 L221.6,185.1 
+		L222.8,192.7 L224.1,200.1 L225.3,207.5 L226.6,214.9 L227.9,222.1 L229.1,229.2 L230.4,236.2 L231.6,243.1 
+		L232.9,249.8 L234.1,256.4 L235.4,262.9 L236.7,269.2 L237.9,275.3 L239.2,281.3 L240.4,287.1 L241.7,292.8 
+		L243.0,298.3 L244.2,303.6 L245.5,308.7 L246.7,313.7 L248.0,318.5 L249.2,323.2 L250.5,327.7 L251.8,332.0 
+		L253.0,336.2 L254.3,340.2 L255.5,344.1 L256.8,347.8 L258.0,351.3 L259.3,354.8 L260.6,358.0 L261.8,361.2 
+		L263.1,364.2 L264.3,367.1 L265.6,369.8 L266.9,372.5 L268.1,375.0 L269.4,377.4 L270.6,379.7 L271.9,381.9 
+		L273.1,384.0 L274.4,386.0 L275.7,387.9 L276.9,389.7 L278.2,391.4 L279.4,393.1 L280.7,394.6 L281.9,396.1 
+		L283.2,397.5 L284.5,398.9 L285.7,400.2 L287.0,401.4 L288.2,402.5 L289.5,403.6 L290.7,404.6 L292.0,405.6 
+		L293.3,406.5 L294.5,407.4 L295.8,408.3 L297.0,409.1 L298.3,409.8 L299.6,410.5 L300.8,411.2 L302.1,411.8 
+		L303.3,412.4 L304.6,413.0 L305.8,413.5 L307.1,414.0 L308.4,414.5 L309.6,415.0 L310.9,415.4 L312.1,415.8 
+		L313.4,416.2 L314.6,416.5 L315.9,416.9 L317.2,417.2 L318.4,417.5 L319.7,417.8 L320.9,418.1 L322.2,418.3 
+		L323.5,418.5 L324.7,418.8 L326.0,419.0 L327.2,419.2 L328.5,419.4 L329.7,419.6 L331.0,419.7 L332.3,419.9 
+		L333.5,420.0 L334.8,420.2 L336.0,420.3 L337.3,420.4 L338.5,420.5 L339.8,420.7 L341.1,420.8 L342.3,420.9 
+		L343.6,421.0 L344.8,421.0 L346.1,421.1 L347.3,421.2 L348.6,421.3 L349.9,421.3 L351.1,421.4 L352.4,421.5 
+		L353.6,421.5 L354.9,421.6 L356.2,421.6 L357.4,421.7 L358.7,421.7 L359.9,421.8 L361.2,421.8 L362.4,421.8 
+		L363.7,421.9 L365.0,421.9 L366.2,421.9 L367.5,422.0 L368.7,422.0 L370.0,422.0 L371.2,422.0 L372.5,422.1 
+		L373.8,422.1 L375.0,422.1 L376.3,422.1 L377.5,422.1 L378.8,422.1 L380.0,422.2 L381.3,422.2 L382.6,422.2 
+		L383.8,422.2 L385.1,422.2 L386.3,422.2 L387.6,422.2 L388.9,422.2 L390.1,422.3 L391.4,422.3 L392.6,422.3 
+		L393.9,422.3 L395.1,422.3 L396.4,422.3 L397.7,422.3 L398.9,422.3 L400.2,422.3 L401.4,422.3 L402.7,422.3 
+		L403.9,422.3 L405.2,422.3 L406.5,422.3 L407.7,422.3 L409.0,422.3 L410.2,422.3 L411.5,422.4 L412.8,422.4 
+		L414.0,422.4 L415.3,422.4 L416.5,422.4 L417.8,422.4 L419.0,422.4 L420.3,422.4 L421.6,422.4 L422.8,422.4 
+		L424.1,422.4 L425.3,422.4 L426.6,422.4 L427.8,422.4 L429.1,422.4 L430.4,422.4 L431.6,422.4 L432.9,422.4 
+		L434.1,422.4 L435.4,422.4 L436.6,422.4 L437.9,422.4 L439.2,422.4 L440.4,422.4 L441.7,422.4 L442.9,422.4 
+		L444.2,422.4 L445.5,422.4 L446.7,422.4 L448.0,422.4 L449.2,422.4 L450.5,422.4 L451.7,422.4 L453.0,422.4 
+		L454.3,422.4 L455.5,422.4 L456.8,422.4 L458.0,422.4 L459.3,422.4 L460.5,422.4 L461.8,422.4 L463.1,422.4 
+		L464.3,422.4 L465.6,422.4 L466.8,422.4 L468.1,422.4 L469.3,422.4 L470.6,422.4 L471.9,422.4 L473.1,422.4 
+		L474.4,422.4 L475.6,422.4 L476.9,422.4 L478.2,422.4 L479.4,422.4 L480.7,422.4 L481.9,422.4 L483.2,422.4 
+		L484.4,422.4 L485.7,422.4 L487.0,422.4 L488.2,422.4 L489.5,422.4 L490.7,422.4 L492.0,422.4 L493.2,422.4 
+		L494.5,422.4 L495.8,422.4 L497.0,422.4 L498.3,422.4 L499.5,422.4 L500.8,422.4 L502.1,422.4 L503.3,422.4 
+		L504.6,422.4 L505.8,422.4 L507.1,422.4 L508.3,422.4 L509.6,422.4 L510.9,422.4 L512.1,422.4 L513.4,422.4 
+		L514.6,422.4 L515.9,422.4 L517.1,422.4 L518.4,422.4 L519.7,422.4 L520.9,422.4 L522.2,422.4 L523.4,422.4 
+		L524.7,422.4 L525.9,422.4 L527.2,422.4 L528.5,422.4 L529.7,422.4 L531.0,422.4 L532.2,422.4 L533.5,422.4 
+		L534.8,422.4 L536.0,422.4 L537.3,422.4 L538.5,422.4 L539.8,422.4 L541.0,422.4 L542.3,422.4 L543.6,422.4 
+		L544.8,422.4 L546.1,422.4 L547.3,422.4 L548.6,422.4 L549.8,422.4 L551.1,422.4 L552.4,422.4 L553.6,422.4 
+		L554.9,422.4 L556.1,422.4 L557.4,422.4 L558.6,422.4 L559.9,422.4 L561.2,422.4 L562.4,422.4 L563.7,422.4 
+		L564.9,422.4 L566.2,422.4 L567.5,422.4 L568.7,422.4 L570.0,422.4 L571.2,422.4 L572.5,422.4 L573.7,422.4 
+		L575.0,422.4 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.25.dat b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.25.dat
new file mode 100644
index 0000000..a688111
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.25.dat
@@ -0,0 +1,413 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000000
+0.020000	0.000000
+0.030000	0.000000
+0.040000	0.000000
+0.050000	0.000000
+0.060000	0.000000
+0.070000	0.000000
+0.080000	0.000000
+0.090000	0.000000
+0.100000	0.000000
+0.110000	0.000000
+0.120000	0.000000
+0.130000	0.000000
+0.140000	0.000000
+0.150000	0.000000
+0.160000	0.000000
+0.170000	0.000000
+0.180000	0.000000
+0.190000	0.000000
+0.200000	0.000000
+0.210000	0.000000
+0.220000	0.000000
+0.230000	0.000000
+0.240000	0.000001
+0.250000	0.000001
+0.260000	0.000003
+0.270000	0.000007
+0.280000	0.000013
+0.290000	0.000026
+0.300000	0.000049
+0.310000	0.000088
+0.320000	0.000154
+0.330000	0.000259
+0.340000	0.000425
+0.350000	0.000676
+0.360000	0.001048
+0.370000	0.001586
+0.380000	0.002347
+0.390000	0.003400
+0.400000	0.004829
+0.410000	0.006734
+0.420000	0.009227
+0.430000	0.012439
+0.440000	0.016511
+0.450000	0.021600
+0.460000	0.027873
+0.470000	0.035505
+0.480000	0.044674
+0.490000	0.055563
+0.500000	0.068349
+0.510000	0.083205
+0.520000	0.100291
+0.530000	0.119752
+0.540000	0.141714
+0.550000	0.166280
+0.560000	0.193526
+0.570000	0.223499
+0.580000	0.256215
+0.590000	0.291656
+0.600000	0.329770
+0.610000	0.370472
+0.620000	0.413642
+0.630000	0.459130
+0.640000	0.506752
+0.650000	0.556297
+0.660000	0.607530
+0.670000	0.660192
+0.680000	0.714004
+0.690000	0.768675
+0.700000	0.823901
+0.710000	0.879369
+0.720000	0.934766
+0.730000	0.989776
+0.740000	1.044091
+0.750000	1.097407
+0.760000	1.149432
+0.770000	1.199888
+0.780000	1.248512
+0.790000	1.295061
+0.800000	1.339311
+0.810000	1.381058
+0.820000	1.420125
+0.830000	1.456354
+0.840000	1.489613
+0.850000	1.519795
+0.860000	1.546816
+0.870000	1.570614
+0.880000	1.591152
+0.890000	1.608414
+0.900000	1.622405
+0.910000	1.633150
+0.920000	1.640691
+0.930000	1.645089
+0.940000	1.646419
+0.950000	1.644771
+0.960000	1.640246
+0.970000	1.632958
+0.980000	1.623028
+0.990000	1.610586
+1.000000	1.595769
+1.010000	1.578718
+1.020000	1.559579
+1.030000	1.538499
+1.040000	1.515627
+1.050000	1.491112
+1.060000	1.465102
+1.070000	1.437745
+1.080000	1.409184
+1.090000	1.379561
+1.100000	1.349013
+1.110000	1.317674
+1.120000	1.285670
+1.130000	1.253126
+1.140000	1.220158
+1.150000	1.186878
+1.160000	1.153393
+1.170000	1.119801
+1.180000	1.086195
+1.190000	1.052664
+1.200000	1.019289
+1.210000	0.986143
+1.220000	0.953297
+1.230000	0.920814
+1.240000	0.888750
+1.250000	0.857159
+1.260000	0.826086
+1.270000	0.795572
+1.280000	0.765655
+1.290000	0.736366
+1.300000	0.707733
+1.310000	0.679778
+1.320000	0.652522
+1.330000	0.625978
+1.340000	0.600161
+1.350000	0.575077
+1.360000	0.550734
+1.370000	0.527134
+1.380000	0.504277
+1.390000	0.482162
+1.400000	0.460784
+1.410000	0.440139
+1.420000	0.420217
+1.430000	0.401011
+1.440000	0.382509
+1.450000	0.364699
+1.460000	0.347568
+1.470000	0.331104
+1.480000	0.315290
+1.490000	0.300112
+1.500000	0.285554
+1.510000	0.271599
+1.520000	0.258231
+1.530000	0.245433
+1.540000	0.233187
+1.550000	0.221477
+1.560000	0.210285
+1.570000	0.199593
+1.580000	0.189386
+1.590000	0.179645
+1.600000	0.170354
+1.610000	0.161497
+1.620000	0.153056
+1.630000	0.145017
+1.640000	0.137362
+1.650000	0.130077
+1.660000	0.123147
+1.670000	0.116557
+1.680000	0.110293
+1.690000	0.104341
+1.700000	0.098687
+1.710000	0.093318
+1.720000	0.088222
+1.730000	0.083387
+1.740000	0.078800
+1.750000	0.074451
+1.760000	0.070327
+1.770000	0.066419
+1.780000	0.062717
+1.790000	0.059210
+1.800000	0.055890
+1.810000	0.052746
+1.820000	0.049771
+1.830000	0.046956
+1.840000	0.044293
+1.850000	0.041775
+1.860000	0.039394
+1.870000	0.037143
+1.880000	0.035016
+1.890000	0.033006
+1.900000	0.031107
+1.910000	0.029314
+1.920000	0.027621
+1.930000	0.026022
+1.940000	0.024512
+1.950000	0.023088
+1.960000	0.021744
+1.970000	0.020476
+1.980000	0.019280
+1.990000	0.018151
+2.000000	0.017087
+2.010000	0.016084
+2.020000	0.015139
+2.030000	0.014247
+2.040000	0.013407
+2.050000	0.012615
+2.060000	0.011870
+2.070000	0.011167
+2.080000	0.010505
+2.090000	0.009881
+2.100000	0.009294
+2.110000	0.008741
+2.120000	0.008221
+2.130000	0.007731
+2.140000	0.007270
+2.150000	0.006835
+2.160000	0.006427
+2.170000	0.006042
+2.180000	0.005680
+2.190000	0.005340
+2.200000	0.005020
+2.210000	0.004718
+2.220000	0.004435
+2.230000	0.004168
+2.240000	0.003917
+2.250000	0.003681
+2.260000	0.003460
+2.270000	0.003251
+2.280000	0.003055
+2.290000	0.002871
+2.300000	0.002697
+2.310000	0.002534
+2.320000	0.002381
+2.330000	0.002237
+2.340000	0.002102
+2.350000	0.001975
+2.360000	0.001855
+2.370000	0.001743
+2.380000	0.001637
+2.390000	0.001538
+2.400000	0.001445
+2.410000	0.001357
+2.420000	0.001275
+2.430000	0.001198
+2.440000	0.001125
+2.450000	0.001057
+2.460000	0.000993
+2.470000	0.000932
+2.480000	0.000876
+2.490000	0.000823
+2.500000	0.000773
+2.510000	0.000726
+2.520000	0.000682
+2.530000	0.000640
+2.540000	0.000601
+2.550000	0.000565
+2.560000	0.000531
+2.570000	0.000498
+2.580000	0.000468
+2.590000	0.000440
+2.600000	0.000413
+2.610000	0.000388
+2.620000	0.000364
+2.630000	0.000342
+2.640000	0.000321
+2.650000	0.000302
+2.660000	0.000284
+2.670000	0.000266
+2.680000	0.000250
+2.690000	0.000235
+2.700000	0.000221
+2.710000	0.000207
+2.720000	0.000195
+2.730000	0.000183
+2.740000	0.000172
+2.750000	0.000162
+2.760000	0.000152
+2.770000	0.000143
+2.780000	0.000134
+2.790000	0.000126
+2.800000	0.000118
+2.810000	0.000111
+2.820000	0.000104
+2.830000	0.000098
+2.840000	0.000092
+2.850000	0.000087
+2.860000	0.000081
+2.870000	0.000076
+2.880000	0.000072
+2.890000	0.000067
+2.900000	0.000063
+2.910000	0.000060
+2.920000	0.000056
+2.930000	0.000053
+2.940000	0.000049
+2.950000	0.000046
+2.960000	0.000044
+2.970000	0.000041
+2.980000	0.000039
+2.990000	0.000036
+3.000000	0.000034
+3.010000	0.000032
+3.020000	0.000030
+3.030000	0.000028
+3.040000	0.000027
+3.050000	0.000025
+3.060000	0.000024
+3.070000	0.000022
+3.080000	0.000021
+3.090000	0.000020
+3.100000	0.000018
+3.110000	0.000017
+3.120000	0.000016
+3.130000	0.000015
+3.140000	0.000014
+3.150000	0.000014
+3.160000	0.000013
+3.170000	0.000012
+3.180000	0.000011
+3.190000	0.000011
+3.200000	0.000010
+3.210000	0.000009
+3.220000	0.000009
+3.230000	0.000008
+3.240000	0.000008
+3.250000	0.000007
+3.260000	0.000007
+3.270000	0.000006
+3.280000	0.000006
+3.290000	0.000006
+3.300000	0.000005
+3.310000	0.000005
+3.320000	0.000005
+3.330000	0.000004
+3.340000	0.000004
+3.350000	0.000004
+3.360000	0.000004
+3.370000	0.000004
+3.380000	0.000003
+3.390000	0.000003
+3.400000	0.000003
+3.410000	0.000003
+3.420000	0.000003
+3.430000	0.000002
+3.440000	0.000002
+3.450000	0.000002
+3.460000	0.000002
+3.470000	0.000002
+3.480000	0.000002
+3.490000	0.000002
+3.500000	0.000002
+3.510000	0.000002
+3.520000	0.000001
+3.530000	0.000001
+3.540000	0.000001
+3.550000	0.000001
+3.560000	0.000001
+3.570000	0.000001
+3.580000	0.000001
+3.590000	0.000001
+3.600000	0.000001
+3.610000	0.000001
+3.620000	0.000001
+3.630000	0.000001
+3.640000	0.000001
+3.650000	0.000001
+3.660000	0.000001
+3.670000	0.000001
+3.680000	0.000001
+3.690000	0.000001
+3.700000	0.000000
+3.710000	0.000000
+3.720000	0.000000
+3.730000	0.000000
+3.740000	0.000000
+3.750000	0.000000
+3.760000	0.000000
+3.770000	0.000000
+3.780000	0.000000
+3.790000	0.000000
+3.800000	0.000000
+3.810000	0.000000
+3.820000	0.000000
+3.830000	0.000000
+3.840000	0.000000
+3.850000	0.000000
+3.860000	0.000000
+3.870000	0.000000
+3.880000	0.000000
+3.890000	0.000000
+3.900000	0.000000
+3.910000	0.000000
+3.920000	0.000000
+3.930000	0.000000
+3.940000	0.000000
+3.950000	0.000000
+3.960000	0.000000
+3.970000	0.000000
+3.980000	0.000000
+3.990000	0.000000
+4.000000	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.5.dat b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.5.dat
new file mode 100644
index 0000000..25387a4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_0.5.dat
@@ -0,0 +1,413 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000000
+0.020000	0.000000
+0.030000	0.000000
+0.040000	0.000000
+0.050000	0.000000
+0.060000	0.000002
+0.070000	0.000008
+0.080000	0.000029
+0.090000	0.000082
+0.100000	0.000198
+0.110000	0.000425
+0.120000	0.000828
+0.130000	0.001488
+0.140000	0.002501
+0.150000	0.003979
+0.160000	0.006037
+0.170000	0.008796
+0.180000	0.012375
+0.190000	0.016889
+0.200000	0.022439
+0.210000	0.029118
+0.220000	0.037000
+0.230000	0.046143
+0.240000	0.056586
+0.250000	0.068349
+0.260000	0.081436
+0.270000	0.095831
+0.280000	0.111502
+0.290000	0.128403
+0.300000	0.146472
+0.310000	0.165639
+0.320000	0.185820
+0.330000	0.206926
+0.340000	0.228861
+0.350000	0.251523
+0.360000	0.274808
+0.370000	0.298611
+0.380000	0.322825
+0.390000	0.347345
+0.400000	0.372068
+0.410000	0.396893
+0.420000	0.421724
+0.430000	0.446466
+0.440000	0.471032
+0.450000	0.495339
+0.460000	0.519309
+0.470000	0.542869
+0.480000	0.565953
+0.490000	0.588500
+0.500000	0.610455
+0.510000	0.631768
+0.520000	0.652395
+0.530000	0.672298
+0.540000	0.691442
+0.550000	0.709800
+0.560000	0.727347
+0.570000	0.744064
+0.580000	0.759937
+0.590000	0.774954
+0.600000	0.789109
+0.610000	0.802396
+0.620000	0.814817
+0.630000	0.826373
+0.640000	0.837069
+0.650000	0.846914
+0.660000	0.855917
+0.670000	0.864090
+0.680000	0.871447
+0.690000	0.878004
+0.700000	0.883777
+0.710000	0.888785
+0.720000	0.893046
+0.730000	0.896581
+0.740000	0.899411
+0.750000	0.901558
+0.760000	0.903042
+0.770000	0.903888
+0.780000	0.904117
+0.790000	0.903753
+0.800000	0.902818
+0.810000	0.901336
+0.820000	0.899329
+0.830000	0.896821
+0.840000	0.893833
+0.850000	0.890389
+0.860000	0.886509
+0.870000	0.882217
+0.880000	0.877533
+0.890000	0.872478
+0.900000	0.867073
+0.910000	0.861337
+0.920000	0.855290
+0.930000	0.848951
+0.940000	0.842339
+0.950000	0.835471
+0.960000	0.828364
+0.970000	0.821037
+0.980000	0.813504
+0.990000	0.805781
+1.000000	0.797885
+1.010000	0.789828
+1.020000	0.781627
+1.030000	0.773293
+1.040000	0.764840
+1.050000	0.756281
+1.060000	0.747627
+1.070000	0.738891
+1.080000	0.730082
+1.090000	0.721212
+1.100000	0.712290
+1.110000	0.703327
+1.120000	0.694331
+1.130000	0.685310
+1.140000	0.676274
+1.150000	0.667230
+1.160000	0.658186
+1.170000	0.649147
+1.180000	0.640122
+1.190000	0.631117
+1.200000	0.622137
+1.210000	0.613188
+1.220000	0.604275
+1.230000	0.595404
+1.240000	0.586579
+1.250000	0.577804
+1.260000	0.569083
+1.270000	0.560421
+1.280000	0.551821
+1.290000	0.543286
+1.300000	0.534820
+1.310000	0.526424
+1.320000	0.518103
+1.330000	0.509857
+1.340000	0.501690
+1.350000	0.493604
+1.360000	0.485600
+1.370000	0.477680
+1.380000	0.469846
+1.390000	0.462099
+1.400000	0.454439
+1.410000	0.446869
+1.420000	0.439390
+1.430000	0.432001
+1.440000	0.424704
+1.450000	0.417499
+1.460000	0.410386
+1.470000	0.403367
+1.480000	0.396441
+1.490000	0.389609
+1.500000	0.382870
+1.510000	0.376224
+1.520000	0.369672
+1.530000	0.363214
+1.540000	0.356848
+1.550000	0.350575
+1.560000	0.344394
+1.570000	0.338306
+1.580000	0.332309
+1.590000	0.326403
+1.600000	0.320587
+1.610000	0.314861
+1.620000	0.309225
+1.630000	0.303677
+1.640000	0.298216
+1.650000	0.292843
+1.660000	0.287556
+1.670000	0.282355
+1.680000	0.277238
+1.690000	0.272205
+1.700000	0.267255
+1.710000	0.262387
+1.720000	0.257600
+1.730000	0.252893
+1.740000	0.248266
+1.750000	0.243717
+1.760000	0.239246
+1.770000	0.234850
+1.780000	0.230531
+1.790000	0.226286
+1.800000	0.222114
+1.810000	0.218015
+1.820000	0.213987
+1.830000	0.210030
+1.840000	0.206143
+1.850000	0.202324
+1.860000	0.198573
+1.870000	0.194889
+1.880000	0.191270
+1.890000	0.187715
+1.900000	0.184225
+1.910000	0.180797
+1.920000	0.177431
+1.930000	0.174126
+1.940000	0.170881
+1.950000	0.167694
+1.960000	0.164566
+1.970000	0.161495
+1.980000	0.158479
+1.990000	0.155519
+2.000000	0.152614
+2.010000	0.149762
+2.020000	0.146962
+2.030000	0.144214
+2.040000	0.141517
+2.050000	0.138870
+2.060000	0.136272
+2.070000	0.133722
+2.080000	0.131219
+2.090000	0.128764
+2.100000	0.126354
+2.110000	0.123989
+2.120000	0.121668
+2.130000	0.119391
+2.140000	0.117156
+2.150000	0.114963
+2.160000	0.112812
+2.170000	0.110701
+2.180000	0.108630
+2.190000	0.106597
+2.200000	0.104603
+2.210000	0.102647
+2.220000	0.100728
+2.230000	0.098845
+2.240000	0.096997
+2.250000	0.095185
+2.260000	0.093406
+2.270000	0.091662
+2.280000	0.089950
+2.290000	0.088271
+2.300000	0.086624
+2.310000	0.085008
+2.320000	0.083423
+2.330000	0.081868
+2.340000	0.080343
+2.350000	0.078846
+2.360000	0.077378
+2.370000	0.075938
+2.380000	0.074525
+2.390000	0.073139
+2.400000	0.071780
+2.410000	0.070446
+2.420000	0.069138
+2.430000	0.067855
+2.440000	0.066596
+2.450000	0.065361
+2.460000	0.064150
+2.470000	0.062962
+2.480000	0.061796
+2.490000	0.060653
+2.500000	0.059531
+2.510000	0.058431
+2.520000	0.057351
+2.530000	0.056293
+2.540000	0.055254
+2.550000	0.054235
+2.560000	0.053236
+2.570000	0.052255
+2.580000	0.051294
+2.590000	0.050350
+2.600000	0.049425
+2.610000	0.048517
+2.620000	0.047626
+2.630000	0.046752
+2.640000	0.045895
+2.650000	0.045054
+2.660000	0.044230
+2.670000	0.043420
+2.680000	0.042627
+2.690000	0.041848
+2.700000	0.041084
+2.710000	0.040334
+2.720000	0.039599
+2.730000	0.038878
+2.740000	0.038170
+2.750000	0.037476
+2.760000	0.036794
+2.770000	0.036126
+2.780000	0.035470
+2.790000	0.034827
+2.800000	0.034196
+2.810000	0.033577
+2.820000	0.032969
+2.830000	0.032373
+2.840000	0.031789
+2.850000	0.031215
+2.860000	0.030652
+2.870000	0.030099
+2.880000	0.029557
+2.890000	0.029026
+2.900000	0.028504
+2.910000	0.027992
+2.920000	0.027489
+2.930000	0.026996
+2.940000	0.026513
+2.950000	0.026038
+2.960000	0.025572
+2.970000	0.025115
+2.980000	0.024667
+2.990000	0.024226
+3.000000	0.023794
+3.010000	0.023371
+3.020000	0.022955
+3.030000	0.022546
+3.040000	0.022146
+3.050000	0.021753
+3.060000	0.021367
+3.070000	0.020988
+3.080000	0.020617
+3.090000	0.020252
+3.100000	0.019894
+3.110000	0.019543
+3.120000	0.019198
+3.130000	0.018860
+3.140000	0.018527
+3.150000	0.018201
+3.160000	0.017881
+3.170000	0.017567
+3.180000	0.017259
+3.190000	0.016956
+3.200000	0.016659
+3.210000	0.016368
+3.220000	0.016082
+3.230000	0.015801
+3.240000	0.015525
+3.250000	0.015254
+3.260000	0.014988
+3.270000	0.014728
+3.280000	0.014471
+3.290000	0.014220
+3.300000	0.013973
+3.310000	0.013731
+3.320000	0.013493
+3.330000	0.013259
+3.340000	0.013030
+3.350000	0.012805
+3.360000	0.012584
+3.370000	0.012367
+3.380000	0.012154
+3.390000	0.011945
+3.400000	0.011739
+3.410000	0.011538
+3.420000	0.011339
+3.430000	0.011145
+3.440000	0.010954
+3.450000	0.010767
+3.460000	0.010582
+3.470000	0.010402
+3.480000	0.010224
+3.490000	0.010050
+3.500000	0.009879
+3.510000	0.009710
+3.520000	0.009545
+3.530000	0.009383
+3.540000	0.009224
+3.550000	0.009068
+3.560000	0.008914
+3.570000	0.008763
+3.580000	0.008615
+3.590000	0.008469
+3.600000	0.008327
+3.610000	0.008186
+3.620000	0.008048
+3.630000	0.007913
+3.640000	0.007780
+3.650000	0.007649
+3.660000	0.007521
+3.670000	0.007395
+3.680000	0.007271
+3.690000	0.007149
+3.700000	0.007030
+3.710000	0.006912
+3.720000	0.006797
+3.730000	0.006684
+3.740000	0.006573
+3.750000	0.006463
+3.760000	0.006356
+3.770000	0.006250
+3.780000	0.006147
+3.790000	0.006045
+3.800000	0.005945
+3.810000	0.005846
+3.820000	0.005750
+3.830000	0.005655
+3.840000	0.005562
+3.850000	0.005470
+3.860000	0.005380
+3.870000	0.005292
+3.880000	0.005205
+3.890000	0.005119
+3.900000	0.005035
+3.910000	0.004953
+3.920000	0.004872
+3.930000	0.004792
+3.940000	0.004714
+3.950000	0.004637
+3.960000	0.004561
+3.970000	0.004487
+3.980000	0.004414
+3.990000	0.004342
+4.000000	0.004272
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_1.0.dat
new file mode 100644
index 0000000..b43e074
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/lognormal_0.0_1.0.dat
@@ -0,0 +1,413 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000990
+0.020000	0.009477
+0.030000	0.028429
+0.040000	0.056099
+0.050000	0.089778
+0.060000	0.127051
+0.070000	0.166043
+0.080000	0.205386
+0.090000	0.244120
+0.100000	0.281590
+0.110000	0.317367
+0.120000	0.351188
+0.130000	0.382905
+0.140000	0.412456
+0.150000	0.439837
+0.160000	0.465085
+0.170000	0.488265
+0.180000	0.509458
+0.190000	0.528760
+0.200000	0.546268
+0.210000	0.562085
+0.220000	0.576314
+0.230000	0.589055
+0.240000	0.600404
+0.250000	0.610455
+0.260000	0.619298
+0.270000	0.627017
+0.280000	0.633691
+0.290000	0.639396
+0.300000	0.644203
+0.310000	0.648178
+0.320000	0.651382
+0.330000	0.653873
+0.340000	0.655705
+0.350000	0.656929
+0.360000	0.657590
+0.370000	0.657734
+0.380000	0.657399
+0.390000	0.656624
+0.400000	0.655444
+0.410000	0.653891
+0.420000	0.651996
+0.430000	0.649787
+0.440000	0.647289
+0.450000	0.644527
+0.460000	0.641524
+0.470000	0.638301
+0.480000	0.634877
+0.490000	0.631269
+0.500000	0.627496
+0.510000	0.623572
+0.520000	0.619513
+0.530000	0.615331
+0.540000	0.611039
+0.550000	0.606648
+0.560000	0.602170
+0.570000	0.597615
+0.580000	0.592992
+0.590000	0.588308
+0.600000	0.583574
+0.610000	0.578795
+0.620000	0.573979
+0.630000	0.569133
+0.640000	0.564261
+0.650000	0.559371
+0.660000	0.554466
+0.670000	0.549552
+0.680000	0.544633
+0.690000	0.539712
+0.700000	0.534795
+0.710000	0.529884
+0.720000	0.524982
+0.730000	0.520092
+0.740000	0.515218
+0.750000	0.510361
+0.760000	0.505524
+0.770000	0.500709
+0.780000	0.495918
+0.790000	0.491153
+0.800000	0.486416
+0.810000	0.481707
+0.820000	0.477029
+0.830000	0.472382
+0.840000	0.467767
+0.850000	0.463186
+0.860000	0.458640
+0.870000	0.454129
+0.880000	0.449654
+0.890000	0.445216
+0.900000	0.440816
+0.910000	0.436453
+0.920000	0.432128
+0.930000	0.427842
+0.940000	0.423595
+0.950000	0.419387
+0.960000	0.415219
+0.970000	0.411090
+0.980000	0.407001
+0.990000	0.402952
+1.000000	0.398942
+1.010000	0.394973
+1.020000	0.391043
+1.030000	0.387153
+1.040000	0.383303
+1.050000	0.379493
+1.060000	0.375722
+1.070000	0.371991
+1.080000	0.368299
+1.090000	0.364646
+1.100000	0.361031
+1.110000	0.357456
+1.120000	0.353918
+1.130000	0.350419
+1.140000	0.346958
+1.150000	0.343535
+1.160000	0.340149
+1.170000	0.336800
+1.180000	0.333487
+1.190000	0.330212
+1.200000	0.326972
+1.210000	0.323768
+1.220000	0.320600
+1.230000	0.317467
+1.240000	0.314369
+1.250000	0.311306
+1.260000	0.308277
+1.270000	0.305282
+1.280000	0.302320
+1.290000	0.299392
+1.300000	0.296496
+1.310000	0.293633
+1.320000	0.290803
+1.330000	0.288004
+1.340000	0.285237
+1.350000	0.282501
+1.360000	0.279795
+1.370000	0.277121
+1.380000	0.274476
+1.390000	0.271861
+1.400000	0.269276
+1.410000	0.266720
+1.420000	0.264193
+1.430000	0.261694
+1.440000	0.259224
+1.450000	0.256781
+1.460000	0.254366
+1.470000	0.251978
+1.480000	0.249617
+1.490000	0.247282
+1.500000	0.244974
+1.510000	0.242691
+1.520000	0.240434
+1.530000	0.238203
+1.540000	0.235996
+1.550000	0.233815
+1.560000	0.231657
+1.570000	0.229524
+1.580000	0.227414
+1.590000	0.225328
+1.600000	0.223265
+1.610000	0.221226
+1.620000	0.219208
+1.630000	0.217214
+1.640000	0.215241
+1.650000	0.213290
+1.660000	0.211361
+1.670000	0.209453
+1.680000	0.207566
+1.690000	0.205700
+1.700000	0.203854
+1.710000	0.202029
+1.720000	0.200224
+1.730000	0.198438
+1.740000	0.196672
+1.750000	0.194925
+1.760000	0.193198
+1.770000	0.191489
+1.780000	0.189798
+1.790000	0.188126
+1.800000	0.186472
+1.810000	0.184836
+1.820000	0.183218
+1.830000	0.181617
+1.840000	0.180034
+1.850000	0.178467
+1.860000	0.176917
+1.870000	0.175384
+1.880000	0.173867
+1.890000	0.172367
+1.900000	0.170882
+1.910000	0.169413
+1.920000	0.167960
+1.930000	0.166523
+1.940000	0.165100
+1.950000	0.163692
+1.960000	0.162300
+1.970000	0.160922
+1.980000	0.159558
+1.990000	0.158209
+2.000000	0.156874
+2.010000	0.155553
+2.020000	0.154246
+2.030000	0.152952
+2.040000	0.151672
+2.050000	0.150405
+2.060000	0.149151
+2.070000	0.147910
+2.080000	0.146682
+2.090000	0.145467
+2.100000	0.144264
+2.110000	0.143073
+2.120000	0.141895
+2.130000	0.140729
+2.140000	0.139574
+2.150000	0.138432
+2.160000	0.137301
+2.170000	0.136181
+2.180000	0.135073
+2.190000	0.133976
+2.200000	0.132891
+2.210000	0.131816
+2.220000	0.130752
+2.230000	0.129698
+2.240000	0.128656
+2.250000	0.127623
+2.260000	0.126601
+2.270000	0.125589
+2.280000	0.124588
+2.290000	0.123596
+2.300000	0.122614
+2.310000	0.121641
+2.320000	0.120679
+2.330000	0.119726
+2.340000	0.118782
+2.350000	0.117847
+2.360000	0.116922
+2.370000	0.116005
+2.380000	0.115098
+2.390000	0.114200
+2.400000	0.113310
+2.410000	0.112429
+2.420000	0.111556
+2.430000	0.110692
+2.440000	0.109836
+2.450000	0.108988
+2.460000	0.108149
+2.470000	0.107318
+2.480000	0.106494
+2.490000	0.105679
+2.500000	0.104871
+2.510000	0.104071
+2.520000	0.103279
+2.530000	0.102494
+2.540000	0.101716
+2.550000	0.100946
+2.560000	0.100183
+2.570000	0.099428
+2.580000	0.098679
+2.590000	0.097938
+2.600000	0.097203
+2.610000	0.096476
+2.620000	0.095755
+2.630000	0.095041
+2.640000	0.094333
+2.650000	0.093632
+2.660000	0.092938
+2.670000	0.092250
+2.680000	0.091568
+2.690000	0.090893
+2.700000	0.090224
+2.710000	0.089561
+2.720000	0.088904
+2.730000	0.088253
+2.740000	0.087608
+2.750000	0.086969
+2.760000	0.086335
+2.770000	0.085708
+2.780000	0.085086
+2.790000	0.084470
+2.800000	0.083859
+2.810000	0.083254
+2.820000	0.082654
+2.830000	0.082060
+2.840000	0.081471
+2.850000	0.080887
+2.860000	0.080309
+2.870000	0.079736
+2.880000	0.079168
+2.890000	0.078604
+2.900000	0.078046
+2.910000	0.077493
+2.920000	0.076945
+2.930000	0.076401
+2.940000	0.075863
+2.950000	0.075329
+2.960000	0.074799
+2.970000	0.074275
+2.980000	0.073755
+2.990000	0.073239
+3.000000	0.072728
+3.010000	0.072222
+3.020000	0.071720
+3.030000	0.071222
+3.040000	0.070728
+3.050000	0.070239
+3.060000	0.069754
+3.070000	0.069273
+3.080000	0.068797
+3.090000	0.068324
+3.100000	0.067855
+3.110000	0.067391
+3.120000	0.066930
+3.130000	0.066474
+3.140000	0.066021
+3.150000	0.065572
+3.160000	0.065127
+3.170000	0.064685
+3.180000	0.064248
+3.190000	0.063814
+3.200000	0.063384
+3.210000	0.062957
+3.220000	0.062534
+3.230000	0.062114
+3.240000	0.061698
+3.250000	0.061286
+3.260000	0.060877
+3.270000	0.060471
+3.280000	0.060069
+3.290000	0.059670
+3.300000	0.059274
+3.310000	0.058881
+3.320000	0.058492
+3.330000	0.058106
+3.340000	0.057723
+3.350000	0.057344
+3.360000	0.056967
+3.370000	0.056594
+3.380000	0.056223
+3.390000	0.055856
+3.400000	0.055491
+3.410000	0.055130
+3.420000	0.054771
+3.430000	0.054416
+3.440000	0.054063
+3.450000	0.053713
+3.460000	0.053366
+3.470000	0.053022
+3.480000	0.052680
+3.490000	0.052341
+3.500000	0.052005
+3.510000	0.051672
+3.520000	0.051341
+3.530000	0.051013
+3.540000	0.050688
+3.550000	0.050365
+3.560000	0.050044
+3.570000	0.049727
+3.580000	0.049411
+3.590000	0.049098
+3.600000	0.048788
+3.610000	0.048480
+3.620000	0.048175
+3.630000	0.047872
+3.640000	0.047571
+3.650000	0.047273
+3.660000	0.046977
+3.670000	0.046683
+3.680000	0.046391
+3.690000	0.046102
+3.700000	0.045815
+3.710000	0.045531
+3.720000	0.045248
+3.730000	0.044968
+3.740000	0.044689
+3.750000	0.044413
+3.760000	0.044139
+3.770000	0.043868
+3.780000	0.043598
+3.790000	0.043330
+3.800000	0.043065
+3.810000	0.042801
+3.820000	0.042539
+3.830000	0.042280
+3.840000	0.042022
+3.850000	0.041766
+3.860000	0.041513
+3.870000	0.041261
+3.880000	0.041011
+3.890000	0.040763
+3.900000	0.040517
+3.910000	0.040272
+3.920000	0.040030
+3.930000	0.039789
+3.940000	0.039550
+3.950000	0.039313
+3.960000	0.039078
+3.970000	0.038844
+3.980000	0.038612
+3.990000	0.038382
+4.000000	0.038153
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/normal.plt b/v0.1-M1/chi/reference-manual/distribution_plots/normal.plt
new file mode 100644
index 0000000..84524ad
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/normal.plt
@@ -0,0 +1,27 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+set xrange [0:10]
+set yrange [0:0.5]
+set xlabel "x"
+set ylabel "normal(real m, v2)"
+#set samples 2000
+set output "normal.svg"
+set nokey
+set label "normal(3.0, 1.0)" at 4.2, 0.25
+set label "normal(5.0, 2.0)" at 6.5, 0.17
+set style data lines
+plot "normal_3_1.dat" using 1:2 linetype 1, \
+     "normal_5_2.dat" using 1:2 linetype 2
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/normal.svg b/v0.1-M1/chi/reference-manual/distribution_plots/normal.svg
new file mode 100644
index 0000000..e494812
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/normal.svg
@@ -0,0 +1,369 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,341.3 L80.9,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(63.6,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M71.9,260.1 L80.9,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(63.6,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,179.0 L80.9,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(63.6,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.3</text>
+	</g>
+	<path  d='M71.9,97.8 L80.9,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(63.6,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M172.5,422.4 L172.5,413.4 M172.5,16.7 L172.5,25.7 '></path>
+	<g transform="translate(172.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M273.1,422.4 L273.1,413.4 M273.1,16.7 L273.1,25.7 '></path>
+	<g transform="translate(273.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M373.8,422.4 L373.8,413.4 M373.8,16.7 L373.8,25.7 '></path>
+	<g transform="translate(373.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 6</text>
+	</g>
+	<path  d='M474.4,422.4 L474.4,413.4 M474.4,16.7 L474.4,25.7 '></path>
+	<g transform="translate(474.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 8</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 10</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>normal(real m, v2)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(283.2,224.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>normal(3.0, 1.0)</text>
+	</g>
+	<g transform="translate(398.9,289.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>normal(5.0, 2.0)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,418.8 L72.4,418.7 L72.9,418.6 L73.4,418.5 L73.9,418.3 L74.4,418.2 L74.9,418.1 L75.4,418.0 
+		L75.9,417.8 L76.4,417.7 L76.9,417.6 L77.4,417.4 L77.9,417.3 L78.4,417.1 L78.9,417.0 L79.4,416.8 
+		L79.9,416.7 L80.5,416.5 L81.0,416.3 L81.5,416.2 L82.0,416.0 L82.5,415.8 L83.0,415.6 L83.5,415.4 
+		L84.0,415.2 L84.5,415.0 L85.0,414.8 L85.5,414.6 L86.0,414.4 L86.5,414.2 L87.0,413.9 L87.5,413.7 
+		L88.0,413.5 L88.5,413.2 L89.0,413.0 L89.5,412.7 L90.0,412.5 L90.5,412.2 L91.0,411.9 L91.5,411.7 
+		L92.0,411.4 L92.5,411.1 L93.0,410.8 L93.5,410.5 L94.0,410.2 L94.5,409.9 L95.0,409.5 L95.5,409.2 
+		L96.0,408.9 L96.6,408.5 L97.1,408.2 L97.6,407.8 L98.1,407.5 L98.6,407.1 L99.1,406.7 L99.6,406.3 
+		L100.1,405.9 L100.6,405.5 L101.1,405.1 L101.6,404.7 L102.1,404.2 L102.6,403.8 L103.1,403.3 L103.6,402.9 
+		L104.1,402.4 L104.6,401.9 L105.1,401.5 L105.6,401.0 L106.1,400.5 L106.6,399.9 L107.1,399.4 L107.6,398.9 
+		L108.1,398.3 L108.6,397.8 L109.1,397.2 L109.6,396.6 L110.1,396.1 L110.6,395.5 L111.1,394.9 L111.6,394.2 
+		L112.1,393.6 L112.7,393.0 L113.2,392.3 L113.7,391.7 L114.2,391.0 L114.7,390.3 L115.2,389.6 L115.7,388.9 
+		L116.2,388.2 L116.7,387.5 L117.2,386.7 L117.7,386.0 L118.2,385.2 L118.7,384.4 L119.2,383.6 L119.7,382.8 
+		L120.2,382.0 L120.7,381.2 L121.2,380.3 L121.7,379.5 L122.2,378.6 L122.7,377.7 L123.2,376.8 L123.7,375.9 
+		L124.2,375.0 L124.7,374.0 L125.2,373.1 L125.7,372.1 L126.2,371.2 L126.7,370.2 L127.2,369.2 L127.7,368.1 
+		L128.2,367.1 L128.8,366.1 L129.3,365.0 L129.8,363.9 L130.3,362.8 L130.8,361.7 L131.3,360.6 L131.8,359.5 
+		L132.3,358.3 L132.8,357.2 L133.3,356.0 L133.8,354.8 L134.3,353.6 L134.8,352.4 L135.3,351.2 L135.8,349.9 
+		L136.3,348.7 L136.8,347.4 L137.3,346.1 L137.8,344.8 L138.3,343.5 L138.8,342.1 L139.3,340.8 L139.8,339.4 
+		L140.3,338.0 L140.8,336.7 L141.3,335.3 L141.8,333.8 L142.3,332.4 L142.8,331.0 L143.3,329.5 L143.8,328.0 
+		L144.3,326.5 L144.8,325.0 L145.4,323.5 L145.9,322.0 L146.4,320.4 L146.9,318.9 L147.4,317.3 L147.9,315.7 
+		L148.4,314.1 L148.9,312.5 L149.4,310.9 L149.9,309.3 L150.4,307.6 L150.9,306.0 L151.4,304.3 L151.9,302.6 
+		L152.4,300.9 L152.9,299.2 L153.4,297.5 L153.9,295.8 L154.4,294.0 L154.9,292.3 L155.4,290.5 L155.9,288.7 
+		L156.4,286.9 L156.9,285.2 L157.4,283.4 L157.9,281.5 L158.4,279.7 L158.9,277.9 L159.4,276.0 L159.9,274.2 
+		L160.4,272.3 L160.9,270.5 L161.5,268.6 L162.0,266.7 L162.5,264.8 L163.0,262.9 L163.5,261.0 L164.0,259.1 
+		L164.5,257.2 L165.0,255.3 L165.5,253.4 L166.0,251.4 L166.5,249.5 L167.0,247.6 L167.5,245.6 L168.0,243.7 
+		L168.5,241.7 L169.0,239.8 L169.5,237.8 L170.0,235.9 L170.5,233.9 L171.0,232.0 L171.5,230.0 L172.0,228.0 
+		L172.5,226.1 L173.0,224.1 L173.5,222.1 L174.0,220.2 L174.5,218.2 L175.0,216.3 L175.5,214.3 L176.0,212.3 
+		L176.5,210.4 L177.0,208.4 L177.6,206.5 L178.1,204.6 L178.6,202.6 L179.1,200.7 L179.6,198.8 L180.1,196.8 
+		L180.6,194.9 L181.1,193.0 L181.6,191.1 L182.1,189.2 L182.6,187.3 L183.1,185.5 L183.6,183.6 L184.1,181.7 
+		L184.6,179.9 L185.1,178.1 L185.6,176.2 L186.1,174.4 L186.6,172.6 L187.1,170.8 L187.6,169.0 L188.1,167.3 
+		L188.6,165.5 L189.1,163.8 L189.6,162.1 L190.1,160.3 L190.6,158.6 L191.1,157.0 L191.6,155.3 L192.1,153.7 
+		L192.6,152.0 L193.1,150.4 L193.7,148.8 L194.2,147.2 L194.7,145.7 L195.2,144.1 L195.7,142.6 L196.2,141.1 
+		L196.7,139.6 L197.2,138.2 L197.7,136.7 L198.2,135.3 L198.7,133.9 L199.2,132.5 L199.7,131.2 L200.2,129.9 
+		L200.7,128.6 L201.2,127.3 L201.7,126.0 L202.2,124.8 L202.7,123.6 L203.2,122.4 L203.7,121.2 L204.2,120.1 
+		L204.7,119.0 L205.2,117.9 L205.7,116.9 L206.2,115.9 L206.7,114.9 L207.2,113.9 L207.7,112.9 L208.2,112.0 
+		L208.7,111.1 L209.2,110.3 L209.7,109.5 L210.3,108.7 L210.8,107.9 L211.3,107.1 L211.8,106.4 L212.3,105.8 
+		L212.8,105.1 L213.3,104.5 L213.8,103.9 L214.3,103.3 L214.8,102.8 L215.3,102.3 L215.8,101.9 L216.3,101.4 
+		L216.8,101.0 L217.3,100.7 L217.8,100.3 L218.3,100.0 L218.8,99.7 L219.3,99.5 L219.8,99.3 L220.3,99.1 
+		L220.8,99.0 L221.3,98.8 L221.8,98.8 L222.3,98.7 L222.8,98.7 L223.3,98.7 L223.8,98.8 L224.3,98.8 
+		L224.8,99.0 L225.3,99.1 L225.8,99.3 L226.4,99.5 L226.9,99.7 L227.4,100.0 L227.9,100.3 L228.4,100.7 
+		L228.9,101.0 L229.4,101.4 L229.9,101.9 L230.4,102.3 L230.9,102.8 L231.4,103.3 L231.9,103.9 L232.4,104.5 
+		L232.9,105.1 L233.4,105.8 L233.9,106.4 L234.4,107.1 L234.9,107.9 L235.4,108.7 L235.9,109.5 L236.4,110.3 
+		L236.9,111.1 L237.4,112.0 L237.9,112.9 L238.4,113.9 L238.9,114.9 L239.4,115.9 L239.9,116.9 L240.4,117.9 
+		L240.9,119.0 L241.4,120.1 L241.9,121.2 L242.5,122.4 L243.0,123.6 L243.5,124.8 L244.0,126.0 L244.5,127.3 
+		L245.0,128.6 L245.5,129.9 L246.0,131.2 L246.5,132.5 L247.0,133.9 L247.5,135.3 L248.0,136.7 L248.5,138.2 
+		L249.0,139.6 L249.5,141.1 L250.0,142.6 L250.5,144.1 L251.0,145.7 L251.5,147.2 L252.0,148.8 L252.5,150.4 
+		L253.0,152.0 L253.5,153.7 L254.0,155.3 L254.5,157.0 L255.0,158.6 L255.5,160.3 L256.0,162.1 L256.5,163.8 
+		L257.0,165.5 L257.5,167.3 L258.0,169.0 L258.6,170.8 L259.1,172.6 L259.6,174.4 L260.1,176.2 L260.6,178.1 
+		L261.1,179.9 L261.6,181.7 L262.1,183.6 L262.6,185.5 L263.1,187.3 L263.6,189.2 L264.1,191.1 L264.6,193.0 
+		L265.1,194.9 L265.6,196.8 L266.1,198.8 L266.6,200.7 L267.1,202.6 L267.6,204.6 L268.1,206.5 L268.6,208.4 
+		L269.1,210.4 L269.6,212.3 L270.1,214.3 L270.6,216.3 L271.1,218.2 L271.6,220.2 L272.1,222.1 L272.6,224.1 
+		L273.1,226.1 L273.6,228.0 L274.1,230.0 L274.6,232.0 L275.2,233.9 L275.7,235.9 L276.2,237.8 L276.7,239.8 
+		L277.2,241.7 L277.7,243.7 L278.2,245.6 L278.7,247.6 L279.2,249.5 L279.7,251.4 L280.2,253.4 L280.7,255.3 
+		L281.2,257.2 L281.7,259.1 L282.2,261.0 L282.7,262.9 L283.2,264.8 L283.7,266.7 L284.2,268.6 L284.7,270.5 
+		L285.2,272.3 L285.7,274.2 L286.2,276.0 L286.7,277.9 L287.2,279.7 L287.7,281.5 L288.2,283.4 L288.7,285.2 
+		L289.2,286.9 L289.7,288.7 L290.2,290.5 L290.7,292.3 L291.3,294.0 L291.8,295.8 L292.3,297.5 L292.8,299.2 
+		L293.3,300.9 L293.8,302.6 L294.3,304.3 L294.8,306.0 L295.3,307.6 L295.8,309.3 L296.3,310.9 L296.8,312.5 
+		L297.3,314.1 L297.8,315.7 L298.3,317.3 L298.8,318.9 L299.3,320.4 L299.8,322.0 L300.3,323.5 L300.8,325.0 
+		L301.3,326.5 L301.8,328.0 L302.3,329.5 L302.8,331.0 L303.3,332.4 L303.8,333.8 L304.3,335.3 L304.8,336.7 
+		L305.3,338.0 L305.8,339.4 L306.3,340.8 L306.8,342.1 L307.4,343.5 L307.9,344.8 L308.4,346.1 L308.9,347.4 
+		L309.4,348.7 L309.9,349.9 L310.4,351.2 L310.9,352.4 L311.4,353.6 L311.9,354.8 L312.4,356.0 L312.9,357.2 
+		L313.4,358.3 L313.9,359.5 L314.4,360.6 L314.9,361.7 L315.4,362.8 L315.9,363.9 L316.4,365.0 L316.9,366.1 
+		L317.4,367.1 L317.9,368.1 L318.4,369.2 L318.9,370.2 L319.4,371.2 L319.9,372.1 L320.4,373.1 L320.9,374.0 
+		L321.4,375.0 L321.9,375.9 L322.4,376.8 L322.9,377.7 L323.5,378.6 L324.0,379.5 L324.5,380.3 L325.0,381.2 
+		L325.5,382.0 L326.0,382.8 L326.5,383.6 L327.0,384.4 L327.5,385.2 L328.0,386.0 L328.5,386.7 L329.0,387.5 
+		L329.5,388.2 L330.0,388.9 L330.5,389.6 L331.0,390.3 L331.5,391.0 L332.0,391.7 L332.5,392.3 L333.0,393.0 
+		L333.5,393.6 L334.0,394.2 L334.5,394.9 L335.0,395.5 L335.5,396.1 L336.0,396.6 L336.5,397.2 L337.0,397.8 
+		L337.5,398.3 L338.0,398.9 L338.5,399.4 L339.0,399.9 L339.5,400.5 L340.1,401.0 L340.6,401.5 L341.1,401.9 
+		L341.6,402.4 L342.1,402.9 L342.6,403.3 L343.1,403.8 L343.6,404.2 L344.1,404.7 L344.6,405.1 L345.1,405.5 
+		L345.6,405.9 L346.1,406.3 L346.6,406.7 L347.1,407.1 L347.6,407.5 L348.1,407.8 L348.6,408.2 L349.1,408.5 
+		L349.6,408.9 L350.1,409.2 L350.6,409.5 L351.1,409.9 L351.6,410.2 L352.1,410.5 L352.6,410.8 L353.1,411.1 
+		L353.6,411.4 L354.1,411.7 L354.6,411.9 L355.1,412.2 L355.6,412.5 L356.2,412.7 L356.7,413.0 L357.2,413.2 
+		L357.7,413.5 L358.2,413.7 L358.7,413.9 L359.2,414.2 L359.7,414.4 L360.2,414.6 L360.7,414.8 L361.2,415.0 
+		L361.7,415.2 L362.2,415.4 L362.7,415.6 L363.2,415.8 L363.7,416.0 L364.2,416.2 L364.7,416.3 L365.2,416.5 
+		L365.7,416.7 L366.2,416.8 L366.7,417.0 L367.2,417.1 L367.7,417.3 L368.2,417.4 L368.7,417.6 L369.2,417.7 
+		L369.7,417.8 L370.2,418.0 L370.7,418.1 L371.2,418.2 L371.7,418.3 L372.3,418.5 L372.8,418.6 L373.3,418.7 
+		L373.8,418.8 L374.3,418.9 L374.8,419.0 L375.3,419.1 L375.8,419.2 L376.3,419.3 L376.8,419.4 L377.3,419.5 
+		L377.8,419.6 L378.3,419.7 L378.8,419.7 L379.3,419.8 L379.8,419.9 L380.3,420.0 L380.8,420.1 L381.3,420.1 
+		L381.8,420.2 L382.3,420.3 L382.8,420.3 L383.3,420.4 L383.8,420.5 L384.3,420.5 L384.8,420.6 L385.3,420.6 
+		L385.8,420.7 L386.3,420.8 L386.8,420.8 L387.3,420.9 L387.8,420.9 L388.3,421.0 L388.9,421.0 L389.4,421.0 
+		L389.9,421.1 L390.4,421.1 L390.9,421.2 L391.4,421.2 L391.9,421.3 L392.4,421.3 L392.9,421.3 L393.4,421.4 
+		L393.9,421.4 L394.4,421.4 L394.9,421.5 L395.4,421.5 L395.9,421.5 L396.4,421.6 L396.9,421.6 L397.4,421.6 
+		L397.9,421.6 L398.4,421.7 L398.9,421.7 L399.4,421.7 L399.9,421.7 L400.4,421.8 L400.9,421.8 L401.4,421.8 
+		L401.9,421.8 L402.4,421.8 L402.9,421.9 L403.4,421.9 L403.9,421.9 L404.4,421.9 L405.0,421.9 L405.5,422.0 
+		L406.0,422.0 L406.5,422.0 L407.0,422.0 L407.5,422.0 L408.0,422.0 L408.5,422.0 L409.0,422.1 L409.5,422.1 
+		L410.0,422.1 L410.5,422.1 L411.0,422.1 L411.5,422.1 L412.0,422.1 L412.5,422.1 L413.0,422.1 L413.5,422.2 
+		L414.0,422.2 L414.5,422.2 L415.0,422.2 L415.5,422.2 L416.0,422.2 L416.5,422.2 L417.0,422.2 L417.5,422.2 
+		L418.0,422.2 L418.5,422.2 L419.0,422.2 L419.5,422.2 L420.0,422.3 L420.5,422.3 L421.1,422.3 L421.6,422.3 
+		L422.1,422.3 L422.6,422.3 L423.1,422.3 L423.6,422.3 L424.1,422.3 L424.6,422.3 L425.1,422.3 L425.6,422.3 
+		L426.1,422.3 L426.6,422.3 L427.1,422.3 L427.6,422.3 L428.1,422.3 L428.6,422.3 L429.1,422.3 L429.6,422.3 
+		L430.1,422.3 L430.6,422.3 L431.1,422.3 L431.6,422.3 L432.1,422.3 L432.6,422.3 L433.1,422.3 L433.6,422.4 
+		L434.1,422.4 L434.6,422.4 L435.1,422.4 L435.6,422.4 L436.1,422.4 L436.6,422.4 L437.2,422.4 L437.7,422.4 
+		L438.2,422.4 L438.7,422.4 L439.2,422.4 L439.7,422.4 L440.2,422.4 L440.7,422.4 L441.2,422.4 L441.7,422.4 
+		L442.2,422.4 L442.7,422.4 L443.2,422.4 L443.7,422.4 L444.2,422.4 L444.7,422.4 L445.2,422.4 L445.7,422.4 
+		L446.2,422.4 L446.7,422.4 L447.2,422.4 L447.7,422.4 L448.2,422.4 L448.7,422.4 L449.2,422.4 L449.7,422.4 
+		L450.2,422.4 L450.7,422.4 L451.2,422.4 L451.7,422.4 L452.2,422.4 L452.7,422.4 L453.2,422.4 L453.8,422.4 
+		L454.3,422.4 L454.8,422.4 L455.3,422.4 L455.8,422.4 L456.3,422.4 L456.8,422.4 L457.3,422.4 L457.8,422.4 
+		L458.3,422.4 L458.8,422.4 L459.3,422.4 L459.8,422.4 L460.3,422.4 L460.8,422.4 L461.3,422.4 L461.8,422.4 
+		L462.3,422.4 L462.8,422.4 L463.3,422.4 L463.8,422.4 L464.3,422.4 L464.8,422.4 L465.3,422.4 L465.8,422.4 
+		L466.3,422.4 L466.8,422.4 L467.3,422.4 L467.8,422.4 L468.3,422.4 L468.8,422.4 L469.3,422.4 L469.9,422.4 
+		L470.4,422.4 L470.9,422.4 L471.4,422.4 L471.9,422.4 L472.4,422.4 L472.9,422.4 L473.4,422.4 L473.9,422.4 
+		L474.4,422.4 L474.9,422.4 L475.4,422.4 L475.9,422.4 L476.4,422.4 L476.9,422.4 L477.4,422.4 L477.9,422.4 
+		L478.4,422.4 L478.9,422.4 L479.4,422.4 L479.9,422.4 L480.4,422.4 L480.9,422.4 L481.4,422.4 L481.9,422.4 
+		L482.4,422.4 L482.9,422.4 L483.4,422.4 L483.9,422.4 L484.4,422.4 L484.9,422.4 L485.4,422.4 L486.0,422.4 
+		L486.5,422.4 L487.0,422.4 L487.5,422.4 L488.0,422.4 L488.5,422.4 L489.0,422.4 L489.5,422.4 L490.0,422.4 
+		L490.5,422.4 L491.0,422.4 L491.5,422.4 L492.0,422.4 L492.5,422.4 L493.0,422.4 L493.5,422.4 L494.0,422.4 
+		L494.5,422.4 L495.0,422.4 L495.5,422.4 L496.0,422.4 L496.5,422.4 L497.0,422.4 L497.5,422.4 L498.0,422.4 
+		L498.5,422.4 L499.0,422.4 L499.5,422.4 L500.0,422.4 L500.5,422.4 L501.0,422.4 L501.5,422.4 L502.1,422.4 
+		L502.6,422.4 L503.1,422.4 L503.6,422.4 L504.1,422.4 L504.6,422.4 L505.1,422.4 L505.6,422.4 L506.1,422.4 
+		L506.6,422.4 L507.1,422.4 L507.6,422.4 L508.1,422.4 L508.6,422.4 L509.1,422.4 L509.6,422.4 L510.1,422.4 
+		L510.6,422.4 L511.1,422.4 L511.6,422.4 L512.1,422.4 L512.6,422.4 L513.1,422.4 L513.6,422.4 L514.1,422.4 
+		L514.6,422.4 L515.1,422.4 L515.6,422.4 L516.1,422.4 L516.6,422.4 L517.1,422.4 L517.6,422.4 L518.1,422.4 
+		L518.7,422.4 L519.2,422.4 L519.7,422.4 L520.2,422.4 L520.7,422.4 L521.2,422.4 L521.7,422.4 L522.2,422.4 
+		L522.7,422.4 L523.2,422.4 L523.7,422.4 L524.2,422.4 L524.7,422.4 L525.2,422.4 L525.7,422.4 L526.2,422.4 
+		L526.7,422.4 L527.2,422.4 L527.7,422.4 L528.2,422.4 L528.7,422.4 L529.2,422.4 L529.7,422.4 L530.2,422.4 
+		L530.7,422.4 L531.2,422.4 L531.7,422.4 L532.2,422.4 L532.7,422.4 L533.2,422.4 L533.7,422.4 L534.2,422.4 
+		L534.8,422.4 L535.3,422.4 L535.8,422.4 L536.3,422.4 L536.8,422.4 L537.3,422.4 L537.8,422.4 L538.3,422.4 
+		L538.8,422.4 L539.3,422.4 L539.8,422.4 L540.3,422.4 L540.8,422.4 L541.3,422.4 L541.8,422.4 L542.3,422.4 
+		L542.8,422.4 L543.3,422.4 L543.8,422.4 L544.3,422.4 L544.8,422.4 L545.3,422.4 L545.8,422.4 L546.3,422.4 
+		L546.8,422.4 L547.3,422.4 L547.8,422.4 L548.3,422.4 L548.8,422.4 L549.3,422.4 L549.8,422.4 L550.3,422.4 
+		L550.9,422.4 L551.4,422.4 L551.9,422.4 L552.4,422.4 L552.9,422.4 L553.4,422.4 L553.9,422.4 L554.4,422.4 
+		L554.9,422.4 L555.4,422.4 L555.9,422.4 L556.4,422.4 L556.9,422.4 L557.4,422.4 L557.9,422.4 L558.4,422.4 
+		L558.9,422.4 L559.4,422.4 L559.9,422.4 L560.4,422.4 L560.9,422.4 L561.4,422.4 L561.9,422.4 L562.4,422.4 
+		L562.9,422.4 L563.4,422.4 L563.9,422.4 L564.4,422.4 L564.9,422.4 L565.4,422.4 L565.9,422.4 L566.4,422.4 
+		L567.0,422.4 L567.5,422.4 L568.0,422.4 L568.5,422.4 L569.0,422.4 L569.5,422.4 L570.0,422.4 L570.5,422.4 
+		L571.0,422.4 L571.5,422.4 L572.0,422.4 L572.5,422.4 L573.0,422.4 L573.5,422.4 L574.0,422.4 L574.5,422.4 
+		L575.0,422.4 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,415.3 L72.4,415.2 L72.9,415.1 L73.4,415.0 L73.9,414.9 L74.4,414.8 L74.9,414.7 L75.4,414.6 
+		L75.9,414.5 L76.4,414.4 L76.9,414.4 L77.4,414.3 L77.9,414.2 L78.4,414.1 L78.9,413.9 L79.4,413.8 
+		L79.9,413.7 L80.5,413.6 L81.0,413.5 L81.5,413.4 L82.0,413.3 L82.5,413.2 L83.0,413.1 L83.5,413.0 
+		L84.0,412.9 L84.5,412.8 L85.0,412.6 L85.5,412.5 L86.0,412.4 L86.5,412.3 L87.0,412.2 L87.5,412.0 
+		L88.0,411.9 L88.5,411.8 L89.0,411.7 L89.5,411.6 L90.0,411.4 L90.5,411.3 L91.0,411.2 L91.5,411.0 
+		L92.0,410.9 L92.5,410.8 L93.0,410.6 L93.5,410.5 L94.0,410.4 L94.5,410.2 L95.0,410.1 L95.5,410.0 
+		L96.0,409.8 L96.6,409.7 L97.1,409.5 L97.6,409.4 L98.1,409.2 L98.6,409.1 L99.1,408.9 L99.6,408.8 
+		L100.1,408.6 L100.6,408.5 L101.1,408.3 L101.6,408.2 L102.1,408.0 L102.6,407.8 L103.1,407.7 L103.6,407.5 
+		L104.1,407.4 L104.6,407.2 L105.1,407.0 L105.6,406.9 L106.1,406.7 L106.6,406.5 L107.1,406.4 L107.6,406.2 
+		L108.1,406.0 L108.6,405.8 L109.1,405.7 L109.6,405.5 L110.1,405.3 L110.6,405.1 L111.1,404.9 L111.6,404.7 
+		L112.1,404.6 L112.7,404.4 L113.2,404.2 L113.7,404.0 L114.2,403.8 L114.7,403.6 L115.2,403.4 L115.7,403.2 
+		L116.2,403.0 L116.7,402.8 L117.2,402.6 L117.7,402.4 L118.2,402.2 L118.7,402.0 L119.2,401.8 L119.7,401.6 
+		L120.2,401.4 L120.7,401.1 L121.2,400.9 L121.7,400.7 L122.2,400.5 L122.7,400.3 L123.2,400.1 L123.7,399.8 
+		L124.2,399.6 L124.7,399.4 L125.2,399.2 L125.7,398.9 L126.2,398.7 L126.7,398.5 L127.2,398.2 L127.7,398.0 
+		L128.2,397.7 L128.8,397.5 L129.3,397.3 L129.8,397.0 L130.3,396.8 L130.8,396.5 L131.3,396.3 L131.8,396.0 
+		L132.3,395.8 L132.8,395.5 L133.3,395.3 L133.8,395.0 L134.3,394.8 L134.8,394.5 L135.3,394.2 L135.8,394.0 
+		L136.3,393.7 L136.8,393.4 L137.3,393.2 L137.8,392.9 L138.3,392.6 L138.8,392.3 L139.3,392.1 L139.8,391.8 
+		L140.3,391.5 L140.8,391.2 L141.3,390.9 L141.8,390.7 L142.3,390.4 L142.8,390.1 L143.3,389.8 L143.8,389.5 
+		L144.3,389.2 L144.8,388.9 L145.4,388.6 L145.9,388.3 L146.4,388.0 L146.9,387.7 L147.4,387.4 L147.9,387.1 
+		L148.4,386.8 L148.9,386.5 L149.4,386.2 L149.9,385.8 L150.4,385.5 L150.9,385.2 L151.4,384.9 L151.9,384.6 
+		L152.4,384.2 L152.9,383.9 L153.4,383.6 L153.9,383.3 L154.4,382.9 L154.9,382.6 L155.4,382.3 L155.9,381.9 
+		L156.4,381.6 L156.9,381.3 L157.4,380.9 L157.9,380.6 L158.4,380.2 L158.9,379.9 L159.4,379.5 L159.9,379.2 
+		L160.4,378.8 L160.9,378.5 L161.5,378.1 L162.0,377.8 L162.5,377.4 L163.0,377.0 L163.5,376.7 L164.0,376.3 
+		L164.5,375.9 L165.0,375.6 L165.5,375.2 L166.0,374.8 L166.5,374.5 L167.0,374.1 L167.5,373.7 L168.0,373.3 
+		L168.5,373.0 L169.0,372.6 L169.5,372.2 L170.0,371.8 L170.5,371.4 L171.0,371.0 L171.5,370.6 L172.0,370.2 
+		L172.5,369.9 L173.0,369.5 L173.5,369.1 L174.0,368.7 L174.5,368.3 L175.0,367.9 L175.5,367.5 L176.0,367.1 
+		L176.5,366.7 L177.0,366.2 L177.6,365.8 L178.1,365.4 L178.6,365.0 L179.1,364.6 L179.6,364.2 L180.1,363.8 
+		L180.6,363.3 L181.1,362.9 L181.6,362.5 L182.1,362.1 L182.6,361.7 L183.1,361.2 L183.6,360.8 L184.1,360.4 
+		L184.6,359.9 L185.1,359.5 L185.6,359.1 L186.1,358.6 L186.6,358.2 L187.1,357.8 L187.6,357.3 L188.1,356.9 
+		L188.6,356.5 L189.1,356.0 L189.6,355.6 L190.1,355.1 L190.6,354.7 L191.1,354.2 L191.6,353.8 L192.1,353.3 
+		L192.6,352.9 L193.1,352.4 L193.7,352.0 L194.2,351.5 L194.7,351.1 L195.2,350.6 L195.7,350.1 L196.2,349.7 
+		L196.7,349.2 L197.2,348.8 L197.7,348.3 L198.2,347.8 L198.7,347.4 L199.2,346.9 L199.7,346.4 L200.2,346.0 
+		L200.7,345.5 L201.2,345.0 L201.7,344.6 L202.2,344.1 L202.7,343.6 L203.2,343.1 L203.7,342.7 L204.2,342.2 
+		L204.7,341.7 L205.2,341.2 L205.7,340.8 L206.2,340.3 L206.7,339.8 L207.2,339.3 L207.7,338.9 L208.2,338.4 
+		L208.7,337.9 L209.2,337.4 L209.7,336.9 L210.3,336.4 L210.8,336.0 L211.3,335.5 L211.8,335.0 L212.3,334.5 
+		L212.8,334.0 L213.3,333.5 L213.8,333.0 L214.3,332.6 L214.8,332.1 L215.3,331.6 L215.8,331.1 L216.3,330.6 
+		L216.8,330.1 L217.3,329.6 L217.8,329.1 L218.3,328.6 L218.8,328.2 L219.3,327.7 L219.8,327.2 L220.3,326.7 
+		L220.8,326.2 L221.3,325.7 L221.8,325.2 L222.3,324.7 L222.8,324.2 L223.3,323.7 L223.8,323.3 L224.3,322.8 
+		L224.8,322.3 L225.3,321.8 L225.8,321.3 L226.4,320.8 L226.9,320.3 L227.4,319.8 L227.9,319.3 L228.4,318.8 
+		L228.9,318.3 L229.4,317.9 L229.9,317.4 L230.4,316.9 L230.9,316.4 L231.4,315.9 L231.9,315.4 L232.4,314.9 
+		L232.9,314.4 L233.4,314.0 L233.9,313.5 L234.4,313.0 L234.9,312.5 L235.4,312.0 L235.9,311.5 L236.4,311.1 
+		L236.9,310.6 L237.4,310.1 L237.9,309.6 L238.4,309.1 L238.9,308.7 L239.4,308.2 L239.9,307.7 L240.4,307.2 
+		L240.9,306.8 L241.4,306.3 L241.9,305.8 L242.5,305.3 L243.0,304.9 L243.5,304.4 L244.0,303.9 L244.5,303.5 
+		L245.0,303.0 L245.5,302.5 L246.0,302.1 L246.5,301.6 L247.0,301.1 L247.5,300.7 L248.0,300.2 L248.5,299.8 
+		L249.0,299.3 L249.5,298.9 L250.0,298.4 L250.5,298.0 L251.0,297.5 L251.5,297.1 L252.0,296.6 L252.5,296.2 
+		L253.0,295.7 L253.5,295.3 L254.0,294.8 L254.5,294.4 L255.0,294.0 L255.5,293.5 L256.0,293.1 L256.5,292.7 
+		L257.0,292.2 L257.5,291.8 L258.0,291.4 L258.6,290.9 L259.1,290.5 L259.6,290.1 L260.1,289.7 L260.6,289.3 
+		L261.1,288.9 L261.6,288.4 L262.1,288.0 L262.6,287.6 L263.1,287.2 L263.6,286.8 L264.1,286.4 L264.6,286.0 
+		L265.1,285.6 L265.6,285.2 L266.1,284.8 L266.6,284.4 L267.1,284.0 L267.6,283.7 L268.1,283.3 L268.6,282.9 
+		L269.1,282.5 L269.6,282.1 L270.1,281.8 L270.6,281.4 L271.1,281.0 L271.6,280.7 L272.1,280.3 L272.6,279.9 
+		L273.1,279.6 L273.6,279.2 L274.1,278.9 L274.6,278.5 L275.2,278.2 L275.7,277.8 L276.2,277.5 L276.7,277.1 
+		L277.2,276.8 L277.7,276.5 L278.2,276.1 L278.7,275.8 L279.2,275.5 L279.7,275.2 L280.2,274.8 L280.7,274.5 
+		L281.2,274.2 L281.7,273.9 L282.2,273.6 L282.7,273.3 L283.2,273.0 L283.7,272.7 L284.2,272.4 L284.7,272.1 
+		L285.2,271.8 L285.7,271.5 L286.2,271.3 L286.7,271.0 L287.2,270.7 L287.7,270.4 L288.2,270.2 L288.7,269.9 
+		L289.2,269.6 L289.7,269.4 L290.2,269.1 L290.7,268.9 L291.3,268.6 L291.8,268.4 L292.3,268.1 L292.8,267.9 
+		L293.3,267.7 L293.8,267.4 L294.3,267.2 L294.8,267.0 L295.3,266.8 L295.8,266.6 L296.3,266.3 L296.8,266.1 
+		L297.3,265.9 L297.8,265.7 L298.3,265.5 L298.8,265.3 L299.3,265.1 L299.8,265.0 L300.3,264.8 L300.8,264.6 
+		L301.3,264.4 L301.8,264.2 L302.3,264.1 L302.8,263.9 L303.3,263.8 L303.8,263.6 L304.3,263.4 L304.8,263.3 
+		L305.3,263.1 L305.8,263.0 L306.3,262.9 L306.8,262.7 L307.4,262.6 L307.9,262.5 L308.4,262.4 L308.9,262.2 
+		L309.4,262.1 L309.9,262.0 L310.4,261.9 L310.9,261.8 L311.4,261.7 L311.9,261.6 L312.4,261.5 L312.9,261.4 
+		L313.4,261.4 L313.9,261.3 L314.4,261.2 L314.9,261.1 L315.4,261.1 L315.9,261.0 L316.4,260.9 L316.9,260.9 
+		L317.4,260.8 L317.9,260.8 L318.4,260.8 L318.9,260.7 L319.4,260.7 L319.9,260.6 L320.4,260.6 L320.9,260.6 
+		L321.4,260.6 L321.9,260.6 L322.4,260.6 L322.9,260.6 L323.5,260.5 L324.0,260.6 L324.5,260.6 L325.0,260.6 
+		L325.5,260.6 L326.0,260.6 L326.5,260.6 L327.0,260.6 L327.5,260.7 L328.0,260.7 L328.5,260.8 L329.0,260.8 
+		L329.5,260.8 L330.0,260.9 L330.5,260.9 L331.0,261.0 L331.5,261.1 L332.0,261.1 L332.5,261.2 L333.0,261.3 
+		L333.5,261.4 L334.0,261.4 L334.5,261.5 L335.0,261.6 L335.5,261.7 L336.0,261.8 L336.5,261.9 L337.0,262.0 
+		L337.5,262.1 L338.0,262.2 L338.5,262.4 L339.0,262.5 L339.5,262.6 L340.1,262.7 L340.6,262.9 L341.1,263.0 
+		L341.6,263.1 L342.1,263.3 L342.6,263.4 L343.1,263.6 L343.6,263.8 L344.1,263.9 L344.6,264.1 L345.1,264.2 
+		L345.6,264.4 L346.1,264.6 L346.6,264.8 L347.1,265.0 L347.6,265.1 L348.1,265.3 L348.6,265.5 L349.1,265.7 
+		L349.6,265.9 L350.1,266.1 L350.6,266.3 L351.1,266.6 L351.6,266.8 L352.1,267.0 L352.6,267.2 L353.1,267.4 
+		L353.6,267.7 L354.1,267.9 L354.6,268.1 L355.1,268.4 L355.6,268.6 L356.2,268.9 L356.7,269.1 L357.2,269.4 
+		L357.7,269.6 L358.2,269.9 L358.7,270.2 L359.2,270.4 L359.7,270.7 L360.2,271.0 L360.7,271.3 L361.2,271.5 
+		L361.7,271.8 L362.2,272.1 L362.7,272.4 L363.2,272.7 L363.7,273.0 L364.2,273.3 L364.7,273.6 L365.2,273.9 
+		L365.7,274.2 L366.2,274.5 L366.7,274.8 L367.2,275.2 L367.7,275.5 L368.2,275.8 L368.7,276.1 L369.2,276.5 
+		L369.7,276.8 L370.2,277.1 L370.7,277.5 L371.2,277.8 L371.7,278.2 L372.3,278.5 L372.8,278.9 L373.3,279.2 
+		L373.8,279.6 L374.3,279.9 L374.8,280.3 L375.3,280.7 L375.8,281.0 L376.3,281.4 L376.8,281.8 L377.3,282.1 
+		L377.8,282.5 L378.3,282.9 L378.8,283.3 L379.3,283.7 L379.8,284.0 L380.3,284.4 L380.8,284.8 L381.3,285.2 
+		L381.8,285.6 L382.3,286.0 L382.8,286.4 L383.3,286.8 L383.8,287.2 L384.3,287.6 L384.8,288.0 L385.3,288.4 
+		L385.8,288.9 L386.3,289.3 L386.8,289.7 L387.3,290.1 L387.8,290.5 L388.3,290.9 L388.9,291.4 L389.4,291.8 
+		L389.9,292.2 L390.4,292.7 L390.9,293.1 L391.4,293.5 L391.9,294.0 L392.4,294.4 L392.9,294.8 L393.4,295.3 
+		L393.9,295.7 L394.4,296.2 L394.9,296.6 L395.4,297.1 L395.9,297.5 L396.4,298.0 L396.9,298.4 L397.4,298.9 
+		L397.9,299.3 L398.4,299.8 L398.9,300.2 L399.4,300.7 L399.9,301.1 L400.4,301.6 L400.9,302.1 L401.4,302.5 
+		L401.9,303.0 L402.4,303.5 L402.9,303.9 L403.4,304.4 L403.9,304.9 L404.4,305.3 L405.0,305.8 L405.5,306.3 
+		L406.0,306.8 L406.5,307.2 L407.0,307.7 L407.5,308.2 L408.0,308.7 L408.5,309.1 L409.0,309.6 L409.5,310.1 
+		L410.0,310.6 L410.5,311.1 L411.0,311.5 L411.5,312.0 L412.0,312.5 L412.5,313.0 L413.0,313.5 L413.5,314.0 
+		L414.0,314.4 L414.5,314.9 L415.0,315.4 L415.5,315.9 L416.0,316.4 L416.5,316.9 L417.0,317.4 L417.5,317.9 
+		L418.0,318.3 L418.5,318.8 L419.0,319.3 L419.5,319.8 L420.0,320.3 L420.5,320.8 L421.1,321.3 L421.6,321.8 
+		L422.1,322.3 L422.6,322.8 L423.1,323.3 L423.6,323.7 L424.1,324.2 L424.6,324.7 L425.1,325.2 L425.6,325.7 
+		L426.1,326.2 L426.6,326.7 L427.1,327.2 L427.6,327.7 L428.1,328.2 L428.6,328.6 L429.1,329.1 L429.6,329.6 
+		L430.1,330.1 L430.6,330.6 L431.1,331.1 L431.6,331.6 L432.1,332.1 L432.6,332.6 L433.1,333.0 L433.6,333.5 
+		L434.1,334.0 L434.6,334.5 L435.1,335.0 L435.6,335.5 L436.1,336.0 L436.6,336.4 L437.2,336.9 L437.7,337.4 
+		L438.2,337.9 L438.7,338.4 L439.2,338.9 L439.7,339.3 L440.2,339.8 L440.7,340.3 L441.2,340.8 L441.7,341.2 
+		L442.2,341.7 L442.7,342.2 L443.2,342.7 L443.7,343.1 L444.2,343.6 L444.7,344.1 L445.2,344.6 L445.7,345.0 
+		L446.2,345.5 L446.7,346.0 L447.2,346.4 L447.7,346.9 L448.2,347.4 L448.7,347.8 L449.2,348.3 L449.7,348.8 
+		L450.2,349.2 L450.7,349.7 L451.2,350.1 L451.7,350.6 L452.2,351.1 L452.7,351.5 L453.2,352.0 L453.8,352.4 
+		L454.3,352.9 L454.8,353.3 L455.3,353.8 L455.8,354.2 L456.3,354.7 L456.8,355.1 L457.3,355.6 L457.8,356.0 
+		L458.3,356.5 L458.8,356.9 L459.3,357.3 L459.8,357.8 L460.3,358.2 L460.8,358.6 L461.3,359.1 L461.8,359.5 
+		L462.3,359.9 L462.8,360.4 L463.3,360.8 L463.8,361.2 L464.3,361.7 L464.8,362.1 L465.3,362.5 L465.8,362.9 
+		L466.3,363.3 L466.8,363.8 L467.3,364.2 L467.8,364.6 L468.3,365.0 L468.8,365.4 L469.3,365.8 L469.9,366.2 
+		L470.4,366.7 L470.9,367.1 L471.4,367.5 L471.9,367.9 L472.4,368.3 L472.9,368.7 L473.4,369.1 L473.9,369.5 
+		L474.4,369.9 L474.9,370.2 L475.4,370.6 L475.9,371.0 L476.4,371.4 L476.9,371.8 L477.4,372.2 L477.9,372.6 
+		L478.4,373.0 L478.9,373.3 L479.4,373.7 L479.9,374.1 L480.4,374.5 L480.9,374.8 L481.4,375.2 L481.9,375.6 
+		L482.4,375.9 L482.9,376.3 L483.4,376.7 L483.9,377.0 L484.4,377.4 L484.9,377.8 L485.4,378.1 L486.0,378.5 
+		L486.5,378.8 L487.0,379.2 L487.5,379.5 L488.0,379.9 L488.5,380.2 L489.0,380.6 L489.5,380.9 L490.0,381.3 
+		L490.5,381.6 L491.0,381.9 L491.5,382.3 L492.0,382.6 L492.5,382.9 L493.0,383.3 L493.5,383.6 L494.0,383.9 
+		L494.5,384.2 L495.0,384.6 L495.5,384.9 L496.0,385.2 L496.5,385.5 L497.0,385.8 L497.5,386.2 L498.0,386.5 
+		L498.5,386.8 L499.0,387.1 L499.5,387.4 L500.0,387.7 L500.5,388.0 L501.0,388.3 L501.5,388.6 L502.1,388.9 
+		L502.6,389.2 L503.1,389.5 L503.6,389.8 L504.1,390.1 L504.6,390.4 L505.1,390.7 L505.6,390.9 L506.1,391.2 
+		L506.6,391.5 L507.1,391.8 L507.6,392.1 L508.1,392.3 L508.6,392.6 L509.1,392.9 L509.6,393.2 L510.1,393.4 
+		L510.6,393.7 L511.1,394.0 L511.6,394.2 L512.1,394.5 L512.6,394.8 L513.1,395.0 L513.6,395.3 L514.1,395.5 
+		L514.6,395.8 L515.1,396.0 L515.6,396.3 L516.1,396.5 L516.6,396.8 L517.1,397.0 L517.6,397.3 L518.1,397.5 
+		L518.7,397.7 L519.2,398.0 L519.7,398.2 L520.2,398.5 L520.7,398.7 L521.2,398.9 L521.7,399.2 L522.2,399.4 
+		L522.7,399.6 L523.2,399.8 L523.7,400.1 L524.2,400.3 L524.7,400.5 L525.2,400.7 L525.7,400.9 L526.2,401.1 
+		L526.7,401.4 L527.2,401.6 L527.7,401.8 L528.2,402.0 L528.7,402.2 L529.2,402.4 L529.7,402.6 L530.2,402.8 
+		L530.7,403.0 L531.2,403.2 L531.7,403.4 L532.2,403.6 L532.7,403.8 L533.2,404.0 L533.7,404.2 L534.2,404.4 
+		L534.8,404.6 L535.3,404.7 L535.8,404.9 L536.3,405.1 L536.8,405.3 L537.3,405.5 L537.8,405.7 L538.3,405.8 
+		L538.8,406.0 L539.3,406.2 L539.8,406.4 L540.3,406.5 L540.8,406.7 L541.3,406.9 L541.8,407.0 L542.3,407.2 
+		L542.8,407.4 L543.3,407.5 L543.8,407.7 L544.3,407.8 L544.8,408.0 L545.3,408.2 L545.8,408.3 L546.3,408.5 
+		L546.8,408.6 L547.3,408.8 L547.8,408.9 L548.3,409.1 L548.8,409.2 L549.3,409.4 L549.8,409.5 L550.3,409.7 
+		L550.9,409.8 L551.4,410.0 L551.9,410.1 L552.4,410.2 L552.9,410.4 L553.4,410.5 L553.9,410.6 L554.4,410.8 
+		L554.9,410.9 L555.4,411.0 L555.9,411.2 L556.4,411.3 L556.9,411.4 L557.4,411.6 L557.9,411.7 L558.4,411.8 
+		L558.9,411.9 L559.4,412.0 L559.9,412.2 L560.4,412.3 L560.9,412.4 L561.4,412.5 L561.9,412.6 L562.4,412.8 
+		L562.9,412.9 L563.4,413.0 L563.9,413.1 L564.4,413.2 L564.9,413.3 L565.4,413.4 L565.9,413.5 L566.4,413.6 
+		L567.0,413.7 L567.5,413.8 L568.0,413.9 L568.5,414.1 L569.0,414.2 L569.5,414.3 L570.0,414.4 L570.5,414.4 
+		L571.0,414.5 L571.5,414.6 L572.0,414.7 L572.5,414.8 L573.0,414.9 L573.5,415.0 L574.0,415.1 L574.5,415.2 
+		L575.0,415.3 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/normal_3_1.dat b/v0.1-M1/chi/reference-manual/distribution_plots/normal_3_1.dat
new file mode 100644
index 0000000..f5ac621
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/normal_3_1.dat
@@ -0,0 +1,1014 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.004432
+0.010000	0.004567
+0.020000	0.004705
+0.030000	0.004847
+0.040000	0.004993
+0.050000	0.005143
+0.060000	0.005296
+0.070000	0.005454
+0.080000	0.005616
+0.090000	0.005782
+0.100000	0.005953
+0.110000	0.006127
+0.120000	0.006307
+0.130000	0.006491
+0.140000	0.006679
+0.150000	0.006873
+0.160000	0.007071
+0.170000	0.007274
+0.180000	0.007483
+0.190000	0.007697
+0.200000	0.007915
+0.210000	0.008140
+0.220000	0.008370
+0.230000	0.008605
+0.240000	0.008846
+0.250000	0.009094
+0.260000	0.009347
+0.270000	0.009606
+0.280000	0.009871
+0.290000	0.010143
+0.300000	0.010421
+0.310000	0.010706
+0.320000	0.010997
+0.330000	0.011295
+0.340000	0.011600
+0.350000	0.011912
+0.360000	0.012232
+0.370000	0.012558
+0.380000	0.012892
+0.390000	0.013234
+0.400000	0.013583
+0.410000	0.013940
+0.420000	0.014305
+0.430000	0.014678
+0.440000	0.015060
+0.450000	0.015449
+0.460000	0.015848
+0.470000	0.016254
+0.480000	0.016670
+0.490000	0.017095
+0.500000	0.017528
+0.510000	0.017971
+0.520000	0.018423
+0.530000	0.018885
+0.540000	0.019356
+0.550000	0.019837
+0.560000	0.020328
+0.570000	0.020829
+0.580000	0.021341
+0.590000	0.021862
+0.600000	0.022395
+0.610000	0.022937
+0.620000	0.023491
+0.630000	0.024056
+0.640000	0.024631
+0.650000	0.025218
+0.660000	0.025817
+0.670000	0.026426
+0.680000	0.027048
+0.690000	0.027682
+0.700000	0.028327
+0.710000	0.028985
+0.720000	0.029655
+0.730000	0.030337
+0.740000	0.031032
+0.750000	0.031740
+0.760000	0.032460
+0.770000	0.033194
+0.780000	0.033941
+0.790000	0.034701
+0.800000	0.035475
+0.810000	0.036262
+0.820000	0.037063
+0.830000	0.037878
+0.840000	0.038707
+0.850000	0.039550
+0.860000	0.040408
+0.870000	0.041280
+0.880000	0.042166
+0.890000	0.043067
+0.900000	0.043984
+0.910000	0.044915
+0.920000	0.045861
+0.930000	0.046823
+0.940000	0.047800
+0.950000	0.048792
+0.960000	0.049800
+0.970000	0.050824
+0.980000	0.051864
+0.990000	0.052919
+1.000000	0.053991
+1.010000	0.055079
+1.020000	0.056183
+1.030000	0.057304
+1.040000	0.058441
+1.050000	0.059595
+1.060000	0.060765
+1.070000	0.061952
+1.080000	0.063157
+1.090000	0.064378
+1.100000	0.065616
+1.110000	0.066871
+1.120000	0.068144
+1.130000	0.069433
+1.140000	0.070740
+1.150000	0.072065
+1.160000	0.073407
+1.170000	0.074766
+1.180000	0.076143
+1.190000	0.077538
+1.200000	0.078950
+1.210000	0.080380
+1.220000	0.081828
+1.230000	0.083293
+1.240000	0.084776
+1.250000	0.086277
+1.260000	0.087796
+1.270000	0.089333
+1.280000	0.090887
+1.290000	0.092459
+1.300000	0.094049
+1.310000	0.095657
+1.320000	0.097282
+1.330000	0.098925
+1.340000	0.100586
+1.350000	0.102265
+1.360000	0.103961
+1.370000	0.105675
+1.380000	0.107406
+1.390000	0.109155
+1.400000	0.110921
+1.410000	0.112704
+1.420000	0.114505
+1.430000	0.116323
+1.440000	0.118157
+1.450000	0.120009
+1.460000	0.121878
+1.470000	0.123763
+1.480000	0.125665
+1.490000	0.127583
+1.500000	0.129518
+1.510000	0.131468
+1.520000	0.133435
+1.530000	0.135418
+1.540000	0.137417
+1.550000	0.139431
+1.560000	0.141460
+1.570000	0.143505
+1.580000	0.145564
+1.590000	0.147639
+1.600000	0.149727
+1.610000	0.151831
+1.620000	0.153948
+1.630000	0.156080
+1.640000	0.158225
+1.650000	0.160383
+1.660000	0.162555
+1.670000	0.164740
+1.680000	0.166937
+1.690000	0.169147
+1.700000	0.171369
+1.710000	0.173602
+1.720000	0.175847
+1.730000	0.178104
+1.740000	0.180371
+1.750000	0.182649
+1.760000	0.184937
+1.770000	0.187235
+1.780000	0.189543
+1.790000	0.191860
+1.800000	0.194186
+1.810000	0.196520
+1.820000	0.198863
+1.830000	0.201214
+1.840000	0.203571
+1.850000	0.205936
+1.860000	0.208308
+1.870000	0.210686
+1.880000	0.213069
+1.890000	0.215458
+1.900000	0.217852
+1.910000	0.220251
+1.920000	0.222653
+1.930000	0.225060
+1.940000	0.227470
+1.950000	0.229882
+1.960000	0.232297
+1.970000	0.234714
+1.980000	0.237132
+1.990000	0.239551
+2.000000	0.241971
+2.010000	0.244390
+2.020000	0.246809
+2.030000	0.249228
+2.040000	0.251644
+2.050000	0.254059
+2.060000	0.256471
+2.070000	0.258881
+2.080000	0.261286
+2.090000	0.263688
+2.100000	0.266085
+2.110000	0.268477
+2.120000	0.270864
+2.130000	0.273244
+2.140000	0.275618
+2.150000	0.277985
+2.160000	0.280344
+2.170000	0.282694
+2.180000	0.285036
+2.190000	0.287369
+2.200000	0.289692
+2.210000	0.292004
+2.220000	0.294305
+2.230000	0.296595
+2.240000	0.298872
+2.250000	0.301137
+2.260000	0.303389
+2.270000	0.305627
+2.280000	0.307851
+2.290000	0.310060
+2.300000	0.312254
+2.310000	0.314432
+2.320000	0.316593
+2.330000	0.318737
+2.340000	0.320864
+2.350000	0.322972
+2.360000	0.325062
+2.370000	0.327133
+2.380000	0.329184
+2.390000	0.331215
+2.400000	0.333225
+2.410000	0.335213
+2.420000	0.337180
+2.430000	0.339124
+2.440000	0.341046
+2.450000	0.342944
+2.460000	0.344818
+2.470000	0.346668
+2.480000	0.348493
+2.490000	0.350292
+2.500000	0.352065
+2.510000	0.353812
+2.520000	0.355533
+2.530000	0.357225
+2.540000	0.358890
+2.550000	0.360527
+2.560000	0.362135
+2.570000	0.363714
+2.580000	0.365263
+2.590000	0.366782
+2.600000	0.368270
+2.610000	0.369728
+2.620000	0.371154
+2.630000	0.372548
+2.640000	0.373911
+2.650000	0.375240
+2.660000	0.376537
+2.670000	0.377801
+2.680000	0.379031
+2.690000	0.380226
+2.700000	0.381388
+2.710000	0.382515
+2.720000	0.383606
+2.730000	0.384663
+2.740000	0.385683
+2.750000	0.386668
+2.760000	0.387617
+2.770000	0.388529
+2.780000	0.389404
+2.790000	0.390242
+2.800000	0.391043
+2.810000	0.391806
+2.820000	0.392531
+2.830000	0.393219
+2.840000	0.393868
+2.850000	0.394479
+2.860000	0.395052
+2.870000	0.395585
+2.880000	0.396080
+2.890000	0.396536
+2.900000	0.396953
+2.910000	0.397330
+2.920000	0.397668
+2.930000	0.397966
+2.940000	0.398225
+2.950000	0.398444
+2.960000	0.398623
+2.970000	0.398763
+2.980000	0.398862
+2.990000	0.398922
+3.000000	0.398942
+3.010000	0.398922
+3.020000	0.398862
+3.030000	0.398763
+3.040000	0.398623
+3.050000	0.398444
+3.060000	0.398225
+3.070000	0.397966
+3.080000	0.397668
+3.090000	0.397330
+3.100000	0.396953
+3.110000	0.396536
+3.120000	0.396080
+3.130000	0.395585
+3.140000	0.395052
+3.150000	0.394479
+3.160000	0.393868
+3.170000	0.393219
+3.180000	0.392531
+3.190000	0.391806
+3.200000	0.391043
+3.210000	0.390242
+3.220000	0.389404
+3.230000	0.388529
+3.240000	0.387617
+3.250000	0.386668
+3.260000	0.385683
+3.270000	0.384663
+3.280000	0.383606
+3.290000	0.382515
+3.300000	0.381388
+3.310000	0.380226
+3.320000	0.379031
+3.330000	0.377801
+3.340000	0.376537
+3.350000	0.375240
+3.360000	0.373911
+3.370000	0.372548
+3.380000	0.371154
+3.390000	0.369728
+3.400000	0.368270
+3.410000	0.366782
+3.420000	0.365263
+3.430000	0.363714
+3.440000	0.362135
+3.450000	0.360527
+3.460000	0.358890
+3.470000	0.357225
+3.480000	0.355533
+3.490000	0.353812
+3.500000	0.352065
+3.510000	0.350292
+3.520000	0.348493
+3.530000	0.346668
+3.540000	0.344818
+3.550000	0.342944
+3.560000	0.341046
+3.570000	0.339124
+3.580000	0.337180
+3.590000	0.335213
+3.600000	0.333225
+3.610000	0.331215
+3.620000	0.329184
+3.630000	0.327133
+3.640000	0.325062
+3.650000	0.322972
+3.660000	0.320864
+3.670000	0.318737
+3.680000	0.316593
+3.690000	0.314432
+3.700000	0.312254
+3.710000	0.310060
+3.720000	0.307851
+3.730000	0.305627
+3.740000	0.303389
+3.750000	0.301137
+3.760000	0.298872
+3.770000	0.296595
+3.780000	0.294305
+3.790000	0.292004
+3.800000	0.289692
+3.810000	0.287369
+3.820000	0.285036
+3.830000	0.282694
+3.840000	0.280344
+3.850000	0.277985
+3.860000	0.275618
+3.870000	0.273244
+3.880000	0.270864
+3.890000	0.268477
+3.900000	0.266085
+3.910000	0.263688
+3.920000	0.261286
+3.930000	0.258881
+3.940000	0.256471
+3.950000	0.254059
+3.960000	0.251644
+3.970000	0.249228
+3.980000	0.246809
+3.990000	0.244390
+4.000000	0.241971
+4.010000	0.239551
+4.020000	0.237132
+4.030000	0.234714
+4.040000	0.232297
+4.050000	0.229882
+4.060000	0.227470
+4.070000	0.225060
+4.080000	0.222653
+4.090000	0.220251
+4.100000	0.217852
+4.110000	0.215458
+4.120000	0.213069
+4.130000	0.210686
+4.140000	0.208308
+4.150000	0.205936
+4.160000	0.203571
+4.170000	0.201214
+4.180000	0.198863
+4.190000	0.196520
+4.200000	0.194186
+4.210000	0.191860
+4.220000	0.189543
+4.230000	0.187235
+4.240000	0.184937
+4.250000	0.182649
+4.260000	0.180371
+4.270000	0.178104
+4.280000	0.175847
+4.290000	0.173602
+4.300000	0.171369
+4.310000	0.169147
+4.320000	0.166937
+4.330000	0.164740
+4.340000	0.162555
+4.350000	0.160383
+4.360000	0.158225
+4.370000	0.156080
+4.380000	0.153948
+4.390000	0.151831
+4.400000	0.149727
+4.410000	0.147639
+4.420000	0.145564
+4.430000	0.143505
+4.440000	0.141460
+4.450000	0.139431
+4.460000	0.137417
+4.470000	0.135418
+4.480000	0.133435
+4.490000	0.131468
+4.500000	0.129518
+4.510000	0.127583
+4.520000	0.125665
+4.530000	0.123763
+4.540000	0.121878
+4.550000	0.120009
+4.560000	0.118157
+4.570000	0.116323
+4.580000	0.114505
+4.590000	0.112704
+4.600000	0.110921
+4.610000	0.109155
+4.620000	0.107406
+4.630000	0.105675
+4.640000	0.103961
+4.650000	0.102265
+4.660000	0.100586
+4.670000	0.098925
+4.680000	0.097282
+4.690000	0.095657
+4.700000	0.094049
+4.710000	0.092459
+4.720000	0.090887
+4.730000	0.089333
+4.740000	0.087796
+4.750000	0.086277
+4.760000	0.084776
+4.770000	0.083293
+4.780000	0.081828
+4.790000	0.080380
+4.800000	0.078950
+4.810000	0.077538
+4.820000	0.076143
+4.830000	0.074766
+4.840000	0.073407
+4.850000	0.072065
+4.860000	0.070740
+4.870000	0.069433
+4.880000	0.068144
+4.890000	0.066871
+4.900000	0.065616
+4.910000	0.064378
+4.920000	0.063157
+4.930000	0.061952
+4.940000	0.060765
+4.950000	0.059595
+4.960000	0.058441
+4.970000	0.057304
+4.980000	0.056183
+4.990000	0.055079
+5.000000	0.053991
+5.010000	0.052919
+5.020000	0.051864
+5.030000	0.050824
+5.040000	0.049800
+5.050000	0.048792
+5.060000	0.047800
+5.070000	0.046823
+5.080000	0.045861
+5.090000	0.044915
+5.100000	0.043984
+5.110000	0.043067
+5.120000	0.042166
+5.130000	0.041280
+5.140000	0.040408
+5.150000	0.039550
+5.160000	0.038707
+5.170000	0.037878
+5.180000	0.037063
+5.190000	0.036262
+5.200000	0.035475
+5.210000	0.034701
+5.220000	0.033941
+5.230000	0.033194
+5.240000	0.032460
+5.250000	0.031740
+5.260000	0.031032
+5.270000	0.030337
+5.280000	0.029655
+5.290000	0.028985
+5.300000	0.028327
+5.310000	0.027682
+5.320000	0.027048
+5.330000	0.026426
+5.340000	0.025817
+5.350000	0.025218
+5.360000	0.024631
+5.370000	0.024056
+5.380000	0.023491
+5.390000	0.022937
+5.400000	0.022395
+5.410000	0.021862
+5.420000	0.021341
+5.430000	0.020829
+5.440000	0.020328
+5.450000	0.019837
+5.460000	0.019356
+5.470000	0.018885
+5.480000	0.018423
+5.490000	0.017971
+5.500000	0.017528
+5.510000	0.017095
+5.520000	0.016670
+5.530000	0.016254
+5.540000	0.015848
+5.550000	0.015449
+5.560000	0.015060
+5.570000	0.014678
+5.580000	0.014305
+5.590000	0.013940
+5.600000	0.013583
+5.610000	0.013234
+5.620000	0.012892
+5.630000	0.012558
+5.640000	0.012232
+5.650000	0.011912
+5.660000	0.011600
+5.670000	0.011295
+5.680000	0.010997
+5.690000	0.010706
+5.700000	0.010421
+5.710000	0.010143
+5.720000	0.009871
+5.730000	0.009606
+5.740000	0.009347
+5.750000	0.009094
+5.760000	0.008846
+5.770000	0.008605
+5.780000	0.008370
+5.790000	0.008140
+5.800000	0.007915
+5.810000	0.007697
+5.820000	0.007483
+5.830000	0.007274
+5.840000	0.007071
+5.850000	0.006873
+5.860000	0.006679
+5.870000	0.006491
+5.880000	0.006307
+5.890000	0.006127
+5.900000	0.005953
+5.910000	0.005782
+5.920000	0.005616
+5.930000	0.005454
+5.940000	0.005296
+5.950000	0.005143
+5.960000	0.004993
+5.970000	0.004847
+5.980000	0.004705
+5.990000	0.004567
+6.000000	0.004432
+6.010000	0.004301
+6.020000	0.004173
+6.030000	0.004049
+6.040000	0.003928
+6.050000	0.003810
+6.060000	0.003695
+6.070000	0.003584
+6.080000	0.003475
+6.090000	0.003370
+6.100000	0.003267
+6.110000	0.003167
+6.120000	0.003070
+6.130000	0.002975
+6.140000	0.002884
+6.150000	0.002794
+6.160000	0.002707
+6.170000	0.002623
+6.180000	0.002541
+6.190000	0.002461
+6.200000	0.002384
+6.210000	0.002309
+6.220000	0.002236
+6.230000	0.002165
+6.240000	0.002096
+6.250000	0.002029
+6.260000	0.001964
+6.270000	0.001901
+6.280000	0.001840
+6.290000	0.001780
+6.300000	0.001723
+6.310000	0.001667
+6.320000	0.001612
+6.330000	0.001560
+6.340000	0.001508
+6.350000	0.001459
+6.360000	0.001411
+6.370000	0.001364
+6.380000	0.001319
+6.390000	0.001275
+6.400000	0.001232
+6.410000	0.001191
+6.420000	0.001151
+6.430000	0.001112
+6.440000	0.001075
+6.450000	0.001038
+6.460000	0.001003
+6.470000	0.000969
+6.480000	0.000936
+6.490000	0.000904
+6.500000	0.000873
+6.510000	0.000843
+6.520000	0.000814
+6.530000	0.000785
+6.540000	0.000758
+6.550000	0.000732
+6.560000	0.000706
+6.570000	0.000681
+6.580000	0.000657
+6.590000	0.000634
+6.600000	0.000612
+6.610000	0.000590
+6.620000	0.000569
+6.630000	0.000549
+6.640000	0.000529
+6.650000	0.000510
+6.660000	0.000492
+6.670000	0.000474
+6.680000	0.000457
+6.690000	0.000441
+6.700000	0.000425
+6.710000	0.000409
+6.720000	0.000394
+6.730000	0.000380
+6.740000	0.000366
+6.750000	0.000353
+6.760000	0.000340
+6.770000	0.000327
+6.780000	0.000315
+6.790000	0.000303
+6.800000	0.000292
+6.810000	0.000281
+6.820000	0.000271
+6.830000	0.000260
+6.840000	0.000251
+6.850000	0.000241
+6.860000	0.000232
+6.870000	0.000223
+6.880000	0.000215
+6.890000	0.000207
+6.900000	0.000199
+6.910000	0.000191
+6.920000	0.000184
+6.930000	0.000177
+6.940000	0.000170
+6.950000	0.000163
+6.960000	0.000157
+6.970000	0.000151
+6.980000	0.000145
+6.990000	0.000139
+7.000000	0.000134
+7.010000	0.000129
+7.020000	0.000124
+7.030000	0.000119
+7.040000	0.000114
+7.050000	0.000109
+7.060000	0.000105
+7.070000	0.000101
+7.080000	0.000097
+7.090000	0.000093
+7.100000	0.000089
+7.110000	0.000086
+7.120000	0.000082
+7.130000	0.000079
+7.140000	0.000076
+7.150000	0.000073
+7.160000	0.000070
+7.170000	0.000067
+7.180000	0.000064
+7.190000	0.000061
+7.200000	0.000059
+7.210000	0.000057
+7.220000	0.000054
+7.230000	0.000052
+7.240000	0.000050
+7.250000	0.000048
+7.260000	0.000046
+7.270000	0.000044
+7.280000	0.000042
+7.290000	0.000040
+7.300000	0.000039
+7.310000	0.000037
+7.320000	0.000035
+7.330000	0.000034
+7.340000	0.000032
+7.350000	0.000031
+7.360000	0.000030
+7.370000	0.000028
+7.380000	0.000027
+7.390000	0.000026
+7.400000	0.000025
+7.410000	0.000024
+7.420000	0.000023
+7.430000	0.000022
+7.440000	0.000021
+7.450000	0.000020
+7.460000	0.000019
+7.470000	0.000018
+7.480000	0.000017
+7.490000	0.000017
+7.500000	0.000016
+7.510000	0.000015
+7.520000	0.000015
+7.530000	0.000014
+7.540000	0.000013
+7.550000	0.000013
+7.560000	0.000012
+7.570000	0.000012
+7.580000	0.000011
+7.590000	0.000011
+7.600000	0.000010
+7.610000	0.000010
+7.620000	0.000009
+7.630000	0.000009
+7.640000	0.000008
+7.650000	0.000008
+7.660000	0.000008
+7.670000	0.000007
+7.680000	0.000007
+7.690000	0.000007
+7.700000	0.000006
+7.710000	0.000006
+7.720000	0.000006
+7.730000	0.000006
+7.740000	0.000005
+7.750000	0.000005
+7.760000	0.000005
+7.770000	0.000005
+7.780000	0.000004
+7.790000	0.000004
+7.800000	0.000004
+7.810000	0.000004
+7.820000	0.000004
+7.830000	0.000003
+7.840000	0.000003
+7.850000	0.000003
+7.860000	0.000003
+7.870000	0.000003
+7.880000	0.000003
+7.890000	0.000003
+7.900000	0.000002
+7.910000	0.000002
+7.920000	0.000002
+7.930000	0.000002
+7.940000	0.000002
+7.950000	0.000002
+7.960000	0.000002
+7.970000	0.000002
+7.980000	0.000002
+7.990000	0.000002
+8.000000	0.000001
+8.010000	0.000001
+8.020000	0.000001
+8.030000	0.000001
+8.040000	0.000001
+8.050000	0.000001
+8.060000	0.000001
+8.070000	0.000001
+8.080000	0.000001
+8.090000	0.000001
+8.100000	0.000001
+8.110000	0.000001
+8.120000	0.000001
+8.130000	0.000001
+8.140000	0.000001
+8.150000	0.000001
+8.160000	0.000001
+8.170000	0.000001
+8.180000	0.000001
+8.190000	0.000001
+8.200000	0.000001
+8.210000	0.000001
+8.220000	0.000000
+8.230000	0.000000
+8.240000	0.000000
+8.250000	0.000000
+8.260000	0.000000
+8.270000	0.000000
+8.280000	0.000000
+8.290000	0.000000
+8.300000	0.000000
+8.310000	0.000000
+8.320000	0.000000
+8.330000	0.000000
+8.340000	0.000000
+8.350000	0.000000
+8.360000	0.000000
+8.370000	0.000000
+8.380000	0.000000
+8.390000	0.000000
+8.400000	0.000000
+8.410000	0.000000
+8.420000	0.000000
+8.430000	0.000000
+8.440000	0.000000
+8.450000	0.000000
+8.460000	0.000000
+8.470000	0.000000
+8.480000	0.000000
+8.490000	0.000000
+8.500000	0.000000
+8.510000	0.000000
+8.520000	0.000000
+8.530000	0.000000
+8.540000	0.000000
+8.550000	0.000000
+8.560000	0.000000
+8.570000	0.000000
+8.580000	0.000000
+8.590000	0.000000
+8.600000	0.000000
+8.610000	0.000000
+8.620000	0.000000
+8.630000	0.000000
+8.640000	0.000000
+8.650000	0.000000
+8.660000	0.000000
+8.670000	0.000000
+8.680000	0.000000
+8.690000	0.000000
+8.700000	0.000000
+8.710000	0.000000
+8.720000	0.000000
+8.730000	0.000000
+8.740000	0.000000
+8.750000	0.000000
+8.760000	0.000000
+8.770000	0.000000
+8.780000	0.000000
+8.790000	0.000000
+8.800000	0.000000
+8.810000	0.000000
+8.820000	0.000000
+8.830000	0.000000
+8.840000	0.000000
+8.850000	0.000000
+8.860000	0.000000
+8.870000	0.000000
+8.880000	0.000000
+8.890000	0.000000
+8.900000	0.000000
+8.910000	0.000000
+8.920000	0.000000
+8.930000	0.000000
+8.940000	0.000000
+8.950000	0.000000
+8.960000	0.000000
+8.970000	0.000000
+8.980000	0.000000
+8.990000	0.000000
+9.000000	0.000000
+9.010000	0.000000
+9.020000	0.000000
+9.030000	0.000000
+9.040000	0.000000
+9.050000	0.000000
+9.060000	0.000000
+9.070000	0.000000
+9.080000	0.000000
+9.090000	0.000000
+9.100000	0.000000
+9.110000	0.000000
+9.120000	0.000000
+9.130000	0.000000
+9.140000	0.000000
+9.150000	0.000000
+9.160000	0.000000
+9.170000	0.000000
+9.180000	0.000000
+9.190000	0.000000
+9.200000	0.000000
+9.210000	0.000000
+9.220000	0.000000
+9.230000	0.000000
+9.240000	0.000000
+9.250000	0.000000
+9.260000	0.000000
+9.270000	0.000000
+9.280000	0.000000
+9.290000	0.000000
+9.300000	0.000000
+9.310000	0.000000
+9.320000	0.000000
+9.330000	0.000000
+9.340000	0.000000
+9.350000	0.000000
+9.360000	0.000000
+9.370000	0.000000
+9.380000	0.000000
+9.390000	0.000000
+9.400000	0.000000
+9.410000	0.000000
+9.420000	0.000000
+9.430000	0.000000
+9.440000	0.000000
+9.450000	0.000000
+9.460000	0.000000
+9.470000	0.000000
+9.480000	0.000000
+9.490000	0.000000
+9.500000	0.000000
+9.510000	0.000000
+9.520000	0.000000
+9.530000	0.000000
+9.540000	0.000000
+9.550000	0.000000
+9.560000	0.000000
+9.570000	0.000000
+9.580000	0.000000
+9.590000	0.000000
+9.600000	0.000000
+9.610000	0.000000
+9.620000	0.000000
+9.630000	0.000000
+9.640000	0.000000
+9.650000	0.000000
+9.660000	0.000000
+9.670000	0.000000
+9.680000	0.000000
+9.690000	0.000000
+9.700000	0.000000
+9.710000	0.000000
+9.720000	0.000000
+9.730000	0.000000
+9.740000	0.000000
+9.750000	0.000000
+9.760000	0.000000
+9.770000	0.000000
+9.780000	0.000000
+9.790000	0.000000
+9.800000	0.000000
+9.810000	0.000000
+9.820000	0.000000
+9.830000	0.000000
+9.840000	0.000000
+9.850000	0.000000
+9.860000	0.000000
+9.870000	0.000000
+9.880000	0.000000
+9.890000	0.000000
+9.900000	0.000000
+9.910000	0.000000
+9.920000	0.000000
+9.930000	0.000000
+9.940000	0.000000
+9.950000	0.000000
+9.960000	0.000000
+9.970000	0.000000
+9.980000	0.000000
+9.990000	0.000000
+10.000000	0.000000
+10.010000	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/normal_5_2.dat b/v0.1-M1/chi/reference-manual/distribution_plots/normal_5_2.dat
new file mode 100644
index 0000000..7052d9e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/normal_5_2.dat
@@ -0,0 +1,1014 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.008764
+0.010000	0.008874
+0.020000	0.008986
+0.030000	0.009098
+0.040000	0.009212
+0.050000	0.009326
+0.060000	0.009442
+0.070000	0.009560
+0.080000	0.009678
+0.090000	0.009798
+0.100000	0.009919
+0.110000	0.010041
+0.120000	0.010164
+0.130000	0.010289
+0.140000	0.010415
+0.150000	0.010542
+0.160000	0.010670
+0.170000	0.010800
+0.180000	0.010931
+0.190000	0.011064
+0.200000	0.011197
+0.210000	0.011332
+0.220000	0.011469
+0.230000	0.011606
+0.240000	0.011745
+0.250000	0.011886
+0.260000	0.012028
+0.270000	0.012171
+0.280000	0.012316
+0.290000	0.012462
+0.300000	0.012609
+0.310000	0.012758
+0.320000	0.012908
+0.330000	0.013060
+0.340000	0.013213
+0.350000	0.013368
+0.360000	0.013524
+0.370000	0.013682
+0.380000	0.013841
+0.390000	0.014001
+0.400000	0.014164
+0.410000	0.014327
+0.420000	0.014492
+0.430000	0.014659
+0.440000	0.014827
+0.450000	0.014997
+0.460000	0.015168
+0.470000	0.015341
+0.480000	0.015516
+0.490000	0.015692
+0.500000	0.015870
+0.510000	0.016049
+0.520000	0.016230
+0.530000	0.016413
+0.540000	0.016597
+0.550000	0.016783
+0.560000	0.016970
+0.570000	0.017160
+0.580000	0.017350
+0.590000	0.017543
+0.600000	0.017737
+0.610000	0.017933
+0.620000	0.018131
+0.630000	0.018330
+0.640000	0.018531
+0.650000	0.018734
+0.660000	0.018939
+0.670000	0.019145
+0.680000	0.019353
+0.690000	0.019563
+0.700000	0.019775
+0.710000	0.019988
+0.720000	0.020204
+0.730000	0.020421
+0.740000	0.020640
+0.750000	0.020860
+0.760000	0.021083
+0.770000	0.021307
+0.780000	0.021534
+0.790000	0.021762
+0.800000	0.021992
+0.810000	0.022224
+0.820000	0.022457
+0.830000	0.022693
+0.840000	0.022931
+0.850000	0.023170
+0.860000	0.023411
+0.870000	0.023655
+0.880000	0.023900
+0.890000	0.024147
+0.900000	0.024396
+0.910000	0.024647
+0.920000	0.024900
+0.930000	0.025155
+0.940000	0.025412
+0.950000	0.025671
+0.960000	0.025932
+0.970000	0.026195
+0.980000	0.026460
+0.990000	0.026727
+1.000000	0.026995
+1.010000	0.027266
+1.020000	0.027539
+1.030000	0.027814
+1.040000	0.028092
+1.050000	0.028371
+1.060000	0.028652
+1.070000	0.028935
+1.080000	0.029220
+1.090000	0.029508
+1.100000	0.029797
+1.110000	0.030089
+1.120000	0.030383
+1.130000	0.030678
+1.140000	0.030976
+1.150000	0.031276
+1.160000	0.031578
+1.170000	0.031882
+1.180000	0.032189
+1.190000	0.032497
+1.200000	0.032808
+1.210000	0.033121
+1.220000	0.033436
+1.230000	0.033753
+1.240000	0.034072
+1.250000	0.034393
+1.260000	0.034717
+1.270000	0.035042
+1.280000	0.035370
+1.290000	0.035700
+1.300000	0.036032
+1.310000	0.036367
+1.320000	0.036703
+1.330000	0.037042
+1.340000	0.037383
+1.350000	0.037726
+1.360000	0.038072
+1.370000	0.038419
+1.380000	0.038769
+1.390000	0.039121
+1.400000	0.039475
+1.410000	0.039831
+1.420000	0.040190
+1.430000	0.040551
+1.440000	0.040914
+1.450000	0.041279
+1.460000	0.041647
+1.470000	0.042016
+1.480000	0.042388
+1.490000	0.042762
+1.500000	0.043139
+1.510000	0.043517
+1.520000	0.043898
+1.530000	0.044281
+1.540000	0.044666
+1.550000	0.045054
+1.560000	0.045443
+1.570000	0.045835
+1.580000	0.046230
+1.590000	0.046626
+1.600000	0.047025
+1.610000	0.047425
+1.620000	0.047828
+1.630000	0.048234
+1.640000	0.048641
+1.650000	0.049051
+1.660000	0.049463
+1.670000	0.049877
+1.680000	0.050293
+1.690000	0.050712
+1.700000	0.051132
+1.710000	0.051555
+1.720000	0.051981
+1.730000	0.052408
+1.740000	0.052837
+1.750000	0.053269
+1.760000	0.053703
+1.770000	0.054139
+1.780000	0.054577
+1.790000	0.055018
+1.800000	0.055460
+1.810000	0.055905
+1.820000	0.056352
+1.830000	0.056801
+1.840000	0.057252
+1.850000	0.057706
+1.860000	0.058161
+1.870000	0.058619
+1.880000	0.059079
+1.890000	0.059541
+1.900000	0.060005
+1.910000	0.060471
+1.920000	0.060939
+1.930000	0.061409
+1.940000	0.061881
+1.950000	0.062356
+1.960000	0.062832
+1.970000	0.063311
+1.980000	0.063791
+1.990000	0.064274
+2.000000	0.064759
+2.010000	0.065245
+2.020000	0.065734
+2.030000	0.066225
+2.040000	0.066718
+2.050000	0.067212
+2.060000	0.067709
+2.070000	0.068208
+2.080000	0.068708
+2.090000	0.069211
+2.100000	0.069715
+2.110000	0.070222
+2.120000	0.070730
+2.130000	0.071240
+2.140000	0.071752
+2.150000	0.072266
+2.160000	0.072782
+2.170000	0.073300
+2.180000	0.073819
+2.190000	0.074341
+2.200000	0.074864
+2.210000	0.075389
+2.220000	0.075915
+2.230000	0.076444
+2.240000	0.076974
+2.250000	0.077506
+2.260000	0.078040
+2.270000	0.078575
+2.280000	0.079112
+2.290000	0.079651
+2.300000	0.080192
+2.310000	0.080734
+2.320000	0.081278
+2.330000	0.081823
+2.340000	0.082370
+2.350000	0.082918
+2.360000	0.083469
+2.370000	0.084020
+2.380000	0.084573
+2.390000	0.085128
+2.400000	0.085684
+2.410000	0.086242
+2.420000	0.086801
+2.430000	0.087362
+2.440000	0.087924
+2.450000	0.088487
+2.460000	0.089052
+2.470000	0.089618
+2.480000	0.090186
+2.490000	0.090754
+2.500000	0.091325
+2.510000	0.091896
+2.520000	0.092469
+2.530000	0.093043
+2.540000	0.093618
+2.550000	0.094194
+2.560000	0.094772
+2.570000	0.095350
+2.580000	0.095930
+2.590000	0.096511
+2.600000	0.097093
+2.610000	0.097676
+2.620000	0.098260
+2.630000	0.098845
+2.640000	0.099432
+2.650000	0.100019
+2.660000	0.100607
+2.670000	0.101196
+2.680000	0.101786
+2.690000	0.102376
+2.700000	0.102968
+2.710000	0.103561
+2.720000	0.104154
+2.730000	0.104748
+2.740000	0.105343
+2.750000	0.105938
+2.760000	0.106535
+2.770000	0.107132
+2.780000	0.107729
+2.790000	0.108327
+2.800000	0.108926
+2.810000	0.109525
+2.820000	0.110125
+2.830000	0.110726
+2.840000	0.111327
+2.850000	0.111928
+2.860000	0.112530
+2.870000	0.113132
+2.880000	0.113735
+2.890000	0.114338
+2.900000	0.114941
+2.910000	0.115545
+2.920000	0.116149
+2.930000	0.116753
+2.940000	0.117357
+2.950000	0.117961
+2.960000	0.118566
+2.970000	0.119171
+2.980000	0.119776
+2.990000	0.120380
+3.000000	0.120985
+3.010000	0.121590
+3.020000	0.122195
+3.030000	0.122800
+3.040000	0.123405
+3.050000	0.124009
+3.060000	0.124614
+3.070000	0.125218
+3.080000	0.125822
+3.090000	0.126426
+3.100000	0.127030
+3.110000	0.127633
+3.120000	0.128236
+3.130000	0.128838
+3.140000	0.129440
+3.150000	0.130042
+3.160000	0.130643
+3.170000	0.131244
+3.180000	0.131844
+3.190000	0.132444
+3.200000	0.133043
+3.210000	0.133641
+3.220000	0.134239
+3.230000	0.134836
+3.240000	0.135432
+3.250000	0.136027
+3.260000	0.136622
+3.270000	0.137216
+3.280000	0.137809
+3.290000	0.138401
+3.300000	0.138992
+3.310000	0.139583
+3.320000	0.140172
+3.330000	0.140760
+3.340000	0.141347
+3.350000	0.141933
+3.360000	0.142518
+3.370000	0.143102
+3.380000	0.143684
+3.390000	0.144266
+3.400000	0.144846
+3.410000	0.145425
+3.420000	0.146002
+3.430000	0.146578
+3.440000	0.147153
+3.450000	0.147726
+3.460000	0.148297
+3.470000	0.148868
+3.480000	0.149436
+3.490000	0.150003
+3.500000	0.150569
+3.510000	0.151133
+3.520000	0.151695
+3.530000	0.152255
+3.540000	0.152814
+3.550000	0.153371
+3.560000	0.153926
+3.570000	0.154479
+3.580000	0.155030
+3.590000	0.155580
+3.600000	0.156127
+3.610000	0.156672
+3.620000	0.157216
+3.630000	0.157757
+3.640000	0.158296
+3.650000	0.158834
+3.660000	0.159369
+3.670000	0.159901
+3.680000	0.160432
+3.690000	0.160960
+3.700000	0.161486
+3.710000	0.162010
+3.720000	0.162531
+3.730000	0.163050
+3.740000	0.163566
+3.750000	0.164080
+3.760000	0.164592
+3.770000	0.165101
+3.780000	0.165607
+3.790000	0.166111
+3.800000	0.166612
+3.810000	0.167111
+3.820000	0.167607
+3.830000	0.168100
+3.840000	0.168590
+3.850000	0.169077
+3.860000	0.169562
+3.870000	0.170044
+3.880000	0.170523
+3.890000	0.170999
+3.900000	0.171472
+3.910000	0.171942
+3.920000	0.172409
+3.930000	0.172873
+3.940000	0.173334
+3.950000	0.173792
+3.960000	0.174246
+3.970000	0.174698
+3.980000	0.175146
+3.990000	0.175591
+4.000000	0.176033
+4.010000	0.176471
+4.020000	0.176906
+4.030000	0.177338
+4.040000	0.177766
+4.050000	0.178191
+4.060000	0.178613
+4.070000	0.179031
+4.080000	0.179445
+4.090000	0.179856
+4.100000	0.180263
+4.110000	0.180667
+4.120000	0.181067
+4.130000	0.181464
+4.140000	0.181857
+4.150000	0.182246
+4.160000	0.182631
+4.170000	0.183013
+4.180000	0.183391
+4.190000	0.183765
+4.200000	0.184135
+4.210000	0.184501
+4.220000	0.184864
+4.230000	0.185222
+4.240000	0.185577
+4.250000	0.185928
+4.260000	0.186274
+4.270000	0.186617
+4.280000	0.186955
+4.290000	0.187290
+4.300000	0.187620
+4.310000	0.187946
+4.320000	0.188269
+4.330000	0.188587
+4.340000	0.188900
+4.350000	0.189210
+4.360000	0.189515
+4.370000	0.189816
+4.380000	0.190113
+4.390000	0.190406
+4.400000	0.190694
+4.410000	0.190978
+4.420000	0.191257
+4.430000	0.191532
+4.440000	0.191803
+4.450000	0.192069
+4.460000	0.192331
+4.470000	0.192589
+4.480000	0.192842
+4.490000	0.193090
+4.500000	0.193334
+4.510000	0.193573
+4.520000	0.193808
+4.530000	0.194039
+4.540000	0.194264
+4.550000	0.194485
+4.560000	0.194702
+4.570000	0.194914
+4.580000	0.195121
+4.590000	0.195323
+4.600000	0.195521
+4.610000	0.195715
+4.620000	0.195903
+4.630000	0.196087
+4.640000	0.196266
+4.650000	0.196440
+4.660000	0.196610
+4.670000	0.196774
+4.680000	0.196934
+4.690000	0.197089
+4.700000	0.197240
+4.710000	0.197385
+4.720000	0.197526
+4.730000	0.197662
+4.740000	0.197793
+4.750000	0.197919
+4.760000	0.198040
+4.770000	0.198156
+4.780000	0.198268
+4.790000	0.198375
+4.800000	0.198476
+4.810000	0.198573
+4.820000	0.198665
+4.830000	0.198752
+4.840000	0.198834
+4.850000	0.198911
+4.860000	0.198983
+4.870000	0.199050
+4.880000	0.199112
+4.890000	0.199170
+4.900000	0.199222
+4.910000	0.199269
+4.920000	0.199312
+4.930000	0.199349
+4.940000	0.199381
+4.950000	0.199409
+4.960000	0.199431
+4.970000	0.199449
+4.980000	0.199461
+4.990000	0.199469
+5.000000	0.199471
+5.010000	0.199469
+5.020000	0.199461
+5.030000	0.199449
+5.040000	0.199431
+5.050000	0.199409
+5.060000	0.199381
+5.070000	0.199349
+5.080000	0.199312
+5.090000	0.199269
+5.100000	0.199222
+5.110000	0.199170
+5.120000	0.199112
+5.130000	0.199050
+5.140000	0.198983
+5.150000	0.198911
+5.160000	0.198834
+5.170000	0.198752
+5.180000	0.198665
+5.190000	0.198573
+5.200000	0.198476
+5.210000	0.198375
+5.220000	0.198268
+5.230000	0.198156
+5.240000	0.198040
+5.250000	0.197919
+5.260000	0.197793
+5.270000	0.197662
+5.280000	0.197526
+5.290000	0.197385
+5.300000	0.197240
+5.310000	0.197089
+5.320000	0.196934
+5.330000	0.196774
+5.340000	0.196610
+5.350000	0.196440
+5.360000	0.196266
+5.370000	0.196087
+5.380000	0.195903
+5.390000	0.195715
+5.400000	0.195521
+5.410000	0.195323
+5.420000	0.195121
+5.430000	0.194914
+5.440000	0.194702
+5.450000	0.194485
+5.460000	0.194264
+5.470000	0.194039
+5.480000	0.193808
+5.490000	0.193573
+5.500000	0.193334
+5.510000	0.193090
+5.520000	0.192842
+5.530000	0.192589
+5.540000	0.192331
+5.550000	0.192069
+5.560000	0.191803
+5.570000	0.191532
+5.580000	0.191257
+5.590000	0.190978
+5.600000	0.190694
+5.610000	0.190406
+5.620000	0.190113
+5.630000	0.189816
+5.640000	0.189515
+5.650000	0.189210
+5.660000	0.188900
+5.670000	0.188587
+5.680000	0.188269
+5.690000	0.187946
+5.700000	0.187620
+5.710000	0.187290
+5.720000	0.186955
+5.730000	0.186617
+5.740000	0.186274
+5.750000	0.185928
+5.760000	0.185577
+5.770000	0.185222
+5.780000	0.184864
+5.790000	0.184501
+5.800000	0.184135
+5.810000	0.183765
+5.820000	0.183391
+5.830000	0.183013
+5.840000	0.182631
+5.850000	0.182246
+5.860000	0.181857
+5.870000	0.181464
+5.880000	0.181067
+5.890000	0.180667
+5.900000	0.180263
+5.910000	0.179856
+5.920000	0.179445
+5.930000	0.179031
+5.940000	0.178613
+5.950000	0.178191
+5.960000	0.177766
+5.970000	0.177338
+5.980000	0.176906
+5.990000	0.176471
+6.000000	0.176033
+6.010000	0.175591
+6.020000	0.175146
+6.030000	0.174698
+6.040000	0.174246
+6.050000	0.173792
+6.060000	0.173334
+6.070000	0.172873
+6.080000	0.172409
+6.090000	0.171942
+6.100000	0.171472
+6.110000	0.170999
+6.120000	0.170523
+6.130000	0.170044
+6.140000	0.169562
+6.150000	0.169077
+6.160000	0.168590
+6.170000	0.168100
+6.180000	0.167607
+6.190000	0.167111
+6.200000	0.166612
+6.210000	0.166111
+6.220000	0.165607
+6.230000	0.165101
+6.240000	0.164592
+6.250000	0.164080
+6.260000	0.163566
+6.270000	0.163050
+6.280000	0.162531
+6.290000	0.162010
+6.300000	0.161486
+6.310000	0.160960
+6.320000	0.160432
+6.330000	0.159901
+6.340000	0.159369
+6.350000	0.158834
+6.360000	0.158296
+6.370000	0.157757
+6.380000	0.157216
+6.390000	0.156672
+6.400000	0.156127
+6.410000	0.155580
+6.420000	0.155030
+6.430000	0.154479
+6.440000	0.153926
+6.450000	0.153371
+6.460000	0.152814
+6.470000	0.152255
+6.480000	0.151695
+6.490000	0.151133
+6.500000	0.150569
+6.510000	0.150003
+6.520000	0.149436
+6.530000	0.148868
+6.540000	0.148297
+6.550000	0.147726
+6.560000	0.147153
+6.570000	0.146578
+6.580000	0.146002
+6.590000	0.145425
+6.600000	0.144846
+6.610000	0.144266
+6.620000	0.143684
+6.630000	0.143102
+6.640000	0.142518
+6.650000	0.141933
+6.660000	0.141347
+6.670000	0.140760
+6.680000	0.140172
+6.690000	0.139583
+6.700000	0.138992
+6.710000	0.138401
+6.720000	0.137809
+6.730000	0.137216
+6.740000	0.136622
+6.750000	0.136027
+6.760000	0.135432
+6.770000	0.134836
+6.780000	0.134239
+6.790000	0.133641
+6.800000	0.133043
+6.810000	0.132444
+6.820000	0.131844
+6.830000	0.131244
+6.840000	0.130643
+6.850000	0.130042
+6.860000	0.129440
+6.870000	0.128838
+6.880000	0.128236
+6.890000	0.127633
+6.900000	0.127030
+6.910000	0.126426
+6.920000	0.125822
+6.930000	0.125218
+6.940000	0.124614
+6.950000	0.124009
+6.960000	0.123405
+6.970000	0.122800
+6.980000	0.122195
+6.990000	0.121590
+7.000000	0.120985
+7.010000	0.120380
+7.020000	0.119776
+7.030000	0.119171
+7.040000	0.118566
+7.050000	0.117961
+7.060000	0.117357
+7.070000	0.116753
+7.080000	0.116149
+7.090000	0.115545
+7.100000	0.114941
+7.110000	0.114338
+7.120000	0.113735
+7.130000	0.113132
+7.140000	0.112530
+7.150000	0.111928
+7.160000	0.111327
+7.170000	0.110726
+7.180000	0.110125
+7.190000	0.109525
+7.200000	0.108926
+7.210000	0.108327
+7.220000	0.107729
+7.230000	0.107132
+7.240000	0.106535
+7.250000	0.105938
+7.260000	0.105343
+7.270000	0.104748
+7.280000	0.104154
+7.290000	0.103561
+7.300000	0.102968
+7.310000	0.102376
+7.320000	0.101786
+7.330000	0.101196
+7.340000	0.100607
+7.350000	0.100019
+7.360000	0.099432
+7.370000	0.098845
+7.380000	0.098260
+7.390000	0.097676
+7.400000	0.097093
+7.410000	0.096511
+7.420000	0.095930
+7.430000	0.095350
+7.440000	0.094772
+7.450000	0.094194
+7.460000	0.093618
+7.470000	0.093043
+7.480000	0.092469
+7.490000	0.091896
+7.500000	0.091325
+7.510000	0.090754
+7.520000	0.090186
+7.530000	0.089618
+7.540000	0.089052
+7.550000	0.088487
+7.560000	0.087924
+7.570000	0.087362
+7.580000	0.086801
+7.590000	0.086242
+7.600000	0.085684
+7.610000	0.085128
+7.620000	0.084573
+7.630000	0.084020
+7.640000	0.083469
+7.650000	0.082918
+7.660000	0.082370
+7.670000	0.081823
+7.680000	0.081278
+7.690000	0.080734
+7.700000	0.080192
+7.710000	0.079651
+7.720000	0.079112
+7.730000	0.078575
+7.740000	0.078040
+7.750000	0.077506
+7.760000	0.076974
+7.770000	0.076444
+7.780000	0.075915
+7.790000	0.075389
+7.800000	0.074864
+7.810000	0.074341
+7.820000	0.073819
+7.830000	0.073300
+7.840000	0.072782
+7.850000	0.072266
+7.860000	0.071752
+7.870000	0.071240
+7.880000	0.070730
+7.890000	0.070222
+7.900000	0.069715
+7.910000	0.069211
+7.920000	0.068708
+7.930000	0.068208
+7.940000	0.067709
+7.950000	0.067212
+7.960000	0.066718
+7.970000	0.066225
+7.980000	0.065734
+7.990000	0.065245
+8.000000	0.064759
+8.010000	0.064274
+8.020000	0.063791
+8.030000	0.063311
+8.040000	0.062832
+8.050000	0.062356
+8.060000	0.061881
+8.070000	0.061409
+8.080000	0.060939
+8.090000	0.060471
+8.100000	0.060005
+8.110000	0.059541
+8.120000	0.059079
+8.130000	0.058619
+8.140000	0.058161
+8.150000	0.057706
+8.160000	0.057252
+8.170000	0.056801
+8.180000	0.056352
+8.190000	0.055905
+8.200000	0.055460
+8.210000	0.055018
+8.220000	0.054577
+8.230000	0.054139
+8.240000	0.053703
+8.250000	0.053269
+8.260000	0.052837
+8.270000	0.052408
+8.280000	0.051981
+8.290000	0.051555
+8.300000	0.051132
+8.310000	0.050712
+8.320000	0.050293
+8.330000	0.049877
+8.340000	0.049463
+8.350000	0.049051
+8.360000	0.048641
+8.370000	0.048234
+8.380000	0.047828
+8.390000	0.047425
+8.400000	0.047025
+8.410000	0.046626
+8.420000	0.046230
+8.430000	0.045835
+8.440000	0.045443
+8.450000	0.045054
+8.460000	0.044666
+8.470000	0.044281
+8.480000	0.043898
+8.490000	0.043517
+8.500000	0.043139
+8.510000	0.042762
+8.520000	0.042388
+8.530000	0.042016
+8.540000	0.041647
+8.550000	0.041279
+8.560000	0.040914
+8.570000	0.040551
+8.580000	0.040190
+8.590000	0.039831
+8.600000	0.039475
+8.610000	0.039121
+8.620000	0.038769
+8.630000	0.038419
+8.640000	0.038072
+8.650000	0.037726
+8.660000	0.037383
+8.670000	0.037042
+8.680000	0.036703
+8.690000	0.036367
+8.700000	0.036032
+8.710000	0.035700
+8.720000	0.035370
+8.730000	0.035042
+8.740000	0.034717
+8.750000	0.034393
+8.760000	0.034072
+8.770000	0.033753
+8.780000	0.033436
+8.790000	0.033121
+8.800000	0.032808
+8.810000	0.032497
+8.820000	0.032189
+8.830000	0.031882
+8.840000	0.031578
+8.850000	0.031276
+8.860000	0.030976
+8.870000	0.030678
+8.880000	0.030383
+8.890000	0.030089
+8.900000	0.029797
+8.910000	0.029508
+8.920000	0.029220
+8.930000	0.028935
+8.940000	0.028652
+8.950000	0.028371
+8.960000	0.028092
+8.970000	0.027814
+8.980000	0.027539
+8.990000	0.027266
+9.000000	0.026995
+9.010000	0.026727
+9.020000	0.026460
+9.030000	0.026195
+9.040000	0.025932
+9.050000	0.025671
+9.060000	0.025412
+9.070000	0.025155
+9.080000	0.024900
+9.090000	0.024647
+9.100000	0.024396
+9.110000	0.024147
+9.120000	0.023900
+9.130000	0.023655
+9.140000	0.023411
+9.150000	0.023170
+9.160000	0.022931
+9.170000	0.022693
+9.180000	0.022457
+9.190000	0.022224
+9.200000	0.021992
+9.210000	0.021762
+9.220000	0.021534
+9.230000	0.021307
+9.240000	0.021083
+9.250000	0.020860
+9.260000	0.020640
+9.270000	0.020421
+9.280000	0.020204
+9.290000	0.019988
+9.300000	0.019775
+9.310000	0.019563
+9.320000	0.019353
+9.330000	0.019145
+9.340000	0.018939
+9.350000	0.018734
+9.360000	0.018531
+9.370000	0.018330
+9.380000	0.018131
+9.390000	0.017933
+9.400000	0.017737
+9.410000	0.017543
+9.420000	0.017350
+9.430000	0.017160
+9.440000	0.016970
+9.450000	0.016783
+9.460000	0.016597
+9.470000	0.016413
+9.480000	0.016230
+9.490000	0.016049
+9.500000	0.015870
+9.510000	0.015692
+9.520000	0.015516
+9.530000	0.015341
+9.540000	0.015168
+9.550000	0.014997
+9.560000	0.014827
+9.570000	0.014659
+9.580000	0.014492
+9.590000	0.014327
+9.600000	0.014164
+9.610000	0.014001
+9.620000	0.013841
+9.630000	0.013682
+9.640000	0.013524
+9.650000	0.013368
+9.660000	0.013213
+9.670000	0.013060
+9.680000	0.012908
+9.690000	0.012758
+9.700000	0.012609
+9.710000	0.012462
+9.720000	0.012316
+9.730000	0.012171
+9.740000	0.012028
+9.750000	0.011886
+9.760000	0.011745
+9.770000	0.011606
+9.780000	0.011469
+9.790000	0.011332
+9.800000	0.011197
+9.810000	0.011064
+9.820000	0.010931
+9.830000	0.010800
+9.840000	0.010670
+9.850000	0.010542
+9.860000	0.010415
+9.870000	0.010289
+9.880000	0.010164
+9.890000	0.010041
+9.900000	0.009919
+9.910000	0.009798
+9.920000	0.009678
+9.930000	0.009560
+9.940000	0.009442
+9.950000	0.009326
+9.960000	0.009212
+9.970000	0.009098
+9.980000	0.008986
+9.990000	0.008874
+10.000000	0.008764
+10.010000	0.008655
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/poisson.plt b/v0.1-M1/chi/reference-manual/distribution_plots/poisson.plt
new file mode 100644
index 0000000..beea162
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/poisson.plt
@@ -0,0 +1,29 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:10]
+set yrange [0:0.22]
+set xlabel "x"
+set ylabel "poisson(real lambda)"
+#set samples 2000
+set output "poisson.svg"
+set nokey
+set label "poisson(4.0)" at 4.4, 0.18
+set label "poisson(10.0)" at 11.5, 0.11
+set style data impulses
+plot "poisson_4.0.dat" using 1:2 with impulses linetype 1, \
+     "poisson_4.0.dat" using 1:2 with points linetype 1, \
+     "poisson_10.0.dat" using 1:2 with impulses linetype 2, \
+     "poisson_10.0.dat" using 1:2 with points linetype 2
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/poisson.svg b/v0.1-M1/chi/reference-manual/distribution_plots/poisson.svg
new file mode 100644
index 0000000..aaebf95
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/poisson.svg
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg 
+ width="600" height="480"
+ viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>Gnuplot</title>
+<desc>Produced by GNUPLOT 5.2 patchlevel 2 </desc>
+
+<g id="gnuplot_canvas">
+
+<rect x="0" y="0" width="600" height="480" fill="none"/>
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+	<path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
+	<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
+	<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
+	  <feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
+	  <feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
+	</filter>
+	<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
+	  <feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
+	  <feComposite in='SourceGraphic' in2='grey' operator='atop'/>
+	</filter>
+</defs>
+<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,422.4 L89.2,422.4 M575.0,422.4 L566.0,422.4  '/>	<g transform="translate(71.9,426.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="end">
+		<text><tspan font-family="Arial" > 0</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,330.5 L89.2,330.5 M575.0,330.5 L566.0,330.5  '/>	<g transform="translate(71.9,334.4)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="end">
+		<text><tspan font-family="Arial" > 0.05</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,238.6 L89.2,238.6 M575.0,238.6 L566.0,238.6  '/>	<g transform="translate(71.9,242.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="end">
+		<text><tspan font-family="Arial" > 0.1</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,146.7 L89.2,146.7 M575.0,146.7 L566.0,146.7  '/>	<g transform="translate(71.9,150.6)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="end">
+		<text><tspan font-family="Arial" > 0.15</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,54.9 L89.2,54.9 M575.0,54.9 L566.0,54.9  '/>	<g transform="translate(71.9,58.8)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="end">
+		<text><tspan font-family="Arial" > 0.2</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,422.4 L80.2,413.4 M80.2,18.1 L80.2,27.1  '/>	<g transform="translate(80.2,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 0</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M129.7,422.4 L129.7,413.4 M129.7,18.1 L129.7,27.1  '/>	<g transform="translate(129.7,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 2</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M179.2,422.4 L179.2,413.4 M179.2,18.1 L179.2,27.1  '/>	<g transform="translate(179.2,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 4</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M228.6,422.4 L228.6,413.4 M228.6,18.1 L228.6,27.1  '/>	<g transform="translate(228.6,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 6</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M278.1,422.4 L278.1,413.4 M278.1,18.1 L278.1,27.1  '/>	<g transform="translate(278.1,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 8</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M327.6,422.4 L327.6,413.4 M327.6,18.1 L327.6,27.1  '/>	<g transform="translate(327.6,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 10</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M377.1,422.4 L377.1,413.4 M377.1,18.1 L377.1,27.1  '/>	<g transform="translate(377.1,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 12</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M426.6,422.4 L426.6,413.4 M426.6,18.1 L426.6,27.1  '/>	<g transform="translate(426.6,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 14</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M476.0,422.4 L476.0,413.4 M476.0,18.1 L476.0,27.1  '/>	<g transform="translate(476.0,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 16</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M525.5,422.4 L525.5,413.4 M525.5,18.1 L525.5,27.1  '/>	<g transform="translate(525.5,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 18</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M575.0,422.4 L575.0,413.4 M575.0,18.1 L575.0,27.1  '/>	<g transform="translate(575.0,444.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" > 20</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,18.1 L80.2,422.4 L575.0,422.4 L575.0,18.1 L80.2,18.1 Z  '/>	<g transform="translate(189.1,95.5)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="start">
+		<text><tspan font-family="Arial" >poisson(4.0)</tspan></text>
+	</g>
+	<g transform="translate(364.7,224.1)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="start">
+		<text><tspan font-family="Arial" >poisson(10.0)</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<g transform="translate(16.3,220.3) rotate(270)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" >poisson(real lambda)</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<g transform="translate(327.6,471.3)" stroke="none" fill="black" font-family="Arial" font-size="12.00"  text-anchor="middle">
+		<text><tspan font-family="Arial" >x</tspan></text>
+	</g>
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+	<g id="gnuplot_plot_1" ><title>"poisson_4.0.dat" using 1:2</title>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='rgb(148,   0, 211)'  d='M80.2,422.4 L80.2,388.7 M104.9,422.4 L104.9,287.8 M129.7,422.4 L129.7,153.1 M154.4,422.4 L154.4,63.4
+		M179.2,422.4 L179.2,63.4 M203.9,422.4 L203.9,135.2 M228.6,422.4 L228.6,230.9 M253.4,422.4 L253.4,313.0
+		M278.1,422.4 L278.1,367.7 M302.9,422.4 L302.9,398.1 M327.6,422.4 L327.6,412.7 M352.3,422.4 L352.3,418.9
+		M377.1,422.4 L377.1,421.2 M401.8,422.4 L401.8,422.0 M426.6,422.4 L426.6,422.3 M451.3,422.4 M476.0,422.4
+		M500.8,422.4 M525.5,422.4 M550.3,422.4  '/></g>
+	</g>
+	<g id="gnuplot_plot_2" ><title>"poisson_4.0.dat" using 1:2</title>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<use xlink:href='#gpPt0' transform='translate(80.2,388.7) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(104.9,287.8) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(129.7,153.1) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(154.4,63.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(179.2,63.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(203.9,135.2) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(228.6,230.9) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(253.4,313.0) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(278.1,367.7) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(302.9,398.1) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(327.6,412.7) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(352.3,418.9) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(377.1,421.2) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(401.8,422.0) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(426.6,422.3) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(451.3,422.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(476.0,422.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(500.8,422.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(525.5,422.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+	<use xlink:href='#gpPt0' transform='translate(550.3,422.4) scale(4.50)' color='rgb(148,   0, 211)'/>
+</g>
+	</g>
+	<g id="gnuplot_plot_3" ><title>"poisson_10.0.dat" using 1:2</title>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='rgb(  0, 158, 115)'  d='M80.2,422.4 L80.2,422.3 M104.9,422.4 L104.9,421.6 M129.7,422.4 L129.7,418.2 M154.4,422.4 L154.4,408.5
+		M179.2,422.4 L179.2,387.6 M203.9,422.4 L203.9,352.9 M228.6,422.4 L228.6,306.5 M253.4,422.4 L253.4,256.9
+		M278.1,422.4 L278.1,215.5 M302.9,422.4 L302.9,192.5 M327.6,422.4 L327.6,192.5 M352.3,422.4 L352.3,213.4
+		M377.1,422.4 L377.1,248.2 M401.8,422.4 L401.8,288.4 M426.6,422.4 L426.6,326.7 M451.3,422.4 L451.3,358.6
+		M476.0,422.4 L476.0,382.5 M500.8,422.4 L500.8,398.9 M525.5,422.4 L525.5,409.4 M550.3,422.4 L550.3,415.5
+		 '/></g>
+	</g>
+	<g id="gnuplot_plot_4" ><title>"poisson_10.0.dat" using 1:2</title>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<use xlink:href='#gpPt1' transform='translate(80.2,422.3) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(104.9,421.6) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(129.7,418.2) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(154.4,408.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(179.2,387.6) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(203.9,352.9) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(228.6,306.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(253.4,256.9) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(278.1,215.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(302.9,192.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(327.6,192.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(352.3,213.4) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(377.1,248.2) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(401.8,288.4) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(426.6,326.7) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(451.3,358.6) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(476.0,382.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(500.8,398.9) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(525.5,409.4) scale(4.50)' color='rgb(  0, 158, 115)'/>
+	<use xlink:href='#gpPt1' transform='translate(550.3,415.5) scale(4.50)' color='rgb(  0, 158, 115)'/>
+</g>
+	</g>
+<g fill="none" color="white" stroke="rgb(  0, 158, 115)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+	<path stroke='black'  d='M80.2,18.1 L80.2,422.4 L575.0,422.4 L575.0,18.1 L80.2,18.1 Z  '/></g>
+<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
+</g>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/poisson_10.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/poisson_10.0.dat
new file mode 100644
index 0000000..a308422
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/poisson_10.0.dat
@@ -0,0 +1,32 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.000045
+1	0.000454
+2	0.002270
+3	0.007567
+4	0.018917
+5	0.037833
+6	0.063055
+7	0.090079
+8	0.112599
+9	0.125110
+10	0.125110
+11	0.113736
+12	0.094780
+13	0.072908
+14	0.052077
+15	0.034718
+16	0.021699
+17	0.012764
+18	0.007091
+19	0.003732
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/poisson_4.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/poisson_4.0.dat
new file mode 100644
index 0000000..8ef210d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/poisson_4.0.dat
@@ -0,0 +1,32 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0	0.018316
+1	0.073263
+2	0.146525
+3	0.195367
+4	0.195367
+5	0.156293
+6	0.104196
+7	0.059540
+8	0.029770
+9	0.013231
+10	0.005292
+11	0.001925
+12	0.000642
+13	0.000197
+14	0.000056
+15	0.000015
+16	0.000004
+17	0.000001
+18	0.000000
+19	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/triangle.plt b/v0.1-M1/chi/reference-manual/distribution_plots/triangle.plt
new file mode 100644
index 0000000..69a12f2
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/triangle.plt
@@ -0,0 +1,25 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+set xrange [0:5]
+set yrange [0:0.9]
+set xlabel "x"
+set ylabel "triangle(real a, b, c)"
+#set samples 2000
+set output "triangle.svg"
+set nokey
+set label "triangle(1.0, 2.0, 4.0)" at 2.5, 0.55
+set style data lines
+plot "triangle_1_2_4.dat" using 1:2 linetype 1
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/triangle.svg b/v0.1-M1/chi/reference-manual/distribution_plots/triangle.svg
new file mode 100644
index 0000000..3437a62
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/triangle.svg
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,377.3 L80.9,377.3 M575.0,377.3 L566.0,377.3 '></path>
+	<g transform="translate(63.6,381.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.1</text>
+	</g>
+	<path  d='M71.9,332.2 L80.9,332.2 M575.0,332.2 L566.0,332.2 '></path>
+	<g transform="translate(63.6,336.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.2</text>
+	</g>
+	<path  d='M71.9,287.2 L80.9,287.2 M575.0,287.2 L566.0,287.2 '></path>
+	<g transform="translate(63.6,291.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.3</text>
+	</g>
+	<path  d='M71.9,242.1 L80.9,242.1 M575.0,242.1 L566.0,242.1 '></path>
+	<g transform="translate(63.6,246.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.4</text>
+	</g>
+	<path  d='M71.9,197.0 L80.9,197.0 M575.0,197.0 L566.0,197.0 '></path>
+	<g transform="translate(63.6,201.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+	<path  d='M71.9,151.9 L80.9,151.9 M575.0,151.9 L566.0,151.9 '></path>
+	<g transform="translate(63.6,156.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.6</text>
+	</g>
+	<path  d='M71.9,106.9 L80.9,106.9 M575.0,106.9 L566.0,106.9 '></path>
+	<g transform="translate(63.6,111.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.7</text>
+	</g>
+	<path  d='M71.9,61.8 L80.9,61.8 M575.0,61.8 L566.0,61.8 '></path>
+	<g transform="translate(63.6,66.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.8</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.9</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M172.5,422.4 L172.5,413.4 M172.5,16.7 L172.5,25.7 '></path>
+	<g transform="translate(172.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M273.1,422.4 L273.1,413.4 M273.1,16.7 L273.1,25.7 '></path>
+	<g transform="translate(273.1,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M373.8,422.4 L373.8,413.4 M373.8,16.7 L373.8,25.7 '></path>
+	<g transform="translate(373.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M474.4,422.4 L474.4,413.4 M474.4,16.7 L474.4,25.7 '></path>
+	<g transform="translate(474.4,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 4</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 5</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>triangle(real a, b, c)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(323.5,179.0)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>triangle(1.0, 2.0, 4.0)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M172.5,422.4 L173.5,419.4 L174.5,416.4 L175.5,413.4 L176.5,410.4 L177.6,407.4 L178.6,404.4 L179.6,401.4 
+		L180.6,398.4 L181.6,395.4 L182.6,392.3 L183.6,389.3 L184.6,386.3 L185.6,383.3 L186.6,380.3 L187.6,377.3 
+		L188.6,374.3 L189.6,371.3 L190.6,368.3 L191.6,365.3 L192.6,362.3 L193.7,359.3 L194.7,356.3 L195.7,353.3 
+		L196.7,350.3 L197.7,347.3 L198.7,344.3 L199.7,341.3 L200.7,338.3 L201.7,335.2 L202.7,332.2 L203.7,329.2 
+		L204.7,326.2 L205.7,323.2 L206.7,320.2 L207.7,317.2 L208.7,314.2 L209.7,311.2 L210.8,308.2 L211.8,305.2 
+		L212.8,302.2 L213.8,299.2 L214.8,296.2 L215.8,293.2 L216.8,290.2 L217.8,287.2 L218.8,284.2 L219.8,281.2 
+		L220.8,278.2 L221.8,275.1 L222.8,272.1 L223.8,269.1 L224.8,266.1 L225.8,263.1 L226.9,260.1 L227.9,257.1 
+		L228.9,254.1 L229.9,251.1 L230.9,248.1 L231.9,245.1 L232.9,242.1 L233.9,239.1 L234.9,236.1 L235.9,233.1 
+		L236.9,230.1 L237.9,227.1 L238.9,224.1 L239.9,221.1 L240.9,218.0 L241.9,215.0 L243.0,212.0 L244.0,209.0 
+		L245.0,206.0 L246.0,203.0 L247.0,200.0 L248.0,197.0 L249.0,194.0 L250.0,191.0 L251.0,188.0 L252.0,185.0 
+		L253.0,182.0 L254.0,179.0 L255.0,176.0 L256.0,173.0 L257.0,170.0 L258.0,167.0 L259.1,164.0 L260.1,160.9 
+		L261.1,157.9 L262.1,154.9 L263.1,151.9 L264.1,148.9 L265.1,145.9 L266.1,142.9 L267.1,139.9 L268.1,136.9 
+		L269.1,133.9 L270.1,130.9 L271.1,127.9 L272.1,124.9 L273.1,121.9 L274.1,123.4 L275.2,124.9 L276.2,126.4 
+		L277.2,127.9 L278.2,129.4 L279.2,130.9 L280.2,132.4 L281.2,133.9 L282.2,135.4 L283.2,136.9 L284.2,138.4 
+		L285.2,139.9 L286.2,141.4 L287.2,142.9 L288.2,144.4 L289.2,145.9 L290.2,147.4 L291.3,148.9 L292.3,150.4 
+		L293.3,151.9 L294.3,153.4 L295.3,154.9 L296.3,156.4 L297.3,157.9 L298.3,159.4 L299.3,160.9 L300.3,162.5 
+		L301.3,164.0 L302.3,165.5 L303.3,167.0 L304.3,168.5 L305.3,170.0 L306.3,171.5 L307.4,173.0 L308.4,174.5 
+		L309.4,176.0 L310.4,177.5 L311.4,179.0 L312.4,180.5 L313.4,182.0 L314.4,183.5 L315.4,185.0 L316.4,186.5 
+		L317.4,188.0 L318.4,189.5 L319.4,191.0 L320.4,192.5 L321.4,194.0 L322.4,195.5 L323.5,197.0 L324.5,198.5 
+		L325.5,200.0 L326.5,201.5 L327.5,203.0 L328.5,204.5 L329.5,206.0 L330.5,207.5 L331.5,209.0 L332.5,210.5 
+		L333.5,212.0 L334.5,213.5 L335.5,215.0 L336.5,216.5 L337.5,218.0 L338.5,219.6 L339.5,221.1 L340.6,222.6 
+		L341.6,224.1 L342.6,225.6 L343.6,227.1 L344.6,228.6 L345.6,230.1 L346.6,231.6 L347.6,233.1 L348.6,234.6 
+		L349.6,236.1 L350.6,237.6 L351.6,239.1 L352.6,240.6 L353.6,242.1 L354.6,243.6 L355.6,245.1 L356.7,246.6 
+		L357.7,248.1 L358.7,249.6 L359.7,251.1 L360.7,252.6 L361.7,254.1 L362.7,255.6 L363.7,257.1 L364.7,258.6 
+		L365.7,260.1 L366.7,261.6 L367.7,263.1 L368.7,264.6 L369.7,266.1 L370.7,267.6 L371.7,269.1 L372.8,270.6 
+		L373.8,272.1 L374.8,273.6 L375.8,275.1 L376.8,276.6 L377.8,278.2 L378.8,279.7 L379.8,281.2 L380.8,282.7 
+		L381.8,284.2 L382.8,285.7 L383.8,287.2 L384.8,288.7 L385.8,290.2 L386.8,291.7 L387.8,293.2 L388.9,294.7 
+		L389.9,296.2 L390.9,297.7 L391.9,299.2 L392.9,300.7 L393.9,302.2 L394.9,303.7 L395.9,305.2 L396.9,306.7 
+		L397.9,308.2 L398.9,309.7 L399.9,311.2 L400.9,312.7 L401.9,314.2 L402.9,315.7 L403.9,317.2 L405.0,318.7 
+		L406.0,320.2 L407.0,321.7 L408.0,323.2 L409.0,324.7 L410.0,326.2 L411.0,327.7 L412.0,329.2 L413.0,330.7 
+		L414.0,332.2 L415.0,333.7 L416.0,335.2 L417.0,336.8 L418.0,338.3 L419.0,339.8 L420.0,341.3 L421.1,342.8 
+		L422.1,344.3 L423.1,345.8 L424.1,347.3 L425.1,348.8 L426.1,350.3 L427.1,351.8 L428.1,353.3 L429.1,354.8 
+		L430.1,356.3 L431.1,357.8 L432.1,359.3 L433.1,360.8 L434.1,362.3 L435.1,363.8 L436.1,365.3 L437.2,366.8 
+		L438.2,368.3 L439.2,369.8 L440.2,371.3 L441.2,372.8 L442.2,374.3 L443.2,375.8 L444.2,377.3 L445.2,378.8 
+		L446.2,380.3 L447.2,381.8 L448.2,383.3 L449.2,384.8 L450.2,386.3 L451.2,387.8 L452.2,389.3 L453.2,390.8 
+		L454.3,392.3 L455.3,393.9 L456.3,395.4 L457.3,396.9 L458.3,398.4 L459.3,399.9 L460.3,401.4 L461.3,402.9 
+		L462.3,404.4 L463.3,405.9 L464.3,407.4 L465.3,408.9 L466.3,410.4 L467.3,411.9 L468.3,413.4 L469.3,414.9 
+		L470.4,416.4 L471.4,417.9 L472.4,419.4 L473.4,420.9 L474.4,422.4 L475.4,422.4 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/triangle_1_2_4.dat b/v0.1-M1/chi/reference-manual/distribution_plots/triangle_1_2_4.dat
new file mode 100644
index 0000000..c569178
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/triangle_1_2_4.dat
@@ -0,0 +1,314 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+1.000000	0.000000
+1.010000	0.006667
+1.020000	0.013333
+1.030000	0.020000
+1.040000	0.026667
+1.050000	0.033333
+1.060000	0.040000
+1.070000	0.046667
+1.080000	0.053333
+1.090000	0.060000
+1.100000	0.066667
+1.110000	0.073333
+1.120000	0.080000
+1.130000	0.086667
+1.140000	0.093333
+1.150000	0.100000
+1.160000	0.106667
+1.170000	0.113333
+1.180000	0.120000
+1.190000	0.126667
+1.200000	0.133333
+1.210000	0.140000
+1.220000	0.146667
+1.230000	0.153333
+1.240000	0.160000
+1.250000	0.166667
+1.260000	0.173333
+1.270000	0.180000
+1.280000	0.186667
+1.290000	0.193333
+1.300000	0.200000
+1.310000	0.206667
+1.320000	0.213333
+1.330000	0.220000
+1.340000	0.226667
+1.350000	0.233333
+1.360000	0.240000
+1.370000	0.246667
+1.380000	0.253333
+1.390000	0.260000
+1.400000	0.266667
+1.410000	0.273333
+1.420000	0.280000
+1.430000	0.286667
+1.440000	0.293333
+1.450000	0.300000
+1.460000	0.306667
+1.470000	0.313333
+1.480000	0.320000
+1.490000	0.326667
+1.500000	0.333333
+1.510000	0.340000
+1.520000	0.346667
+1.530000	0.353333
+1.540000	0.360000
+1.550000	0.366667
+1.560000	0.373333
+1.570000	0.380000
+1.580000	0.386667
+1.590000	0.393333
+1.600000	0.400000
+1.610000	0.406667
+1.620000	0.413333
+1.630000	0.420000
+1.640000	0.426667
+1.650000	0.433333
+1.660000	0.440000
+1.670000	0.446667
+1.680000	0.453333
+1.690000	0.460000
+1.700000	0.466667
+1.710000	0.473333
+1.720000	0.480000
+1.730000	0.486667
+1.740000	0.493333
+1.750000	0.500000
+1.760000	0.506667
+1.770000	0.513333
+1.780000	0.520000
+1.790000	0.526667
+1.800000	0.533333
+1.810000	0.540000
+1.820000	0.546667
+1.830000	0.553333
+1.840000	0.560000
+1.850000	0.566667
+1.860000	0.573333
+1.870000	0.580000
+1.880000	0.586667
+1.890000	0.593333
+1.900000	0.600000
+1.910000	0.606667
+1.920000	0.613333
+1.930000	0.620000
+1.940000	0.626667
+1.950000	0.633333
+1.960000	0.640000
+1.970000	0.646667
+1.980000	0.653333
+1.990000	0.660000
+2.000000	0.666667
+2.010000	0.663333
+2.020000	0.660000
+2.030000	0.656667
+2.040000	0.653333
+2.050000	0.650000
+2.060000	0.646667
+2.070000	0.643333
+2.080000	0.640000
+2.090000	0.636667
+2.100000	0.633333
+2.110000	0.630000
+2.120000	0.626667
+2.130000	0.623333
+2.140000	0.620000
+2.150000	0.616667
+2.160000	0.613333
+2.170000	0.610000
+2.180000	0.606667
+2.190000	0.603333
+2.200000	0.600000
+2.210000	0.596667
+2.220000	0.593333
+2.230000	0.590000
+2.240000	0.586667
+2.250000	0.583333
+2.260000	0.580000
+2.270000	0.576667
+2.280000	0.573333
+2.290000	0.570000
+2.300000	0.566667
+2.310000	0.563333
+2.320000	0.560000
+2.330000	0.556667
+2.340000	0.553333
+2.350000	0.550000
+2.360000	0.546667
+2.370000	0.543333
+2.380000	0.540000
+2.390000	0.536667
+2.400000	0.533333
+2.410000	0.530000
+2.420000	0.526667
+2.430000	0.523333
+2.440000	0.520000
+2.450000	0.516667
+2.460000	0.513333
+2.470000	0.510000
+2.480000	0.506667
+2.490000	0.503333
+2.500000	0.500000
+2.510000	0.496667
+2.520000	0.493333
+2.530000	0.490000
+2.540000	0.486667
+2.550000	0.483333
+2.560000	0.480000
+2.570000	0.476667
+2.580000	0.473333
+2.590000	0.470000
+2.600000	0.466667
+2.610000	0.463333
+2.620000	0.460000
+2.630000	0.456667
+2.640000	0.453333
+2.650000	0.450000
+2.660000	0.446667
+2.670000	0.443333
+2.680000	0.440000
+2.690000	0.436667
+2.700000	0.433333
+2.710000	0.430000
+2.720000	0.426667
+2.730000	0.423333
+2.740000	0.420000
+2.750000	0.416667
+2.760000	0.413333
+2.770000	0.410000
+2.780000	0.406667
+2.790000	0.403333
+2.800000	0.400000
+2.810000	0.396667
+2.820000	0.393333
+2.830000	0.390000
+2.840000	0.386667
+2.850000	0.383333
+2.860000	0.380000
+2.870000	0.376667
+2.880000	0.373333
+2.890000	0.370000
+2.900000	0.366667
+2.910000	0.363333
+2.920000	0.360000
+2.930000	0.356667
+2.940000	0.353333
+2.950000	0.350000
+2.960000	0.346667
+2.970000	0.343333
+2.980000	0.340000
+2.990000	0.336667
+3.000000	0.333333
+3.010000	0.330000
+3.020000	0.326667
+3.030000	0.323333
+3.040000	0.320000
+3.050000	0.316667
+3.060000	0.313333
+3.070000	0.310000
+3.080000	0.306667
+3.090000	0.303333
+3.100000	0.300000
+3.110000	0.296667
+3.120000	0.293333
+3.130000	0.290000
+3.140000	0.286667
+3.150000	0.283333
+3.160000	0.280000
+3.170000	0.276667
+3.180000	0.273333
+3.190000	0.270000
+3.200000	0.266667
+3.210000	0.263333
+3.220000	0.260000
+3.230000	0.256667
+3.240000	0.253333
+3.250000	0.250000
+3.260000	0.246667
+3.270000	0.243333
+3.280000	0.240000
+3.290000	0.236667
+3.300000	0.233333
+3.310000	0.230000
+3.320000	0.226667
+3.330000	0.223333
+3.340000	0.220000
+3.350000	0.216667
+3.360000	0.213333
+3.370000	0.210000
+3.380000	0.206667
+3.390000	0.203333
+3.400000	0.200000
+3.410000	0.196667
+3.420000	0.193333
+3.430000	0.190000
+3.440000	0.186667
+3.450000	0.183333
+3.460000	0.180000
+3.470000	0.176667
+3.480000	0.173333
+3.490000	0.170000
+3.500000	0.166667
+3.510000	0.163333
+3.520000	0.160000
+3.530000	0.156667
+3.540000	0.153333
+3.550000	0.150000
+3.560000	0.146667
+3.570000	0.143333
+3.580000	0.140000
+3.590000	0.136667
+3.600000	0.133333
+3.610000	0.130000
+3.620000	0.126667
+3.630000	0.123333
+3.640000	0.120000
+3.650000	0.116667
+3.660000	0.113333
+3.670000	0.110000
+3.680000	0.106667
+3.690000	0.103333
+3.700000	0.100000
+3.710000	0.096667
+3.720000	0.093333
+3.730000	0.090000
+3.740000	0.086667
+3.750000	0.083333
+3.760000	0.080000
+3.770000	0.076667
+3.780000	0.073333
+3.790000	0.070000
+3.800000	0.066667
+3.810000	0.063333
+3.820000	0.060000
+3.830000	0.056667
+3.840000	0.053333
+3.850000	0.050000
+3.860000	0.046667
+3.870000	0.043333
+3.880000	0.040000
+3.890000	0.036667
+3.900000	0.033333
+3.910000	0.030000
+3.920000	0.026667
+3.930000	0.023333
+3.940000	0.020000
+3.950000	0.016667
+3.960000	0.013333
+3.970000	0.010000
+3.980000	0.006667
+3.990000	0.003333
+4.000000	0.000000
+4.010000	0.000000
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull.plt b/v0.1-M1/chi/reference-manual/distribution_plots/weibull.plt
new file mode 100644
index 0000000..7569a7a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull.plt
@@ -0,0 +1,31 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+set terminal svg
+#set grid back
+#set xrange [0:10]
+set yrange [0:2.5]
+set xlabel "x"
+set ylabel "weibull(real a, b)"
+#set samples 2000
+set output "weibull.svg"
+set nokey
+set label "weibull(0.5, 1.0)" at 0.1, 2.2
+set label "weibull(1.0, 1.0)" at 2.2, 0.2
+set label "weibull(1.5, 1.0)" at 1.4, 0.45
+set label "weibull(5.0, 1.0)" at 1.15, 1.4
+set style data lines
+plot "weibull_0.5_1.0.dat" using 1:2 linetype 1, \
+     "weibull_1.0_1.0.dat" using 1:2 linetype 2, \
+     "weibull_1.5_1.0.dat" using 1:2 linetype 3, \
+     "weibull_5.0_1.0.dat" using 1:2 linetype 4
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull.svg b/v0.1-M1/chi/reference-manual/distribution_plots/weibull.svg
new file mode 100644
index 0000000..a74b297
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull.svg
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<svg width="600" height="480" viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+
+<title>gnuplot</title>
+<desc>Produced by GNUPLOT 4.4 patchlevel 4 </desc>
+
+<defs>
+
+	<circle id='gpDot' r='0.5' stroke-width='0.5'/>
+	<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
+	<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
+	<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
+	<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
+	<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
+	<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
+	<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
+	<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
+	<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
+	<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
+	<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
+</defs>
+<g style="fill:none; color:white; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L80.9,422.4 M575.0,422.4 L566.0,422.4 '></path>
+	<g transform="translate(63.6,426.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0</text>
+	</g>
+	<path  d='M71.9,341.3 L80.9,341.3 M575.0,341.3 L566.0,341.3 '></path>
+	<g transform="translate(63.6,345.8)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 0.5</text>
+	</g>
+	<path  d='M71.9,260.1 L80.9,260.1 M575.0,260.1 L566.0,260.1 '></path>
+	<g transform="translate(63.6,264.6)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1</text>
+	</g>
+	<path  d='M71.9,179.0 L80.9,179.0 M575.0,179.0 L566.0,179.0 '></path>
+	<g transform="translate(63.6,183.5)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 1.5</text>
+	</g>
+	<path  d='M71.9,97.8 L80.9,97.8 M575.0,97.8 L566.0,97.8 '></path>
+	<g transform="translate(63.6,102.3)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 2</text>
+	</g>
+	<path  d='M71.9,16.7 L80.9,16.7 M575.0,16.7 L566.0,16.7 '></path>
+	<g transform="translate(63.6,21.2)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:end">
+		<text> 2.5</text>
+	</g>
+	<path  d='M71.9,422.4 L71.9,413.4 M71.9,16.7 L71.9,25.7 '></path>
+	<g transform="translate(71.9,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0</text>
+	</g>
+	<path  d='M155.8,422.4 L155.8,413.4 M155.8,16.7 L155.8,25.7 '></path>
+	<g transform="translate(155.8,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 0.5</text>
+	</g>
+	<path  d='M239.6,422.4 L239.6,413.4 M239.6,16.7 L239.6,25.7 '></path>
+	<g transform="translate(239.6,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1</text>
+	</g>
+	<path  d='M323.5,422.4 L323.5,413.4 M323.5,16.7 L323.5,25.7 '></path>
+	<g transform="translate(323.5,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 1.5</text>
+	</g>
+	<path  d='M407.3,422.4 L407.3,413.4 M407.3,16.7 L407.3,25.7 '></path>
+	<g transform="translate(407.3,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2</text>
+	</g>
+	<path  d='M491.2,422.4 L491.2,413.4 M491.2,16.7 L491.2,25.7 '></path>
+	<g transform="translate(491.2,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 2.5</text>
+	</g>
+	<path  d='M575.0,422.4 L575.0,413.4 M575.0,16.7 L575.0,25.7 '></path>
+	<g transform="translate(575.0,444.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text> 3</text>
+	</g>
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+	<g transform="translate(17.6,219.6) rotate(270)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>weibull(real a, b)</text>
+	</g>
+	<g transform="translate(323.4,471.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:middle">
+		<text>x</text>
+	</g>
+	<g transform="translate(88.7,69.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>weibull(0.5, 1.0)</text>
+	</g>
+	<g transform="translate(440.8,394.4)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>weibull(1.0, 1.0)</text>
+	</g>
+	<g transform="translate(306.7,353.9)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>weibull(1.5, 1.0)</text>
+	</g>
+	<g transform="translate(264.8,199.7)" style="stroke:none; fill:black; font-family:Arial; font-size:12.00pt; text-anchor:start">
+		<text>weibull(5.0, 1.0)</text>
+	</g>
+</g>
+	<g id="Plot_1"><title>Plot_1</title>
+<g style="fill:none; color:red; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M76.7,16.7 L76.9,28.4 L78.6,90.2 L80.3,132.2 L82.0,163.1 L83.6,187.0 L85.3,206.2 L87.0,222.0 
+		L88.7,235.4 L90.3,246.8 L92.0,256.7 L93.7,265.5 L95.4,273.2 L97.1,280.2 L98.7,286.4 L100.4,292.1 
+		L102.1,297.3 L103.8,302.0 L105.4,306.4 L107.1,310.4 L108.8,314.2 L110.5,317.7 L112.1,320.9 L113.8,324.0 
+		L115.5,326.8 L117.2,329.5 L118.9,332.1 L120.5,334.5 L122.2,336.7 L123.9,338.9 L125.6,340.9 L127.2,342.9 
+		L128.9,344.7 L130.6,346.5 L132.3,348.2 L133.9,349.8 L135.6,351.3 L137.3,352.8 L139.0,354.2 L140.7,355.6 
+		L142.3,356.9 L144.0,358.2 L145.7,359.4 L147.4,360.6 L149.0,361.7 L150.7,362.8 L152.4,363.8 L154.1,364.8 
+		L155.8,365.8 L157.4,366.8 L159.1,367.7 L160.8,368.6 L162.5,369.4 L164.1,370.3 L165.8,371.1 L167.5,371.9 
+		L169.2,372.7 L170.8,373.4 L172.5,374.1 L174.2,374.8 L175.9,375.5 L177.6,376.2 L179.2,376.8 L180.9,377.5 
+		L182.6,378.1 L184.3,378.7 L185.9,379.3 L187.6,379.8 L189.3,380.4 L191.0,380.9 L192.6,381.5 L194.3,382.0 
+		L196.0,382.5 L197.7,383.0 L199.4,383.5 L201.0,383.9 L202.7,384.4 L204.4,384.9 L206.1,385.3 L207.7,385.7 
+		L209.4,386.2 L211.1,386.6 L212.8,387.0 L214.4,387.4 L216.1,387.8 L217.8,388.2 L219.5,388.5 L221.2,388.9 
+		L222.8,389.3 L224.5,389.6 L226.2,390.0 L227.9,390.3 L229.5,390.7 L231.2,391.0 L232.9,391.3 L234.6,391.6 
+		L236.2,391.9 L237.9,392.2 L239.6,392.6 L241.3,392.8 L243.0,393.1 L244.6,393.4 L246.3,393.7 L248.0,394.0 
+		L249.7,394.3 L251.3,394.5 L253.0,394.8 L254.7,395.0 L256.4,395.3 L258.0,395.5 L259.7,395.8 L261.4,396.0 
+		L263.1,396.3 L264.8,396.5 L266.4,396.7 L268.1,397.0 L269.8,397.2 L271.5,397.4 L273.1,397.6 L274.8,397.8 
+		L276.5,398.1 L278.2,398.3 L279.8,398.5 L281.5,398.7 L283.2,398.9 L284.9,399.1 L286.6,399.3 L288.2,399.5 
+		L289.9,399.6 L291.6,399.8 L293.3,400.0 L294.9,400.2 L296.6,400.4 L298.3,400.5 L300.0,400.7 L301.6,400.9 
+		L303.3,401.1 L305.0,401.2 L306.7,401.4 L308.4,401.6 L310.0,401.7 L311.7,401.9 L313.4,402.0 L315.1,402.2 
+		L316.7,402.3 L318.4,402.5 L320.1,402.6 L321.8,402.8 L323.5,402.9 L325.1,403.1 L326.8,403.2 L328.5,403.4 
+		L330.2,403.5 L331.8,403.6 L333.5,403.8 L335.2,403.9 L336.9,404.0 L338.5,404.2 L340.2,404.3 L341.9,404.4 
+		L343.6,404.5 L345.3,404.7 L346.9,404.8 L348.6,404.9 L350.3,405.0 L352.0,405.2 L353.6,405.3 L355.3,405.4 
+		L357.0,405.5 L358.7,405.6 L360.3,405.7 L362.0,405.8 L363.7,406.0 L365.4,406.1 L367.1,406.2 L368.7,406.3 
+		L370.4,406.4 L372.1,406.5 L373.8,406.6 L375.4,406.7 L377.1,406.8 L378.8,406.9 L380.5,407.0 L382.1,407.1 
+		L383.8,407.2 L385.5,407.3 L387.2,407.4 L388.9,407.5 L390.5,407.6 L392.2,407.7 L393.9,407.8 L395.6,407.8 
+		L397.2,407.9 L398.9,408.0 L400.6,408.1 L402.3,408.2 L403.9,408.3 L405.6,408.4 L407.3,408.5 L409.0,408.5 
+		L410.7,408.6 L412.3,408.7 L414.0,408.8 L415.7,408.9 L417.4,408.9 L419.0,409.0 L420.7,409.1 L422.4,409.2 
+		L424.1,409.3 L425.7,409.3 L427.4,409.4 L429.1,409.5 L430.8,409.6 L432.5,409.6 L434.1,409.7 L435.8,409.8 
+		L437.5,409.8 L439.2,409.9 L440.8,410.0 L442.5,410.1 L444.2,410.1 L445.9,410.2 L447.5,410.3 L449.2,410.3 
+		L450.9,410.4 L452.6,410.5 L454.3,410.5 L455.9,410.6 L457.6,410.7 L459.3,410.7 L461.0,410.8 L462.6,410.8 
+		L464.3,410.9 L466.0,411.0 L467.7,411.0 L469.3,411.1 L471.0,411.2 L472.7,411.2 L474.4,411.3 L476.1,411.3 
+		L477.7,411.4 L479.4,411.4 L481.1,411.5 L482.8,411.6 L484.4,411.6 L486.1,411.7 L487.8,411.7 L489.5,411.8 
+		L491.2,411.8 L492.8,411.9 L494.5,412.0 L496.2,412.0 L497.9,412.1 L499.5,412.1 L501.2,412.2 L502.9,412.2 
+		L504.6,412.3 L506.2,412.3 L507.9,412.4 L509.6,412.4 L511.3,412.5 L513.0,412.5 L514.6,412.6 L516.3,412.6 
+		L518.0,412.7 L519.7,412.7 L521.3,412.8 L523.0,412.8 L524.7,412.9 L526.4,412.9 L528.0,412.9 L529.7,413.0 
+		L531.4,413.0 L533.1,413.1 L534.8,413.1 L536.4,413.2 L538.1,413.2 L539.8,413.3 L541.5,413.3 L543.1,413.3 
+		L544.8,413.4 L546.5,413.4 L548.2,413.5 L549.8,413.5 L551.5,413.6 L553.2,413.6 L554.9,413.6 L556.6,413.7 
+		L558.2,413.7 L559.9,413.8 L561.6,413.8 L563.3,413.8 L564.9,413.9 L566.6,413.9 L568.3,414.0 L570.0,414.0 
+		L571.6,414.0 L573.3,414.1 L575.0,414.1 '></path>
+</g>
+	</g>
+	<g id="Plot_2"><title>Plot_2</title>
+<g style="fill:none; color:green; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,260.1 L73.6,261.7 L75.3,263.3 L76.9,264.9 L78.6,266.5 L80.3,268.0 L82.0,269.6 L83.6,271.1 
+		L85.3,272.6 L87.0,274.1 L88.7,275.6 L90.3,277.0 L92.0,278.5 L93.7,279.9 L95.4,281.3 L97.1,282.7 
+		L98.7,284.1 L100.4,285.5 L102.1,286.9 L103.8,288.2 L105.4,289.5 L107.1,290.9 L108.8,292.2 L110.5,293.5 
+		L112.1,294.7 L113.8,296.0 L115.5,297.3 L117.2,298.5 L118.9,299.8 L120.5,301.0 L122.2,302.2 L123.9,303.4 
+		L125.6,304.6 L127.2,305.7 L128.9,306.9 L130.6,308.0 L132.3,309.2 L133.9,310.3 L135.6,311.4 L137.3,312.5 
+		L139.0,313.6 L140.7,314.7 L142.3,315.8 L144.0,316.8 L145.7,317.9 L147.4,318.9 L149.0,320.0 L150.7,321.0 
+		L152.4,322.0 L154.1,323.0 L155.8,324.0 L157.4,325.0 L159.1,325.9 L160.8,326.9 L162.5,327.8 L164.1,328.8 
+		L165.8,329.7 L167.5,330.6 L169.2,331.5 L170.8,332.4 L172.5,333.3 L174.2,334.2 L175.9,335.1 L177.6,336.0 
+		L179.2,336.8 L180.9,337.7 L182.6,338.5 L184.3,339.4 L185.9,340.2 L187.6,341.0 L189.3,341.8 L191.0,342.6 
+		L192.6,343.4 L194.3,344.2 L196.0,345.0 L197.7,345.7 L199.4,346.5 L201.0,347.3 L202.7,348.0 L204.4,348.8 
+		L206.1,349.5 L207.7,350.2 L209.4,350.9 L211.1,351.6 L212.8,352.3 L214.4,353.0 L216.1,353.7 L217.8,354.4 
+		L219.5,355.1 L221.2,355.8 L222.8,356.4 L224.5,357.1 L226.2,357.7 L227.9,358.4 L229.5,359.0 L231.2,359.6 
+		L232.9,360.3 L234.6,360.9 L236.2,361.5 L237.9,362.1 L239.6,362.7 L241.3,363.3 L243.0,363.9 L244.6,364.5 
+		L246.3,365.0 L248.0,365.6 L249.7,366.2 L251.3,366.7 L253.0,367.3 L254.7,367.8 L256.4,368.4 L258.0,368.9 
+		L259.7,369.5 L261.4,370.0 L263.1,370.5 L264.8,371.0 L266.4,371.5 L268.1,372.0 L269.8,372.5 L271.5,373.0 
+		L273.1,373.5 L274.8,374.0 L276.5,374.5 L278.2,375.0 L279.8,375.4 L281.5,375.9 L283.2,376.4 L284.9,376.8 
+		L286.6,377.3 L288.2,377.7 L289.9,378.2 L291.6,378.6 L293.3,379.0 L294.9,379.5 L296.6,379.9 L298.3,380.3 
+		L300.0,380.7 L301.6,381.2 L303.3,381.6 L305.0,382.0 L306.7,382.4 L308.4,382.8 L310.0,383.2 L311.7,383.6 
+		L313.4,384.0 L315.1,384.3 L316.7,384.7 L318.4,385.1 L320.1,385.5 L321.8,385.8 L323.5,386.2 L325.1,386.6 
+		L326.8,386.9 L328.5,387.3 L330.2,387.6 L331.8,388.0 L333.5,388.3 L335.2,388.6 L336.9,389.0 L338.5,389.3 
+		L340.2,389.6 L341.9,390.0 L343.6,390.3 L345.3,390.6 L346.9,390.9 L348.6,391.2 L350.3,391.5 L352.0,391.9 
+		L353.6,392.2 L355.3,392.5 L357.0,392.8 L358.7,393.0 L360.3,393.3 L362.0,393.6 L363.7,393.9 L365.4,394.2 
+		L367.1,394.5 L368.7,394.8 L370.4,395.0 L372.1,395.3 L373.8,395.6 L375.4,395.8 L377.1,396.1 L378.8,396.4 
+		L380.5,396.6 L382.1,396.9 L383.8,397.1 L385.5,397.4 L387.2,397.6 L388.9,397.9 L390.5,398.1 L392.2,398.4 
+		L393.9,398.6 L395.6,398.8 L397.2,399.1 L398.9,399.3 L400.6,399.5 L402.3,399.8 L403.9,400.0 L405.6,400.2 
+		L407.3,400.4 L409.0,400.7 L410.7,400.9 L412.3,401.1 L414.0,401.3 L415.7,401.5 L417.4,401.7 L419.0,401.9 
+		L420.7,402.1 L422.4,402.3 L424.1,402.5 L425.7,402.7 L427.4,402.9 L429.1,403.1 L430.8,403.3 L432.5,403.5 
+		L434.1,403.7 L435.8,403.9 L437.5,404.1 L439.2,404.2 L440.8,404.4 L442.5,404.6 L444.2,404.8 L445.9,405.0 
+		L447.5,405.1 L449.2,405.3 L450.9,405.5 L452.6,405.6 L454.3,405.8 L455.9,406.0 L457.6,406.1 L459.3,406.3 
+		L461.0,406.5 L462.6,406.6 L464.3,406.8 L466.0,406.9 L467.7,407.1 L469.3,407.2 L471.0,407.4 L472.7,407.5 
+		L474.4,407.7 L476.1,407.8 L477.7,408.0 L479.4,408.1 L481.1,408.3 L482.8,408.4 L484.4,408.5 L486.1,408.7 
+		L487.8,408.8 L489.5,408.9 L491.2,409.1 L492.8,409.2 L494.5,409.3 L496.2,409.5 L497.9,409.6 L499.5,409.7 
+		L501.2,409.9 L502.9,410.0 L504.6,410.1 L506.2,410.2 L507.9,410.3 L509.6,410.5 L511.3,410.6 L513.0,410.7 
+		L514.6,410.8 L516.3,410.9 L518.0,411.0 L519.7,411.2 L521.3,411.3 L523.0,411.4 L524.7,411.5 L526.4,411.6 
+		L528.0,411.7 L529.7,411.8 L531.4,411.9 L533.1,412.0 L534.8,412.1 L536.4,412.2 L538.1,412.3 L539.8,412.4 
+		L541.5,412.5 L543.1,412.6 L544.8,412.7 L546.5,412.8 L548.2,412.9 L549.8,413.0 L551.5,413.1 L553.2,413.2 
+		L554.9,413.3 L556.6,413.4 L558.2,413.5 L559.9,413.6 L561.6,413.6 L563.3,413.7 L564.9,413.8 L566.6,413.9 
+		L568.3,414.0 L570.0,414.1 L571.6,414.2 L573.3,414.2 L575.0,414.3 '></path>
+</g>
+	</g>
+	<g id="Plot_3"><title>Plot_3</title>
+<g style="fill:none; color:blue; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L73.6,398.1 L75.3,388.1 L76.9,380.5 L78.6,374.1 L80.3,368.6 L82.0,363.6 L83.6,359.2 
+		L85.3,355.1 L87.0,351.3 L88.7,347.8 L90.3,344.6 L92.0,341.5 L93.7,338.7 L95.4,336.0 L97.1,333.4 
+		L98.7,331.1 L100.4,328.8 L102.1,326.7 L103.8,324.7 L105.4,322.9 L107.1,321.1 L108.8,319.4 L110.5,317.9 
+		L112.1,316.4 L113.8,315.0 L115.5,313.7 L117.2,312.5 L118.9,311.3 L120.5,310.3 L122.2,309.3 L123.9,308.4 
+		L125.6,307.5 L127.2,306.7 L128.9,306.0 L130.6,305.3 L132.3,304.7 L133.9,304.2 L135.6,303.7 L137.3,303.2 
+		L139.0,302.9 L140.7,302.5 L142.3,302.2 L144.0,302.0 L145.7,301.8 L147.4,301.7 L149.0,301.6 L150.7,301.5 
+		L152.4,301.5 L154.1,301.5 L155.8,301.5 L157.4,301.6 L159.1,301.8 L160.8,301.9 L162.5,302.1 L164.1,302.3 
+		L165.8,302.6 L167.5,302.9 L169.2,303.2 L170.8,303.6 L172.5,303.9 L174.2,304.3 L175.9,304.8 L177.6,305.2 
+		L179.2,305.7 L180.9,306.2 L182.6,306.7 L184.3,307.3 L185.9,307.8 L187.6,308.4 L189.3,309.0 L191.0,309.6 
+		L192.6,310.3 L194.3,310.9 L196.0,311.6 L197.7,312.3 L199.4,313.0 L201.0,313.7 L202.7,314.4 L204.4,315.2 
+		L206.1,315.9 L207.7,316.7 L209.4,317.5 L211.1,318.3 L212.8,319.1 L214.4,319.9 L216.1,320.7 L217.8,321.5 
+		L219.5,322.4 L221.2,323.2 L222.8,324.1 L224.5,324.9 L226.2,325.8 L227.9,326.7 L229.5,327.5 L231.2,328.4 
+		L232.9,329.3 L234.6,330.2 L236.2,331.1 L237.9,332.0 L239.6,332.9 L241.3,333.7 L243.0,334.6 L244.6,335.5 
+		L246.3,336.4 L248.0,337.3 L249.7,338.3 L251.3,339.2 L253.0,340.1 L254.7,341.0 L256.4,341.9 L258.0,342.8 
+		L259.7,343.7 L261.4,344.6 L263.1,345.5 L264.8,346.3 L266.4,347.2 L268.1,348.1 L269.8,349.0 L271.5,349.9 
+		L273.1,350.8 L274.8,351.7 L276.5,352.5 L278.2,353.4 L279.8,354.3 L281.5,355.1 L283.2,356.0 L284.9,356.8 
+		L286.6,357.7 L288.2,358.5 L289.9,359.4 L291.6,360.2 L293.3,361.0 L294.9,361.8 L296.6,362.7 L298.3,363.5 
+		L300.0,364.3 L301.6,365.1 L303.3,365.9 L305.0,366.7 L306.7,367.4 L308.4,368.2 L310.0,369.0 L311.7,369.8 
+		L313.4,370.5 L315.1,371.3 L316.7,372.0 L318.4,372.7 L320.1,373.5 L321.8,374.2 L323.5,374.9 L325.1,375.6 
+		L326.8,376.3 L328.5,377.0 L330.2,377.7 L331.8,378.4 L333.5,379.1 L335.2,379.7 L336.9,380.4 L338.5,381.1 
+		L340.2,381.7 L341.9,382.4 L343.6,383.0 L345.3,383.6 L346.9,384.2 L348.6,384.8 L350.3,385.5 L352.0,386.1 
+		L353.6,386.6 L355.3,387.2 L357.0,387.8 L358.7,388.4 L360.3,388.9 L362.0,389.5 L363.7,390.1 L365.4,390.6 
+		L367.1,391.1 L368.7,391.7 L370.4,392.2 L372.1,392.7 L373.8,393.2 L375.4,393.7 L377.1,394.2 L378.8,394.7 
+		L380.5,395.2 L382.1,395.7 L383.8,396.1 L385.5,396.6 L387.2,397.1 L388.9,397.5 L390.5,397.9 L392.2,398.4 
+		L393.9,398.8 L395.6,399.2 L397.2,399.7 L398.9,400.1 L400.6,400.5 L402.3,400.9 L403.9,401.3 L405.6,401.7 
+		L407.3,402.1 L409.0,402.4 L410.7,402.8 L412.3,403.2 L414.0,403.5 L415.7,403.9 L417.4,404.2 L419.0,404.6 
+		L420.7,404.9 L422.4,405.3 L424.1,405.6 L425.7,405.9 L427.4,406.2 L429.1,406.5 L430.8,406.8 L432.5,407.1 
+		L434.1,407.4 L435.8,407.7 L437.5,408.0 L439.2,408.3 L440.8,408.6 L442.5,408.9 L444.2,409.1 L445.9,409.4 
+		L447.5,409.7 L449.2,409.9 L450.9,410.2 L452.6,410.4 L454.3,410.6 L455.9,410.9 L457.6,411.1 L459.3,411.3 
+		L461.0,411.6 L462.6,411.8 L464.3,412.0 L466.0,412.2 L467.7,412.4 L469.3,412.6 L471.0,412.8 L472.7,413.0 
+		L474.4,413.2 L476.1,413.4 L477.7,413.6 L479.4,413.8 L481.1,414.0 L482.8,414.2 L484.4,414.3 L486.1,414.5 
+		L487.8,414.7 L489.5,414.8 L491.2,415.0 L492.8,415.2 L494.5,415.3 L496.2,415.5 L497.9,415.6 L499.5,415.8 
+		L501.2,415.9 L502.9,416.1 L504.6,416.2 L506.2,416.3 L507.9,416.5 L509.6,416.6 L511.3,416.7 L513.0,416.9 
+		L514.6,417.0 L516.3,417.1 L518.0,417.2 L519.7,417.3 L521.3,417.4 L523.0,417.6 L524.7,417.7 L526.4,417.8 
+		L528.0,417.9 L529.7,418.0 L531.4,418.1 L533.1,418.2 L534.8,418.3 L536.4,418.4 L538.1,418.5 L539.8,418.6 
+		L541.5,418.6 L543.1,418.7 L544.8,418.8 L546.5,418.9 L548.2,419.0 L549.8,419.1 L551.5,419.1 L553.2,419.2 
+		L554.9,419.3 L556.6,419.4 L558.2,419.4 L559.9,419.5 L561.6,419.6 L563.3,419.6 L564.9,419.7 L566.6,419.8 
+		L568.3,419.8 L570.0,419.9 L571.6,419.9 L573.3,420.0 L575.0,420.1 '></path>
+</g>
+	</g>
+	<g id="Plot_4"><title>Plot_4</title>
+<g style="fill:none; color:cyan; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,422.4 L73.6,422.4 L75.3,422.4 L76.9,422.4 L78.6,422.4 L80.3,422.4 L82.0,422.4 L83.6,422.4 
+		L85.3,422.4 L87.0,422.3 L88.7,422.3 L90.3,422.3 L92.0,422.2 L93.7,422.2 L95.4,422.1 L97.1,422.0 
+		L98.7,421.9 L100.4,421.7 L102.1,421.5 L103.8,421.3 L105.4,421.1 L107.1,420.8 L108.8,420.5 L110.5,420.1 
+		L112.1,419.7 L113.8,419.2 L115.5,418.7 L117.2,418.1 L118.9,417.4 L120.5,416.7 L122.2,415.8 L123.9,414.9 
+		L125.6,413.9 L127.2,412.8 L128.9,411.6 L130.6,410.3 L132.3,408.9 L133.9,407.3 L135.6,405.6 L137.3,403.8 
+		L139.0,401.8 L140.7,399.7 L142.3,397.5 L144.0,395.1 L145.7,392.5 L147.4,389.7 L149.0,386.8 L150.7,383.7 
+		L152.4,380.4 L154.1,376.9 L155.8,373.2 L157.4,369.4 L159.1,365.3 L160.8,361.0 L162.5,356.5 L164.1,351.8 
+		L165.8,346.9 L167.5,341.8 L169.2,336.4 L170.8,330.9 L172.5,325.1 L174.2,319.2 L175.9,313.0 L177.6,306.7 
+		L179.2,300.1 L180.9,293.4 L182.6,286.6 L184.3,279.5 L185.9,272.4 L187.6,265.1 L189.3,257.7 L191.0,250.2 
+		L192.6,242.7 L194.3,235.1 L196.0,227.5 L197.7,219.9 L199.4,212.3 L201.0,204.8 L202.7,197.4 L204.4,190.1 
+		L206.1,182.9 L207.7,175.9 L209.4,169.2 L211.1,162.7 L212.8,156.5 L214.4,150.6 L216.1,145.1 L217.8,140.0 
+		L219.5,135.3 L221.2,131.1 L222.8,127.4 L224.5,124.3 L226.2,121.7 L227.9,119.7 L229.5,118.3 L231.2,117.6 
+		L232.9,117.5 L234.6,118.0 L236.2,119.3 L237.9,121.3 L239.6,123.9 L241.3,127.2 L243.0,131.2 L244.6,135.9 
+		L246.3,141.2 L248.0,147.2 L249.7,153.7 L251.3,160.8 L253.0,168.4 L254.7,176.5 L256.4,185.1 L258.0,194.0 
+		L259.7,203.3 L261.4,212.8 L263.1,222.6 L264.8,232.5 L266.4,242.6 L268.1,252.6 L269.8,262.7 L271.5,272.8 
+		L273.1,282.7 L274.8,292.4 L276.5,301.9 L278.2,311.2 L279.8,320.1 L281.5,328.7 L283.2,337.0 L284.9,344.8 
+		L286.6,352.3 L288.2,359.3 L289.9,365.8 L291.6,372.0 L293.3,377.6 L294.9,382.8 L296.6,387.6 L298.3,392.0 
+		L300.0,395.9 L301.6,399.5 L303.3,402.7 L305.0,405.5 L306.7,408.0 L308.4,410.2 L310.0,412.1 L311.7,413.8 
+		L313.4,415.3 L315.1,416.5 L316.7,417.6 L318.4,418.4 L320.1,419.2 L321.8,419.8 L323.5,420.3 L325.1,420.8 
+		L326.8,421.1 L328.5,421.4 L330.2,421.6 L331.8,421.8 L333.5,421.9 L335.2,422.0 L336.9,422.1 L338.5,422.2 
+		L340.2,422.3 L341.9,422.3 L343.6,422.3 L345.3,422.3 L346.9,422.4 L348.6,422.4 L350.3,422.4 L352.0,422.4 
+		L353.6,422.4 L355.3,422.4 L357.0,422.4 L358.7,422.4 L360.3,422.4 L362.0,422.4 L363.7,422.4 L365.4,422.4 
+		L367.1,422.4 L368.7,422.4 L370.4,422.4 L372.1,422.4 L373.8,422.4 L375.4,422.4 L377.1,422.4 L378.8,422.4 
+		L380.5,422.4 L382.1,422.4 L383.8,422.4 L385.5,422.4 L387.2,422.4 L388.9,422.4 L390.5,422.4 L392.2,422.4 
+		L393.9,422.4 L395.6,422.4 L397.2,422.4 L398.9,422.4 L400.6,422.4 L402.3,422.4 L403.9,422.4 L405.6,422.4 
+		L407.3,422.4 L409.0,422.4 L410.7,422.4 L412.3,422.4 L414.0,422.4 L415.7,422.4 L417.4,422.4 L419.0,422.4 
+		L420.7,422.4 L422.4,422.4 L424.1,422.4 L425.7,422.4 L427.4,422.4 L429.1,422.4 L430.8,422.4 L432.5,422.4 
+		L434.1,422.4 L435.8,422.4 L437.5,422.4 L439.2,422.4 L440.8,422.4 L442.5,422.4 L444.2,422.4 L445.9,422.4 
+		L447.5,422.4 L449.2,422.4 L450.9,422.4 L452.6,422.4 L454.3,422.4 L455.9,422.4 L457.6,422.4 L459.3,422.4 
+		L461.0,422.4 L462.6,422.4 L464.3,422.4 L466.0,422.4 L467.7,422.4 L469.3,422.4 L471.0,422.4 L472.7,422.4 
+		L474.4,422.4 L476.1,422.4 L477.7,422.4 L479.4,422.4 L481.1,422.4 L482.8,422.4 L484.4,422.4 L486.1,422.4 
+		L487.8,422.4 L489.5,422.4 L491.2,422.4 L492.8,422.4 L494.5,422.4 L496.2,422.4 L497.9,422.4 L499.5,422.4 
+		L501.2,422.4 L502.9,422.4 L504.6,422.4 L506.2,422.4 L507.9,422.4 L509.6,422.4 L511.3,422.4 L513.0,422.4 
+		L514.6,422.4 L516.3,422.4 L518.0,422.4 L519.7,422.4 L521.3,422.4 L523.0,422.4 L524.7,422.4 L526.4,422.4 
+		L528.0,422.4 L529.7,422.4 L531.4,422.4 L533.1,422.4 L534.8,422.4 L536.4,422.4 L538.1,422.4 L539.8,422.4 
+		L541.5,422.4 L543.1,422.4 L544.8,422.4 L546.5,422.4 L548.2,422.4 L549.8,422.4 L551.5,422.4 L553.2,422.4 
+		L554.9,422.4 L556.6,422.4 L558.2,422.4 L559.9,422.4 L561.6,422.4 L563.3,422.4 L564.9,422.4 L566.6,422.4 
+		L568.3,422.4 L570.0,422.4 L571.6,422.4 L573.3,422.4 L575.0,422.4 '></path>
+</g>
+	</g>
+<g style="fill:none; color:black; stroke:currentColor; stroke-width:1.00; stroke-linecap:butt; stroke-linejoin:miter">
+	<path  d='M71.9,16.7 L71.9,422.4 L575.0,422.4 L575.0,16.7 L71.9,16.7 Z '></path>
+</g>
+</svg>
+
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull_0.5_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_0.5_1.0.dat
new file mode 100644
index 0000000..b09019e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_0.5_1.0.dat
@@ -0,0 +1,313 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	NaN
+0.010000	4.524187
+0.020000	3.069280
+0.030000	2.427657
+0.040000	2.046827
+0.050000	1.788026
+0.060000	1.597770
+0.070000	1.450499
+0.080000	1.332257
+0.090000	1.234697
+0.100000	1.152482
+0.110000	1.082018
+0.120000	1.020788
+0.130000	0.966966
+0.140000	0.919195
+0.150000	0.876441
+0.160000	0.837900
+0.170000	0.802937
+0.180000	0.771042
+0.190000	0.741803
+0.200000	0.714879
+0.210000	0.689988
+0.220000	0.666894
+0.230000	0.645395
+0.240000	0.625323
+0.250000	0.606531
+0.260000	0.588892
+0.270000	0.572298
+0.280000	0.556652
+0.290000	0.541871
+0.300000	0.527882
+0.310000	0.514617
+0.320000	0.502020
+0.330000	0.490038
+0.340000	0.478625
+0.350000	0.467739
+0.360000	0.457343
+0.370000	0.447402
+0.380000	0.437886
+0.390000	0.428767
+0.400000	0.420018
+0.410000	0.411618
+0.420000	0.403544
+0.430000	0.395776
+0.440000	0.388298
+0.450000	0.381092
+0.460000	0.374144
+0.470000	0.367438
+0.480000	0.360962
+0.490000	0.354704
+0.500000	0.348652
+0.510000	0.342797
+0.520000	0.337127
+0.530000	0.331635
+0.540000	0.326312
+0.550000	0.321150
+0.560000	0.316140
+0.570000	0.311277
+0.580000	0.306554
+0.590000	0.301965
+0.600000	0.297503
+0.610000	0.293164
+0.620000	0.288942
+0.630000	0.284832
+0.640000	0.280831
+0.650000	0.276932
+0.660000	0.273134
+0.670000	0.269431
+0.680000	0.265820
+0.690000	0.262297
+0.700000	0.258860
+0.710000	0.255504
+0.720000	0.252228
+0.730000	0.249027
+0.740000	0.245901
+0.750000	0.242845
+0.760000	0.239858
+0.770000	0.236937
+0.780000	0.234080
+0.790000	0.231285
+0.800000	0.228549
+0.810000	0.225872
+0.820000	0.223251
+0.830000	0.220683
+0.840000	0.218169
+0.850000	0.215705
+0.860000	0.213291
+0.870000	0.210925
+0.880000	0.208605
+0.890000	0.206330
+0.900000	0.204099
+0.910000	0.201910
+0.920000	0.199763
+0.930000	0.197656
+0.940000	0.195588
+0.950000	0.193558
+0.960000	0.191564
+0.970000	0.189607
+0.980000	0.187684
+0.990000	0.185795
+1.000000	0.183940
+1.010000	0.182116
+1.020000	0.180324
+1.030000	0.178563
+1.040000	0.176831
+1.050000	0.175128
+1.060000	0.173454
+1.070000	0.171807
+1.080000	0.170187
+1.090000	0.168593
+1.100000	0.167025
+1.110000	0.165482
+1.120000	0.163963
+1.130000	0.162469
+1.140000	0.160997
+1.150000	0.159548
+1.160000	0.158122
+1.170000	0.156717
+1.180000	0.155333
+1.190000	0.153970
+1.200000	0.152628
+1.210000	0.151305
+1.220000	0.150002
+1.230000	0.148717
+1.240000	0.147452
+1.250000	0.146204
+1.260000	0.144974
+1.270000	0.143762
+1.280000	0.142566
+1.290000	0.141388
+1.300000	0.140225
+1.310000	0.139079
+1.320000	0.137948
+1.330000	0.136833
+1.340000	0.135733
+1.350000	0.134648
+1.360000	0.133577
+1.370000	0.132520
+1.380000	0.131477
+1.390000	0.130448
+1.400000	0.129432
+1.410000	0.128429
+1.420000	0.127440
+1.430000	0.126462
+1.440000	0.125498
+1.450000	0.124545
+1.460000	0.123604
+1.470000	0.122675
+1.480000	0.121758
+1.490000	0.120852
+1.500000	0.119957
+1.510000	0.119073
+1.520000	0.118199
+1.530000	0.117336
+1.540000	0.116483
+1.550000	0.115641
+1.560000	0.114809
+1.570000	0.113986
+1.580000	0.113173
+1.590000	0.112369
+1.600000	0.111575
+1.610000	0.110790
+1.620000	0.110013
+1.630000	0.109246
+1.640000	0.108488
+1.650000	0.107737
+1.660000	0.106996
+1.670000	0.106262
+1.680000	0.105537
+1.690000	0.104820
+1.700000	0.104111
+1.710000	0.103409
+1.720000	0.102715
+1.730000	0.102029
+1.740000	0.101350
+1.750000	0.100678
+1.760000	0.100013
+1.770000	0.099356
+1.780000	0.098705
+1.790000	0.098061
+1.800000	0.097424
+1.810000	0.096794
+1.820000	0.096170
+1.830000	0.095552
+1.840000	0.094941
+1.850000	0.094337
+1.860000	0.093738
+1.870000	0.093145
+1.880000	0.092559
+1.890000	0.091978
+1.900000	0.091403
+1.910000	0.090834
+1.920000	0.090270
+1.930000	0.089712
+1.940000	0.089159
+1.950000	0.088612
+1.960000	0.088070
+1.970000	0.087534
+1.980000	0.087002
+1.990000	0.086476
+2.000000	0.085955
+2.010000	0.085438
+2.020000	0.084927
+2.030000	0.084420
+2.040000	0.083919
+2.050000	0.083422
+2.060000	0.082929
+2.070000	0.082441
+2.080000	0.081958
+2.090000	0.081479
+2.100000	0.081004
+2.110000	0.080534
+2.120000	0.080068
+2.130000	0.079606
+2.140000	0.079149
+2.150000	0.078696
+2.160000	0.078246
+2.170000	0.077801
+2.180000	0.077359
+2.190000	0.076922
+2.200000	0.076488
+2.210000	0.076059
+2.220000	0.075633
+2.230000	0.075210
+2.240000	0.074792
+2.250000	0.074377
+2.260000	0.073965
+2.270000	0.073557
+2.280000	0.073153
+2.290000	0.072752
+2.300000	0.072355
+2.310000	0.071960
+2.320000	0.071570
+2.330000	0.071182
+2.340000	0.070798
+2.350000	0.070417
+2.360000	0.070039
+2.370000	0.069664
+2.380000	0.069292
+2.390000	0.068924
+2.400000	0.068558
+2.410000	0.068195
+2.420000	0.067836
+2.430000	0.067479
+2.440000	0.067125
+2.450000	0.066774
+2.460000	0.066426
+2.470000	0.066081
+2.480000	0.065738
+2.490000	0.065398
+2.500000	0.065061
+2.510000	0.064726
+2.520000	0.064394
+2.530000	0.064065
+2.540000	0.063738
+2.550000	0.063414
+2.560000	0.063093
+2.570000	0.062774
+2.580000	0.062457
+2.590000	0.062143
+2.600000	0.061831
+2.610000	0.061521
+2.620000	0.061214
+2.630000	0.060909
+2.640000	0.060607
+2.650000	0.060307
+2.660000	0.060009
+2.670000	0.059713
+2.680000	0.059420
+2.690000	0.059129
+2.700000	0.058840
+2.710000	0.058553
+2.720000	0.058268
+2.730000	0.057985
+2.740000	0.057704
+2.750000	0.057426
+2.760000	0.057149
+2.770000	0.056875
+2.780000	0.056602
+2.790000	0.056332
+2.800000	0.056063
+2.810000	0.055796
+2.820000	0.055532
+2.830000	0.055269
+2.840000	0.055008
+2.850000	0.054749
+2.860000	0.054491
+2.870000	0.054236
+2.880000	0.053982
+2.890000	0.053730
+2.900000	0.053480
+2.910000	0.053232
+2.920000	0.052985
+2.930000	0.052740
+2.940000	0.052497
+2.950000	0.052256
+2.960000	0.052016
+2.970000	0.051778
+2.980000	0.051541
+2.990000	0.051306
+3.000000	0.051073
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.0_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.0_1.0.dat
new file mode 100644
index 0000000..e48d62d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.0_1.0.dat
@@ -0,0 +1,313 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	1.000000
+0.010000	0.990050
+0.020000	0.980199
+0.030000	0.970446
+0.040000	0.960789
+0.050000	0.951229
+0.060000	0.941765
+0.070000	0.932394
+0.080000	0.923116
+0.090000	0.913931
+0.100000	0.904837
+0.110000	0.895834
+0.120000	0.886920
+0.130000	0.878095
+0.140000	0.869358
+0.150000	0.860708
+0.160000	0.852144
+0.170000	0.843665
+0.180000	0.835270
+0.190000	0.826959
+0.200000	0.818731
+0.210000	0.810584
+0.220000	0.802519
+0.230000	0.794534
+0.240000	0.786628
+0.250000	0.778801
+0.260000	0.771052
+0.270000	0.763379
+0.280000	0.755784
+0.290000	0.748264
+0.300000	0.740818
+0.310000	0.733447
+0.320000	0.726149
+0.330000	0.718924
+0.340000	0.711770
+0.350000	0.704688
+0.360000	0.697676
+0.370000	0.690734
+0.380000	0.683861
+0.390000	0.677057
+0.400000	0.670320
+0.410000	0.663650
+0.420000	0.657047
+0.430000	0.650509
+0.440000	0.644036
+0.450000	0.637628
+0.460000	0.631284
+0.470000	0.625002
+0.480000	0.618783
+0.490000	0.612626
+0.500000	0.606531
+0.510000	0.600496
+0.520000	0.594521
+0.530000	0.588605
+0.540000	0.582748
+0.550000	0.576950
+0.560000	0.571209
+0.570000	0.565525
+0.580000	0.559898
+0.590000	0.554327
+0.600000	0.548812
+0.610000	0.543351
+0.620000	0.537944
+0.630000	0.532592
+0.640000	0.527292
+0.650000	0.522046
+0.660000	0.516851
+0.670000	0.511709
+0.680000	0.506617
+0.690000	0.501576
+0.700000	0.496585
+0.710000	0.491644
+0.720000	0.486752
+0.730000	0.481909
+0.740000	0.477114
+0.750000	0.472367
+0.760000	0.467666
+0.770000	0.463013
+0.780000	0.458406
+0.790000	0.453845
+0.800000	0.449329
+0.810000	0.444858
+0.820000	0.440432
+0.830000	0.436049
+0.840000	0.431711
+0.850000	0.427415
+0.860000	0.423162
+0.870000	0.418952
+0.880000	0.414783
+0.890000	0.410656
+0.900000	0.406570
+0.910000	0.402524
+0.920000	0.398519
+0.930000	0.394554
+0.940000	0.390628
+0.950000	0.386741
+0.960000	0.382893
+0.970000	0.379083
+0.980000	0.375311
+0.990000	0.371577
+1.000000	0.367879
+1.010000	0.364219
+1.020000	0.360595
+1.030000	0.357007
+1.040000	0.353455
+1.050000	0.349938
+1.060000	0.346456
+1.070000	0.343009
+1.080000	0.339596
+1.090000	0.336216
+1.100000	0.332871
+1.110000	0.329559
+1.120000	0.326280
+1.130000	0.323033
+1.140000	0.319819
+1.150000	0.316637
+1.160000	0.313486
+1.170000	0.310367
+1.180000	0.307279
+1.190000	0.304221
+1.200000	0.301194
+1.210000	0.298197
+1.220000	0.295230
+1.230000	0.292293
+1.240000	0.289384
+1.250000	0.286505
+1.260000	0.283654
+1.270000	0.280832
+1.280000	0.278037
+1.290000	0.275271
+1.300000	0.272532
+1.310000	0.269820
+1.320000	0.267135
+1.330000	0.264477
+1.340000	0.261846
+1.350000	0.259240
+1.360000	0.256661
+1.370000	0.254107
+1.380000	0.251579
+1.390000	0.249075
+1.400000	0.246597
+1.410000	0.244143
+1.420000	0.241714
+1.430000	0.239309
+1.440000	0.236928
+1.450000	0.234570
+1.460000	0.232236
+1.470000	0.229925
+1.480000	0.227638
+1.490000	0.225373
+1.500000	0.223130
+1.510000	0.220910
+1.520000	0.218712
+1.530000	0.216536
+1.540000	0.214381
+1.550000	0.212248
+1.560000	0.210136
+1.570000	0.208045
+1.580000	0.205975
+1.590000	0.203926
+1.600000	0.201897
+1.610000	0.199888
+1.620000	0.197899
+1.630000	0.195930
+1.640000	0.193980
+1.650000	0.192050
+1.660000	0.190139
+1.670000	0.188247
+1.680000	0.186374
+1.690000	0.184520
+1.700000	0.182684
+1.710000	0.180866
+1.720000	0.179066
+1.730000	0.177284
+1.740000	0.175520
+1.750000	0.173774
+1.760000	0.172045
+1.770000	0.170333
+1.780000	0.168638
+1.790000	0.166960
+1.800000	0.165299
+1.810000	0.163654
+1.820000	0.162026
+1.830000	0.160414
+1.840000	0.158817
+1.850000	0.157237
+1.860000	0.155673
+1.870000	0.154124
+1.880000	0.152590
+1.890000	0.151072
+1.900000	0.149569
+1.910000	0.148080
+1.920000	0.146607
+1.930000	0.145148
+1.940000	0.143704
+1.950000	0.142274
+1.960000	0.140858
+1.970000	0.139457
+1.980000	0.138069
+1.990000	0.136695
+2.000000	0.135335
+2.010000	0.133989
+2.020000	0.132655
+2.030000	0.131336
+2.040000	0.130029
+2.050000	0.128735
+2.060000	0.127454
+2.070000	0.126186
+2.080000	0.124930
+2.090000	0.123687
+2.100000	0.122456
+2.110000	0.121238
+2.120000	0.120032
+2.130000	0.118837
+2.140000	0.117655
+2.150000	0.116484
+2.160000	0.115325
+2.170000	0.114178
+2.180000	0.113042
+2.190000	0.111917
+2.200000	0.110803
+2.210000	0.109701
+2.220000	0.108609
+2.230000	0.107528
+2.240000	0.106459
+2.250000	0.105399
+2.260000	0.104350
+2.270000	0.103312
+2.280000	0.102284
+2.290000	0.101266
+2.300000	0.100259
+2.310000	0.099261
+2.320000	0.098274
+2.330000	0.097296
+2.340000	0.096328
+2.350000	0.095369
+2.360000	0.094420
+2.370000	0.093481
+2.380000	0.092551
+2.390000	0.091630
+2.400000	0.090718
+2.410000	0.089815
+2.420000	0.088922
+2.430000	0.088037
+2.440000	0.087161
+2.450000	0.086294
+2.460000	0.085435
+2.470000	0.084585
+2.480000	0.083743
+2.490000	0.082910
+2.500000	0.082085
+2.510000	0.081268
+2.520000	0.080460
+2.530000	0.079659
+2.540000	0.078866
+2.550000	0.078082
+2.560000	0.077305
+2.570000	0.076536
+2.580000	0.075774
+2.590000	0.075020
+2.600000	0.074274
+2.610000	0.073535
+2.620000	0.072803
+2.630000	0.072078
+2.640000	0.071361
+2.650000	0.070651
+2.660000	0.069948
+2.670000	0.069252
+2.680000	0.068563
+2.690000	0.067881
+2.700000	0.067206
+2.710000	0.066537
+2.720000	0.065875
+2.730000	0.065219
+2.740000	0.064570
+2.750000	0.063928
+2.760000	0.063292
+2.770000	0.062662
+2.780000	0.062039
+2.790000	0.061421
+2.800000	0.060810
+2.810000	0.060205
+2.820000	0.059606
+2.830000	0.059013
+2.840000	0.058426
+2.850000	0.057844
+2.860000	0.057269
+2.870000	0.056699
+2.880000	0.056135
+2.890000	0.055576
+2.900000	0.055023
+2.910000	0.054476
+2.920000	0.053934
+2.930000	0.053397
+2.940000	0.052866
+2.950000	0.052340
+2.960000	0.051819
+2.970000	0.051303
+2.980000	0.050793
+2.990000	0.050287
+3.000000	0.049787
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.5_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.5_1.0.dat
new file mode 100644
index 0000000..98b2cb7
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_1.5_1.0.dat
@@ -0,0 +1,313 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.149850
+0.020000	0.211533
+0.030000	0.258461
+0.040000	0.297610
+0.050000	0.331681
+0.060000	0.362063
+0.070000	0.389580
+0.080000	0.414772
+0.090000	0.438013
+0.100000	0.459576
+0.110000	0.479671
+0.120000	0.498458
+0.130000	0.516068
+0.140000	0.532605
+0.150000	0.548159
+0.160000	0.562803
+0.170000	0.576600
+0.180000	0.589605
+0.190000	0.601867
+0.200000	0.613425
+0.210000	0.624320
+0.220000	0.634583
+0.230000	0.644244
+0.240000	0.653333
+0.250000	0.661873
+0.260000	0.669887
+0.270000	0.677397
+0.280000	0.684423
+0.290000	0.690982
+0.300000	0.697092
+0.310000	0.702769
+0.320000	0.708028
+0.330000	0.712884
+0.340000	0.717350
+0.350000	0.721438
+0.360000	0.725162
+0.370000	0.728532
+0.380000	0.731561
+0.390000	0.734259
+0.400000	0.736635
+0.410000	0.738701
+0.420000	0.740465
+0.430000	0.741938
+0.440000	0.743127
+0.450000	0.744042
+0.460000	0.744691
+0.470000	0.745081
+0.480000	0.745222
+0.490000	0.745120
+0.500000	0.744783
+0.510000	0.744219
+0.520000	0.743434
+0.530000	0.742435
+0.540000	0.741229
+0.550000	0.739823
+0.560000	0.738223
+0.570000	0.736435
+0.580000	0.734465
+0.590000	0.732319
+0.600000	0.730004
+0.610000	0.727524
+0.620000	0.724886
+0.630000	0.722094
+0.640000	0.719155
+0.650000	0.716073
+0.660000	0.712854
+0.670000	0.709502
+0.680000	0.706022
+0.690000	0.702420
+0.700000	0.698700
+0.710000	0.694866
+0.720000	0.690923
+0.730000	0.686875
+0.740000	0.682727
+0.750000	0.678484
+0.760000	0.674148
+0.770000	0.669724
+0.780000	0.665216
+0.790000	0.660629
+0.800000	0.655965
+0.810000	0.651228
+0.820000	0.646423
+0.830000	0.641552
+0.840000	0.636619
+0.850000	0.631627
+0.860000	0.626581
+0.870000	0.621482
+0.880000	0.616335
+0.890000	0.611142
+0.900000	0.605906
+0.910000	0.600631
+0.920000	0.595319
+0.930000	0.589972
+0.940000	0.584595
+0.950000	0.579189
+0.960000	0.573757
+0.970000	0.568301
+0.980000	0.562825
+0.990000	0.557330
+1.000000	0.551819
+1.010000	0.546294
+1.020000	0.540758
+1.030000	0.535213
+1.040000	0.529660
+1.050000	0.524102
+1.060000	0.518540
+1.070000	0.512978
+1.080000	0.507416
+1.090000	0.501857
+1.100000	0.496303
+1.110000	0.490754
+1.120000	0.485213
+1.130000	0.479682
+1.140000	0.474161
+1.150000	0.468654
+1.160000	0.463160
+1.170000	0.457682
+1.180000	0.452220
+1.190000	0.446777
+1.200000	0.441354
+1.210000	0.435951
+1.220000	0.430571
+1.230000	0.425214
+1.240000	0.419881
+1.250000	0.414573
+1.260000	0.409292
+1.270000	0.404039
+1.280000	0.398814
+1.290000	0.393619
+1.300000	0.388454
+1.310000	0.383320
+1.320000	0.378218
+1.330000	0.373149
+1.340000	0.368114
+1.350000	0.363113
+1.360000	0.358147
+1.370000	0.353217
+1.380000	0.348323
+1.390000	0.343465
+1.400000	0.338646
+1.410000	0.333864
+1.420000	0.329120
+1.430000	0.324416
+1.440000	0.319751
+1.450000	0.315125
+1.460000	0.310540
+1.470000	0.305996
+1.480000	0.301492
+1.490000	0.297030
+1.500000	0.292609
+1.510000	0.288229
+1.520000	0.283892
+1.530000	0.279597
+1.540000	0.275344
+1.550000	0.271134
+1.560000	0.266967
+1.570000	0.262842
+1.580000	0.258761
+1.590000	0.254722
+1.600000	0.250727
+1.610000	0.246775
+1.620000	0.242866
+1.630000	0.239001
+1.640000	0.235178
+1.650000	0.231399
+1.660000	0.227664
+1.670000	0.223971
+1.680000	0.220322
+1.690000	0.216715
+1.700000	0.213152
+1.710000	0.209632
+1.720000	0.206154
+1.730000	0.202719
+1.740000	0.199327
+1.750000	0.195977
+1.760000	0.192669
+1.770000	0.189403
+1.780000	0.186179
+1.790000	0.182997
+1.800000	0.179857
+1.810000	0.176757
+1.820000	0.173699
+1.830000	0.170682
+1.840000	0.167705
+1.850000	0.164768
+1.860000	0.161872
+1.870000	0.159016
+1.880000	0.156199
+1.890000	0.153421
+1.900000	0.150683
+1.910000	0.147983
+1.920000	0.145322
+1.930000	0.142699
+1.940000	0.140114
+1.950000	0.137567
+1.960000	0.135056
+1.970000	0.132583
+1.980000	0.130147
+1.990000	0.127746
+2.000000	0.125382
+2.010000	0.123054
+2.020000	0.120761
+2.030000	0.118502
+2.040000	0.116279
+2.050000	0.114090
+2.060000	0.111935
+2.070000	0.109813
+2.080000	0.107725
+2.090000	0.105670
+2.100000	0.103648
+2.110000	0.101658
+2.120000	0.099700
+2.130000	0.097773
+2.140000	0.095878
+2.150000	0.094013
+2.160000	0.092179
+2.170000	0.090376
+2.180000	0.088602
+2.190000	0.086857
+2.200000	0.085142
+2.210000	0.083456
+2.220000	0.081798
+2.230000	0.080168
+2.240000	0.078566
+2.250000	0.076991
+2.260000	0.075443
+2.270000	0.073922
+2.280000	0.072427
+2.290000	0.070959
+2.300000	0.069516
+2.310000	0.068098
+2.320000	0.066705
+2.330000	0.065337
+2.340000	0.063994
+2.350000	0.062674
+2.360000	0.061378
+2.370000	0.060105
+2.380000	0.058856
+2.390000	0.057628
+2.400000	0.056424
+2.410000	0.055241
+2.420000	0.054080
+2.430000	0.052941
+2.440000	0.051822
+2.450000	0.050724
+2.460000	0.049647
+2.470000	0.048590
+2.480000	0.047553
+2.490000	0.046535
+2.500000	0.045537
+2.510000	0.044557
+2.520000	0.043596
+2.530000	0.042654
+2.540000	0.041730
+2.550000	0.040823
+2.560000	0.039934
+2.570000	0.039062
+2.580000	0.038207
+2.590000	0.037369
+2.600000	0.036547
+2.610000	0.035741
+2.620000	0.034952
+2.630000	0.034178
+2.640000	0.033419
+2.650000	0.032675
+2.660000	0.031946
+2.670000	0.031232
+2.680000	0.030532
+2.690000	0.029846
+2.700000	0.029174
+2.710000	0.028516
+2.720000	0.027871
+2.730000	0.027240
+2.740000	0.026621
+2.750000	0.026015
+2.760000	0.025421
+2.770000	0.024840
+2.780000	0.024270
+2.790000	0.023713
+2.800000	0.023167
+2.810000	0.022633
+2.820000	0.022109
+2.830000	0.021597
+2.840000	0.021096
+2.850000	0.020605
+2.860000	0.020124
+2.870000	0.019654
+2.880000	0.019194
+2.890000	0.018744
+2.900000	0.018303
+2.910000	0.017872
+2.920000	0.017450
+2.930000	0.017037
+2.940000	0.016633
+2.950000	0.016238
+2.960000	0.015851
+2.970000	0.015473
+2.980000	0.015103
+2.990000	0.014741
+3.000000	0.014388
diff --git a/v0.1-M1/chi/reference-manual/distribution_plots/weibull_5.0_1.0.dat b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_5.0_1.0.dat
new file mode 100644
index 0000000..d8b3d17
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/distribution_plots/weibull_5.0_1.0.dat
@@ -0,0 +1,313 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+0.000000	0.000000
+0.010000	0.000000
+0.020000	0.000001
+0.030000	0.000004
+0.040000	0.000013
+0.050000	0.000031
+0.060000	0.000065
+0.070000	0.000120
+0.080000	0.000205
+0.090000	0.000328
+0.100000	0.000500
+0.110000	0.000732
+0.120000	0.001037
+0.130000	0.001428
+0.140000	0.001921
+0.150000	0.002531
+0.160000	0.003276
+0.170000	0.004175
+0.180000	0.005248
+0.190000	0.006514
+0.200000	0.007997
+0.210000	0.009720
+0.220000	0.011707
+0.230000	0.013983
+0.240000	0.016576
+0.250000	0.019512
+0.260000	0.022822
+0.270000	0.026534
+0.280000	0.030680
+0.290000	0.035292
+0.300000	0.040402
+0.310000	0.046044
+0.320000	0.052253
+0.330000	0.059064
+0.340000	0.066514
+0.350000	0.074638
+0.360000	0.083475
+0.370000	0.093060
+0.380000	0.103434
+0.390000	0.114633
+0.400000	0.126696
+0.410000	0.139661
+0.420000	0.153565
+0.430000	0.168445
+0.440000	0.184340
+0.450000	0.201283
+0.460000	0.219309
+0.470000	0.238452
+0.480000	0.258743
+0.490000	0.280212
+0.500000	0.302885
+0.510000	0.326788
+0.520000	0.351942
+0.530000	0.378365
+0.540000	0.406073
+0.550000	0.435074
+0.560000	0.465376
+0.570000	0.496979
+0.580000	0.529879
+0.590000	0.564065
+0.600000	0.599521
+0.610000	0.636222
+0.620000	0.674139
+0.630000	0.713233
+0.640000	0.753456
+0.650000	0.794754
+0.660000	0.837062
+0.670000	0.880307
+0.680000	0.924405
+0.690000	0.969262
+0.700000	1.014776
+0.710000	1.060832
+0.720000	1.107306
+0.730000	1.154062
+0.740000	1.200955
+0.750000	1.247829
+0.760000	1.294517
+0.770000	1.340846
+0.780000	1.386628
+0.790000	1.431672
+0.800000	1.475776
+0.810000	1.518731
+0.820000	1.560325
+0.830000	1.600339
+0.840000	1.638551
+0.850000	1.674738
+0.860000	1.708677
+0.870000	1.740145
+0.880000	1.768926
+0.890000	1.794806
+0.900000	1.817580
+0.910000	1.837054
+0.920000	1.853044
+0.930000	1.865384
+0.940000	1.873920
+0.950000	1.878519
+0.960000	1.879070
+0.970000	1.875485
+0.980000	1.867697
+0.990000	1.855671
+1.000000	1.839397
+1.010000	1.818895
+1.020000	1.794215
+1.030000	1.765438
+1.040000	1.732677
+1.050000	1.696075
+1.060000	1.655806
+1.070000	1.612073
+1.080000	1.565107
+1.090000	1.515166
+1.100000	1.462531
+1.110000	1.407507
+1.120000	1.350414
+1.130000	1.291589
+1.140000	1.231381
+1.150000	1.170146
+1.160000	1.108243
+1.170000	1.046033
+1.180000	0.983869
+1.190000	0.922099
+1.200000	0.861056
+1.210000	0.801057
+1.220000	0.742400
+1.230000	0.685360
+1.240000	0.630185
+1.250000	0.577097
+1.260000	0.526285
+1.270000	0.477911
+1.280000	0.432101
+1.290000	0.388952
+1.300000	0.348529
+1.310000	0.310863
+1.320000	0.275960
+1.330000	0.243795
+1.340000	0.214320
+1.350000	0.187462
+1.360000	0.163130
+1.370000	0.141212
+1.380000	0.121587
+1.390000	0.104118
+1.400000	0.088663
+1.410000	0.075074
+1.420000	0.063199
+1.430000	0.052888
+1.440000	0.043993
+1.450000	0.036369
+1.460000	0.029878
+1.470000	0.024388
+1.480000	0.019777
+1.490000	0.015932
+1.500000	0.012747
+1.510000	0.010129
+1.520000	0.007991
+1.530000	0.006260
+1.540000	0.004868
+1.550000	0.003757
+1.560000	0.002878
+1.570000	0.002187
+1.580000	0.001649
+1.590000	0.001234
+1.600000	0.000915
+1.610000	0.000673
+1.620000	0.000491
+1.630000	0.000355
+1.640000	0.000255
+1.650000	0.000181
+1.660000	0.000127
+1.670000	0.000089
+1.680000	0.000061
+1.690000	0.000042
+1.700000	0.000028
+1.710000	0.000019
+1.720000	0.000013
+1.730000	0.000008
+1.740000	0.000005
+1.750000	0.000003
+1.760000	0.000002
+1.770000	0.000001
+1.780000	0.000001
+1.790000	0.000001
+1.800000	0.000000
+1.810000	0.000000
+1.820000	0.000000
+1.830000	0.000000
+1.840000	0.000000
+1.850000	0.000000
+1.860000	0.000000
+1.870000	0.000000
+1.880000	0.000000
+1.890000	0.000000
+1.900000	0.000000
+1.910000	0.000000
+1.920000	0.000000
+1.930000	0.000000
+1.940000	0.000000
+1.950000	0.000000
+1.960000	0.000000
+1.970000	0.000000
+1.980000	0.000000
+1.990000	0.000000
+2.000000	0.000000
+2.010000	0.000000
+2.020000	0.000000
+2.030000	0.000000
+2.040000	0.000000
+2.050000	0.000000
+2.060000	0.000000
+2.070000	0.000000
+2.080000	0.000000
+2.090000	0.000000
+2.100000	0.000000
+2.110000	0.000000
+2.120000	0.000000
+2.130000	0.000000
+2.140000	0.000000
+2.150000	0.000000
+2.160000	0.000000
+2.170000	0.000000
+2.180000	0.000000
+2.190000	0.000000
+2.200000	0.000000
+2.210000	0.000000
+2.220000	0.000000
+2.230000	0.000000
+2.240000	0.000000
+2.250000	0.000000
+2.260000	0.000000
+2.270000	0.000000
+2.280000	0.000000
+2.290000	0.000000
+2.300000	0.000000
+2.310000	0.000000
+2.320000	0.000000
+2.330000	0.000000
+2.340000	0.000000
+2.350000	0.000000
+2.360000	0.000000
+2.370000	0.000000
+2.380000	0.000000
+2.390000	0.000000
+2.400000	0.000000
+2.410000	0.000000
+2.420000	0.000000
+2.430000	0.000000
+2.440000	0.000000
+2.450000	0.000000
+2.460000	0.000000
+2.470000	0.000000
+2.480000	0.000000
+2.490000	0.000000
+2.500000	0.000000
+2.510000	0.000000
+2.520000	0.000000
+2.530000	0.000000
+2.540000	0.000000
+2.550000	0.000000
+2.560000	0.000000
+2.570000	0.000000
+2.580000	0.000000
+2.590000	0.000000
+2.600000	0.000000
+2.610000	0.000000
+2.620000	0.000000
+2.630000	0.000000
+2.640000	0.000000
+2.650000	0.000000
+2.660000	0.000000
+2.670000	0.000000
+2.680000	0.000000
+2.690000	0.000000
+2.700000	0.000000
+2.710000	0.000000
+2.720000	0.000000
+2.730000	0.000000
+2.740000	0.000000
+2.750000	0.000000
+2.760000	0.000000
+2.770000	0.000000
+2.780000	0.000000
+2.790000	0.000000
+2.800000	0.000000
+2.810000	0.000000
+2.820000	0.000000
+2.830000	0.000000
+2.840000	0.000000
+2.850000	0.000000
+2.860000	0.000000
+2.870000	0.000000
+2.880000	0.000000
+2.890000	0.000000
+2.900000	0.000000
+2.910000	0.000000
+2.920000	0.000000
+2.930000	0.000000
+2.940000	0.000000
+2.950000	0.000000
+2.960000	0.000000
+2.970000	0.000000
+2.980000	0.000000
+2.990000	0.000000
+3.000000	0.000000
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/Makefile b/v0.1-M1/chi/reference-manual/rail_diagrams/Makefile
new file mode 100644
index 0000000..4bd7a6b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/Makefile
@@ -0,0 +1,45 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+#
+# Makefile for creating the reference manual rail road images
+#
+LATEX=latex
+DVIPS=dvips
+RAIL=rail
+CROP=bbox_add.pl
+EPSPNG=eps2png
+
+NONSOURCE=picture.tex preamble.tex postamble.tex
+SOURCE=$(filter-out $(NONSOURCE),$(wildcard *.tex))
+DEST=$(SOURCE:.tex=.png)
+
+.phony: images clean
+
+images: $(DEST)
+
+# eps2png: -t=transparent, -f=force writing, -d=dpi
+%.png: %.tex
+	cat preamble.tex $< postamble.tex > picture.tex
+	$(LATEX) picture.tex
+	$(RAIL) picture
+	$(LATEX) picture.tex
+	$(DVIPS) -E -o picture.eps picture.dvi
+	$(CROP) picture.eps
+	$(EPSPNG) -d 120 -f -t picture.eps
+	mv picture.png $@
+
+clean:
+	for i in $(DEST) picture.aux picture.dvi picture.eps picture.log picture.tex;\
+	do if test -f $$i;\
+	   then rm $$i;\
+	   fi;\
+	done
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.png b/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.png
new file mode 100644
index 0000000..5de6c65
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.tex
new file mode 100644
index 0000000..e5492c0
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/addressable.tex
@@ -0,0 +1,19 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Addressable : VARNAMETK
+              ( ()
+              | ( ( ( [1] DOTTK FIELDNAMETK )
+                  | ( [2] SQOPENTK Expression SQCLOSETK )
+                  ) + () )
+              ) ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.png
new file mode 100644
index 0000000..294262c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.tex
new file mode 100644
index 0000000..188b32a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/assignment_statement.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+AssignmentStatement : ( Addressable + COMMATK )
+                      BECOMESTK
+                      ( Expression + COMMATK ) ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/body.png b/v0.1-M1/chi/reference-manual/rail_diagrams/body.png
new file mode 100644
index 0000000..fe8dfba
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/body.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/body.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/body.tex
new file mode 100644
index 0000000..d259468
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/body.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Body : ( () | VarDefinitions ) ( [1] ( Statement + SEMICOLTK ) )
+     ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.png
new file mode 100644
index 0000000..3aeba21
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.tex
new file mode 100644
index 0000000..fef32d9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/bool_expression.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+BooleanLiteralValue : TRUEKW | FALSEKW
+                    ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.png
new file mode 100644
index 0000000..02272c3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.tex
new file mode 100644
index 0000000..501b619
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/break_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+BreakStatement : BREAKKW ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.png
new file mode 100644
index 0000000..2070320
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.tex
new file mode 100644
index 0000000..d9b1288
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/cast_expression.tex
@@ -0,0 +1,18 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+CastExpression : ( BOOLKW | INTKW | REALKW | STRINGKW
+                 | TIMERKW | MATRIXKW | SETKW
+                 )
+                 PAROPENTK Expression PARCLOSETK
+               ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.png
new file mode 100644
index 0000000..5044216
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.tex
new file mode 100644
index 0000000..688d78c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/channel_type.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ChannelType : CHANKW ( () | RECEIVETK | SENDTK | SENDRECEIVETK )
+              ( Type | VOIDKW )
+            ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.png
new file mode 100644
index 0000000..61b691b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.tex
new file mode 100644
index 0000000..2737e3c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/choice_statement.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ChoiceStatement : IFKW BooleanExpression COLONTK ( Statement + SEMICOLTK ) \\
+                  ( ()
+                  | ( ELIFKW BooleanExpression COLONTK ( Statement + SEMICOLTK ) ) + ()
+                  ) \\
+                  ( ()
+                  | ( ELSEKW COLONTK ( Statement + SEMICOLTK ) )
+                  )
+                  ENDKW ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.png
new file mode 100644
index 0000000..eb418b4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.tex
new file mode 100644
index 0000000..38e2a2d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/close_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+CloseStatement : CLOSEKW PAROPENTK FileExpression PARCLOSETK ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.png
new file mode 100644
index 0000000..1d6d20a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.tex
new file mode 100644
index 0000000..6ab66c3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/communication_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+CommunicationStatement : SendStatement | ReceiveStatement
+               | SelectStatement ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.png
new file mode 100644
index 0000000..3ab6511
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.tex
new file mode 100644
index 0000000..43b6673
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/compare_expression.tex
@@ -0,0 +1,25 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+BooleanExpression : Expression ( EQTK | NETK ) Expression
+                  | ( IntegerExpression | RealExpression )
+                    ( LTTK | LETK | GETK | GTTK )
+                    ( IntegerExpression | RealExpression )
+                  | StringExpression ( LTTK | LETK | GETK | GTTK )
+                    StringExpression
+                  | Expression INKW ( ListExpression | SetExpression
+                                    | DictionaryExpression )
+                  | ListExpression SUBKW ListExpression
+                  | SetExpression SUBKW SetExpression
+                  | DictionaryExpression SUBKW DictionaryExpression
+                  ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.png
new file mode 100644
index 0000000..f37f28c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.tex
new file mode 100644
index 0000000..ba0b73a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/constantdef.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+    ConstantDefinition: CONSTKW ( Type CONSTANTNAMETK BECOMESTK Expression ) + COMMATK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.png
new file mode 100644
index 0000000..a87a9ae
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.tex
new file mode 100644
index 0000000..12ee344
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/container_type.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ContainerType : SetType
+              | ListType
+              | DictionaryType
+              ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.png
new file mode 100644
index 0000000..d104515
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.tex
new file mode 100644
index 0000000..7e20e6b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/continue_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ContinueStatement : CONTINUEKW ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.png
new file mode 100644
index 0000000..6ec0f2e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.tex
new file mode 100644
index 0000000..9d6535f
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/delay_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+DelayStatement : DELAYKW ( IntegerExpression | RealExpression ) ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.png
new file mode 100644
index 0000000..f613671
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.tex
new file mode 100644
index 0000000..5a645f2
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/dictionary_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+DictionaryType : DICTKW PAROPENTK Type COLONTK Type PARCLOSETK
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.png
new file mode 100644
index 0000000..85168f8
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.tex
new file mode 100644
index 0000000..2a43e4c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/distribution_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+DistributionType : DISTKW Type ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.png
new file mode 100644
index 0000000..1520ed4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.tex
new file mode 100644
index 0000000..9b79ffb
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/elementary_type.tex
@@ -0,0 +1,18 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ElementaryType : BOOLKW | INTKW | REALKW | STRINGKW | FILEKW | INSTKW |
+                 TIMERKW |
+                 MATRIXKW PAROPENTK ConstantExpression COMMATK ConstantExpression PARCLOSETK |
+                 VOIDKW
+               ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.png b/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.png
new file mode 100644
index 0000000..69585ed
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.tex
new file mode 100644
index 0000000..454f3af
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/enum_value.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+EnumLiteralValue : ENUMVALUENAMETK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.png
new file mode 100644
index 0000000..f08fefe
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.tex
new file mode 100644
index 0000000..da51d06
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/enumdef.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+EnumDefinition: ENUMKW ( ENUMTYPENAMETK BECOMESTK
+                CUROPENTK ( ENUMVALUENAMETK + COMMATK ) CURCLOSETK ) + COMMATK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.png
new file mode 100644
index 0000000..1f78332
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.tex
new file mode 100644
index 0000000..c2be7d9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/exit_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ExitStatement : EXITKW ( () | ( Expression + COMMATK ) ) ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.png
new file mode 100644
index 0000000..9ff77ce
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.tex
new file mode 100644
index 0000000..8673be9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/finish_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+FinishStatement : FINISHKW ( PROCESSNAMETK + COMMATK ) ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.png
new file mode 100644
index 0000000..99bc003
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.tex
new file mode 100644
index 0000000..afe50a3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/for_statement.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ForStatement : FORKW ( VARNAMETK + COMMATK ) INKW Expression
+               COLONTK ( Statement + SEMICOLTK ) ENDKW
+             ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.png b/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.png
new file mode 100644
index 0000000..7d04389
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.tex
new file mode 100644
index 0000000..69e66da
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/formalparms.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+FormalParameters: ( Type ( VARNAMETK + COMMATK ) ) + SEMICOLTK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.png
new file mode 100644
index 0000000..42c8254
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.tex
new file mode 100644
index 0000000..68bcec3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/func_call_expression.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+FunctionCallExpression : Expression PAROPENTK
+                         ( () | ( Expression + COMMATK ) ) PARCLOSETK
+                       ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.png
new file mode 100644
index 0000000..a6b4698
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.tex
new file mode 100644
index 0000000..957d713
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/funcdef.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+FunctionDefinition: FUNCKW Type FUNCTIONNAMETK
+                    PAROPENTK ( () | FormalParameters ) PARCLOSETK COLONTK Body ENDKW
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.png
new file mode 100644
index 0000000..0742715
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.tex
new file mode 100644
index 0000000..dcbcb8f
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/function_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+FunctionType : FUNCKW Type PAROPENTK ( () | ( Type + COMMATK ) ) PARCLOSETK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.png
new file mode 100644
index 0000000..d25f50d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.tex
new file mode 100644
index 0000000..16e994f
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/generic_expression.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Expression : ( [1] ( CONSTANTNAMETK
+                   | ENUMVALUENAMETK
+                   | VARNAMETK
+                   | FUNCTIONNAMETK
+                   | PROCESSNAMETK ) )
+           | ( [2] PAROPENTK Expression PARCLOSETK )
+           | ( [3] TypedExpression )
+           ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.png
new file mode 100644
index 0000000..41515ea
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.tex
new file mode 100644
index 0000000..52d954d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/iterative_statement.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Iterativestatement : WhileStatement
+               | ForStatement
+               | BreakStatement | ContinueStatement ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.png b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.png
new file mode 100644
index 0000000..843c8df
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.tex
new file mode 100644
index 0000000..e327d0a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_real_number.tex
@@ -0,0 +1,20 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+LexicalRealNumber : ( ZEROTK | ( ONENINETK ( () + ZERONINETK ) ) )
+                    ( DOTTK ( ZERONINETK + () )
+                    | ( ( () | ( DOTTK ( ZERONINETK + () ) ) )
+                        ( expTK | EXPTK ) ( () | PLUSTK | MINUSTK )
+                        ( ZEROTK | ( ONENINETK ( () + ZERONINETK ) ) )
+                        ) )
+                    ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.png b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.png
new file mode 100644
index 0000000..437d65b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.tex
new file mode 100644
index 0000000..851ddd6
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/lexical_string_literal.tex
@@ -0,0 +1,20 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+LexicalString : QUOTETK
+                ( ()
+                | ( ( SINGLE
+                    | ( BACKSLASHTK ( QUOTETK | BACKSLASHTK | TTK | NTK )  )
+                    ) + () )
+                )
+                QUOTETK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.png
new file mode 100644
index 0000000..c65d704
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.tex
new file mode 100644
index 0000000..a4f3a28
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/list_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ListType : LISTKW ( () | ( PAROPENTK Expression PARCLOSETK ) ) Type
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.png
new file mode 100644
index 0000000..55c6d5c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.tex
new file mode 100644
index 0000000..b0a18ee
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_dictionary.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+DictionaryLiteralValue : LTTK Type COLONTK Type GTTK CUROPENTK CURCLOSETK
+                | CUROPENTK ( ( Expression COLONTK Expression ) + COMMATK ) CURCLOSETK
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.png
new file mode 100644
index 0000000..391aef3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.tex
new file mode 100644
index 0000000..c548349
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_integer_number.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+LexicalIntegerNumber : ZEROTK
+                     | ONENINETK ( () + ZERONINETK )
+                     ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.png
new file mode 100644
index 0000000..ef5caa3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.tex
new file mode 100644
index 0000000..fe41036
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_list.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ListLiteralValue : LTTK Type GTTK SQOPENTK SQCLOSETK
+                 | SQOPENTK ( Expression + COMMATK ) SQCLOSETK
+                 ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.png
new file mode 100644
index 0000000..9a56468
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.tex
new file mode 100644
index 0000000..4b91145
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_matrix.tex
@@ -0,0 +1,18 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+MatrixExpression : SQOPENTK
+                   ( ( RealExpression + COMMATK )
+                     ( ( SEMICOLTK ( RealExpression + COMMATK ) ) + () ) )
+                   SQCLOSETK
+                 ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.png
new file mode 100644
index 0000000..e2374df
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.tex
new file mode 100644
index 0000000..bb88a36
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_set.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SetLiteralValue : ( LTTK Type GTTK CUROPENTK CURCLOSETK )
+                | ( CUROPENTK ( Expression + COMMATK ) CURCLOSETK )
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.png b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.png
new file mode 100644
index 0000000..b0c31fb
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.tex
new file mode 100644
index 0000000..0f7d2a1
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/literal_tuple.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+TupleExpression : PAROPENTK Expression COMMATK ( Expression + COMMATK )
+                  PARCLOSETK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.png
new file mode 100644
index 0000000..c433251
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.tex
new file mode 100644
index 0000000..62cfa3b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/modeldef.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ModelDefinition: MODELKW ( () | Type ) MODELNAMETK PAROPENTK
+                 ( () | FormalParameters ) PARCLOSETK COLONTK Body ENDKW
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.png b/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.png
new file mode 100644
index 0000000..b4f5f6b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.tex
new file mode 100644
index 0000000..50c5a0b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/other_statements.tex
@@ -0,0 +1,20 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+OtherStatements : DelayStatement
+                | WriteStatement
+                | CloseStatement
+                | ReturnStatement
+                | ExitStatement
+                | PassStatement
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.png
new file mode 100644
index 0000000..692a502
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.tex
new file mode 100644
index 0000000..7def7c5
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/pass_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+PassStatement : PASSKW ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/postamble.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/postamble.tex
new file mode 100644
index 0000000..f29fa8b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/postamble.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+}
+\end{TeXtoEPS}
+\end{document}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/preamble.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/preamble.tex
new file mode 100644
index 0000000..3aaff9b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/preamble.tex
@@ -0,0 +1,131 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage[a4paper]{geometry}
+\usepackage{times}
+\usepackage{pst-eps}
+
+\usepackage{rail}
+
+\railnontermfont{\rmfamily\itshape}
+\railterm{ALTKW}\railalias{ALTKW}{alt}
+\railterm{ANDKW}\railalias{ANDKW}{and}
+\railterm{ASTERISKTK}\railalias{ASTERISKTK}{\char"2A} % *
+\railterm{BECOMESTK}\railalias{BECOMESTK}{\char"3D} % =
+\railterm{BOOLKW}\railalias{BOOLKW}{bool}
+\railterm{BREAKKW}\railalias{BREAKKW}{break}
+\railterm{CARETTK}\railalias{CARETTK}{\char"5E} % ^
+\railterm{CHANKW}\railalias{CHANKW}{chan}
+\railterm{CHANNELKW}\railalias{CHANNELKW}{channel}
+\railterm{CLOSEKW}\railalias{CLOSEKW}{close}
+\railterm{COLONTK}\railalias{COLONTK}{\char"3A} % :
+\railterm{COMMATK}\railalias{COMMATK}{\char"2C} % ,
+\railterm{CONSTKW}\railalias{CONSTKW}{const}
+\railterm{CONTINUEKW}\railalias{CONTINUEKW}{continue}
+\railterm{CURCLOSETK}\railalias{CURCLOSETK}{\char"7D} % }
+\railterm{CUROPENTK}\railalias{CUROPENTK}{\char"7B} % {
+\railterm{DELAYKW}\railalias{DELAYKW}{delay}
+\railterm{DICTKW}\railalias{DICTKW}{dict}
+\railterm{DISTKW}\railalias{DISTKW}{dist}
+\railterm{DIVKW}\railalias{DIVKW}{div}
+\railterm{DOTTK}\railalias{DOTTK}{\char"2E} % .
+\railterm{ELIFKW}\railalias{ELIFKW}{elif}
+\railterm{ELSEKW}\railalias{ELSEKW}{else}
+\railterm{ENDKW}\railalias{ENDKW}{end}
+\railterm{ENUMKW}\railalias{ENUMKW}{enum}
+\railterm{EQTK}\railalias{EQTK}{\char"3D\char"3D} % ==
+\railterm{EXITKW}\railalias{EXITKW}{exit}
+\railterm{FALSEKW}\railalias{FALSEKW}{false}
+\railterm{FILEKW}\railalias{FILEKW}{file}
+\railterm{FINISHKW}\railalias{FINISHKW}{finish}
+\railterm{FORKW}\railalias{FORKW}{for}
+\railterm{FUNCKW}\railalias{FUNCKW}{func}
+\railterm{GETK}\railalias{GETK}{\char"3E\char"3D} % >=
+\railterm{GTTK}\railalias{GTTK}{\char"3E} % >
+\railterm{IDENTIFIERTK}\railalias{IDENTIFIERTK}{Identifier}
+\railterm{IFKW}\railalias{IFKW}{if}
+\railterm{INKW}\railalias{INKW}{in}
+\railterm{INSTKW}\railalias{INSTKW}{inst}
+\railterm{INTKW}\railalias{INTKW}{int}
+\railterm{LETK}\railalias{LETK}{\char"3C\char"3D} % <=
+\railterm{LISTKW}\railalias{LISTKW}{list}
+\railterm{LTTK}\railalias{LTTK}{\char"3C} % <
+\railterm{MATRIXKW}\railalias{MATRIXKW}{matrix}
+\railterm{MINUSTK}\railalias{MINUSTK}{\char"2D} % -
+\railterm{MODELKW}\railalias{MODELKW}{model}
+\railterm{MODKW}\railalias{MODKW}{mod}
+\railterm{NETK}\railalias{NETK}{\char"21\char"3D} % !=
+\railterm{NOTKW}\railalias{NOTKW}{not}
+\railterm{NUMBERTK}\railalias{NUMBERTK}{Number}
+\railterm{ORKW}\railalias{ORKW}{or}
+\railterm{PARCLOSETK}\railalias{PARCLOSETK}{\char"29} % )
+\railterm{PAROPENTK}\railalias{PAROPENTK}{\char"28} % (
+\railterm{PASSKW}\railalias{PASSKW}{pass}
+\railterm{PLUSTK}\railalias{PLUSTK}{\char"2B} % +
+\railterm{PROCKW}\railalias{PROCKW}{proc}
+\railterm{READKW}\railalias{READKW}{read}
+\railterm{REALKW}\railalias{REALKW}{real}
+\railterm{REALTK}\railalias{REALTK}{Real}
+\railterm{RECEIVETK}\railalias{RECEIVETK}{\char"3F} % ?
+\railterm{RETURNKW}\railalias{RETURNKW}{return}
+\railterm{RUNKW}\railalias{RUNKW}{run}
+\railterm{SAMPLEKW}\railalias{SAMPLEKW}{sample}
+\railterm{SELECTKW}\railalias{SELECTKW}{select}
+\railterm{SEMICOLTK}\railalias{SEMICOLTK}{\char"3B} % ;
+\railterm{SENDRECEIVETK}\railalias{SENDRECEIVETK}{\char"21\char"3F} % !?
+\railterm{SENDTK}\railalias{SENDTK}{\char"21} % !
+\railterm{SETKW}\railalias{SETKW}{set}
+\railterm{SLASHTK}\railalias{SLASHTK}{\char"2F}
+\railterm{SQCLOSETK}\railalias{SQCLOSETK}{\char"5D} % ]
+\railterm{SQOPENTK}\railalias{SQOPENTK}{\char"5B}   % [
+\railterm{STARTKW}\railalias{STARTKW}{start}
+\railterm{STRINGKW}\railalias{STRINGKW}{string}
+\railterm{STRINGTK}\railalias{STRINGTK}{String}
+\railterm{SUBKW}\railalias{SUBKW}{sub}
+\railterm{TIMEKW}\railalias{TIMEKW}{time}
+\railterm{TIMERKW}\railalias{TIMERKW}{timer}
+\railterm{TRUEKW}\railalias{TRUEKW}{true}
+\railterm{TUPLEKW}\railalias{TUPLEKW}{tuple}
+\railterm{TYPEKW}\railalias{TYPEKW}{type}
+\railterm{UNWINDKW}\railalias{UNWINDKW}{unwind}
+\railterm{VOIDKW}\railalias{VOIDKW}{void}
+\railterm{WHILEKW}\railalias{WHILEKW}{while}
+\railterm{WRITEKW}\railalias{WRITEKW}{write}
+\railterm{WRITELNKW}\railalias{WRITELNKW}{writeln}
+\railterm{XPERKW}\railalias{XPERKW}{xper}
+\railterm{ZEROTK}\railalias{ZEROTK}{0}
+\railterm{ZERONINETK}\railalias{ZERONINETK}{0\ldots 9}
+\railterm{expTK}\railalias{expTK}{e}
+\railterm{EXPTK}\railalias{EXPTK}{E}
+\railterm{ONENINETK}\railalias{ONENINETK}{1\ldots 9} % 1...9
+\railterm{QUOTETK}\railalias{QUOTETK}{\char"22} % "
+\railterm{BACKSLASHTK}\railalias{BACKSLASHTK}{$\backslash$} % \
+\railterm{STRESC}\railalias{STRESC}%
+    {`\char"22', `$\backslash$', `n', or `t'} % ["\nt]
+\railterm{SINGLE}\railalias{SINGLE}%
+    {not `\char"22', `$\backslash$', `TAB', or `NL'} % [^"\\\t\n]
+\railterm{NTK}\railalias{NTK}{n}
+\railterm{TTK}\railalias{TTK}{t}
+\railterm{CONSTANTNAMETK}\railalias{CONSTANTNAMETK}{ConstantName}
+\railterm{ENUMTYPENAMETK}\railalias{ENUMTYPENAMETK}{EnumtypeName}
+\railterm{ENUMVALUENAMETK}\railalias{ENUMVALUENAMETK}{EnumvalueName}
+\railterm{FIELDNAMETK}\railalias{FIELDNAMETK}{FieldName}
+\railterm{FUNCTIONNAMETK}\railalias{FUNCTIONNAMETK}{FunctionName}
+\railterm{MODELNAMETK}\railalias{MODELNAMETK}{ModelName}
+\railterm{XPERNAMETK}\railalias{XPERNAMETK}{ExperimentName}
+\railterm{PROCESSNAMETK}\railalias{PROCESSNAMETK}{ProcessName}
+\railterm{TYPENAMETK}\railalias{TYPENAMETK}{TypeName}
+\railterm{VARNAMETK}\railalias{VARNAMETK}{VariableName}
+
+\begin{document}
+\begin{TeXtoEPS}
+\vbox{%
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.png
new file mode 100644
index 0000000..d9974a3
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.tex
new file mode 100644
index 0000000..ea4a5e4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/procdef.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ProcessDefinition: PROCKW ( () | Type ) PROCESSNAMETK PAROPENTK
+                   ( () | FormalParameters ) PARCLOSETK COLONTK Body ENDKW
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.png b/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.png
new file mode 100644
index 0000000..b5475a1
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.tex
new file mode 100644
index 0000000..75f4f96
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/process_instance.tex
@@ -0,0 +1,19 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ProcessInstance : [1] ( () | ( PROCESSNAMETK BECOMESTK ) )
+                      PROCESSNAMETK PAROPENTK ( () | ( Expression + COMMATK ) ) PARCLOSETK
+                | [2] UNWINDKW ( ( ( VARNAMETK + COMMATK ) INKW Expression ) + COMMATK )
+                      COLONTK ( ProcessInstance + COMMATK ) ENDKW
+
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.png
new file mode 100644
index 0000000..5fb1d92
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.tex
new file mode 100644
index 0000000..5db4242
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/process_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ProcessType : PROCKW PAROPENTK ( () | ( Type + COMMATK ) ) PARCLOSETK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/program.png b/v0.1-M1/chi/reference-manual/rail_diagrams/program.png
new file mode 100644
index 0000000..dad2628
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/program.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/program.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/program.tex
new file mode 100644
index 0000000..bac72b4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/program.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Program : ( EnumDefinition
+          | TypeDefinition
+          | ConstantDefinition
+          | ProcessDefinition
+          | ModelDefinition
+          | FunctionDefinition
+          | ExperimentDefinition
+          ) + SEMICOLTK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.png b/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.png
new file mode 100644
index 0000000..1cc3f0c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.tex
new file mode 100644
index 0000000..7a8d844
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/real_number_values.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+RealNumberValue : LexicalRealNumber
+                | TIMEKW
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.png
new file mode 100644
index 0000000..3bbfd42
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.tex
new file mode 100644
index 0000000..a8df180
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/receive_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ReceiveStatement : ChannelExpression RECEIVETK ( () | Addressable ) ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.png
new file mode 100644
index 0000000..1da088c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.tex
new file mode 100644
index 0000000..bf3adb6
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/return_statement.tex
@@ -0,0 +1,15 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ReturnStatement : RETURNKW ( Expression + COMMATK ) ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.png b/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.png
new file mode 100644
index 0000000..7931527
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.tex
new file mode 100644
index 0000000..e5d39d0
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/run_start.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+RunStartStatement : ( RUNKW | STARTKW ) ( ProcessInstance + COMMATK ) ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.png b/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.png
new file mode 100644
index 0000000..91c8c7c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.tex
new file mode 100644
index 0000000..7023efc
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_alternative.tex
@@ -0,0 +1,20 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SelectAlternative :( [1] ( ( () | ( BooleanExpression COMMATK ) )
+                           ( SendStatement | ReceiveStatement )
+                         )
+                   | [2] BooleanExpression
+                   )
+                   ( () | ( [3] COLONTK ( Statement + SEMICOLTK ) ) )
+                  ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.png b/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.png
new file mode 100644
index 0000000..9ad435e
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.tex
new file mode 100644
index 0000000..8519692
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_condition.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SelectCondition : [1] SelectAlternative
+                | [2] UNWINDKW ( ( ( VARNAMETK + COMMATK ) INKW Expression ) + COMMATK )
+                      COLONTK SelectAlternative ENDKW
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.png
new file mode 100644
index 0000000..c36288a
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.tex
new file mode 100644
index 0000000..b110cb1
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/select_statement.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SelectStatement : SELECTKW SelectCondition
+                  ( () | ( ALTKW SelectCondition + () ) )
+                  ENDKW
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.png
new file mode 100644
index 0000000..ceb89e2
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.tex
new file mode 100644
index 0000000..4c5c0a1
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/send_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SendStatement : ChannelExpression SENDTK ( () | Expression ) ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.png
new file mode 100644
index 0000000..6ebf2ad
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.tex
new file mode 100644
index 0000000..6ea11ac
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/set_type.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SetType : SETKW Type ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/statement.png
new file mode 100644
index 0000000..53af1f1
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/statement.tex
new file mode 100644
index 0000000..69b750c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/statement.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Statement : ( AssignmentStatement
+            | Iterativestatement
+            | ChoiceStatement
+            | SubProcessStatement
+            | CommunicationStatement
+            | OtherStatements
+            ) ;
+\end{rail}
+
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.png
new file mode 100644
index 0000000..ab570f9
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.tex
new file mode 100644
index 0000000..dfaf101
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/subprocess_statement.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+SubProcessStatement : RunStartStatement | FinishStatement ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/terminate_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/terminate_statement.png
new file mode 100644
index 0000000..36a2965
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/terminate_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.png
new file mode 100644
index 0000000..8a16e70
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.tex
new file mode 100644
index 0000000..4af745d
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/tuple_type.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+TupleType : TUPLEKW PAROPENTK
+            ( ( Type ( FIELDNAMETK + COMMATK ) ) + SEMICOLTK )
+            PARCLOSETK
+          ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/type.png b/v0.1-M1/chi/reference-manual/rail_diagrams/type.png
new file mode 100644
index 0000000..af7ea98
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/type.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/type.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/type.tex
new file mode 100644
index 0000000..bfd4cd6
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/type.tex
@@ -0,0 +1,23 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+Type : ElementaryType
+     | ContainerType
+     | TupleType
+     | ChannelType
+     | DistributionType
+     | FunctionType
+     | ProcessType
+     | TYPENAMETK
+     | ENUMTYPENAMETK
+     ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.png b/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.png
new file mode 100644
index 0000000..cdc7551
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.tex
new file mode 100644
index 0000000..30b93d0
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/typed_expression.tex
@@ -0,0 +1,31 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+TypedExpression : BooleanExpression
+                | IntegerExpression
+                | RealExpression
+                | StringExpression
+                | ListExpression
+                | SetExpression
+                | DictionaryExpression
+                | TupleExpression
+                | FileExpression
+                | ReadExpression
+                | TimerExpression
+                | ChannelExpression
+                | DistributionExpression
+                | ProcessExpression
+                | InstanceExpression
+                | CastExpression
+                | FunctionCallExpression
+                ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.png
new file mode 100644
index 0000000..5c23a7c
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.tex
new file mode 100644
index 0000000..b9e8ef2
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/typedef.tex
@@ -0,0 +1,14 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+TypeDefinition: TYPEKW ( TYPENAMETK BECOMESTK Type ) + COMMATK ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.png
new file mode 100644
index 0000000..8dfa729
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.tex
new file mode 100644
index 0000000..580ca2b
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/vardef.tex
@@ -0,0 +1,19 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+VarDefinitions : ( Type
+                   ( VARNAMETK
+                     ( () | BECOMESTK Expression ) + COMMATK
+                   )
+                   SEMICOLTK
+                 ) + () ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.png
new file mode 100644
index 0000000..f6fce56
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.tex
new file mode 100644
index 0000000..eb1fe35
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/while_statement.tex
@@ -0,0 +1,16 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+WhileStatement : WHILEKW BooleanExpression COLONTK
+                 ( Statement + SEMICOLTK ) ENDKW
+                 ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.png b/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.png
new file mode 100644
index 0000000..08a52c4
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.tex
new file mode 100644
index 0000000..772e815
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/write_statement.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+WriteStatement : ( WRITEKW | WRITELNKW )
+                 PAROPENTK ( () | ( [1] FileExpression COMMATK ) )
+                 ( [2] LexicalString ) ( COMMATK + Expression ) PARCLOSETK
+               ;
+\end{rail}
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.png b/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.png
new file mode 100644
index 0000000..ef0f400
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.png
Binary files differ
diff --git a/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.tex b/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.tex
new file mode 100644
index 0000000..3e32f67
--- /dev/null
+++ b/v0.1-M1/chi/reference-manual/rail_diagrams/xperdef.tex
@@ -0,0 +1,17 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\begin{rail}
+ExperimentDefinition: XPERKW XPERNAMETK
+                      PAROPENTK ( () | FormalParameters ) PARCLOSETK
+                      COLONTK Body ENDKW
+\end{rail}
+
diff --git a/v0.1-M1/chi/tool-manual/chi_compiler_dialog.png b/v0.1-M1/chi/tool-manual/chi_compiler_dialog.png
new file mode 100644
index 0000000..972c7c4
--- /dev/null
+++ b/v0.1-M1/chi/tool-manual/chi_compiler_dialog.png
Binary files differ
diff --git a/v0.1-M1/chi/tool-manual/chi_simulator_dialog.png b/v0.1-M1/chi/tool-manual/chi_simulator_dialog.png
new file mode 100644
index 0000000..d076d5f
--- /dev/null
+++ b/v0.1-M1/chi/tool-manual/chi_simulator_dialog.png
Binary files differ
diff --git a/v0.1-M1/chi/tool-manual/terminate_button.png b/v0.1-M1/chi/tool-manual/terminate_button.png
new file mode 100644
index 0000000..f07119b
--- /dev/null
+++ b/v0.1-M1/chi/tool-manual/terminate_button.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/gbse.svg b/v0.1-M1/chi/tutorial/gbse.svg
new file mode 100644
index 0000000..12bde24
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/gbse.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="800"
+   height="500"
+   id="svg2816"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="gbse.svg">
+  <defs
+     id="defs2818">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 250 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="800 : 250 : 1"
+       inkscape:persp3d-origin="400 : 166.66667 : 1"
+       id="perspective12" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#295e5c"
+     borderopacity="0.8627451"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="0"
+     inkscape:zoom="0.7710304"
+     inkscape:cx="-165.23345"
+     inkscape:cy="169.26507"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1418"
+     inkscape:window-height="904"
+     inkscape:window-x="212"
+     inkscape:window-y="163"
+     inkscape:window-maximized="0"
+     borderlayer="true" />
+  <metadata
+     id="metadata2821">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-22.615557,-542.76302)">
+    <rect
+       style="fill:#979a52;fill-opacity:0.57534246;stroke:#afafaf;stroke-width:0.40000001;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect2828"
+       width="146.28572"
+       height="302.85715"
+       x="22.815557"
+       y="731.66083" />
+    <rect
+       style="fill:#979a52;fill-opacity:0.57534246;stroke:#afafaf;stroke-width:0.40000001;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="buf0"
+       width="73.142265"
+       height="213.71423"
+       x="59.386955"
+       y="788.80371" />
+    <rect
+       style="fill:#979a52;fill-opacity:0.57534246;stroke:#afafaf;stroke-width:0.40000001;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect2828-9"
+       width="146.28572"
+       height="302.85715"
+       x="403.39786"
+       y="739.70587" />
+    <rect
+       style="fill:#979a52;fill-opacity:0.57534246;stroke:#afafaf;stroke-width:0.40000001;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="buf1"
+       width="73.142265"
+       height="213.71423"
+       x="439.96927"
+       y="796.84869" />
+    <g
+       id="server">
+      <path
+         transform="matrix(0.4,0,0,0.4,-147.56569,662.74193)"
+         d="m 354.28572,738.07648 c 0,110.45695 -95.93898,200 -214.28572,200 -118.346736,0 -214.285721,-89.54305 -214.285721,-200 0,-110.45695 95.938985,-200 214.285721,-200 118.34674,0 214.28572,89.54305 214.28572,200 z"
+         sodipodi:ry="200"
+         sodipodi:rx="214.28572"
+         sodipodi:cy="738.07648"
+         sodipodi:cx="140"
+         id="s"
+         style="fill:#979a52;fill-opacity:0.57534246;stroke:#afafaf;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+    </g>
+  </g>
+</svg>
diff --git a/v0.1-M1/chi/tutorial/pictures/Makefile b/v0.1-M1/chi/tutorial/pictures/Makefile
new file mode 100644
index 0000000..1a2fdf9
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/Makefile
@@ -0,0 +1,42 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+#
+# Makefile for creating the tutorial images
+#
+LATEX=latex
+DVIPS=dvips
+CROP=bbox_add.pl
+EPSPNG=eps2png
+
+NONSOURCE=picture.tex preamble.tex postamble.tex
+SOURCE=$(filter-out $(NONSOURCE),$(wildcard *.tex))
+DEST=$(SOURCE:.tex=.png)
+
+.phony: images clean
+
+images: $(DEST)
+
+# eps2png: -t=transparent, -f=force writing, -d=dpi
+%.png: %.tex
+	cat preamble.tex $< postamble.tex > picture.tex
+	$(LATEX) picture.tex
+	$(DVIPS) -E -o picture.eps picture.dvi
+	$(CROP) picture.eps
+	$(EPSPNG) -d 120 -f -t picture.eps
+	mv picture.png $@
+
+clean:
+	for i in $(DEST) picture.aux picture.dvi picture.eps picture.log picture.tex;\
+        do if test -f $$i;\
+           then rm $$i;\
+           fi;\
+        done
diff --git a/v0.1-M1/chi/tutorial/pictures/assembly_n_components.png b/v0.1-M1/chi/tutorial/pictures/assembly_n_components.png
new file mode 100644
index 0000000..e461048
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/assembly_n_components.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/assembly_n_components.tex b/v0.1-M1/chi/tutorial/pictures/assembly_n_components.tex
new file mode 100644
index 0000000..db4a9ad
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/assembly_n_components.tex
@@ -0,0 +1,31 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+            node(G0){}
+++ ( 0,-8) node(G1){}
+++ ( 0,-8) node(G2){}
+++ (12, 16) node[proc](B0){B}
+++ ( 0,-8) node[proc](B1){...}
+++ ( 0,-8) node[proc](B2){B}
+++ (14, 8) node[proc](S){S}
+++ (12,  0) node(E){};
+\path (G0) edge node{a[0]} (B0)
+      (G1) edge node{a[i]} (B1)
+      (G2) edge node{a[m]} (B2)
+      (B0) edge node{c[0]} (S)
+      (B1) edge node{c[i]} (S)
+      (B2) edge node[below]{c[m]} (S)
+      (S) edge node{b} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/assembly_two_components.png b/v0.1-M1/chi/tutorial/pictures/assembly_two_components.png
new file mode 100644
index 0000000..5149087
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/assembly_two_components.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/assembly_two_components.tex b/v0.1-M1/chi/tutorial/pictures/assembly_two_components.tex
new file mode 100644
index 0000000..622e108
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/assembly_two_components.tex
@@ -0,0 +1,27 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+            node(G0){}
+++ ( 0,-10) node(G1){}
+++ (12, 10) node[proc](B0){B}
+++ ( 0,-10) node[proc](B1){B}
+++ (14,  5) node[proc](S){S}
+++ (12,  0) node(E){};
+\path (G0) edge node{a[0]} (B0)
+      (G1) edge node{a[1]} (B1)
+      (B0) edge node[above]{c[0]} (S)
+      (B1) edge node[below]{c[1]} (S)
+      (S) edge node{b} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.png b/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.png
new file mode 100644
index 0000000..61f532f
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.tex b/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.tex
new file mode 100644
index 0000000..e8e05f4
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/buffered_producer_consumer.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc](P){P}
+++ (12,0) node[proc](B){B}
+++ (12,0) node[proc](C){C};
+\path (P) edge node{a} (B);
+\path (B) edge node{b} (C);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/controlled_factory.png b/v0.1-M1/chi/tutorial/pictures/controlled_factory.png
new file mode 100644
index 0000000..b2673dd
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/controlled_factory.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/controlled_factory.tex b/v0.1-M1/chi/tutorial/pictures/controlled_factory.tex
new file mode 100644
index 0000000..286f503
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/controlled_factory.tex
@@ -0,0 +1,24 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+            node[proc](G){G}
+++ ( 14, 0) node[proc](B){F}
+++ ( 14, 0) node[proc](E){E}
+++ (-14,12) node[proc](C){C};
+\path (G) edge node{gf} (B);
+\path (B) edge node{fe} (E);
+\path (C) edge node[above]{sg} (G);
+\path (C) edge node[above]{se} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/conveyor_3items.png b/v0.1-M1/chi/tutorial/pictures/conveyor_3items.png
new file mode 100644
index 0000000..3234d6d
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/conveyor_3items.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/conveyor_3items.tex b/v0.1-M1/chi/tutorial/pictures/conveyor_3items.tex
new file mode 100644
index 0000000..4ca37cc
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/conveyor_3items.tex
@@ -0,0 +1,39 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[circle,minimum size= 4ex,draw]    (G){}
+++ (60,0) node[circle,minimum size= 4ex,draw]    (H){};
+\draw (0,2) -- (60,2);
+\draw (0,-2) -- (60,-2);
+\draw (12.5,2) rectangle (17.5,7);
+\draw (27.5,2) rectangle (32.5,7);
+\draw (47.5,2) rectangle (52.5,7);
+\draw (50.0,5) node {0};
+\draw (30.0,5) node {1};
+\draw (15.0,5) node {2};
+\draw (15.0,2) -- (15.0,-12);
+\draw (30.0,2) -- (30.0,-8);
+\draw (50.0,2) -- (50.0,-4);
+\draw [help lines](60.0,0) -- (60.0,-2);
+\draw (60.0,-2) -- (60.0,-12);
+\draw [<->] (50.0,-4) -- (60.0,-4);
+\draw (55.0,-4) node [anchor = north] {10.0};
+\draw [<->] (30.0,-8) -- (60.0,-8);
+\draw (45.0,-8) node [anchor = north] {30.0};
+\draw [<->] (15.0,-12) -- (60.0,-12);
+\draw (35.0,-12) node [anchor = north] {45.0};
+\draw [->] (4,1) -- (10,1);
+\draw [->] (40,1) -- (46,1);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/conveyor_system.png b/v0.1-M1/chi/tutorial/pictures/conveyor_system.png
new file mode 100644
index 0000000..8e46bd2
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/conveyor_system.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/conveyor_system.tex b/v0.1-M1/chi/tutorial/pictures/conveyor_system.tex
new file mode 100644
index 0000000..fe0228e
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/conveyor_system.tex
@@ -0,0 +1,23 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc](G){G}
+++ (12,0) node[proc](B){B}
+++ (12,0) node[proc](T){T}
+++ (12,0) node[proc](E){E};
+\path (G) edge node{gb} (B);
+\path (B) edge node{bt} (T);
+\path (T) edge node{te} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.png b/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.png
new file mode 100644
index 0000000..2a8a3e5
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.tex b/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.tex
new file mode 100644
index 0000000..0848cae
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_2buffers_2servers_exit.tex
@@ -0,0 +1,27 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc] (G){G}
+++ (12,0) node[proc] (B0){B}
+++ (12,0) node[proc] (S0){S}
+++ (12,0) node[proc] (B1){B}
+++ (12,0) node[proc] (S1){S}
+++ (12,0) node[proc] (E){E};
+\path (G) edge node{a}(B0)
+      (B0) edge node{b}(S0)
+      (S0) edge node{c}(B1)
+      (B1) edge node{d}(S1)
+      (S1) edge node{e}(E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.png b/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.png
new file mode 100644
index 0000000..a193014
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.tex b/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.tex
new file mode 100644
index 0000000..2dee8e2
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_2servers_exit.tex
@@ -0,0 +1,24 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc](G){G}
+++ (12,  6) node[proc](S0){S0}
+++ ( 0,-12) node[proc](S1){S1}
+++ (12,  6) node[proc](E){E};
+\path (G) edge node{a} (S0)
+      (G) edge node{a} (S1)
+      (S0) edge node{b} (E)
+      (S1) edge node{b} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.png b/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.png
new file mode 100644
index 0000000..a5c544f
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.tex b/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.tex
new file mode 100644
index 0000000..935bcc0
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_buffer_server_exit.tex
@@ -0,0 +1,23 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc] (G){G}
+++ (12,0) node[proc] (B){B}
+++ (12,0) node[proc] (S){S}
+++ (12,0) node[proc] (E){E};
+\path (G) edge node{a}(B)
+      (B) edge node{b}(S)
+      (S) edge node{c}(E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_server_exit.png b/v0.1-M1/chi/tutorial/pictures/generator_server_exit.png
new file mode 100644
index 0000000..1c58a91
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_server_exit.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/generator_server_exit.tex b/v0.1-M1/chi/tutorial/pictures/generator_server_exit.tex
new file mode 100644
index 0000000..737e0d7
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/generator_server_exit.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc](G){G}
+++ (12,0) node[proc](S){S}
+++ (12,0) node[proc](E){E};
+\path (G) edge node{a} (S)
+      (S) edge node{b} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/list_with_indices.png b/v0.1-M1/chi/tutorial/pictures/list_with_indices.png
new file mode 100644
index 0000000..8d4a1ce
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/list_with_indices.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/list_with_indices.tex b/v0.1-M1/chi/tutorial/pictures/list_with_indices.tex
new file mode 100644
index 0000000..cbdf7bf
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/list_with_indices.tex
@@ -0,0 +1,35 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[decoration=brace]
+\draw (0,0) rectangle (1,1);
+\draw (1,0) rectangle (2,1);
+\draw (2,0) rectangle (3,1);
+\draw (3,0) rectangle (4,1);
+\draw (4,0) rectangle (5,1);
+\draw (0.5,0.5) node {7};
+\draw (1.5,0.5) node {8};
+\draw (2.5,0.5) node {3};
+\draw (3.5,0.5) node {5};
+\draw (4.5,0.5) node {9};
+\draw [<-,help lines] (0.5,0) -- (0.5,-0.5);
+\draw (0.5,-0.8) node {xs[0]};
+%\draw[decorate] (5,0) -- (1,0);
+\draw [<-,help lines] (3.5,0) -- (3.5,-1);
+\draw (3.5,-1.3) node {xs[3]};
+\draw [->, help lines] (4.5,2) -- (4.5,1);
+\draw (4.5, 2.3) node {xs[-1]};
+%\draw [decorate] (0,1) -- (4,1);
+\draw [->, help lines] (3.5,1.5) -- (3.5,1.0);
+\draw (3.5, 1.8) node {xs[-2]};
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/list_with_slices.png b/v0.1-M1/chi/tutorial/pictures/list_with_slices.png
new file mode 100644
index 0000000..0abba0d
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/list_with_slices.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/list_with_slices.tex b/v0.1-M1/chi/tutorial/pictures/list_with_slices.tex
new file mode 100644
index 0000000..6f57a82
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/list_with_slices.tex
@@ -0,0 +1,35 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[decoration=brace]
+\draw (0,0) rectangle (1,1);
+\draw (1,0) rectangle (2,1);
+\draw (2,0) rectangle (3,1);
+\draw (3,0) rectangle (4,1);
+\draw (4,0) rectangle (5,1);
+\draw (0.5,0.5) node {7};
+\draw (1.5,0.5) node {8};
+\draw (2.5,0.5) node {3};
+\draw (3.5,0.5) node {5};
+\draw (4.5,0.5) node {9};
+\draw [<-,help lines] (0.5,0) -- (0.5,-1);
+\draw (0.5,-1.3) node {xs[0]};
+\draw[decorate] (5,0) -- (1,0);
+\draw [<-,help lines] (3,-0.2) -- (3,-1);
+\draw (3,-1.3) node {xs[1:]};
+\draw [->, help lines] (4.5,2) -- (4.5,1);
+\draw (4.5, 2.3) node {xs[-1]};
+\draw [decorate] (0,1) -- (4,1);
+\draw [->, help lines] (2,2) -- (2,1.2);
+\draw (2.0, 2.3) node {xs[:-1]};
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/one_place_buffer.png b/v0.1-M1/chi/tutorial/pictures/one_place_buffer.png
new file mode 100644
index 0000000..aa550d1
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/one_place_buffer.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/one_place_buffer.tex b/v0.1-M1/chi/tutorial/pictures/one_place_buffer.tex
new file mode 100644
index 0000000..086206b
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/one_place_buffer.tex
@@ -0,0 +1,21 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node      (G){}
+++ (12,0) node[proc](B){B1}
+++ (12,0) node      (E){};
+\path (G) edge node{a}(B)
+      (B) edge node{b}(E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/postamble.tex b/v0.1-M1/chi/tutorial/pictures/postamble.tex
new file mode 100644
index 0000000..448e6df
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/postamble.tex
@@ -0,0 +1,13 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\end{TeXtoEPS}
+\end{document}
diff --git a/v0.1-M1/chi/tutorial/pictures/preamble.tex b/v0.1-M1/chi/tutorial/pictures/preamble.tex
new file mode 100644
index 0000000..fc69186
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/preamble.tex
@@ -0,0 +1,26 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass[11pt,b5paper]{article}
+%\usepackage{makeidx}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+%\usepackage{fancyvrb}
+\usepackage{pst-eps}
+\usepackage{tikz}
+\usetikzlibrary{arrows,backgrounds}
+\usetikzlibrary{decorations.pathreplacing}
+\tikzstyle{proc}=[circle,text centered,inner sep=0ex,thin,minimum size=6ex,node distance=14ex,draw]
+\tikzstyle{every edge}=[draw,->]
+\tikzstyle{every edge}+=[>=angle 45]
+
+\begin{document}
+\begin{TeXtoEPS}
diff --git a/v0.1-M1/chi/tutorial/pictures/producer_consumer.png b/v0.1-M1/chi/tutorial/pictures/producer_consumer.png
new file mode 100644
index 0000000..2272d5a
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/producer_consumer.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/producer_consumer.tex b/v0.1-M1/chi/tutorial/pictures/producer_consumer.tex
new file mode 100644
index 0000000..3eca9dd
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/producer_consumer.tex
@@ -0,0 +1,19 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node[proc](P){P}
+++ (12,0) node[proc](C){C};
+\path (P) edge node{a} (C);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/sixchilds.fig b/v0.1-M1/chi/tutorial/pictures/sixchilds.fig
new file mode 100644
index 0000000..ff55db4
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/sixchilds.fig
@@ -0,0 +1,92 @@
+#FIG 3.2

+################################################################################

+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation

+#

+# See the NOTICE file(s) distributed with this work for additional

+# information regarding copyright ownership.

+#

+# This program and the accompanying materials are made available under the terms

+# of the MIT License which is available at https://opensource.org/licenses/MIT

+#

+# SPDX-License-Identifier: MIT

+################################################################################

+Portrait

+Center

+Metric

+A4      

+100.00

+Single

+-2

+1200 2

+6 990 1395 1350 1755

+2 2 0 1 0 7 35 -1 20 0.000 0 0 -1 0 0 5

+	 1080 1485 1350 1485 1350 1755 1080 1755 1080 1485

+2 2 0 1 0 7 36 -1 20 0.000 0 0 -1 0 0 5

+	 1035 1440 1305 1440 1305 1710 1035 1710 1035 1440

+2 2 0 1 0 7 37 -1 20 0.000 0 0 -1 0 0 5

+	 990 1395 1260 1395 1260 1665 990 1665 990 1395

+4 1 0 30 -1 2 12 0.0000 4 135 90 1215 1665 8\001

+-6

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 1170 1147 158 158 1012 1147 1328 1147

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 1980 1147 158 158 1822 1147 2138 1147

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 2790 1147 158 158 2632 1147 2948 1147

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 3600 1147 158 158 3442 1147 3758 1147

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 5220 1147 158 158 5062 1147 5378 1147

+1 4 0 1 0 7 49 -1 20 0.000 1 0.0000 4410 1147 158 158 4252 1147 4568 1147

+2 3 0 1 0 7 48 -1 20 0.000 0 0 -1 0 0 8

+	 1305 1125 1395 1080 1395 990 1665 990 1665 1170 1395 1170

+	 1395 1125 1305 1125

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 1350 1350 1260 1170 1080 1170 990 1350

+2 3 0 1 0 7 48 -1 20 0.000 0 0 -1 0 0 8

+	 2115 1125 2205 1080 2205 990 2475 990 2475 1170 2205 1170

+	 2205 1125 2115 1125

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 2160 1350 2070 1170 1890 1170 1800 1350

+2 1 1 1 0 7 50 -1 -1 1.000 0 0 -1 0 0 2

+	 1980 990 2025 855

+2 3 0 1 0 7 48 -1 20 0.000 0 0 -1 0 0 8

+	 2925 1125 3015 1080 3015 990 3285 990 3285 1170 3015 1170

+	 3015 1125 2925 1125

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 2970 1350 2880 1170 2700 1170 2610 1350

+2 1 1 1 0 7 50 -1 -1 1.000 0 0 -1 0 0 2

+	 2790 990 2835 855

+2 3 0 1 0 7 48 -1 20 0.000 0 0 -1 0 0 8

+	 3735 1125 3825 1080 3825 990 4095 990 4095 1170 3825 1170

+	 3825 1125 3735 1125

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 3780 1350 3690 1170 3510 1170 3420 1350

+2 1 1 1 0 7 50 -1 -1 1.000 0 0 -1 0 0 2

+	 3600 990 3645 855

+2 3 0 1 0 7 48 -1 20 0.000 0 0 -1 0 0 8

+	 4545 1125 4635 1080 4635 990 4905 990 4905 1170 4635 1170

+	 4635 1125 4545 1125

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 4590 1350 4500 1170 4320 1170 4230 1350

+2 1 1 1 0 7 50 -1 -1 1.000 0 0 -1 0 0 2

+	 4410 990 4455 855

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4

+	 5400 1350 5310 1170 5130 1170 5040 1350

+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2

+	 810 1350 5580 1350

+2 2 0 0 0 7 50 -1 20 0.000 0 0 -1 0 0 5

+	 1620 720 1845 720 1845 810 1620 810 1620 720

+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5

+	 5085 1440 5355 1440 5355 1710 5085 1710 5085 1440

+4 1 0 44 -1 -1 10 0.0000 4 105 75 1530 1125 8\001

+4 1 0 44 -1 -1 10 0.0000 4 120 150 2340 1125 10\001

+4 0 0 50 -1 -1 10 0.0000 4 105 165 2025 855 +2\001

+4 1 0 44 -1 -1 10 0.0000 4 105 150 3150 1125 30\001

+4 0 0 50 -1 -1 10 0.0000 4 105 150 2835 855 *3\001

+4 1 0 44 -1 -1 10 0.0000 4 120 150 3960 1125 60\001

+4 0 0 50 -1 -1 10 0.0000 4 105 150 3645 855 *2\001

+4 1 0 44 -1 -1 10 0.0000 4 120 150 4770 1125 66\001

+4 0 0 50 -1 -1 10 0.0000 4 120 165 4455 855 +6\001

+4 1 0 44 -1 1 12 0.0000 4 120 105 1170 1197 R\001

+4 1 0 44 -1 1 12 0.0000 4 120 210 1980 1197 C1\001

+4 1 0 44 -1 1 12 0.0000 4 120 210 2790 1197 C2\001

+4 1 0 44 -1 1 12 0.0000 4 120 150 5220 1196 W\001

+4 1 0 44 -1 1 12 0.0000 4 120 210 4410 1197 C4\001

+4 1 0 44 -1 1 12 0.0000 4 120 210 3600 1197 C3\001

+4 1 0 50 -1 -1 12 0.0000 4 120 180 5220 1620 66\001

diff --git a/v0.1-M1/chi/tutorial/pictures/sixchilds.png b/v0.1-M1/chi/tutorial/pictures/sixchilds.png
new file mode 100644
index 0000000..8fcc4e7
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/sixchilds.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.png b/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.png
new file mode 100644
index 0000000..2d60ed4
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.tex b/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.tex
new file mode 100644
index 0000000..4950774
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/three_parallel_servers.tex
@@ -0,0 +1,29 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+           node[proc](G){G}
+++ (12,0) node[proc](B){B}
+++ (12,10) node[proc](S0){S}
+++ ( 0,-10) node[proc](S1){S}
+++ ( 0,-10) node[proc](S2){S}
+++ (12,10) node[proc](E){E};
+\path (G) edge node{g} (B);
+\path (B) edge node{b} (S0);
+\path (B) edge node{b} (S1);
+\path (B) edge node{b} (S2);
+\path (S0) edge node{e} (E);
+\path (S1) edge node{e} (E);
+\path (S2) edge node{e} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.png b/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.png
new file mode 100644
index 0000000..c4ec1a5
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.tex b/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.tex
new file mode 100644
index 0000000..10e5b99
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_parallel_requesting_servers.tex
@@ -0,0 +1,28 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+            node[proc](G){G}
+++ (12,  0) node[proc](B){B}
+++ (12,  6) node[proc](S0){S}
+++ ( 0,-12) node[proc](S1){S}
+++ (12,  6) node[proc](E){E};
+\path (G) edge node{a}(B)
+      (B) edge node[below]{b[0]}(S0)
+      (B) edge node{b[1]}(S1)
+      (S0) edge[bend left=-45] node[above]{r}(B)
+      (S1) edge[bend left=45] node{r}(B)
+      (S0) edge node{c} (E)
+      (S1) edge node{c} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.png b/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.png
new file mode 100644
index 0000000..16a5039
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.tex b/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.tex
new file mode 100644
index 0000000..fbcfe2d
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_parallel_servers.tex
@@ -0,0 +1,26 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+            node[proc](G){G}
+++ (12,  0) node[proc](B){B}
+++ (12,  6) node[proc](S0){S}
+++ ( 0,-12) node[proc](S1){S}
+++ (12,  6) node[proc](E){E};
+\path (G) edge node{a}(B)
+      (B) edge node{b}(S0)
+      (B) edge node{b}(S1)
+      (S0) edge node{c} (E)
+      (S1) edge node{c} (E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/pictures/two_place_buffer.png b/v0.1-M1/chi/tutorial/pictures/two_place_buffer.png
new file mode 100644
index 0000000..12f950c
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_place_buffer.png
Binary files differ
diff --git a/v0.1-M1/chi/tutorial/pictures/two_place_buffer.tex b/v0.1-M1/chi/tutorial/pictures/two_place_buffer.tex
new file mode 100644
index 0000000..7adb450
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/pictures/two_place_buffer.tex
@@ -0,0 +1,23 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+{\ttfamily
+\begin{tikzpicture}[x=1ex,y=1ex,thin,>=triangle 45,auto]
+\path
+          node      (G){}
+++ (12,0) node[proc](B0){B1}
+++ (12,0) node[proc](B1){B1}
+++ (12,0) node      (E){};
+\path (G) edge node{a}(B0)
+      (B0) edge node{c}(B1)
+      (B1) edge node{b}(E);
+\end{tikzpicture}
+}
diff --git a/v0.1-M1/chi/tutorial/sbb.png b/v0.1-M1/chi/tutorial/sbb.png
new file mode 100644
index 0000000..630161e
--- /dev/null
+++ b/v0.1-M1/chi/tutorial/sbb.png
Binary files differ
diff --git a/v0.1-M1/cif/build-imgs.bash b/v0.1-M1/cif/build-imgs.bash
new file mode 100755
index 0000000..76930d1
--- /dev/null
+++ b/v0.1-M1/cif/build-imgs.bash
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+#################################################################################
+
+set -e -u
+
+cd $(dirname $(readlink -f $0))
+
+# .png.plt
+for f in `find . -name "*.png.plt"`; do
+    echo "Converting $f"
+    cd `dirname $f`
+    FILE=`basename $f`
+    gnuplot $FILE
+    cd - > /dev/null
+done
+
+# .png.svg
+for f in `find . -name "*.png.svg"`; do
+    echo "Converting $f"
+    FILE=${f//.png.svg/.png}
+    inkscape --export-area-drawing --export-png=$FILE $FILE.svg
+done
+
+# .png.tex
+for f in `find . -name "*.png.tex"`; do
+    echo "Converting $f"
+    cd `dirname $f`
+    FILE=`basename ${f//.png.tex/.png}`
+    pdflatex -quiet $FILE.tex
+    pdfcrop $FILE.pdf $FILE.cropped.pdf > /dev/null
+    convert -density 125 $FILE.cropped.pdf $FILE
+    rm -f $FILE.pdf $FILE.log $FILE.aux $FILE.cropped.pdf
+    cd - > /dev/null
+done
diff --git a/v0.1-M1/cif/eclipse-escet-incubation-cif-manual.pdf b/v0.1-M1/cif/eclipse-escet-incubation-cif-manual.pdf
new file mode 100644
index 0000000..0be71ff
--- /dev/null
+++ b/v0.1-M1/cif/eclipse-escet-incubation-cif-manual.pdf
Binary files differ
diff --git a/v0.1-M1/cif/eclipse-incubation.png b/v0.1-M1/cif/eclipse-incubation.png
new file mode 100644
index 0000000..5fccef5
--- /dev/null
+++ b/v0.1-M1/cif/eclipse-incubation.png
Binary files differ
diff --git a/v0.1-M1/cif/favicon.png b/v0.1-M1/cif/favicon.png
new file mode 100644
index 0000000..9cebcb4
--- /dev/null
+++ b/v0.1-M1/cif/favicon.png
Binary files differ
diff --git a/v0.1-M1/cif/index.html b/v0.1-M1/cif/index.html
new file mode 100644
index 0000000..3f9072d
--- /dev/null
+++ b/v0.1-M1/cif/index.html
@@ -0,0 +1,39877 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation">
+<link rel="icon" type="image/png" href="favicon.png">
+<title>CIF documentation (Incubation)</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+:not(pre)>code.nobreak{word-wrap:normal}
+:not(pre)>code.nowrap{white-space:nowrap}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<style>
+.menu, .submenu, .menuitem, .menuref {
+    background-color: Menu;
+}
+
+.button {
+    border: 1px solid ButtonFace;
+    /*
+    Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
+    border: 2px outset ButtonFace;
+    background-color: ButtonFace;
+    */
+    padding-left: 0.5ex;
+    padding-right: 0.5ex;
+    font-weight: normal;
+    font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
+    white-space: nowrap;
+}
+.button:before {
+    content: none !important;
+}
+.button:after {
+    content: none !important;
+}
+
+#footer-text, #footer-text a {
+    color: rgba(255,255,255,.8)
+}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<h1>CIF documentation (Incubation)</h1>
+<div class="details">
+<span id="author" class="author">Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation</span><br>
+<span id="revnumber">version 0.1.0.20210126-175926</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#introduction-chapter-index">Introduction</a></li>
+<li><a href="#tut-chapter-index">Language tutorial</a>
+<ul class="sectlevel2">
+<li><a href="#tut-introduction">Introduction</a></li>
+<li><a href="#tut-lessons">Lessons</a></li>
+<li><a href="#tut-basics">Basics</a>
+<ul class="sectlevel3">
+<li><a href="#tut-basics-chapter-automata">Automata</a></li>
+<li><a href="#tut-basics-chapter-synchronizing-events">Synchronizing events</a></li>
+<li><a href="#tut-basics-chapter-non-determinism">Non-determinism</a></li>
+<li><a href="#tut-basics-chapter-alphabet">Alphabet</a></li>
+<li><a href="#tut-basics-chapter-event-placement">Event declaration placement</a></li>
+<li><a href="#tut-basics-chapter-shorter-notations">Shorter notations</a></li>
+</ul>
+</li>
+<li><a href="#tut-data">Data</a>
+<ul class="sectlevel3">
+<li><a href="#tut-data-chapter-discrete-variables">Discrete variables</a></li>
+<li><a href="#tut-data-chapter-discvar-change">Discrete variable value changes</a></li>
+<li><a href="#tut-data-chapter-loc-var-duality1">Location/variable duality (1/2)</a></li>
+<li><a href="#tut-data-chapter-loc-var-duality2">Location/variable duality (2/2)</a></li>
+<li><a href="#tut-data-chapter-read-write">Global read, local write</a></li>
+<li><a href="#tut-data-chapter-monitoring">Monitoring</a></li>
+<li><a href="#tut-data-chapter-asgn-old-vs-new">Old and new values in assignments</a></li>
+<li><a href="#tut-data-chapter-tau-event">The <code>tau</code> event</a></li>
+<li><a href="#tut-data-chapter-discvar-init">Initial values of discrete variables</a></li>
+<li><a href="#tut-data-chapter-init-preds">Initialization predicates</a></li>
+<li><a href="#tut-data-chapter-locs-as-var">Using locations as variables</a></li>
+<li><a href="#tut-data-chapter-stat-invariants">State (exclusion) invariants</a></li>
+<li><a href="#tut-data-chapter-stat-evt-excl-invariants">State/event exclusion invariants</a></li>
+</ul>
+</li>
+<li><a href="#tut-types-and-values">Types and values</a>
+<ul class="sectlevel3">
+<li><a href="#tut-values-chapter-types-values-exprs">Types, values, and expressions</a></li>
+<li><a href="#tut-values-chapter-overview">Values overview</a></li>
+<li><a href="#tut-values-chapter-integers">Integers</a></li>
+<li><a href="#tut-values-chapter-integer-ranges">Integer ranges</a></li>
+<li><a href="#tut-values-chapter-reals">Reals</a></li>
+<li><a href="#tut-values-chapter-booleans">Booleans</a></li>
+<li><a href="#tut-values-chapter-strings">Strings</a></li>
+<li><a href="#tut-values-chapter-enumerations">Enumerations</a></li>
+<li><a href="#tut-values-chapter-tuples">Tuples</a></li>
+<li><a href="#tut-values-chapter-lists">Lists</a></li>
+<li><a href="#tut-values-chapter-bounded-lists-and-arrays">Bounded lists and arrays</a></li>
+<li><a href="#tut-values-chapter-sets">Sets</a></li>
+<li><a href="#tut-values-chapter-dictionaries">Dictionaries</a></li>
+<li><a href="#tut-values-chapter-combining-values">Combining values</a></li>
+</ul>
+</li>
+<li><a href="#tut-scalable-solutions-and-reuse-12">Scalable solutions and reuse (1/2)</a>
+<ul class="sectlevel3">
+<li><a href="#tut-reuse1-chapter-constants">Constants</a></li>
+<li><a href="#tut-reuse1-chapter-algebraic-variables">Algebraic variables</a></li>
+<li><a href="#tut-reuse1-chapter-algvar-equations">Algebraic variables and equations</a></li>
+<li><a href="#tut-reuse1-chapter-type-declarations">Type declarations</a></li>
+</ul>
+</li>
+<li><a href="#tut-time">Time</a>
+<ul class="sectlevel3">
+<li><a href="#tut-time-chapter-intro">Timing</a></li>
+<li><a href="#tut-time-chapter-continuous-variables">Continuous variables</a></li>
+<li><a href="#tut-time-chapter-contvar-equations">Continuous variables and equations</a></li>
+<li><a href="#tut-time-chapter-equations">Equations</a></li>
+<li><a href="#tut-time-chapter-var-overview">Variables overview</a></li>
+<li><a href="#tut-time-chapter-urgency">Urgency</a></li>
+<li><a href="#tut-time-chapter-deadlock-livelock">Deadlock and livelock</a></li>
+</ul>
+</li>
+<li><a href="#tut-channel-communication">Channel communication</a>
+<ul class="sectlevel3">
+<li><a href="#tut-channels-chapter-intro">Channels</a></li>
+<li><a href="#tut-channels-chapter-void">Dataless channels</a></li>
+<li><a href="#tut-channels-chapter-chan-sync-combi">Combining channel communication with event synchronization</a></li>
+</ul>
+</li>
+<li><a href="#tut-functions">Functions</a>
+<ul class="sectlevel3">
+<li><a href="#tut-functions-chapter-intro">Functions</a></li>
+<li><a href="#tut-functions-chapter-internal-functions">Internal user-defined functions</a></li>
+<li><a href="#tut-functions-chapter-statements">Function statements</a></li>
+<li><a href="#tut-functions-chapter-functions-as-values">Functions as values</a></li>
+</ul>
+</li>
+<li><a href="#tut-scalable-solutions-and-reuse-22">Scalable solutions and reuse (2/2)</a>
+<ul class="sectlevel3">
+<li><a href="#tut-reuse2-chapter-aut-def-inst">Automaton definition/instantiation</a></li>
+<li><a href="#tut-reuse2-chapter-aut-def-params">Parametrized automaton definitions</a></li>
+<li><a href="#tut-reuse2-chapter-aut-def-param-kinds">Automaton definition parameters</a></li>
+<li><a href="#tut-reuse2-chapter-groups">Groups</a></li>
+<li><a href="#tut-reuse2-chapter-group-defs">Group definitions</a></li>
+<li><a href="#tut-reuse2-chapter-imports">Imports</a></li>
+<li><a href="#tut-reuse2-chapter-imports-libraries">Imports and libraries</a></li>
+<li><a href="#tut-reuse2-chapter-imports-groups">Imports and groups</a></li>
+<li><a href="#tut-reuse2-chapter-namespaces">Namespaces</a></li>
+<li><a href="#tut-reuse2-chapter-input-variables">Input variables</a></li>
+</ul>
+</li>
+<li><a href="#tut-stochastics">Stochastics</a>
+<ul class="sectlevel3">
+<li><a href="#tut-stochastics-chapter-intro">Stochastics</a></li>
+<li><a href="#tut-stochastics-chapter-discrete-continuous-constant">Discrete, continuous, and constant distributions</a></li>
+<li><a href="#tut-stochastics-chapter-pseudo-randomness">Pseudo-randomness</a></li>
+</ul>
+</li>
+<li><a href="#tut-language-extensions">Language extensions</a>
+<ul class="sectlevel3">
+<li><a href="#tut-extensions-chapter-synthesis">Supervisory controller synthesis</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#lang-ref-chapter-index">Language reference</a>
+<ul class="sectlevel2">
+<li><a href="#lang-ref-syntax-lexical">Lexical syntax</a>
+<ul class="sectlevel3">
+<li><a href="#lang-ref-keywords">Keywords</a></li>
+<li><a href="#lang-ref-terminals">Terminals</a></li>
+<li><a href="#lang-ref-whitespace">Whitespace</a></li>
+<li><a href="#lang-ref-comments">Comments</a></li>
+</ul>
+</li>
+<li><a href="#lang-ref-syntax-grammar">Grammar</a></li>
+</ul>
+</li>
+<li><a href="#tools-chapter-index">Tools</a>
+<ul class="sectlevel2">
+<li><a href="#tools-specification-tools">Specification tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-chapter-text-editor">CIF text editor</a></li>
+<li><a href="#tools-chapter-cif2yed">CIF to yEd transformer</a></li>
+</ul>
+</li>
+<li><a href="#tools-supervisory-controller-synthesis-tools">Supervisory controller synthesis tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-chapter-datasynth">Data-based supervisory controller synthesis</a></li>
+<li><a href="#tools-eventbased-chapter-index">Event-based synthesis toolset</a></li>
+<li><a href="#tools-chapter-cif2supremica">CIF to Supremica transformer</a></li>
+</ul>
+</li>
+<li><a href="#tools-simulation-validation-and-visualization-tools">Simulation, validation, and visualization tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-cifsim-chapter-index">CIF simulator</a></li>
+<li><a href="#tools-simulation-basics">Simulation basics</a></li>
+<li><a href="#tools-simulation-inputoutput">Simulation input/Output</a></li>
+<li><a href="#tools-simulation-advanced-topics">Simulation advanced topics</a></li>
+<li><a href="#tools-simulation-miscellaneous-topics">Simulation miscellaneous topics</a></li>
+<li><a href="#tools-simulation-developer-topics">Simulation developer topics</a></li>
+</ul>
+</li>
+<li><a href="#tools-verification-tools">Verification tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-chapter-cif2mcrl2">CIF to mCRL2 transformer</a></li>
+<li><a href="#tools-chapter-cif2uppaal">CIF to UPPAAL transformer</a></li>
+</ul>
+</li>
+<li><a href="#tools-real-time-testing-code-generation-and-implementation-tools">Real-time testing, code generation, and implementation tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-codegen-chapter-index">CIF code generator</a></li>
+<li><a href="#tools-cif2plc-chapter-index">CIF PLC code generator</a></li>
+</ul>
+</li>
+<li><a href="#tools-miscellaneous-tools">Miscellaneous tools</a>
+<ul class="sectlevel3">
+<li><a href="#tools-cif2cif-chapter-index">CIF to CIF transformer</a></li>
+<li><a href="#tools-chapter-mergecif">CIF merger</a></li>
+<li><a href="#tools-chapter-event-disabler">CIF event disabler</a></li>
+<li><a href="#tools-chapter-cif-explorer">CIF explorer</a></li>
+</ul>
+</li>
+<li><a href="#tools-scripting">Scripting</a>
+<ul class="sectlevel3">
+<li><a href="#tools-scripting-chapter-intro">Introduction to scripting</a></li>
+<li><a href="#tools-scripting-chapter-tools">Overview of scriptable tools</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#examples-chapter-index">CIF examples</a></li>
+<li><a href="#release-notes-chapter-index">CIF release notes</a>
+<ul class="sectlevel2">
+<li><a href="#version-0-1-unreleased">Version 0.1 (unreleased)</a></li>
+</ul>
+</li>
+<li><a href="#dev-chapter-index">Developers</a>
+<ul class="sectlevel2">
+<li><a href="#dev-lang-modify">CIF language modification</a></li>
+</ul>
+</li>
+<li><a href="#legal-chapter-index">Legal</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>CIF is a declarative modeling language for the specification of discrete
+event, timed, and hybrid systems as a collection of synchronizing automata.
+The CIF tooling supports the entire development process of controllers,
+including among others specification, supervisory controller synthesis,
+simulation-based validation and visualization, verification, real-time
+testing, and code generation.</p>
+</div>
+<div class="paragraph">
+<p>CIF is one of the tools of the
+<a href="https://eclipse.org/escet">Eclipse ESCET&#8482; project</a>.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The Eclipse ESCET project, including the CIF language and toolset,
+is currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+You can <a href="eclipse-escet-incubation-cif-manual.pdf">download this manual</a>
+as a PDF as well.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The documentation consists of:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#introduction-chapter-index">CIF introduction</a></p>
+</li>
+<li>
+<p><a href="#tut-chapter-index">CIF language tutorial</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-chapter-index">CIF language reference manual</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-index">CIF tool manual</a></p>
+</li>
+<li>
+<p><a href="#examples-chapter-index">CIF examples</a></p>
+</li>
+<li>
+<p><a href="#release-notes-chapter-index">CIF release notes</a></p>
+</li>
+<li>
+<p><a href="#dev-chapter-index">CIF developers manual</a></p>
+</li>
+<li>
+<p><a href="#legal-chapter-index">Legal information</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>A screenshot of the CIF tooling IDE:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./screenshot_ide.png" alt="screenshot ide">
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="introduction-chapter-index">Introduction</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The CIF language is a powerful declarative automata-based modeling language
+for the specification of discrete event, timed (linear dynamics), hybrid
+(piecewise continuous dynamics) systems. It can be seen as a rich state
+machine language with the following main features:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Modular specification with synchronized events and communication between
+automata.</p>
+</li>
+<li>
+<p>Many data types are available (booleans, integers, reals, tuples, lists,
+arrays, sets, and dictionaries), combined with a powerful expression language
+for compact variables updates.</p>
+</li>
+<li>
+<p>Text-based specification of the automata, with many features to simplify
+modeling large non-trivial industrial systems.</p>
+</li>
+<li>
+<p>Primitives for supervisory controller synthesis are integrated in the
+language.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The CIF tooling supports the entire development process of controllers,
+including among others specification, supervisory controller synthesis,
+simulation-based validation and visualization, verification, real-time
+testing, and code generation. Highlights of the CIF tooling include:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Text-based editor that allows to easily specify and edit models.</p>
+</li>
+<li>
+<p>Feature-rich powerful data-based synthesis tool. A transformation to the
+supervisory controller synthesis tool Supremica is also available.</p>
+</li>
+<li>
+<p>A simulator that supports both interactive and automated validation of
+specifications. Powerful visualization features allow for interactive
+visualization-based validation.</p>
+</li>
+<li>
+<p>Conversion to formal verification tools such as mCRL2 and UPPAAL.</p>
+</li>
+<li>
+<p>Implementation language code generation (PLC languages, Java, C, and
+Simulink) for real-time testing and implementation of the designed controller.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="tut-chapter-index">Language tutorial</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This tutorial introduces the CIF language. It explains the general idea
+behind the concepts of the language, and shows how to use them, all by means of
+examples. The tutorial is focused on giving a short introduction to CIF, and
+does not cover all details. It is recommended reading for all CIF users.</p>
+</div>
+<div class="sect2">
+<h3 id="tut-introduction">Introduction</h3>
+<div class="paragraph">
+<p>CIF stands for <strong>C</strong>ompositional <strong>I</strong>nterchange <strong>F</strong>ormat for hybrid
+systems. CIF is primarily used to create models of physical systems and their
+controllers, describing their behavior. However, CIF is a general-purpose
+modeling language, and can be used to model practically anything, ranging from
+physical real-world systems to abstract mathematical entities.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="paragraph">
+<p>CIF supports discrete event models, that are mostly concerned with what
+happens, and in which order. CIF also supports timed systems, where timing
+plays and explicit role, and hybrid systems, which combine the discrete events
+with timing. This makes CIF suitable for modeling of all kinds of systems.</p>
+</div>
+<div class="paragraph">
+<p>The CIF tooling puts a particular focus on supporting the entire development
+process of controllers. However, just as the CIF language, the CIF tooling can
+be applied much more generally. The tooling allows among others specification,
+supervisory controller synthesis, simulation-based validation and
+visualization, verification, real-time testing, and code generation.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-lessons">Lessons</h3>
+<div class="paragraph">
+<p>Several lessons are available, grouped into the following categories:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-tut-basics">Basics</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-data">Data</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-values">Types and values</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-reuse1">Scalable solutions and reuse (1/2)</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-time">Time</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-channels">Channel communication</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions">Functions</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-reuse2">Scalable solutions and reuse (2/2)</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-stochastics">Stochastics</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-extensions">Language extensions</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The lessons introduce new concepts, one by one, and are meant to be read in
+the given order.</p>
+</div>
+<div id="lang-tut-basics" class="paragraph">
+<p><strong>Basics</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-basics-chapter-automata">Automata</a></dt>
+<dd>
+<p>Explains automata, locations, events, edges, transitions, and more.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-basics-chapter-synchronizing-events">Synchronizing events</a></dt>
+<dd>
+<p>Explains event synchronization, enabledness, traces, and state spaces.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-basics-chapter-non-determinism">Non-determinism</a></dt>
+<dd>
+<p>Explains multiple causes of non-determinism.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-basics-chapter-alphabet">Alphabet</a></dt>
+<dd>
+<p>Explains alphabets for both individual automata and entire specifications.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-basics-chapter-event-placement">Event declaration placement</a></dt>
+<dd>
+<p>Explains the placement of event declarations.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-basics-chapter-shorter-notations">Shorter notations</a></dt>
+<dd>
+<p>Explains several shorter notations, including self loops, declaring
+multiple events with a single declaration, multiple events on an edge, and
+nameless locations.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-data" class="paragraph">
+<p><strong>Data</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-data-chapter-discrete-variables">Discrete variables</a></dt>
+<dd>
+<p>Explains discrete variables, guards, and updates.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-discvar-change">Discrete variable value changes</a></dt>
+<dd>
+<p>Explains how and when discrete variables can change value.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-loc-var-duality1">Location/variable duality (1/2)</a></dt>
+<dd>
+<p>Explains the duality between locations and variables using a model of a
+counter.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-loc-var-duality2">Location/variable duality (2/2)</a></dt>
+<dd>
+<p>Explains the duality between locations and variables using a model of a
+lamp.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-read-write">Global read, local write</a></dt>
+<dd>
+<p>Explains the concepts of global read and local write.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-monitoring">Monitoring</a></dt>
+<dd>
+<p>Explains monitoring, self loops, and monitor automata.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-asgn-old-vs-new">Old and new values in assignments</a></dt>
+<dd>
+<p>Explains old and new values of variables in assignments, multiple
+assignments, and the order of assignments.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-tau-event">The <code>tau</code> event</a></dt>
+<dd>
+<p>Explains the <code>tau</code> event.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-discvar-init">Initial values of discrete variables</a></dt>
+<dd>
+<p>Explains initialization of discrete variables, including the use of default
+values and multiple potential initial values.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-init-preds">Initialization predicates</a></dt>
+<dd>
+<p>Explains initialization in general, and initialization predicates in
+particular.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-locs-as-var">Using locations as variables</a></dt>
+<dd>
+<p>Explains the use of locations as variables.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-stat-invariants">State (exclusion) invariants</a></dt>
+<dd>
+<p>Explains state (exclusion) invariants.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-data-chapter-stat-evt-excl-invariants">State/event exclusion invariants</a></dt>
+<dd>
+<p>Explains state/event exclusion invariants.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-values" class="paragraph">
+<p><strong>Types and values</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-values-chapter-types-values-exprs">Types, values, and expressions</a></dt>
+<dd>
+<p>Explains the concepts of types, values, and expressions, as an introduction
+for the other lessons in this category.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-overview">Values overview</a></dt>
+<dd>
+<p>Provides an overview of the available values, and divides them into
+categories.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-integers">Integers</a></dt>
+<dd>
+<p>Explains integer types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-integer-ranges">Integer ranges</a></dt>
+<dd>
+<p>Explains integer ranges.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-reals">Reals</a></dt>
+<dd>
+<p>Explains real types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-booleans">Booleans</a></dt>
+<dd>
+<p>Explains boolean types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-strings">Strings</a></dt>
+<dd>
+<p>Explains string types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-enumerations">Enumerations</a></dt>
+<dd>
+<p>Explains enumeration types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-tuples">Tuples</a></dt>
+<dd>
+<p>Explains tuple types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-lists">Lists</a></dt>
+<dd>
+<p>Explains list types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-bounded-lists-and-arrays">Bounded lists and arrays</a></dt>
+<dd>
+<p>Explains bounded lists, arrays, and their relations with regular lists.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-sets">Sets</a></dt>
+<dd>
+<p>Explains set types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-dictionaries">Dictionaries</a></dt>
+<dd>
+<p>Explains dictionary types, values, and commonly used expressions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-combining-values">Combining values</a></dt>
+<dd>
+<p>Explains how to combine values of different types.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-reuse1" class="paragraph">
+<p><strong>Scalable solutions and reuse (1/2)</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-reuse1-chapter-constants">Constants</a></dt>
+<dd>
+<p>Explains the use of constants.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse1-chapter-algebraic-variables">Algebraic variables</a></dt>
+<dd>
+<p>Explains the use of algebraic variables.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse1-chapter-algvar-equations">Algebraic variables and equations</a></dt>
+<dd>
+<p>Explains the use of equations to specify values of algebraic variables.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse1-chapter-type-declarations">Type declarations</a></dt>
+<dd>
+<p>Explains the use of type declarations.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-time" class="paragraph">
+<p><strong>Time</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-time-chapter-intro">Timing</a></dt>
+<dd>
+<p>Introduces the concept of timing.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-continuous-variables">Continuous variables</a></dt>
+<dd>
+<p>Explains the use of continuous variables.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-contvar-equations">Continuous variables and equations</a></dt>
+<dd>
+<p>Explains the use of equations to specify values of continuous variables.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-equations">Equations</a></dt>
+<dd>
+<p>Show the use of equations for both continuous and algebraic variables, by
+means of an example of a
+<a href="http://en.wikipedia.org/wiki/Nonlinear_system&gt;">non-linear system</a>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-var-overview">Variables overview</a></dt>
+<dd>
+<p>Provides an overview of the different kinds of variables in CIF, and their
+main differences.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-urgency">Urgency</a></dt>
+<dd>
+<p>Explains the concept of urgency, as well as the different forms of urgency.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-time-chapter-deadlock-livelock">Deadlock and livelock</a></dt>
+<dd>
+<p>Explains the concepts of deadlock and livelock.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-channels" class="paragraph">
+<p><strong>Channel communication</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-channels-chapter-intro">Channels</a></dt>
+<dd>
+<p>Explains point-to-point channels and data communication.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-channels-chapter-void">Dataless channels</a></dt>
+<dd>
+<p>Explains <code>void</code> channels that do not communicate any data.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-channels-chapter-chan-sync-combi">Combining channel communication with event synchronization</a></dt>
+<dd>
+<p>Explains how channel communication can be combined with event
+synchronization, further restricting the communication.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-functions" class="paragraph">
+<p><strong>Functions</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-functions-chapter-intro">Functions</a></dt>
+<dd>
+<p>Introduces functions, and explains the different kind of functions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-functions-chapter-internal-functions">Internal user-defined functions</a></dt>
+<dd>
+<p>Explains internal user-defined functions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-functions-chapter-statements">Function statements</a></dt>
+<dd>
+<p>Explains the different statements that can be used in internal user-defined
+functions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-functions-chapter-functions-as-values">Functions as values</a></dt>
+<dd>
+<p>Explains using functions as values, allowing functions to be passed around.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-reuse2" class="paragraph">
+<p><strong>Scalable solutions and reuse (2/2)</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-aut-def-inst">Automaton definition/instantiation</a></dt>
+<dd>
+<p>Explains using automaton definition and instantiation for reuse.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-aut-def-params">Parametrized automaton definitions</a></dt>
+<dd>
+<p>Explains parametrized automaton definitions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-aut-def-param-kinds">Automaton definition parameters</a></dt>
+<dd>
+<p>Explains the different kinds of parameters of automaton definitions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-groups">Groups</a></dt>
+<dd>
+<p>Explains hierarchical structuring using groups.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-group-defs">Group definitions</a></dt>
+<dd>
+<p>Explains groups definitions and parametrized group definitions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-imports">Imports</a></dt>
+<dd>
+<p>Explains splitting CIF specifications over multiple files using imports.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-imports-libraries">Imports and libraries</a></dt>
+<dd>
+<p>Explains how to create libraries that can be used by multiple CIF
+specifications using imports, as well as how to use imports to include
+CIF specifications from other directories.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-imports-groups">Imports and groups</a></dt>
+<dd>
+<p>Explains how imports and groups interact.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-namespaces">Namespaces</a></dt>
+<dd>
+<p>Explains namespaces, and how they can be used together with imports.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-reuse2-chapter-input-variables">Input variables</a></dt>
+<dd>
+<p>Explains input variables, how they can be used for coupling with other
+models and systems, and their relation to imports.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-stochastics" class="paragraph">
+<p><strong>Stochastics</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-stochastics-chapter-intro">Stochastics</a></dt>
+<dd>
+<p>Introduction to stochastic distributions, which allow for sampling, making
+it possible to produce random values.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-stochastics-chapter-discrete-continuous-constant">Discrete, continuous, and constant distributions</a></dt>
+<dd>
+<p>Explains the different categories of stochastic distributions: discrete,
+continuous, and constant distributions.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-stochastics-chapter-pseudo-randomness">Pseudo-randomness</a></dt>
+<dd>
+<p>Explains how computers implement stochastics using pseudo-random number
+generators, and how this affects the use of stochastics in CIF.</p>
+</dd>
+</dl>
+</div>
+<div id="lang-tut-extensions" class="paragraph">
+<p><strong>Language extensions</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-extensions-chapter-synthesis">Supervisory controller synthesis</a></dt>
+<dd>
+<p>Explains how to extend a model to make it suitable for supervisory
+controller synthesis.</p>
+</dd>
+<dt class="hdlist1"><a href="#tools-cifsim-output-print-chapter-index">Print output</a></dt>
+<dd>
+<p>Explains how to extend a model to include printing of textual output.</p>
+<div class="paragraph">
+<p>This documentation is currently not part of the language tutorial,
+but of the simulator tool documentation.</p>
+</div>
+</dd>
+<dt class="hdlist1"><a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualization</a></dt>
+<dd>
+<p>Explains how to extend a model to couple it to an image for visualization.</p>
+<div class="paragraph">
+<p>This documentation is currently not part of the language tutorial,
+but of the simulator tool documentation.</p>
+</div>
+</dd>
+<dt class="hdlist1"><a href="#tools-cifsim-input-svg-chapter-index">SVG interaction</a></dt>
+<dd>
+<p>Explains how to extend a model to couple it to an image for interaction via
+a visualization.</p>
+<div class="paragraph">
+<p>This documentation is currently not part of the language tutorial,
+but of the simulator tool documentation.</p>
+</div>
+</dd>
+</dl>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-basics">Basics</h3>
+<div class="sect3">
+<h4 id="tut-basics-chapter-automata">Automata</h4>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="paragraph">
+<p>CIF models consist of <em>components</em>. Each of the components represents the
+behavior of a part of the system. Components can be modeled as <em>automata</em>,
+which form the basis of CIF. The following CIF <em>specification</em>, or CIF <em>model</em>,
+shows a simple automaton:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp:
+  event turn_on, turn_off;
+
+  location on:
+    initial;
+    edge turn_off goto off;
+
+  location off:
+    edge turn_on goto on;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The automaton is named <code>lamp</code>, and not surprisingly represents the (discrete)
+behavior of a lamp.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="lang-tut-basics-automata-events" class="paragraph">
+<p>Automaton <code>lamp</code> declares two <em>events</em>, named <code>turn_on</code> and <code>turn_off</code>.
+Events model things that can happen in a system. They represent changes. For
+instance, the <code>turn_on</code> event indicates that the lamp is being turned on. It
+represents the change from the lamp being off to the lamp being on. The event
+declaration in the <code>lamp</code> automaton declares two events. The event
+declaration only indicates that these events exist, it does not yet indicate
+when they can happen, and what the result of them happening is.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="lang-tut-basics-automata-location" class="paragraph">
+<p>All automata have one or more <em>locations</em>, which represent the mutually
+exclusive <em>states</em> of the automaton. The <code>lamp</code> automaton has two
+<em>locations</em>, named <code>on</code> and <code>off</code>. Automata have an <em>active</em> or <em>current</em>
+location. That is, for every automaton one of its location is the active
+location, and the automaton is said to be <em>in</em> that location. For instance,
+the <code>lamp</code> automaton is either in its <code>on</code> location, or in its <code>off</code>
+location.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-basics-automata-loc-init" class="paragraph">
+<p>Initially, the lamp is on, as indicated by the <code>initial</code> keyword in the
+<code>on</code> location. That is, the <code>on</code> location is the initial location of the
+<code>lamp</code> automaton. The initial location is the active location of the
+automaton, at the start of the system.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-basics-edge" class="paragraph">
+<p>In each location, an automaton can have different behavior, specified using
+<em>edges</em>. An edge indicates how an automaton can change its state, by going from
+one location to another. Edges can be associated with events, that indicate
+what happened, and thus what caused the state change.</p>
+</div>
+<div class="paragraph">
+<p>The <code>lamp</code> automaton has an edge with the <code>turn_off</code> event, in its <code>on</code>
+location, going to the <code>off</code> location. Whenever the lamp is on, the <code>lamp</code>
+automaton is in its <code>on</code> location. Whenever the lamp is turned off, the
+<code>turn_off</code> event happens. The edge with that event indicates what the
+result of that event is, for the <code>on</code> location. In this case the result is
+that the lamp will then be off, which is why the edge goes to the <code>off</code>
+location.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="lang-tut-basics-trans" class="paragraph">
+<p>The <code>lamp</code> automaton can go from one location to another, as described by its
+edges. This is referred to as 'performing a transition', 'taking a transition',
+or 'taking an edge'. The <code>lamp</code> automaton can keep performing <em>transitions</em>.
+The lamp can be turned on, off, on again, off again, etc. This can go on
+forever.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-basics-chapter-synchronizing-events">Synchronizing events</h4>
+<div class="paragraph">
+<p>
+The power of events is that they synchronize. To illustrate this, consider
+the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer:
+  event produce, provide;
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The automaton represents a producer that produces products, to be consumed
+by a consumer. The <code>producer</code> automaton starts in its <code>producing</code> location,
+in which it produces a product. Once the product has been produced, indicated
+by the <code>produce</code> event, the automaton will be in its <code>idle</code> location, where
+it waits until it can <code>provide</code> the produced product to the consumer. Once it
+has provided the product to the consumer, it will once again be <code>producing</code>
+another product. Consider also the following continuation of the above
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton consumer:
+  event consume;
+
+  location idle:
+    initial;
+    edge producer.provide goto consuming;
+
+  location consuming:
+    edge consume goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This second automaton represents a consumer that consumes products. The
+<code>consumer</code> is initially <code>idle</code>, waiting for a product from the producer.
+Once the producer has provided a product, the consumer will be <code>consuming</code>.
+Once it has consumed the product, as indicated by the occurrence of the
+<code>consume</code> event, it will become <code>idle</code> again.</p>
+</div>
+<div class="paragraph">
+<p>The specification has three events, the <code>produce</code> and <code>provide</code> events
+declared in the <code>producer</code> automaton, and the <code>consume</code> event declared in
+the <code>consumer</code> automaton. The <code>consumer</code> automaton, in its <code>idle</code>
+location, has an edge that refers to the <code>provide</code> event declared in the
+<code>producer</code> automaton. As such, that edge and the edge in the <code>idle</code>
+location of the <code>producer</code> automaton, refer to the same event.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tut-synchronization">Synchronization</h5>
+<div class="paragraph">
+<p>Events that are used in multiple automata, must <em>synchronize</em>. That is, if
+one of those automata performs a transition for that event, the other automata
+must also participate by performing a transition for that same event. If one
+of the automata that uses the event can not perform a transition in its current
+location, none of the automata can perform a transition for that event.</p>
+</div>
+<div class="paragraph">
+<p>Now, lets take a closer look at the behavior of the producer/consumer example.
+Initially, the <code>producer</code> automaton is in its <code>producing</code> location, and the
+<code>consumer</code> automaton is in its <code>idle</code> location. Since the <code>producer</code> is
+the only automaton that uses the <code>produce</code> event, and there is an (outgoing)
+edge in its current location for that <code>produce</code> event, the <code>producer</code> can
+go to its <code>idle</code> location by means of that event.</p>
+</div>
+<div class="paragraph">
+<p>Both the <code>producer</code> and <code>consumer</code> use the <code>provide</code> event. The
+<code>producer</code> has no edge with that event in its <code>producing</code> location, while
+the <code>consumer</code> does have an edge for that event in its <code>idle</code> location.
+Since events must synchronize, and the <code>producer</code> can not participate, the
+event can not occur at this time. This is what we expect, as the <code>producer</code>
+has not yet produced a product, and can thus not yet <code>provide</code> it to the
+consumer. The <code>consumer</code> will have to remain <code>idle</code> until the <code>producer</code>
+has produced a product and is ready to <code>provide</code> it to the <code>consumer</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+The <code>producer</code> blocks the <code>provide</code> event in this case, and is said to
+<em>disable</em> the event. The event is not blocked by the <code>consumer</code>, and is thus
+said to be <em>enabled</em> in the <code>consumer</code> automaton. In the entire
+specification, the event is <em>disabled</em> as well, as it is disabled by at least
+one of the automata of the specification, and all automata must enable the
+event for it to become enabled in the specification.</p>
+</div>
+<div class="paragraph">
+<p>The only behavior that is possible, is for the <code>producer</code> to <code>produce</code> a
+product, and go to its <code>idle</code> location. The <code>consumer</code> does not participate
+and remains in its <code>idle</code> location. Both automata are then in their <code>idle</code>
+location, and both have an edge that enables the <code>provide</code> event. As such,
+the <code>provide</code> event is enabled in the specification. As this is the only
+possible behavior, a transition for the <code>provide</code> event is performed. This
+results in the <code>producer</code> going back to its <code>producing</code> location, while at
+the same time the <code>consumer</code> goes to its <code>consuming</code> location.</p>
+</div>
+<div class="paragraph">
+<p>In its <code>producing</code> location, the <code>producer</code> can <code>produce</code> a product.
+Furthermore, in its <code>consuming</code> location, the <code>consumer</code> can <code>consume</code> a
+product. Two transitions are possible, and CIF does not define which one will
+be performed. That is, either one can be performed. No assumptions should be
+made either way. In other words, both transitions represent valid behavior, as
+described by this specification. Since only one transition can be taken at a
+time, there are two possibilities. Either the <code>producer</code> starts to
+<code>produce</code> the product first, and the <code>consumer</code> starts to <code>consume</code> after
+that, or the other way around.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-traces-and-state-spaces">Traces and state spaces</h5>
+<div class="paragraph">
+<p>Once both transitions have been taken, we are essentially in the same situation
+as we were after the <code>producer</code> produced a product the first time, as both
+automata will be in their <code>idle</code> locations again. The behavior of the
+specification then continues to repeat forever. However, for each repetition
+different choices in the order of production and consumption can be made.</p>
+</div>
+<div class="paragraph">
+<p>
+During a single <em>execution</em> or <em>simulation</em>, choices are made each time that
+multiple transitions are possible. The sequence of transitions that are taken
+is called a <em>trace</em>. Examples of traces for the producer/consumer example are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>produce</code> →
+<code>provide</code> →
+<code>produce</code> →
+<code>consume</code> →
+<code>provide</code> →
+<code>produce</code> →
+<code>consume</code> →
+&#8230;&#8203;</p>
+</li>
+<li>
+<p><code>produce</code> →
+<code>provide</code> →
+<code>produce</code> →
+<code>consume</code> →
+<code>provide</code> →
+<code>consume</code> →
+<code>produce</code> →
+&#8230;&#8203;</p>
+</li>
+<li>
+<p><code>produce</code> →
+<code>provide</code> →
+<code>consume</code> →
+<code>produce</code> →
+<code>provide</code> →
+<code>produce</code> →
+<code>consume</code> →
+&#8230;&#8203;</p>
+</li>
+<li>
+<p><code>produce</code> →
+<code>provide</code> →
+<code>consume</code> →
+<code>produce</code> →
+<code>provide</code> →
+<code>consume</code> →
+<code>produce</code> →
+&#8230;&#8203;</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The traces end with <code>...</code> to indicate that they are partial traces, that go
+beyond the part of the trace that is shown. These four traces however, cover
+all the possibilities for the first seven transitions.</p>
+</div>
+<div class="paragraph">
+<p>
+All possible traces together form the <em>state space</em>, which represents all the
+possible behavior of a system. For the producer/consumer example, the state
+space is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/basics/producer_consumer_state_space_finite.png" alt="producer consumer state space finite">
+</div>
+</div>
+<div class="paragraph">
+<p>Here the circles represent the states of the specification, which are a
+combination of the states of the two automata. The labels of the circles
+indicate the state, as a combination of the first letters of the locations of
+the automata. The initial state is labeled <code>p/i</code>, as initially automaton
+<code>producer</code> is in its <code>producing</code> (p) location, and the <code>consumer</code> is in
+its <code>idle</code> (i) location. The arrows indicate the transitions, and are labeled
+with events. The state space clearly shows the choices, as multiple outgoing
+arrows for a single state. It also makes it clear that as we move to the right,
+and make choices, we can make different choices for different products.
+Since the behavior keeps repeating itself, the state space ends with <code>...</code>
+to indicate that only a part of the state space is shown.</p>
+</div>
+<div class="paragraph">
+<p>However, we can also show the entire behavior of the specification. Essential
+here is that the state space shown above has duplicate states. That is, several
+states have the same label, and allow for the same future behavior. By reusing
+states, a finite representation of the state space can be made, which shows the
+entire possible infinite behavior of the producer/consumer specification:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/basics/producer_consumer_state_space_infinite.png" alt="producer consumer state space infinite">
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-concluding-remarks">Concluding remarks</h5>
+<div class="paragraph">
+<p>By using multiple automata, the producer and consumer were modeled
+independently, allowing for separation of concerns. This is an important
+concept, especially when modeling larger systems. In general, the large system
+is decomposed into parts, usually corresponding to physical entities. Each of
+the parts of the system can then be modeled in isolation, with little regard
+for the other parts.</p>
+</div>
+<div class="paragraph">
+<p>By using synchronizing events, the different automata that model different
+parts of a system, can interact. This allows for modeling of the connection
+between the different parts of the system, ensuring that together they
+represent the behavior of the entire system.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-basics-chapter-non-determinism">Non-determinism</h4>
+<div class="paragraph">
+<p>
+Depending on the context in which it is used, non-determinism can mean
+different things. One definition is having multiple possible traces through the
+state space of a system. Another definition is having multiple possible
+transitions for a certain event, for a certain state. Different communities
+also use different definitions, and some communities only use one of the
+definitions, and use a different name to refer to the other concept.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-non-determinism-between-events">Non-determinism between events</h5>
+<div class="paragraph">
+<p>One cause of non-determinism is that multiple events are enabled, leading to
+multiple possible transitions. In other words, there are multiple possible
+traces through the state space. During the lesson on
+<a href="#tut-basics-chapter-synchronizing-events">synchronizing events</a>, we already
+encountered this form of non-determinism, as transitions for the <code>produce</code> and
+<code>consume</code> events could be performed in arbitrary order.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-non-determinism-for-single-event">Non-determinism for single event</h5>
+<div class="paragraph">
+<p>Another cause of non-determinism is the presence of multiple outgoing edges of
+a single location for the same event. This can lead to multiple possible
+transitions for a that event, for a single state. For instance, consider the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton coin:
+  event toss, land, pick_up;
+
+  location hand:
+    initial;
+    edge toss goto air;
+
+  location air:
+    edge land goto ground;
+
+  location ground:
+    edge pick_up goto hand;
+end
+
+automaton outcome:
+  location unknown:
+    initial;
+    edge coin.land goto heads; // First way to land.
+    edge coin.land goto tails; // Second way to land.
+
+  location heads:
+    edge pick_up goto unknown;
+
+  location tails:
+    edge pick_up goto unknown;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>coin</code> automaton represents a single coin. Initially, it is in the
+<code>hand</code> of a person. That person can <code>toss</code> the coin up into the <code>air</code>,
+eventually causing it to fall and <code>land</code> on the <code>ground</code>. It can be picked
+up (event <code>pick_up</code>), causing it to once again be in the <code>hand</code> of a
+person.</p>
+</div>
+<div class="paragraph">
+<p>The <code>outcome</code> automaton registers the outcome of the
+<a href="http://en.wikipedia.org/wiki/Coin_toss">coin toss</a>. Initially,
+the outcome is <code>unknown</code>. Whenever the coin is tossed, it lands (event
+<code>land</code> from automaton <code>coin</code>) on the ground with either the <code>heads</code> or
+<code>tails</code> side up. The <code>unknown</code> location of the <code>outcome</code> automaton has
+two edges for the same event. This leads to two possible transitions, one to
+the <code>heads</code> location, and one to the <code>tails</code> location. This is a
+non-deterministic choice, as the model does not specify which transition is
+chosen, or even which choice is more likely.</p>
+</div>
+<div class="paragraph">
+<p>In both the <code>heads</code> and <code>tails</code> locations, the coin can be picked up again,
+making the outcome <code>unknown</code>. The coin can be tossed again and again,
+repeating the behavior forever. The following figure shows the state space of
+this specification:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/basics/coin_toss_state_space.png" alt="coin toss state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the first letters of the current locations of the
+two automata.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-basics-chapter-alphabet">Alphabet</h4>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p>The lesson on <a href="#tut-basics-chapter-synchronizing-events">synchronizing events</a>
+described how events that are used in multiple automata exhibit synchronizing
+behavior. That is, if the event is used in multiple automata, they must all
+enable that event in order for a transition to be possible. If one of them can
+not perform the event, the event is disabled, and none of the automata can
+perform a transition for that event.</p>
+</div>
+<div class="paragraph">
+<p>Whether an automaton participates in the synchronization for a certain event,
+is determined by its <em>alphabet</em>. The alphabet of an automaton is the collection
+of events over which it synchronizes.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-default-and-implicit-alphabets">Default and implicit alphabets</h5>
+<div class="paragraph">
+<p>By default, the alphabet of an automaton implicitly contains all the events
+that occur on the edges of the automaton. For instance, consider the following
+CIF specification (the producer/consumer example from the lesson on
+<a href="#tut-basics-chapter-synchronizing-events">synchronizing events</a>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer:
+  event produce, provide;
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end
+
+automaton consumer:
+  event consume;
+
+  location idle:
+    initial;
+    edge producer.provide goto consuming;
+
+  location consuming:
+    edge consume goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The alphabet of the <code>producer</code> automaton contains the events <code>produce</code> and
+<code>provide</code>, as both occur on edges of that automaton. The alphabet of the
+<code>consumer</code> automaton contains the events <code>producer.produce</code> and
+<code>consume</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-basics-alphabet-explicit">Explicit alphabet</h5>
+<div class="paragraph">
+<p>It is possible to explicitly specify the alphabet of an automaton, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event provide;
+
+automaton producer:
+  event produce;
+
+  alphabet produce, provide; // Alphabet explicitly specified.
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>alphabet</code> keyword is followed by the events that comprise the alphabet
+of the automaton, separated by commas. In this case, the alphabet contains
+the <code>produce</code> and <code>provide</code> events. Since this explicitly specified
+alphabet is exactly the same as the default alphabet, it could just as easily
+be omitted.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-non-default-alphabet">Non-default alphabet</h5>
+<div class="paragraph">
+<p>The alphabet is allowed to be empty, which can be explicitly specified as
+follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alphabet; // Empty alphabet. Automaton doesn't synchronize over any events.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+However, the alphabet of an automaton must at least contain the events that
+occur on the edges of an automaton. That is, it must at least contain the
+default alphabet.</p>
+</div>
+<div class="paragraph">
+<p>
+It may however also contain additional events. Since there are no edges for
+those additional events, the automaton can never enable those events, and
+thus always disables them. If a single automaton disables an event, and since
+it must always participate if it has that event in its alphabet, this means
+that the event becomes globally disabled in the entire specification. Having
+such additional events in the alphabet leads to a warning, to inform about the
+potential undesired effects of globally disabling events in this manner.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-implicit-vs-explicit">Implicit vs explicit</h5>
+<div class="paragraph">
+<p>It should be clear that for most automata, the implicit default alphabet
+suffices. There are however reasons for explicitly specifying the default
+alphabet. For large automata, it can improve the readability, as the explicit
+alphabet makes it easy to determine the alphabet of the automaton, without
+having to look at all the edges.</p>
+</div>
+<div class="paragraph">
+<p>The need to explicitly specifying a non-default alphabet rarely occurs.
+However, several <a href="#tools-chapter-index">tools</a> generate CIF specifications with
+explicit alphabets.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-basics-chapter-event-placement">Event declaration placement</h4>
+<div class="paragraph">
+<p>
+Consider the following CIF specification (the producer/consumer example from
+the lesson on <a href="#tut-basics-chapter-synchronizing-events">synchronizing events</a>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer:
+  event produce, provide;
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end
+
+automaton consumer:
+  event consume;
+
+  location idle:
+    initial;
+    edge producer.provide goto consuming;
+
+  location consuming:
+    edge consume goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The specification could also be specified as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer:
+  event produce, provide, consume; // Declaration of event 'consume' moved.
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end
+
+automaton consumer:
+  location idle:
+    initial;
+    edge producer.provide goto consuming;
+
+  location consuming:
+    edge producer.consume goto idle; // Event 'consume' from 'producer'.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>consume</code> event is now declared in the <code>producer</code> automaton rather than
+the <code>consumer</code> automaton, but the locations and edges have not changed. This
+modified specification exhibits the same behavior as the original.</p>
+</div>
+<div class="paragraph">
+<p>It should be clear that while events can be declared in various places, it is
+best to declare them where they belong. That is, the <code>consume</code> event is only
+used by the <code>consumer</code> automaton, and is thus best declared in that
+automaton. Similarly, the <code>produce</code> event is only used by the <code>producer</code>
+automaton.</p>
+</div>
+<div class="paragraph">
+<p>The <code>provide</code> event however is used by both automata. In such cases the event
+is usually declared where it is initiated. In the example above, the producer
+provides the product to the consumer, and not the other way around. Therefore,
+the <code>provide</code> event is declared in the <code>producer</code> automaton, rather than in
+the <code>consumer</code> automaton.</p>
+</div>
+<div class="paragraph">
+<p>However, the modeler is free to choose the best place to declare the event. If
+no choice can be made between the automata, the event can also be declared
+outside the automata, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event provide; // Event 'provide' now declared outside the automata.
+
+automaton producer:
+  event produce;
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide goto producing;
+end
+
+automaton consumer:
+  event consume;
+
+  location idle:
+    initial;
+    edge provide goto consuming; // Can directly refer to 'provide' event.
+
+  location consuming:
+    edge consume goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification also has the same behavior. Only the placement of the event
+declarations has changed.</p>
+</div>
+<div class="paragraph">
+<p>The place where an event is declared is of no influence to the
+implicit (default) <a href="#tut-basics-chapter-alphabet">alphabets</a> of the
+automata. The implicit alphabet of an automaton is determined solely based on
+the events that occur on the edges of that automaton.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-basics-chapter-shorter-notations">Shorter notations</h4>
+<div class="paragraph">
+<p>This lessons explains several short notations, that can be used for easier
+modeling, can reduce the size of the specification, and make specifications
+easier to read. The following topics are discussed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-tut-basics-shorter-notations-self-loop">Self loop</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-basics-shorter-notations-evt-decl-mult">Declaring multiple events with a single declaration</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-basics-shorter-notations-edge-mult-evt">Multiple events on an edge</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-basics-shorter-notations-loc-nameless">Nameless location</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-basics-shorter-notations-self-loop">Self loop</h5>
+<div class="paragraph">
+<p>A self loop is an edge that goes to the location from which it originated.
+Consider the following example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  event e;
+
+  location x:
+    edge e goto x;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The edge in location <code>x</code> of automaton <code>a</code> goes to location <code>x</code>. The
+effect of the <code>e</code> event is that automaton <code>a</code> remains in its <code>x</code>
+location. A self loop can be used to allow a certain event, essentially
+ignoring it for that location.</p>
+</div>
+<div class="paragraph">
+<p>The following short notation can be used for self loops:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  event e;
+
+  location x:
+    edge e; // Goto omitted for self loop.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>goto</code> part of the edge can be omitted for self loop. This can help make
+the model easier to read, as the resulting location does not have to be checked
+against the source location of the edge, to see whether they match.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-basics-shorter-notations-evt-decl-mult">Declaring multiple events with a single declaration</h5>
+<div class="paragraph">
+<p>Several of the previous lessons already showed that multiple events can be
+declared using a single event declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event a, b, c; // Single declaration declares multiple events.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is equivalent to using multiple event declarations that each declare a
+single event:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event a; // Multiple declarations each declare a single event.
+event b;
+event c;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Using a single declaration to declare multiple events can help reduce the
+length of a specification.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-basics-shorter-notations-edge-mult-evt">Multiple events on an edge</h5>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  event e, f;
+
+  location loc:
+    edge e goto loc; // Two edges that only differ in the event.
+    edge f goto loc;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This can also be written more compactly, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  event e, f;
+
+  location loc:
+    edge e, f goto loc; // Edge with two events.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>An edge with two or more events means exactly the same as having individual
+edges for the different events. That is, a choice is made between them. It does
+<em>not</em> specify that event <code>f</code> can only happen after event <code>e</code> has already
+happened. Both automata thus have the exact same behavior.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-basics-shorter-notations-loc-nameless">Nameless location</h5>
+<div class="paragraph">
+<p>Several of the examples above show automata with a single location. For such
+automata, the name of the location is optional:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  event e;
+
+  location:
+    edge e;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Since the location has no name, there is no way to refer to it in a <code>goto</code>,
+and thus only self loop edges can be used. Leaving out the name prevents having
+to come up with a dummy name, which can clutter the specification.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-data">Data</h3>
+<div class="sect3">
+<h4 id="tut-data-chapter-discrete-variables">Discrete variables</h4>
+<div class="paragraph">
+<p>This lesson introduces discrete variables. Consider the following
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment, decrement;
+
+  disc int count = 3;
+
+  location:
+    edge decrement when count &gt; 0 do count := count - 1;
+    edge increment when count &lt; 5 do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The <code>counter</code> automaton can be used to count certain things. The
+<code>increment</code> and <code>decrement</code> events are used to change the count. The count
+itself is stored in a variable named <code>count</code>. CIF has several different types
+of variables. Here, we use a discrete variable, as indicated by the <code>disc</code>
+keyword. The variable has an <code>int</code> data type, meaning it can have integer
+numbers as its value. It is initialized to value <code>3</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+The automaton has two edges, one for the <code>increment</code> event, and one for the
+<code>decrement</code> event. The edge for the <code>decrement</code> event has a <em>guard</em> that
+indicates under which circumstances the event can take place. The condition is
+indicated using the <code>when</code> keyword. In this case, the guard ensures that the
+count can only be decremented if it is currently positive. The guard of the
+edge for the <code>increment</code> event indicates that the count can only be
+incremented as long as it is less than five. In general, a guard must hold in
+the source location of the edge, for the edge to be enabled, and a transition
+to be possible. If the guard is not specified, it defaults to <code>true</code>, which
+always holds and does not restrict the edge in any way.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+Both edges also have <em>updates</em>, indicated using the <code>do</code> keyword. Updates can
+be used to specify the effect of the transition on variables. In this case, the
+updates <em>assign</em> a new value to the <code>count</code> variable that is one less or one
+more than the current value. That is the value of the <code>count</code> variable is
+decremented or incremented by one.</p>
+</div>
+<div class="paragraph">
+<p>This specification represents a counter that can be repeatedly incremented and
+decremented by one, and ensures that the value of variable <code>count</code> is always
+at least zero and at most five.</p>
+</div>
+<div class="paragraph">
+<p>The state space of the <code>counter</code> automaton is as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/counter_state_space.png" alt="counter state space">
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-discvar-change">Discrete variable value changes</h4>
+<div class="paragraph">
+<p>
+Discrete variables can only change value by explicitly assigning them a new
+value in the <code>do</code> part of an edge. If an edge does not assign a value to a
+discrete variable, that variable keeps its current value. Consider the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp:
+  event turn_on, turn_off;
+
+  disc int count = 0;
+
+  location off:
+    initial;
+    edge turn_on  do count := count + 1 goto on;
+
+  location on:
+    edge turn_off                       goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is the same <code>lamp</code> automaton as used in the lesson on
+<a href="#tut-basics-chapter-automata">automata</a>, but with a <code>count</code> variable added. This
+variable is used to count the number of times that the lamp has been turned on.
+The edge for the <code>turn_on</code> event increments the value of the variable by one,
+each time the lamp is turned on.</p>
+</div>
+<div class="paragraph">
+<p>The edge for the <code>turn_off</code> event does not assign a value to a variable, so
+variable <code>count</code> keeps its value when the lamp is turned off.</p>
+</div>
+<div class="paragraph">
+<p>The state space of this specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/discvar_change_state_space.png" alt="discvar change state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the name of the current location of automaton
+<code>lamp</code> and the current value of variable <code>count</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-loc-var-duality1">Location/variable duality (1/2)</h4>
+<div class="paragraph">
+<p>
+
+The lesson that
+<a href="#tut-data-chapter-discrete-variables">introduces discrete variables</a>, uses
+an example of a counter. The actual count was modeled using a variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment, decrement;
+
+  disc int count = 3;
+
+  location:
+    edge decrement when count &gt; 0 do count := count - 1;
+    edge increment when count &lt; 5 do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is also possible to use multiple locations instead of a variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment, decrement;
+
+  location zero:
+    edge increment goto one;
+
+  location one:
+    edge decrement goto zero;
+    edge increment goto two;
+
+  location two:
+    edge decrement goto one;
+    edge increment goto three;
+
+  location three:
+    initial;
+
+    edge decrement goto two;
+    edge increment goto four;
+
+  location four:
+    edge decrement goto three;
+    edge increment goto five;
+
+  location five:
+    edge decrement goto four;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This alternate model has the same behavior, in that it models a counter that
+can be incremented an decremented in steps of one, and the value is kept at
+least zero, and at most five. The variant with the variable however, is shorter
+and more intuitive. It is also easier to change to the <code>count &lt; 5</code> guard to
+<code>count &lt; 100</code> than it is to add dozens of additional locations and edges. In
+this case, using a variable is preferable to using multiple locations.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-loc-var-duality2">Location/variable duality (2/2)</h4>
+<div class="paragraph">
+<p>
+
+The lesson that <a href="#tut-basics-chapter-automata">introduces automata</a>, used an
+example of a lamp:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp:
+  event turn_on, turn_off;
+
+  location on:
+    initial;
+    edge turn_off goto off;
+
+  location off:
+    edge turn_on goto on;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The automaton uses two locations to keep track of the current state of the
+lamp. Instead of two locations, it is also possible to use a variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp:
+  event turn_on, turn_off;
+
+  disc bool on = true;
+
+  location:
+    initial;
+    edge turn_on  when not on do on := true;
+    edge turn_off when     on do on := false;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This alternate automaton uses a single variable named <code>on</code>. The
+<a href="#tut-values-chapter-types-values-exprs">data type</a> of the variable is
+<code>bool</code>, which means that the variable can only have one of two possible
+values: <code>true</code> or <code>false</code>. If variable <code>on</code> has value <code>true</code>, the lamp
+is on, and if it has value <code>false</code> it is off. Initially, the lamp is on, as
+the initial value of the variable is <code>true</code>. The automaton has only one
+location, with two edges. The first edge indicates that the lamp can be turned
+on (event <code>turn_on</code>), only when it is not currently on (guard <code>not on</code>),
+and then afterwards is on (variable <code>on</code> becomes <code>true</code>). Similarly, the
+second edge indicates that the lamp can be turned off, only when it is
+currently on, and then afterwards is on.</p>
+</div>
+<div class="paragraph">
+<p>Both models represent a lamp that is initially on, and can be turned off,
+on, off again, on again, etc, repeating the behavior forever. Which approach
+is best depends on your preference, and on the rest of the model. It is however
+also possible to use both locations and a variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp:
+  event turn_on, turn_off;
+
+  disc bool on2 = true;
+
+  location on:
+    initial;
+    edge turn_off do on2 := false goto off;
+
+  location off:
+    edge turn_on  do on2 := true  goto on;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This automaton has the same behavior as the previous two automata. Variable
+<code>on</code> is renamed to <code>on2</code>, as a variable can not have the same name as a
+location of that same automaton.</p>
+</div>
+<div class="paragraph">
+<p>While it is possible to model a lamp like this, this automaton duplicates the
+information about whether the lamp is on or off. This makes the automaton
+larger and more complex than it needs to be. In general, it is usually better
+to choose either a variable, or multiple locations, to express something, and
+not both. In several future lessons, we&#8217;ll see that combining multiple
+locations with variables is useful, but not to express the same thing.
+Furthermore, an other future lesson explains how to
+<a href="#tut-data-chapter-locs-as-var">use a location as a variable</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-read-write">Global read, local write</h4>
+<div class="paragraph">
+<p>
+
+Discrete variables can only be declared in automata, and may only be assigned
+(given a value, written) by that automaton. They may however be read globally.
+Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton customer:
+  location:
+    initial;
+    edge queue1.enter when queue1.count &lt;= queue2.count;
+    edge queue2.enter when queue2.count &lt;= queue1.count;
+end
+
+automaton queue1:
+  event enter, leave;
+
+  disc int count = 0;
+
+  location:
+    initial;
+    edge enter when count &lt; 2 do count := count + 1;
+    edge leave when count &gt; 0 do count := count - 1;
+end
+
+automaton queue2:
+  event enter, leave;
+
+  disc int count = 0;
+
+  location:
+    initial;
+    edge enter when count &lt; 2 do count := count + 1;
+    edge leave when count &gt; 0 do count := count - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models a supermarket, and features a customer and two
+queues. Customers arrive and enter either of the queues. Eventually customers
+leave the queue.</p>
+</div>
+<div class="paragraph">
+<p>Both queues (automata <code>queue1</code> and <code>queue2</code>) are identical, except for
+their names. They maintain the <code>count</code>, which represents the number of
+customers in the queue. A queues is full if it contains two customers.
+Customers can thus only <code>enter</code> a queue if less than two customers are
+present. Similarly, it is only possible for a customer to leave a queue if
+there is a customer in the queue.</p>
+</div>
+<div class="paragraph">
+<p>Customers decide to which queue they go, based on the number of customers
+already present in those queues. A customer only enters the first queue if that
+queue has less than or the same number of customers as the second queue.
+Similarly, a customer only enters the second queue if that queue has less than
+or the same number of customers as the first queue. If the queues have the same
+number of customers, the customer can choose either queue.</p>
+</div>
+<div class="paragraph">
+<p>
+The <code>enter</code> event declared in the first queue (<code>queue1</code>) is used by both
+the <code>customer</code> automaton and the <code>queue1</code> automaton. The event is thus only
+possible (enabled) if both automata can participate. Both automata restrict the
+occurrence of the event using a guard. The event is thus only possible if both
+guards hold. That is, a custom never enters the first queue if it is full, but
+it also never enters that queue if it has more customers than the second queue.</p>
+</div>
+<div class="paragraph">
+<p>The state space of this specification is as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/supermarket_state_space.png" alt="supermarket state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the counts of the first and second queues.</p>
+</div>
+<div class="paragraph">
+<p>The <code>customer</code> automaton uses the values of the variables of the queue
+automata, and thus reads variables of other automata. This is allowed, due to
+the <em>global read</em> concept of CIF. This concept allows for short guards, that
+directly and intuitively represent the condition under which an event may take
+place.</p>
+</div>
+<div class="paragraph">
+<p>The global read concept should only be used when it is intuitive. In the
+supermarket example, the customer can physically see how many customers are
+in the queues. It is therefore intuitive to directly refer to the <code>count</code>
+variables of the queue automata. If however the customer would not be able to
+physically observer the queues, then the customer would not be able to directly
+base its decision of which queue to join, on that information. In that latter
+case, it may not be a good idea to model the guard in such way.</p>
+</div>
+<div class="paragraph">
+<p>The <em>local write</em> concept means that discrete variables can only be written by
+the automata in which they are declared. It is not allowed for the <code>customer</code>
+and <code>queue2</code> automata to write (change the value of) the <code>count</code> variable
+of the <code>queue1</code> automaton. Only the <code>queue1</code> automaton may write that
+variable. The local write concept prevents that multiple automata write to the
+same variable, as part of a synchronizing event, potentially causing
+conflicting values to be assigned to that variable. This leads to several
+benefits, most notably simpler semantics.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-monitoring">Monitoring</h4>
+<div class="paragraph">
+<p>
+
+This lesson explains the concept of <em>monitoring</em>. It is explained using the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer:
+  event produce, provide_a, provide_b;
+
+  location producing:
+    initial;
+    edge produce goto idle;
+
+  location idle:
+    edge provide_a goto producing;
+    edge provide_b goto producing;
+end
+
+automaton detect_changeover:
+  disc int count = 0;
+
+  location start:
+    initial;
+    edge producer.provide_a goto a;
+    edge producer.provide_b goto b;
+
+  location a:
+    edge producer.provide_b do count := count + 1 goto b;
+
+  location b:
+    edge producer.provide_a do count := count + 1 goto a;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>producer</code> automaton represents a producer that can repeatedly
+<code>produce</code> a product, and provide it to either consumer 'a' (event
+<code>provide_a</code>) or consumer 'b' (event <code>provide_b</code>). The consumers are not
+modeled.</p>
+</div>
+<div class="paragraph">
+<p>The <code>detect_changeover</code> automaton detects consumer changes. That is, it
+detects and counts how often the producer switching from providing consumer 'a'
+with products to providing consumer 'b' with products, and vice versa.
+Initially, the automaton waits for the first product to be provided. It goes
+to either location <code>a</code> or location <code>b</code>, depending on which consumer is
+provided that first product. Whenever a product is then provided to the other
+consumer, the <code>count</code> is incremented by one to account for the changeover
+taking place. This also switches the location to the location for the other
+consumer, where once again the automaton waits for a changeover.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-the-monitoring-problem">The monitoring problem</h5>
+<div class="paragraph">
+<p>There is a problem with the <code>detect_changeover</code> automaton. In its <code>a</code>
+location, it disables the <code>provide_a</code> event, as there is no edge for that
+event, and the automaton has that event in its (implicit)
+<a href="#tut-basics-chapter-alphabet">alphabet</a>. This means that after a product is
+provided to consumer 'a', no more products can be provided to that same
+consumer, until the producer provides a product to the consumer 'b', and the
+automaton switches to the corresponding <code>b</code> location. However, the idea is
+that the producer can provide products to either consumer, at all times, as
+that is the way it is intended. The <code>detect_changeover</code> automaton currently
+prevents behavior that is present in the <code>producer</code>, while it is only meant
+to <em>observe</em> or <em>monitor</em> products being provided. The state space of the
+specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/monitoring_problem_state_space.png" alt="monitoring problem state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the first letters of the names of the current
+locations of the automata. Note how the <code>i/a</code> and <code>i/b</code> locations only have
+outgoing transitions for either the <code>provide_a</code> transition or the
+<code>provide_b</code> transition.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-monitoring-with-self-loops">Monitoring with self loops</h5>
+<div class="paragraph">
+<p>A simple solution is to allow the disabled events:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton detect_changeover:
+  disc int count = 0;
+
+  location start:
+    initial;
+    edge producer.provide_a goto a;
+    edge producer.provide_b goto b;
+
+  location a:
+    edge producer.provide_a; // Added self loop.
+    edge producer.provide_b do count := count + 1 goto b;
+
+  location b:
+    edge producer.provide_a do count := count + 1 goto a;
+    edge producer.provide_b; // Added self loop.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The <code>provide_a</code> event has been added to an edge in the <code>a</code> location. The
+edge is a <a href="#lang-tut-basics-shorter-notations-self-loop">self loop</a>,
+meaning the current location of automaton <code>detect_changeover</code> does not change
+as a result of taking the edge. This means that essentially the event is
+ignored by the <code>detect_changeover</code> automaton, as the edge also has no
+updates. The state space of the modified specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/monitoring_fixed_state_space.png" alt="monitoring fixed state space">
+</div>
+</div>
+<div class="paragraph">
+<p>Now, whenever the <code>provide_a</code> event is possible, the <code>provide_b</code> event is
+also possible, and vice versa, just as in the <code>producer</code> automaton. The
+<code>detect_changeover</code> automaton no longer restricts the occurrence of the
+events; it only monitors them.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-monitoring-with-monitor-automata">Monitoring with monitor automata</h5>
+<div class="paragraph">
+<p>An alternative to adding self loops, is to use a <em>monitor</em> automaton. A monitor
+automaton is an automaton that monitors or observes one or more events. The
+events that it monitors, are never blocked (disabled) by that automaton. For
+our producer/changeover example, we can turn the <code>detect_changeover</code>
+automaton into a monitor automaton for the <code>provide_a</code> and <code>provide_b</code>
+events:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton detect_changeover:
+  monitor producer.provide_a, producer.provide_b; // Monitor instead of the self loops.
+
+  disc int count = 0;
+
+  location start:
+    initial;
+    edge producer.provide_a goto a;
+    edge producer.provide_b goto b;
+
+  location a:
+    edge producer.provide_b do count := count + 1 goto b;
+
+  location b:
+    edge producer.provide_a do count := count + 1 goto a;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By default, automata don&#8217;t monitor any events. Using a <code>monitor</code> declaration
+with one or more events, turns the automaton into a monitor automaton for those
+events. For the producer/changeover example, the behavior with the monitor
+automaton is exactly identical to the behavior of the specification with the
+self loops.</p>
+</div>
+<div class="paragraph">
+<p>By omitting the events from the <code>monitor</code> declaration, an automaton monitors
+all events of its alphabet:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">monitor; // Monitor all events in the alphabet of the automaton.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the producer/changeover, which has only the <code>provide_a</code> and <code>provide_b</code>
+events in its alphabet, this would result in the same behavior as for the
+automaton that monitors the two events explicitly.</p>
+</div>
+<div class="paragraph">
+<p>Using a monitor automaton instead of self loops has several advantages. A
+monitor declaration has to be provided only once, while self loops often have
+to be added to several locations. Furthermore, if the automaton is changed, it
+may be necessary to add or remove self loops, while the monitor declaration can
+most often be kept as is.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-asgn-old-vs-new">Old and new values in assignments</h4>
+<div class="paragraph">
+<p>This lesson explains old and new values of variables in assignments, multiple
+assignments, and the order of assignments.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-old-and-new-values">Old and new values</h5>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment;
+
+  disc int count = 0;
+
+  location:
+    initial;
+    edge increment do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>counter</code> automaton represents a counter that starts counting at zero,
+and can be incremented in steps of one.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+In assignments, the part to the left of the <code>:=</code> is called the <em>left hand
+side</em> of the assignment, or the <em>addressable</em>. The addressable is the variable
+that is assigned, and gets the new value. In the example above, variable
+<code>count</code> is assigned a new value.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+The part to the right of the <code>:=</code> is called the <em>right hand side</em> of the
+assignment, or the (new) <em>value</em>. In the example above, the new value is
+computed by taking the <em>current</em> or <em>old</em> value of variable <code>count</code> and
+incrementing it by one.</p>
+</div>
+<div class="paragraph">
+<p>In general, for variables used to compute the new value, always the old value
+of those variables are used. The new values for variables after a transition,
+are always computed from the old values of variables from before that
+transition.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-data-asgn-old-vs-new-multiple">Multiple assignments</h5>
+<div class="paragraph">
+<p>It is allowed to update multiple variables on a single edge, leading to
+multiple variables getting a new value as part of a single transition. For
+instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton swapper:
+  event swap;
+  disc int x = 0, y = 0;
+
+  location:
+    initial;
+    edge swap do x := y, y := x + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>swapper</code> automaton declares two variables, <code>x</code> and <code>y</code>. It keeps
+swapping the values of both variables, each time increasing the value of <code>y</code>
+by one.</p>
+</div>
+<div class="paragraph">
+<p>Initially, both variables have value zero. During the first <code>swap</code>, variable
+<code>x</code> gets the value of variable <code>y</code>. Since the old values of the variables
+are used to compute the new values, variable <code>x</code> remains zero. Variable <code>y</code>
+gets the old value of variable <code>x</code>, which is also zero, incremented by one.
+The result of the first swap is that <code>x</code> remains zero and <code>y</code> becomes one.</p>
+</div>
+<div class="paragraph">
+<p>During the second swap, <code>x</code> gets the value of variable <code>y</code>, which is then
+one. Variable <code>y</code> gets the value of variable <code>x</code>, which was still zero
+before the second swap, incremented by one. Both variables are thus one after
+the second swap.</p>
+</div>
+<div class="paragraph">
+<p>During the third swap, <code>x</code> gets the value of variable <code>y</code> from after the
+second swap, and thus remains one. Variable <code>y</code> becomes two.</p>
+</div>
+<div class="paragraph">
+<p>The state space of this somewhat artificial example is as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/swapper_state_space.png" alt="swapper state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the values of variables <code>x</code> and <code>y</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-assignment-order">Assignment order</h5>
+<div class="paragraph">
+<p>It is important to note that since the new values of the variables are computed
+from the old values of the variables, assignments are completely independent of
+each other. In the example above, variable <code>x</code> is assigned a new value in the
+first assignment, and variable <code>x</code> is also used to compute the new value of
+variable <code>y</code>. However, the old value of variable <code>x</code> is used to compute the
+new value of variable <code>y</code>. Therefore, the assignment to <code>x</code>, which
+indicates how <code>x</code> should be given a new value, has no effect on the new value
+off <code>y</code>, as the old value of <code>x</code> is used for that, regardless of whether
+<code>x</code> is assigned a new value.</p>
+</div>
+<div class="paragraph">
+<p>Since assignments are independent of each other, the order of the assignments
+of the edge does not matter. Consider the following alternative edge:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge swap do y := x + 1, x := y;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The assignments to <code>x</code> and <code>y</code> have been reordered. The behavior of the
+specification does not change as a result of this reordering.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-data-asgn-old-vs-new-multi">Multi-assignments</h5>
+<div class="paragraph">
+<p>CIF supports both multiple assignments as well as multi-assignments. To see
+the difference, consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge ... do x := y, y := x + 1;     // Multiple (two) assignments.
+edge ... do (x, y) := (y, x + 1);   // Single multi-assignment.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first edge has multiple assignments, namely one assignment to variable
+<code>x</code> and one assignment to variable <code>y</code>. The second edge has one assignment,
+that gives new values to variables <code>x</code> and <code>y</code>. Both are identical, in that
+they have the same affect: variable <code>x</code> is given the old value of variable
+<code>y</code> and variable <code>y</code> is given the old value of variable <code>x</code> incremented
+by one. Generally, using multiple assignments is preferred over using
+multi-assignments, as the former is easier to read. However, in certain cases,
+such as for <a href="#lang-tut-values-tuples-unpacking">tuple unpacking</a>, only the
+latter variant can be used.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-event-synchronization-and-assignment-order">Event synchronization and assignment order</h5>
+<div class="paragraph">
+<p>Consider a system with two conveyors. Products enter on the first conveyor,
+and move towards the second conveyor. Once they leave the first conveyor, they
+move onto the second one. Once they exit from the second conveyor, they leave
+the system. The positions of the left sides of the boxes are in range zero to
+seven, as indicated in the following figure:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/conveyor.png" alt="conveyor">
+</div>
+</div>
+<div class="paragraph">
+<p>This system can be modeled using the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event move;
+
+automaton conveyor1:
+  monitor move;
+  event exit1;
+  disc int pos = 0;
+
+  location:
+    initial;
+    edge move  when pos &lt; 4 do pos := pos + 1;
+    edge exit1 when pos = 4 do pos := 0;
+end
+
+automaton conveyor2:
+  monitor move;
+  event exit2;
+  disc int pos = -1;
+
+  location:
+    initial;
+    edge conveyor1.exit1 when pos = -1             do pos := conveyor1.pos;
+    edge move            when pos &gt;= 0 and pos &lt; 7 do pos := pos + 1;
+    edge exit2           when pos = 7              do pos := -1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each conveyor is modeled using an automaton. Both conveyors use a <code>pos</code>
+variable to represent the position of the left side of the box. The first
+conveyor gets a new box as soon as one leaves. The second one has to wait for
+a box from the first, and can thus be without a box. This is represented by
+value <code>-1</code> for the <code>pos</code> variable from automaton <code>conveyor2</code>. The <code>-1</code>
+value is not a actual position, but a special value indicating that no box is
+present on the conveyor.</p>
+</div>
+<div class="paragraph">
+<p>Boxes on the first conveyor can move towards the second conveyor (event
+<code>move</code>), until they reach position 4. They then leave the first conveyor
+(event <code>exit1</code>), and a new box immediately enters the first conveyor
+(variable <code>pos</code> is reset to zero).</p>
+</div>
+<div class="paragraph">
+<p>Boxes enter the second conveyor when they leave the first conveyor (event
+<code>exit1</code> from <code>conveyor1</code>). The position of the box is then transferred from
+the first conveyor to the second. The box keeps moving (event <code>move</code>) on
+the second conveyor until it reaches position 7. At position 7 it leaves
+(event <code>exit2</code>) the second conveyor, and the system.</p>
+</div>
+<div class="paragraph">
+<p>Both automata synchronize over the <code>move</code> event, meaning that the boxes on
+both conveyors move at the same time. Both automata
+<a href="#tut-data-chapter-monitoring">monitor</a> that event to ensure it is never
+blocked if only the other conveyor can actually move.</p>
+</div>
+<div class="paragraph">
+<p>Both automata synchronize over the <code>exit1</code> event. The first conveyor resets
+is own position (variable <code>pos</code>) to zero. The second conveyor sets its own
+position (variable <code>pos</code>) to the position of the first conveyor. Since old
+values of variables are used to compute the new values, the new value of
+variable <code>pos</code> in <code>conveyor2</code> is given the old value of variable <code>pos</code>
+from <code>conveyor1</code>. This is not influenced by the assignment to variable
+<code>pos</code> of <code>conveyor1</code> to zero, as assignments are independent, and the order
+of assignments does not matter, just as for multiple assignments on a single
+edge.</p>
+</div>
+<div class="paragraph">
+<p>The state space of this specification is as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/conveyor_state_space.png" alt="conveyor state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the values of the <code>pos</code> variables of the automata
+for the first and second conveyors.</p>
+</div>
+<div class="paragraph">
+<p>The important part of the state space is the transition from state <code>4/-1</code>,
+where the box of the first conveyor is at the end and the second conveyor has
+no box, to state <code>0/4</code>, where the first conveyor has received a new box at
+position zero, and the second conveyor has taken over the box (and the
+administration of its position) from the first conveyor.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-tau-event">The <code>tau</code> event</h4>
+<div class="paragraph">
+<p>
+
+
+
+Events allow for synchronization, allowing for interaction between automata
+based on events. If however an automaton has an edge that performs some
+internal processing, the event may not always be relevant. Consider for
+instance the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine1:
+  event process, provide;
+  disc int id = 0;
+
+  location processing:
+    initial;
+    edge process do id := id + 1 goto providing;
+
+  location providing:
+    edge provide goto processing;
+end
+
+automaton machine2:
+  location:
+    initial;
+    edge machine1.provide;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The specification models two machines. Products enter the first machine,
+which processes them (event <code>process</code>) and assigns them an <code>id</code>. The
+machine them provides (event <code>provide</code>) them to the second machine. The
+second machine currently just accepts the products provided by the first
+machine, but would in reality likely perform its own processing as well.
+The state space of the specification is as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/tau_event_state_space1.png" alt="tau event state space1">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the names of the current locations of automaton
+<code>machine1</code>. Since automaton <code>machine2</code> has only a single location, its
+current location does not change, and it is therefore not included in the state
+names.</p>
+</div>
+<div class="paragraph">
+<p>The <code>provide</code> event synchronizes over both automata, while the <code>process</code>
+event is local to the first machine. The <code>process</code> event is not essential,
+and could be left out:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine1:
+  event provide;                         // No more 'process' event.
+  disc int id = 0;
+
+  location processing:
+    initial;
+    edge do id := id + 1 goto providing; // No more event on the edge.
+
+  location providing:
+    edge provide goto processing;
+end
+
+automaton machine2:
+  location:
+    initial;
+    edge machine1.provide;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By omitting the event from an edge, the <code>tau</code> is used for that edge. The
+<code>tau</code> event is an event that is implicitly always present without declaring
+it. The state space of this modified specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/tau_event_state_space2.png" alt="tau event state space2">
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The <code>tau</code> event does not synchronize. You can think of this as each automaton
+having its own local <code>tau</code> event, and since then they are different events,
+they do not synchronize. If multiple automata can perform a transition for an
+edge with the <code>tau</code> event, this leads to potential transitions for each of
+those edges. Since they are all labeled with the <code>tau</code> event, it is
+impossible to distinguish them solely based on their label. This is a form of
+<a href="#tut-basics-chapter-non-determinism">non-determinism</a>.</p>
+</div>
+<div class="paragraph">
+<p>Using the <code>tau</code> events saves having to declare a local event, and also saves
+having to put that event on the edge. It thus leads to smaller specifications.
+However, as explained above, if <code>tau</code> is used on multiple edges of multiple
+automata, the different <code>tau</code> transitions can no longer be distinguished from
+each other in the state space. The use of the <code>tau</code> event is thus always a
+trade-off.</p>
+</div>
+<div class="paragraph">
+<p>
+It is also possible to explicitly use the <code>tau</code> event:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge tau goto ...;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>tau</code> event can thus be used instead of 'regular' events, and may even
+be combined with 'regular' events on the same edge:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge provide, tau goto ...;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Omitting the events from an edge defaults to a single <code>tau</code> event, as shown
+in one of the examples above.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-discvar-init">Initial values of discrete variables</h4>
+<div class="paragraph">
+<p>
+
+
+Discrete variables can be given an initial value with their declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x = 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The initial value may be omitted, leading to the default value of its data type
+being used:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x;
+disc bool y;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The default value of <a href="#tut-values-chapter-integers">integer typed</a> variables
+is <code>0</code>. The default value of <a href="#tut-values-chapter-booleans">boolean typed</a>
+variables is <code>false</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-data-discvar-init-multiple" class="paragraph">
+<p>It is possible to indicate that a variable has more than one potential initial
+value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x in {1, 2, 4};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This declares a variable <code>x</code> that has three potential initial values.
+Variables can only have one value at a time, so an initial value has to be
+chosen from the <a href="#tut-values-chapter-sets">set</a> of potential initial values.
+In other words, initially the value of variable <code>x</code> is either <code>1</code>, <code>2</code>,
+or <code>4</code>. For information on how to store multiple values in a single variable,
+see the lessons on types and values, in particular those on
+<a href="#tut-values-chapter-tuples">tuples</a>, <a href="#tut-values-chapter-lists">lists</a>,
+and <a href="#tut-values-chapter-sets">sets</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-data-discvar-init-any" class="paragraph">
+<p>It is also possible to indicate that a variable can have any arbitrary initial
+value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x in any;
+disc bool y in any;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>x</code> can initially have any value. The only constraint is that the
+initial value must be an integer value, as it must conform to the integer type
+(<code>int</code>) of the variable. Examples of initial values include <code>-1027</code>,
+<code>0</code>, <code>1</code>, and <code>12345</code>. Variable <code>y</code> can initially have any value, as
+long as that value is a boolean value, due to the variable having a boolean
+type (<code>bool</code>). There are only two boolean values, <code>true</code> and <code>false</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+Discrete variables with multiple potential initial values and arbitrary initial
+values essentially <em>parametrize</em> the specification. The exact initial value is
+to be chosen or <em>configured</em> later on. This allows a single specification to be
+used for various different combinations of initial values.</p>
+</div>
+<div class="paragraph">
+<p>So far all examples used literal values to initialize the variables. However,
+it is also allowed to use expressions to compute initial values, for instance
+based on the initial values of other variables:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x = 1;     // Initial value: 1
+disc int y = x * 2; // Initial value: 2
+disc int z = x + y; // Initial value: 3</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+Variable <code>x</code> is explicitly initialized with value <code>1</code>. Variable <code>y</code> is
+initialized to the initial value of <code>x</code>, multiplied by two. Variable <code>z</code>
+is initialized to the sum of the initial values of <code>x</code> and <code>y</code>. Using this
+kind of initialization is useful if the initial values must be kept consistent.
+Changing the initial value of <code>x</code> automatically also changes the initial
+values of <code>y</code> and <code>z</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+The order of the declaration of the variables does not matter. We could just
+as easily declare them as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int y = x * 2; // Uses variable x, which is declared later.
+disc int x = 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+Variable <code>y</code> is still initialized using the initial value of variable <code>x</code>,
+which is now declared after variable <code>y</code>. It is not allowed to construct
+loops, where the initial values of variables depend on each other:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x = y; // Invalid initial value due to cyclic dependency.
+disc int y = z;
+disc int z = x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>x</code> uses the value of variable <code>y</code>, which uses the value of
+variable <code>z</code>, which in turn uses the value of variable <code>x</code> again. This is
+not allowed in CIF, as it creates a cyclic dependency. However, since no
+restrictions are introduced on the initial values of variables <code>x</code>, <code>y</code>,
+and <code>z</code>, except that they must be equal to each other, we can declare them
+as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x in any; // Explicit 'any' breaks the cyclic dependency.
+disc int y = z;
+disc int z = x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, variable <code>x</code> is explicitly initialized to an arbitrary value. The other
+variables are initialized to be equal to whatever arbitrary value is chosen as
+initial value for variable <code>x</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-init-preds">Initialization predicates</h4>
+<div class="paragraph">
+<p>
+<em>Initialization predicates</em> can be used to specify the allowed initial
+locations of automata, as well as to restrict the allowed initial values of
+variables.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-data-init-preds-aut">Initial locations of automata</h5>
+<div class="paragraph">
+<p>Initialization predicates can be used to specify the allowed initial locations
+of automata:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  location loc1:
+    initial;
+
+  location loc2:
+    initial true;
+
+  location loc3;
+
+  location loc4:
+    initial false;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton <code>a</code> has four locations. Location <code>loc1</code> has the <code>initial</code>
+keyword, and is thus allowed to be the initial location. Location <code>loc2</code>
+also uses the <code>initial</code> keyword, but additionally specifies a predicate that
+indicates under which conditions the location may be the initial location.
+Since it is <code>true</code>, which always holds, it does not impose any additional
+restrictions, and can thus always be the initial location. In fact, this is
+identical to location <code>loc1</code>, which did not specify a predicate, in which
+case it default to <code>true</code> as well.</p>
+</div>
+<div class="paragraph">
+<p>Location <code>loc3</code> does not specify anything about initialization, and thus
+can never be the initial location. Location <code>loc4</code> can only be the initial
+location if <code>false</code> holds. Since <code>false</code> never holds, location <code>loc4</code>
+can never be the initial location. In fact, this is identical to location
+<code>loc3</code>, which did not specify any initialization at all, in which case it
+default to <code>false</code> as well.</p>
+</div>
+<div class="paragraph">
+<p>Locations <code>loc1</code> and <code>loc2</code> are the potential initial locations,
+while locations <code>loc3</code> and <code>loc4</code> can not be chosen as initial locations of
+automaton <code>a</code>. Since an automaton can only have one current location, an
+initial location has to be chosen from the potential initial locations. In
+other words, the initial location of automaton <code>a</code> is either location
+<code>loc1</code> or location <code>loc2</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-consistency-between-initial-locations-and-initial-values">Consistency between initial locations and initial values</h5>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton odd_even:
+  event inc, dec;
+  disc int n = 5;
+
+  location odd:
+    initial;
+    edge inc do n := n + 1 goto even;
+    edge dec do n := n - 1 goto even;
+
+  location even:
+    edge inc do n := n + 1 goto odd;
+    edge dec do n := n - 1 goto odd;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton <code>odd_even</code> keeps track of a value (<code>n</code>) that can constantly be
+incremented (event <code>inc</code>) and decremented (event <code>dec</code>) by one. It has two
+locations, that keep track of the <code>odd</code>/<code>even</code> status of value <code>n</code>.
+Currently, the initial value is <code>5</code>, which is odd. Therefore, the <code>initial</code>
+keyword is specified in the <code>odd</code> location. However, if we change the initial
+value of variable <code>n</code> to <code>6</code>, we have to change the initial location
+as well, to ensure consistent initialization. To automatically keep the initial
+location consistent with the initial value of variable <code>n</code>, we can change
+the specification to the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton odd_even:
+  event inc, dec;
+  disc int n = 5;
+
+  location odd:
+    initial n mod 2 = 1; // Initial location if 'n' is odd.
+    edge inc do n := n + 1 goto even;
+    edge dec do n := n - 1 goto even;
+
+  location even:
+    initial n mod 2 = 0; // Initial location if 'n' is even.
+    edge inc do n := n + 1 goto odd;
+    edge dec do n := n - 1 goto odd;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this specification, location <code>odd</code> can only be the initial location if
+the value is odd (the value
+<a href="http://en.wikipedia.org/wiki/Modular_arithmetic">modulo</a>
+two is congruent to
+one), and location <code>even</code> can only be the initial location if the value is
+even. Changing the initial value of variable <code>n</code> then also changes the
+potential initial locations. Since the value is always odd or even, and can&#8217;t
+be both odd and even, automaton <code>odd_even</code> always has exactly one potential
+initial location.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-restricting-initialization">Restricting initialization</h5>
+<div class="paragraph">
+<p>Initialization predicates can also be used to restrict the initial values of
+variables. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  disc int x in any;
+
+  initial x mod 2 = 1;
+
+  location ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this partial automaton, variable <code>x</code> can be initialized to any integer
+value, as indicated by its <code>int</code> type and the <code>any</code> keyword. However, the
+initialization predicate states that initially, the value of <code>x</code> module two
+must be congruent to one. That is, the value of variable <code>x</code> must initially
+be odd.</p>
+</div>
+<div class="paragraph">
+<p>It is allowed to specify initialization predicates inside automata, but it is
+also allowed to place them outside of them:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  disc int x in any;
+
+  location ...
+end
+
+automaton b:
+  disc int x in any;
+
+  location ...
+end
+
+initial a.x = 2 * b.x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, two automata each declare a variable that can have arbitrary initial
+values. The initialization predicate specifies that the initial value of
+variable <code>x</code> from automaton <code>b</code> must be twice the initial value of
+variable <code>x</code> from automaton <code>a</code>.</p>
+</div>
+<div class="paragraph">
+<p>It is generally recommended to place an initialization predicate inside an
+automaton if the condition only applies to declarations from that automaton,
+and to place it outside of the automata if the condition applies to
+declarations of multiple automata.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-locs-as-var">Using locations as variables</h4>
+<div class="paragraph">
+<p>
+Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine1:
+  event start1, done1, reset1;
+  disc bool claimed = false;
+
+  location idle:
+    initial;
+    edge start1 when not machine2.claimed do claimed := true goto processing;
+
+  location processing:
+    edge done1 do claimed := false goto cool_down;
+
+  location cool_down:
+    edge reset1 goto idle;
+end
+
+automaton machine2:
+  event start2, done2, reset2;
+  disc bool claimed = false;
+
+  location idle:
+    initial;
+    edge start1 when not machine1.claimed do claimed := true goto processing;
+
+  location processing:
+    edge done1 do claimed := false goto cool_down;
+
+  location cool_down:
+    edge reset1 goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models two machines, which produce products. The machines
+share a common resource, which may only be used by at most one of them, at any
+time (see
+<a href="http://en.wikipedia.org/wiki/Mutual_exclusion">mutual exclusion</a>).
+Initially, the machines are <code>idle</code>. Then, they warm themselves up. Once they
+start processing, they set their boolean variable <code>claimed</code> to <code>true</code> to
+indicate that they claimed the shared resource. After processing, the machines
+release the resource, by setting <code>claimed</code> to <code>false</code>. They finish their
+processing cycle by cooling down, before starting the cycle for the next
+product. To ensure that a machine can not claim the resource if the other
+machine has already claimed it, the edges going to the <code>processing</code> locations
+have a guard that states that it is only allowed to claim the resource and
+start processing, if the other machine has not already claimed the resource.
+The state space of this specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/data/mutex_state_space.png" alt="mutex state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the first letters of the names of the current
+locations of the automata.</p>
+</div>
+<div class="paragraph">
+<p>The specification can alternatively be modeled as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine1:
+  event start1, done1, reset1;
+
+  location idle:
+    initial;
+    edge start1 when not machine2.processing goto processing;
+
+  location processing:
+    edge done1 cool_down;
+
+  location cool_down:
+    edge reset1 goto idle;
+end
+
+automaton machine2:
+  event start2, done2, reset2;
+
+  location idle:
+    initial;
+    edge start1 when not machine1.processing goto processing;
+
+  location processing:
+    edge done1 cool_down;
+
+  location cool_down:
+    edge reset1 goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>claimed</code> variables and corresponding updates have been removed, and the
+guards no longer use those variables. Instead, the edge for the <code>start1</code>
+event now refers to the <code>processing</code> location of automaton <code>machine2</code>. The
+guard states that the first machine can perform the <code>start1</code> event, only if
+the second machine is not currently in its <code>processing</code> location. In other
+words, the guard states that the first machine can start processing as long as
+the second machine is not currently busy processing (and thus using the shared
+resource).</p>
+</div>
+<div class="paragraph">
+<p>The <code>processing</code> location of automaton <code>machine2</code> is used as a boolean
+variable. Using the location as a variable saves having to declare another
+variable (<code>claimed</code>) that essentially holds the same information, and needs
+to be explicitly updated (on two separate edges) to the correct value.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-stat-invariants">State (exclusion) invariants</h4>
+<div class="paragraph">
+<p>
+
+
+The lesson on <a href="#tut-data-chapter-discrete-variables">discrete variables</a> used
+the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment, decrement;
+
+  disc int count = 3;
+
+  location:
+    initial;
+    edge decrement when count &gt; 0 do count := count - 1;
+    edge increment when count &lt; 5 do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The counter can repeatedly be incremented and decremented by one, as long as
+the count remains at least one and at most five. To keep the count in the
+allowed range of values, guards were used to limit the occurrence of the
+<code>increment</code> and <code>decrement</code> events.</p>
+</div>
+<div class="paragraph">
+<p>Instead of using guards, it is also possible to use state (exclusion)
+invariants, also called state invariants, or just invariants:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton counter:
+  event increment, decrement;
+
+  disc int count = 3;
+
+  invariant count &gt;= 0;                   // Added invariants
+  invariant count &lt;= 5;
+
+  location:
+    initial;
+    edge decrement do count := count - 1; // No more guards
+    edge increment do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The guards on the edges have been replaced by the two invariants. The first
+invariant specifies that the value of variable <code>count</code> must always be at
+least zero. The second invariant specifies that the value must also be at most
+five.</p>
+</div>
+<div class="paragraph">
+<p>Invariants specify conditions that must always hold. Invariants must hold in
+the initial state, and all states reached via transitions. If a transition
+results in a state where an invariant doesn&#8217;t hold, the transition is not
+allowed and can&#8217;t be taken.</p>
+</div>
+<div class="paragraph">
+<p>For the counter example, initially the <code>count</code> is <code>3</code>. The edge for the
+<code>increment</code> event can be taken, leading to a state where the <code>count</code> is
+<code>4</code>. Taking another transition for the <code>increment</code> event leads to a state
+where the <code>count</code> is <code>5</code>. If we then were to take another transition for
+the <code>increment</code> event, the <code>count</code> would then become <code>6</code>. However, that
+violates the invariant. Therefore, in the state where the <code>count</code> is <code>5</code>,
+no transition for the <code>increment</code> event is possible. In other words, the
+invariant disables the transition for the <code>increment</code> event for that state.</p>
+</div>
+<div class="paragraph">
+<p>The two invariants can be specified in various ways:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Multiple invariants, each with a single predicate.
+invariant count &gt;= 0;
+invariant count &lt;= 5;
+
+// Single invariant, with multiple predicates.
+invariant count &gt;= 0, count &lt;= 5;
+
+// Single invariant, with single predicate.
+invariant count &gt;= 0 and count &lt;= 5;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each of these variants leads to the exact same behavior, and which variant to
+use depends mostly on the modeler&#8217;s own preference.</p>
+</div>
+<div class="paragraph">
+<p>The benefit of guards over invariants is that they more explicitly state the
+condition under which an edge can lead to a transition. If a guard doesn&#8217;t
+hold, the edge can&#8217;t be part of a transition. It is thus immediately clear when
+the edge can lead to a transition. For invariants, the update has to be
+calculated first, after which the invariants can be evaluated for the state
+resulting from the transition. If one of the invariants doesn&#8217;t hold, the
+transition is not allowed. In the case of the invariants, it is not as
+immediately clear from the edge alone, when that specific edge can or can not
+lead to a transition.</p>
+</div>
+<div class="paragraph">
+<p>The benefit of invariants over guards is that they apply to all edges. If
+several edges in an automaton have updates to the same variable, then the
+invariants need to be specified only once, and apply to all transitions, for
+all edges. Using guards, all the edges that modify the variable would need
+their own guards, and if the updates are different, the different edges usually
+require different guards. Furthermore, if new edges with updates to the same
+variables are added, the invariant is already present, but guards have to be
+added, which can easily be forgotten. In those cases, invariants can thus help
+keep the specification consistent.</p>
+</div>
+<div class="paragraph">
+<p>Another benefit of invariants is that they explicitly state the conditions that
+must hold in relation to the variables, while guards specify the condition
+under which the update is allowed. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Using invariants.
+automaton a:
+  disc int x;
+
+  invariant 0 &lt;= x, x &lt;= 100;
+
+  location:
+    initial;
+    edge do x := 2 * x + 3;
+end
+
+// Using guards.
+automaton a:
+  disc int x;
+
+  location:
+    initial;
+    edge when x &lt;= 48 do x := 2 * x + 3;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The goal is to keep the value of in the range [0..100]. The invariant is simple
+and direct. The guard however, has to state the condition under which the
+update does not violate the goal. That is, the upper bound has to be decreased
+by three, and the result has to be divided by two, to get the highest value
+(48) for which the update is still within the valid range of values. That is,
+for value 48 the update results in value 99 (2 * 48 + 3 = 99), and for value
+49 the update results in value 101 (2 * 48 + 3 = 99). The more complex the
+update, the harder it is to figure out the guard to use to keep satisfy the
+goal.</p>
+</div>
+<div class="paragraph">
+<p>You can of course also use <code>2 * x + 3 &lt;= 100</code> as guard, instead of
+<code>x &lt;= 48</code>. However, this duplicates part of the update in the guard.</p>
+</div>
+<div class="paragraph">
+<p>So far, all invariants have been specified in automata. They may however also
+be specified outside of the automata, similar to
+<a href="#tut-data-chapter-init-preds">initialization predicates</a>. It is generally
+recommended to place an invariant inside an automaton if the condition only
+applies to declarations from that automaton, and to place it outside of the
+automata if the condition applies to declarations of multiple automata.</p>
+</div>
+<div class="paragraph">
+<p>
+Furthermore, invariants can be placed in a location. Such an invariant only has
+to hold while the location in which it is specified is the current location of
+its automaton.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-data-chapter-stat-evt-excl-invariants">State/event exclusion invariants</h4>
+<div class="paragraph">
+<p>
+
+
+
+Consider an elevator, consisting of three parts: a motor to make the elevator
+move up and down, a door that can be opened and closed to let passengers enter
+and exit, and an emergency button that can be used to stop the elevator in
+case of an emergency. The following CIF specification models the three parts:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton motor:
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on goto on;
+
+  location on:
+    edge turn_off goto off;
+end
+
+automaton door:
+  event open, close;
+
+  location closed:
+    initial;
+    edge open goto opened;
+
+  location opened:
+    edge close goto closed;
+end
+
+automaton emergency_button:
+  event push, release;
+
+  location released:
+    initial;
+    edge push goto pushed;
+
+  location pushed:
+    edge release goto released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each part is modeled by an automaton. Since the automata don&#8217;t share any
+events, they operate independently. What is missing, is a controller that
+links the different automata, and controls them in a safe manner. Such a
+controller restricts the behavior of the individual automata, allowing only
+the combined behavior that is deemed desired. There are several ways to
+restrict events, including introducing synchronization between the different
+automata, and adding guards. The downside of these approaches it that they
+require modification of the automata. What if we wanted to specify the
+controller separately from the behavior of the physical system? We could
+introduce an additional automaton, that synchronizes with the existing
+automata. For instance, we could add the following to the CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton controller:
+  location:
+    initial;
+    edge motor.turn_on when door.closed and emergency_button.released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This controller introduces restrictions for the <code>turn_on</code> event of the
+<code>motor</code>. In this particular case, the controller ensures that the motor may
+only be turned on when both the door is closed and the emergency button is
+released. By restricting the event, the controller prohibits the event from
+taking place in certain states, ensuring that only the desired behavior
+remains.</p>
+</div>
+<div class="paragraph">
+<p>It is nice that we can separate the description of the physical behavior of the
+elevator from the controller that controls it. This separation of concerns may
+make it easier to reason about the behavior, it may make it easier to adapt
+the controller when the physical system doesn&#8217;t change, and it may make it
+easier to reuse the model of the physical system for other purposes.</p>
+</div>
+<div class="paragraph">
+<p>However, modeling an automaton with a single location that must then also be
+<code>initial</code> requires quite some syntax. State/event exclusion invariants can
+serve the same purpose, but are often easier to use, shorter to write, and
+more intuitive to read. Instead of the <code>controller</code> automaton, we can also
+use the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">invariant motor.turn_on needs door.closed and emergency_button.released;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each state/event exclusion invariant restricts an event, preventing it from
+happening in certain states. That is, the event is excluded from taking place
+in certain states. In this case, the <code>turn_on</code> event of the <code>motor</code>
+automaton needs the <code>door</code> to be in its <code>closed</code> location and the
+<code>emergency_button</code> to be in its <code>released</code> location, for the event to be
+allowed/enabled. For the states in which that condition doesn&#8217;t hold, the event
+is disabled.</p>
+</div>
+<div class="paragraph">
+<p>The invariant consists of two conditions. It can also be written as two
+separate state/event exclusion invariants, one for each condition:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Single state/event exclusion invariant.
+invariant motor.turn_on needs door.closed and emergency_button.released;
+
+// Multiple state/event exclusion invariants.
+invariant motor.turn_on needs door.closed;
+invariant motor.turn_on needs emergency_button.released;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The second and third invariants lead to the same behavior as the first combined
+invariant. The second invariant ensures that the event can only take place when
+the door is closed, while the third invariant ensures that the event can only
+take place when the emergency button is released. The second and third
+invariants each indicate a necessary condition that must hold for the event to
+be allowed/enabled. Together, they require that both conditions hold, for the
+event to be allowed/enabled. If one of the conditions doesn&#8217;t hold, the event
+will be disabled.</p>
+</div>
+<div class="paragraph">
+<p>The <code>door</code> is either <code>opened</code> or <code>closed</code>. So far, we&#8217;ve required that
+the door is closed to allow the motor to be turned on. We can also specify it
+the other way around: to disallow the motor to be turned on, while the door is
+opened:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// State/event exclusion invariant to specify when event is allowed/enabled.
+invariant motor.turn_on needs door.closed;
+
+// State/event exclusion invariant to specify when event is disallowed/disabled.
+invariant door.opened disables motor.turn_on;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Both invariants have the exact same effect. The first invariant only allows the
+motor to be turned on while the door is closed, which means that it disallows
+the motor to be turned on in all other situations, namely when the door is
+opened. And that is exactly what is specified by the second invariant: when the
+door is opened, turning the motor on is disallowed/disabled. In general,
+state/event exclusion invariants can always be specified as a positive form
+(allowed/enabled) and a negative form (disallowed/disabled). It is up to the
+modeler to choose, based on considerations such as personal preference and
+readability. Consider the following four alternative forms:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Single state/event exclusion invariant for enabling the event.
+invariant motor.turn_on needs door.closed and emergency_button.released;</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Multiple state/event exclusion invariants for enabling the event.
+invariant motor.turn_on needs door.closed;
+invariant motor.turn_on needs emergency_button.released;</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Single state/event exclusion invariant for disabling the event.
+invariant door.opened or emergency_button.pushed disables motor.turn_on;</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Multiple state/event exclusion invariants for disabling the event.
+invariant door.opened             disables motor.turn_on;
+invariant emergency_button.pushed disables motor.turn_on;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each of the four forms has the exact same effect, but is written in a different
+way.</p>
+</div>
+<div class="paragraph">
+<p>We already saw earlier that for state/event exclusion invariants that
+introduce necessary conditions for an event to be enabled (the <code>needs</code>
+variant), the conditions can be combined using an <code>and</code> operator to form a
+combined condition, for a single invariant.</p>
+</div>
+<div class="paragraph">
+<p>Here, we also see how in a similar way, state/event exclusion invariants that
+introduce sufficient conditions for an event to be disabled (the <code>disabled</code>
+variant) can be combined. Each of them individually has a condition, that if
+satisfied disables the event, regardless of the other invariants. So, if one of
+them disables the event, the event is disabled. To combine such invariants into
+a single invariant, the conditions need to be combined using an <code>or</code>
+operator, as shown above.</p>
+</div>
+<div class="paragraph">
+<p>It may occur that multiple events need to be disabled for the same conditions.
+Instead of writing multiple invariants with the same conditions, one for each
+event, they can also be combined:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Two separate invariants with same condition, for different events.
+invariant motor.turn_on needs emergency_button.released;
+invariant door.close    needs emergency_button.released;
+
+// Combined invariant, for multiple events.
+invariant {motor.turn_on, door.close} needs emergency_button.released;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first two invariants have the same condition, but restrict different
+events. The third invariant has the same condition, but restricts both events.
+In general, for all state/event invariants, multiple events may be given, if
+they share the same condition. The events must then be separated by spaces and
+be enclosed in curly brackets (<code>{...}</code>).</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-types-and-values">Types and values</h3>
+<div class="sect3">
+<h4 id="tut-values-chapter-types-values-exprs">Types, values, and expressions</h4>
+<div class="paragraph">
+<p>This lesson explains the difference between types, values, and expressions.
+These concepts have already been used in previous lessons, but this lesson
+names them explicitly, and also explains the relations between them.
+Furthermore, this lesson serves as an introduction for the coming lessons,
+which rely heavily on these concepts. Consider the following declarations of
+<a href="#tut-data-chapter-discrete-variables">discrete variables</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int x = 1;
+disc int y = 2 * x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The first declaration declares a discrete variable named <code>x</code>, and the second
+declaration declares a discrete variable named <code>y</code>. Both variables have an
+<code>int</code> <em>data type</em>. A data type is usually just called a <em>type</em>, if there is
+no confusion with other kinds of types. The type of a variable indicates the
+potential or allowed values of the variable. Variable <code>x</code> is initialized to
+<em>value</em> <code>1</code>. Variable <code>y</code> is initialized to twice the value of <code>x</code>,
+meaning it is initialized to value <code>2</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+Both <code>1</code> and <code>2 * x</code> are <em>expressions</em>. Expressions are combinations of
+among others literal values (e.g. <code>1</code>), variables (e.g. <code>x</code>), and
+operations (e.g. <code>*</code>) on them. Expressions can be <em>computed</em>, resulting in a
+value. This is called <em>evaluation</em> of the expression.</p>
+</div>
+<div class="paragraph">
+<p>Expression <code>2 * x</code> can be evaluated. Evaluating the expression results in
+value <code>2</code> if the value of <code>x</code> is <code>1</code>, and in value <code>4</code> if the value of
+<code>x</code> is <code>2</code>. Expressions can thus be evaluated to different values,
+depending on the values of the variables that occur in them.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+</p>
+</div>
+<div id="lang-tut-values-types-values-exprs-literal" class="paragraph">
+<p>Expression <code>1</code> consists of only a single value, called a <em>literal</em> value
+expression. Evaluation always results in that single value. Expression
+<code>1 + 3</code> evaluates to value <code>4</code>. Even though it does not consist of only
+just a literal, the value is the same for each evaluation. The expression
+represents a <em>constant</em> value.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-overview">Values overview</h4>
+<div class="paragraph">
+<p>The values of CIF (and their types) can be categorized into different
+categories: elementary values, container values, and miscellaneous values.
+Elementary values represent single values, such as a single number. Container
+values represent multiple values. The different container values combine or
+store the values in different ways. The elementary and container values are
+described in the remainder of this part of the tutorial. The miscellaneous
+values are special, and are explained later in the tutorial. The remainder of
+this lesson gives an overview of the values available per category, along with
+short descriptions of each of the different kinds of values.</p>
+</div>
+<div class="paragraph">
+<p><strong>Elementary values</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-values-chapter-booleans">Booleans</a></dt>
+<dd>
+<p>Represents truth values of for instance guards and other conditions. The
+only two possible values are <code>true</code> and <code>false</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-integers">Integers</a></dt>
+<dd>
+<p>Represent integer numbers, such as <code>-123</code> and <code>5</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-enumerations">Enumerations</a></dt>
+<dd>
+<p>Represent enumerated values, which are collections of names each
+representing a different value. For instance, a enumeration named
+<code>color</code> could have values <code>red</code>, <code>green</code>, and <code>blue</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-reals">Reals</a></dt>
+<dd>
+<p>Represent real numbers, such as <code>1.56</code> and <code>-2.7e6</code> (scientific
+notation for 2.7 million).</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-strings">Strings</a></dt>
+<dd>
+<p>Represent textual values, such as <code>"hello world"</code> and <code>"some text"</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><strong>Container values</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-values-chapter-tuples">Tuples</a></dt>
+<dd>
+<p>Tuples have two or more ordered values, each of which can have a different
+type. For instance: <code>(1, true, 5.0)</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-lists">Lists</a></dt>
+<dd>
+<p>Lists have zero or more ordered values, each of which has the same type,
+and possibly with duplicates. For instance: <code>[1, 5, 2, 1]</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-sets">Sets</a></dt>
+<dd>
+<p>Sets have zero or more unordered values, each of which has the same type,
+and without any duplicates. For instance: <code>{1, 5, 2}</code>.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-values-chapter-dictionaries">Dictionaries</a></dt>
+<dd>
+<p>Dictionaries have keys and associated values. The keys are unique and each
+map to a value. For instance: <code>{1: true, 2: false, 3: false}</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><strong>Miscellaneous values</strong></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="#tut-functions-chapter-functions-as-values">Functions</a></dt>
+<dd>
+<p>Functions take values and use them to compute other values, possibly using
+complex and lengthy calculations.</p>
+</dd>
+<dt class="hdlist1"><a href="#tut-stochastics-chapter-intro">Distributions</a></dt>
+<dd>
+<p>Stochastic distributions allow for sampling, making it possible to produce
+random values.</p>
+</dd>
+</dl>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-integers">Integers</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+Integers are whole numbers, numbers without a fractional part. Examples include
+<code>-123</code> and <code>5</code>. The default value of integers (<code>int</code> type) is <code>0</code>.
+Several standard arithmetic operators and functions are available to work with
+integers, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">+9          // 9
+--9         // 9
+
+9 + 4       // 13
+9 - 4       // 5
+9 * 4       // 36
+9 / 4       // 2.25 (result is a real number, not an integer number)
+
+9 div 4     // 2    (9 / 4 = 2.25, so 4 fits at most two whole times in 9)
+9 mod 4     // 1    (the remainder of 9 div 4)
+
+pow(2, 4)   // 16   (2 to the power of 4, or 2 * 2 * 2 * 2)
+abs(-9)     // 9    (absolute value)
+min(9, 4)   // 4    (minimum value)
+max(9, 4)   // 9    (maximum value)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Integer values can be compared to other integer values:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">x &lt; y       // less than
+x &lt;= y      // less than or equal to
+x = y       // equal to
+x != y      // not equal to
+x &gt;= y      // larger than or equal to
+x &gt; y       // larger than</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-integer-ranges">Integer ranges</h4>
+<div class="paragraph">
+<p>
+
+CIF can only represent <a href="#tut-values-chapter-integers">integer numbers</a>
+(type <code>int</code>) in the range -2,147,483,648 (= -2<sup>31</sup>) to
+2,147,483,647 (= 2<sup>31</sup> - 1). Using values outside that range
+results in the CIF model being invalid, and leads to runtime errors:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">ERROR: Integer overflow: 9999999 * 9999999.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is possible in CIF to explicitly specify that only a sub range of the
+integer values are allowed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc int[3..7] x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+This variable <code>x</code> can only have integer values that are at least <code>3</code> and
+at most <code>7</code>. Assigning any other value to <code>x</code> is not allowed. The default
+value is not <code>0</code> but <code>3</code>, as that is the value closest to <code>0</code> that is in
+the allowed range of values.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-reals">Reals</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+Reals or real numbers are numbers with a fractional part. Examples include
+<code>1.56</code> and <code>-2.7e6</code> (scientific notation for 2.7 million). Real numbers
+must either have a fraction or use the scientific notation, to distinguish them
+from integer numbers. The default value of reals (<code>real</code> type) is <code>0.0</code>.
+Several standard arithmetic operators and functions are available to work with
+reals, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">+1.23           // 1.23
+--1.2           // 1.2
+
+1.5 + 0.5       // 2.0
+1.5 - 0.5       // 1.0
+1.5 * 0.5       // 0.75
+1.5 / 0.5       // 3.0
+
+pow(3.5, 2.0)   // 7.0      (3.5 to to the power of 2, or 3.5 * 3.5)
+abs(-1.5)       // 1.5      (absolute value)
+min(1.5, 0.5)   // 0.5      (minimum value)
+max(1.5, 0.5)   // 1.5      (maximum value)
+
+sqrt(16.0)      // 4.0      (square root)
+cbrt(16.0)      // 2.0      (cube root)
+
+sin(1.0)        // 0.841... (sine)
+cos(1.0)        // 0.540... (cosine)
+tan(1.0)        // 1.557... (tangent)
+
+log(100.0)      // 2.0      (logarithm to base 10)
+ln(100.0)       // 4.605... (natural logarithm)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Real values can be compared to other real values, as well as to integer values:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">x &lt; y       // less than
+x &lt;= y      // less than or equal to
+x = y       // equal to
+x != y      // not equal to
+x &gt;= y      // larger than or equal to
+x &gt; y       // larger than</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Integer numbers can often be written where real numbers are expected. Real
+values and integer values can also often be combined using arithmetic operators
+and functions. Furthermore, it is possible to convert between them, e.g as
+follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">sqrt(16)    // 4.0 (16 interpreted as 16.0)
+1 + 0.5     // 1.5 (addition of an integer number and a real number)
+max(0.5, 1) // 1.0 (maximum of an integer number and a real number)
+
+&lt;real&gt;1     // 1.0 (cast from integer to real, explicit conversion)
+round(1.6)  // 2   (round real to closest integer, half up)
+ceil(0.7)   // 1   (round real up to integer)
+floor(0.7)  // 0   (round real down to integer)</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-booleans">Booleans</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+Booleans represents truth values of for instance guards and other conditions
+and properties. The only two possible values are <code>true</code> (condition or
+property holds) and <code>false</code> (condition or property does not hold). The
+default value of booleans (<code>bool</code> type) is <code>false</code>. Several standard
+<a href="http://en.wikipedia.org/wiki/Logical_operator">logical operators</a>
+are available to work with booleans, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">not x       // inverse
+
+x and y     // conjunction (both x and y must hold)
+x or y      // disjunction (either x, y, or both must hold)
+x =&gt; y      // implication (if x holds, y must hold)
+
+x = y       // equal to
+x != y      // not equal to</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The condition <code>x &lt; 3</code> evaluates to <code>true</code> if <code>x</code> is less than <code>3</code> and
+to <code>false</code> if <code>x</code> is <code>3</code> or larger than <code>3</code>. The result is thus a
+boolean value.</p>
+</div>
+<div class="paragraph">
+<p>Conditions can be combined. <code>x &gt;= 3 and x &lt;= 9</code> means that the value of <code>x</code>
+must be both at least <code>3</code> and at most <code>9</code>. <code>x &gt;= 3 or x &lt;= 9</code> means that
+the value of <code>x</code> must be at least <code>3</code>, at most <code>9</code>, or both. Since the
+condition is always satisfied (it always evaluates to <code>true</code>), condition
+<code>true</code> can be used instead of <code>x &gt;= 3 or x &lt;= 9</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-strings">Strings</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+Strings represent textual values, as a sequence of characters. String values
+are always written between double quotes. An example is <code>"hello world"</code>. The
+default value of strings (<code>string</code> type) is the empty string <code>""</code>.</p>
+</div>
+<div class="paragraph">
+<p>Strings can be composed using the <code>+</code> operator. The expression
+<code>"hello" + " " + "world"</code> evaluates to <code>"hello world"</code>. For advanced text
+formatting, see
+<a href="#tools-cifsim-output-print-chapter-tut-fmt">the text formatting tutorial</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-enumerations">Enumerations</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+Enumerations represent collections of related entities, such as types of
+products, types of available resources, available machine types, different
+countries, different colors, different genders, and so on. It is possible to
+use numbers to represent the different entities, for instance <code>0</code> for red,
+<code>1</code> for orange, and <code>2</code> for green, to represent the different colors of
+a traffic light. However, these numbers are rather arbitrary. Furthermore, they
+don&#8217;t actually represent numbers, but rather they represent one of the entities
+(red, orange, green). Enumerations allow giving each entity a name, and to use
+those names instead of numbers. This usually makes the model easier to read and
+understand. For instance, consider the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum TrafficColor = RED, ORANGE, GREEN;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="lang-tut-values-enums-lit" class="paragraph">
+<p>The <code>enum</code> keyword is used to declare an enumeration. The <code>TrafficColor</code>
+enumeration has three possible values or <em>literals</em>. The literals are named
+<code>RED</code>, <code>ORANGE</code>, and <code>GREEN</code>. An enumeration can be used as data type,
+and the enumeration literals can be used as values:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc TrafficColor light = RED;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>TrafficColor</code> enumeration is used as type of the <code>light</code> variable.
+The <code>light</code> variable is given value <code>RED</code> as its initial value. The default
+value of an enumeration type is its first literal (<code>RED</code> in this case).
+However, it is usually preferred to explicitly initialize variables with
+enumeration types, for readability.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge change_color when light = RED do light := GREEN;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This edge has a guard that compares the value of the <code>light</code> variable to
+enumeration literal <code>RED</code>. Only if the <code>light</code> is currently <code>RED</code>, may
+this edge be taken. The edge further assigns enumeration literal <code>GREEN</code> as
+the new value of variable <code>light</code>. The edge as a whole models that if the
+<code>light</code> is currently <code>RED</code>, it may change color (event <code>change_color</code>)
+and become <code>GREEN</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-tuples">Tuples</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+Tuples are used for keeping several (related) kinds of data together in one
+variable, e.g. the identification number and weight of a box. A tuple consists
+of a number of fields, where the types of these fields may be different. The
+number of fields is fixed. For instance, consider the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>box</code> has a tuple type, consisting of two fields, an integer
+typed field with name <code>nr</code> and real typed field with name <code>weight</code>. The
+<code>box</code> variable has essentially two values, an integer typed value, and
+a real typed value.</p>
+</div>
+<div class="paragraph">
+<p>If multiple consecutive fields have the same type, the type need not be
+repeated for each of them. In the following example, variables <code>x1</code> and
+<code>x2</code> have the same type:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int a; int b; real c; int d) x1;
+disc tuple(int a, b;     real c; int d) x2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+Literal values exist for tuple types:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box = (5, 2.7);
+
+edge ... do box := (6, 3.4);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>box</code> variable is initialized to a tuple value consisting of integer
+value <code>5</code> (identification number) and real value <code>2.7</code> (weight). The entire
+value of the variable is reassigned in the assignment. That is, both fields are
+given new values.</p>
+</div>
+<div class="paragraph">
+<p>
+It is also possible to refer to a specific field of a tuple, using
+<em>projection</em>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box = (5, 2.7);
+disc int i;
+disc real r;
+
+edge ... do i := box[nr];            // Projection to field 'nr'.
+edge ... do r := box[weight];        // Projection to field 'weight'.
+edge ... do box[nr] := i;            // Assignment to field 'nr'.
+edge ... do box[nr] := box[nr] + 1;  // Increment of field 'nr'.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first edge uses projection to obtain the value of the integer <code>nr</code>
+field, and assign it to integer variable <code>i</code> (<code>i</code> becomes <code>5</code>). The
+second edge performs a similar operation for the <code>weight</code> field (<code>r</code>
+becomes <code>2.7</code>). The third edge assigns the value of integer variable <code>i</code>
+to the integer field <code>nr</code> of the <code>box</code> variable. This changes only the
+value of the <code>nr</code> field. The value of the <code>weight</code> field of the <code>box</code>
+variable is not affected by this assignment. The third edge increments the
+value of the <code>nr</code> field of the <code>box</code> variable by one, leaving the
+<code>weight</code> of the <code>box</code> as is. Besides projection using field names, it is
+also possible to do projection using 0-based indices:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box = (5, 2.7);
+disc int i;
+disc real r;
+
+edge ... do i := box[0];  // Projection to field 'nr'.
+edge ... do r := box[1];  // Projection to field 'weight'.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+Index <code>0</code> refers to the first field, in this case field <code>nr</code>. Index <code>1</code>
+refers to the second field, etc. Projection using indices is also called
+<em>indexing</em>. For tuples, it is usually preferred to use field names, rather than
+indices, for readability.</p>
+</div>
+<div class="paragraph">
+<p>
+It is possible to create a tuple from separate values, each stored in a
+variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box;
+disc int i;
+disc real r;
+
+edge ... do box := (i, r); // Packing a tuple.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The right hand side of the assignment is a tuple literal value, as used before.
+The field values however, are obtained by evaluation of variables, rather than
+using literal integer and real values. This kind of assignment, where there is
+tuple variable at the left hand side, and values for each of the fields of that
+tuple at the right hand side, is called <em>packing</em> a tuple.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-values-tuples-unpacking" class="paragraph">
+<p>It is possible to obtain the values of the fields of a tuple into separate
+variables:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc tuple(int nr; real weight) box = (5, 2.7);
+disc int i;
+disc real r;
+
+edge ... do i := box[nr], r := box[weight];
+edge ... do (i, r) := box; // Unpacking a tuple.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first edge uses projection on the variable <code>box</code> to obtain the values of
+the individual fields, and assigns those extracted values to two separate
+variables. The second edge does the same thing as the first edge, and is
+preferred in this case, because of its simple and short notation. This kind of
+use, where at the left hand side of the assignment you see variables for each
+of the fields of the tuple, and on the right hand side you see only one
+variable that has a tuple type, is called <em>unpacking</em> a tuple.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-lists">Lists</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+A list is an ordered collection of values (called <em>elements</em>) of a same type.
+Lists can be used to model anything where duplicate values may occur or where
+order of the values is significant. Examples are customers waiting in a shop,
+process steps in a recipe, or products stored in a warehouse. Consider the
+following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list int x = [7, 8, 3];</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="lang-tut-values-list-literal" class="paragraph">
+<p>Variable <code>x</code> has a list of integers as its value. In this case, its initial
+value is a literal list with three integer elements. Lists are ordered
+collections of elements. <code>[7, 8, 3]</code> is thus a different list as
+<code>[8, 7, 3]</code>. Lists are empty by default, and they may have duplicate
+elements:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list int x1;                       // Implicitly empty list.
+disc list int x2 = [];                  // Explicitly empty list.
+disc list int x3 = [1, 2, 1, 2, 2];     // Duplicate elements in a list.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Since lists are ordered, there is a first element and a last element (unless
+the list is empty). An element can be obtained by <em>projection</em>, usually called
+<em>indexing</em> for lists:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list int x = [7, 8, 3];
+disc int i;
+
+edge ... do i := x[0];   // 'i' becomes '7'
+edge ... do i := x[1];   // 'i' becomes '8'
+edge ... do i := x[2];   // 'i' becomes '3'
+edge ... do i := x[3];   // error (there is no fourth element in the list)
+edge ... do x[0] := 5;   // the first element of 'x' is replaced by '5'</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first three edges obtain specific elements of the list, and assign them to
+variable <code>i</code>. The first element is obtained using <em>index</em> or <em>offset</em> <code>0</code>,
+the second element using index <code>1</code>, etc. The index of the last element is the
+length of the list (the number of elements in the list), minus one. Indexing
+does not change the value of variable <code>x</code>. The fourth edge is  invalid, as
+the fourth element (index <code>3</code>) of variable <code>x</code> is used, which does not
+exist. The fifth edge replaces only the first element (index <code>0</code>) of list
+<code>x</code>, while keeping the remaining elements as they are. It is also allowed to
+use negative indices:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list int x = [7, 8, 3];
+disc int i;
+
+edge ... do i := x[-1];  // 'i' becomes '3'
+edge ... do i := x[-2];  // 'i' becomes '8'
+edge ... do i := x[-3];  // 'i' becomes '7'
+edge ... do i := x[-4];  // error (there is no element before element '7')</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Negative indices start from the back of the list, rather than from the front.
+Index <code>-1</code> thus always refers to the last element, <code>-2</code> to the second to
+last element, etc. As with the non-negative indices, using a negative index
+that is out of range of available elements, results in an error. To obtain a
+non-negative index from a negative index, add the negative index to the length
+of the list: <code>3 + -1 = 2</code>, <code>3 + -2 = 1</code>, and <code>3 + -3 = 0</code>. The following
+figure visualizes a list, with non-negative indexing (at the top) and negative
+indexing (at the bottom):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/values/list_indices.png" alt="list indices">
+</div>
+</div>
+<div class="paragraph">
+<p>
+Besides obtaining a single element from a list, it is also possible to obtain
+a sub-range of the elements of a list, called a <em>slice</em>. Slicing also does not
+change the contents of the list. It results in a copy of a contiguous
+sub-sequence of the list. The result of a slice operation is again a list, even
+if the slice contains just one element, or no elements at all. Slicing requires
+two indices: the index of the first element of the sub-range (inclusive), and
+the index of the last element of the sub-range (exclusive). Both indices may be
+omitted. If the start index is omitted, it defaults to zero. If the end index
+is omitted it defaults to the length of the list. If the begin index is equal
+to or larger than the end index, the slice is empty. Similar to indexing,
+negative indices may be used, which are relative to the end of the list rather
+than the start of the list. Indices that are out of bounds
+<a href="http://en.wikipedia.org/wiki/Saturation_arithmetic">saturate</a> to those
+bounds. Some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list int x = [7, 8, 3, 5, 9];
+
+x[2:4]  //       [3, 5]    Slice that includes third and fourth elements.
+x[2:7]  //       [3, 5, 9] Slice that excludes the first two elements.
+x[1:]   //    [8, 3, 5, 9] Slice that excludes the first element.
+x[:-1]  // [7, 8, 3, 5]    Slice that excludes the last element.
+x[:]    // [7, 8, 3, 5, 9] Slice includes all elements (is equal to 'x').</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first slice takes the third (index <code>2</code>) and fourth (index <code>3</code>)
+elements. The begin index (<code>2</code>) is thus included, the end index (<code>4</code>) is
+not. The second slice starts at the same index, but extends to the sixth
+element (index <code>7</code>). Since there are only five elements, the index is
+saturated (or clamped) to the end of the list. The results is that all but the
+first two elements are included. The third slice excludes the first element
+(index <code>0</code>), by starting at index <code>1</code>. It omits the end index, meaning that
+the entire remainder of the list is kept, and only the first element is not
+included. The fourth slice begins at the beginning of the list, as the begin
+index is omitted. It continues until the last element of list, which it
+excludes. It thus excludes a single element from the end of the list. The fifth
+slice includes all elements, as both the begin and end index are omitted. The
+slice is thus identical to the list in <code>x</code>. The following figure graphically
+represents the slices:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/values/list_slicing.png" alt="list slicing">
+</div>
+</div>
+<div class="paragraph">
+<p>
+Lists can be combined into new lists. They are essentially 'glued' together.
+This is called <em>concatenation</em>. This can also be used to add a single element
+to the front or back of the list. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">[7, 8, 3] + [5, 9]   // [7, 8, 3, 5, 9]
+[5] + [7, 8, 3]      // [5, 7, 8, 3]
+[7, 8, 3] + [5]      // [7, 8, 3, 5]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Several other standard operators and functions are available to work with
+lists, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">[1, 4, 2, 4, 5] - [2]           // [1, 4, 4, 5] (removal of elements)
+[1, 4, 2, 4, 5] - [4]           // [1, 2, 4, 5]
+[1, 4, 2, 4, 5] - [8]           // [1, 4, 2, 4, 5]
+[1, 2, 3, 4, 5] - [6, 4, 2, 3]  // [1, 5]
+[1, 4, 4, 1, 1] - [1, 4, 1]     // [4, 1]
+
+[1, 8, 3] = [1, 3, 8]           // false (equality test)
+6 in [1, 8, 3]                  // false (element test)
+1 in [1, 8, 3]                  // true
+
+empty([1, 2])                   // false (empty test)
+size([1, 5, 3, 3])              // 4 (count elements)
+
+del([7, 8, 9, 10], 2)           // [7, 8, 10] (removed value at index '2')
+pop([1, 5, 3])                  // (1, [5, 3]) (first element and remainder)</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-bounded-lists-and-arrays">Bounded lists and arrays</h4>
+<div class="paragraph">
+<p>
+
+CIF can only represent <a href="#tut-values-chapter-lists">lists</a> (type <code>list</code>)
+with at most 2,147,483,647 (= 2<sup>31</sup> - 1) elements. Using lists
+with more elements results in the CIF model being invalid, and leads to runtime
+errors. For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  disc list int x;
+
+  location:
+    initial;
+    edge do x := x + [1];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each time the edge is taken, another element is added to list <code>x</code>. As soon
+as an attempt is made to add the 2,147,483,648<sup>th</sup> element, a
+runtime error occurs.</p>
+</div>
+<div class="paragraph">
+<p>It is possible to explicitly restrict the number of elements that may be
+contained in a list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list[3..7] int y;      // List with at least 3 and at most 7 elements.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+Variable <code>y</code> can only have lists as its value that have at least <code>3</code> and at
+most <code>7</code> elements. Assigning a list with any other number of elements is not
+allowed. Lists with size restrictions are called <em>bounded lists</em>. They can also
+be called <em>size restricted lists</em> or <em>ranged lists</em>. The default value for
+<code>y</code> is <code>[0, 0, 0]</code>. That is, the default value has the least amount of
+elements that is allowed by the bounded list, and the default value (<code>0</code>) of
+the element type (<code>int</code>).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="lang-tut-values-array" class="paragraph">
+<p>Lists with a fixed length are called <em>arrays</em>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc list[5..5] int a;      // List with at least 5 and at most 5 elements.
+disc list[5]    int b;      // Shorter but equivalent array notation.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By giving a bounded list the same lower and upper bound, the bounded list has a
+fixed number of elements, and can be called an <em>array</em>. Arrays also have a
+shorter and more convenient notation, where the number of elements is only
+given once. Both notations for arrays are equivalent.</p>
+</div>
+<div class="paragraph">
+<p>Both bounded lists and arrays support the same operations as regular lists, and
+can be modified (assigned) the same way as regular lists, as long as their size
+restrictions are not violated.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-sets">Sets</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+A set is an unordered collection of values (called <em>elements</em>) of a same type.
+Each element value either exists in a set, or it does not exist in a set. Each
+element value is unique, as duplicate elements are silently discarded. Consider
+the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc set int x1 = {3, 7, 8};
+disc set int x2 = {8, 3, 7};        // Order irrelevant (same as 'x1').
+disc set int x3 = {8, 3, 7, 3};     // Duplicates ignored (same as 'x2').
+disc set int x4 = {};               // Empty set.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Variable <code>x1</code> has a set of integers as its value. In this case, its initial
+value is a literal set with three integer elements. As sets are unordered
+collections of elements, <code>{3, 7, 8}</code> is the same set as <code>{8, 3, 7}</code>, and
+thus variables <code>x1</code> and <code>x2</code> have the same initial values. Since elements
+in a set are unique, set <code>{8, 3, 7}</code> is equal to the set <code>{8, 3, 7, 3}</code>,
+and thus variables <code>x2</code> and <code>x3</code> have the same initial values. For
+readability, elements in a set are normally written in increasing order, for
+example <code>{3, 7, 8}</code>. Variable <code>x4</code> has an empty set as initial value, which
+is also the default initial value for sets.</p>
+</div>
+<div class="paragraph">
+<p>
+The <em>union</em> of two sets results in a set that contains the combined elements of
+both sets. You can think of the resulting set containing the elements that are
+in the one set <code>or</code> in the other set (or in both of them). Since sets never
+contain duplicates, common elements are present only once in the resulting set:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">{1, 2, 3} or {2, 3, 4}          // {1, 2, 3, 4}
+{1, 2, 3} or {2, 3, 4}          // {1, 2, 4, 3}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Since sets are unordered, both answers are possible, and represent the same
+set. Since the order is irrelevant, there are 24 different ways to represent
+that same set. In the remainder of this lesson, we&#8217;ll use increasing order, for
+readability.</p>
+</div>
+<div class="paragraph">
+<p>
+The <em>intersection</em> of two sets results in a set that contains the elements that
+are present in both sets. You can think of the resulting set containing the
+elements that are in the one set <code>and</code> in the other set. In other words, the
+result contains the elements common to both sets:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">{1, 2, 3} and {2, 3, 4}         // {2, 3}
+{1, 2} and {3, 4}               // {} (no elements in common)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+The <em>difference</em> of two sets results in a set that contains the elements of the
+first set that are not present in the second set. You can think of the
+resulting set containing the elements of the first set, with the elements of
+the second set subtracted or removed from it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">{1, 2, 3} - {2, 3, 4}           // {1}
+{1, 2, 3} - {4, 5}              // {1, 2, 3}
+{1, 2, 3} - {1, 2, 3, 4}        // {}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Several other standard operators and functions are available to work with
+sets, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">{1, 8, 3} = {1, 3, 8}       // true (equality, ignores order of elements)
+
+6 in {1, 8, 3}              // false (element test)
+1 in {1, 8, 3}              // true
+
+{1, 3} sub {1, 3}           // true (subset check)
+{1, 3} sub {1, 3, 5}        // true
+{1, 3} sub {1, 4}           // false
+{1, 3} sub {1, 4, 5}        // false
+
+empty({1, 2})               // false (empty test)
+size({1, 5, 3, 3})          // 3 (count elements, duplicates ignored)</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-dictionaries">Dictionaries</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+A dictionary is an unordered collection of <em>keys</em> and associated <em>values</em>. A
+key with its associated value is called a key/value <em>pair</em>. Consider the
+following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(string:int) age = {&quot;eve&quot;: 32, &quot;john&quot;: 34, &quot;adam&quot;: 25};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Variable <code>age</code> has as value a dictionary consisting of pairs of strings
+(the keys) and integers (the values). In this example, each string represents
+a person&#8217;s name, and each integer represents the age of that person. Variable
+<code>age</code> is initialized with a literal dictionary, containing three key/value
+pairs. You can think of the dictionary as storing the information that <code>eve</code>
+is <code>32</code> years old, or that the age of <code>eve</code> is <code>32</code>.</p>
+</div>
+<div class="paragraph">
+<p>As with sets, dictionaries are unordered. The order of the key/value pairs is
+irrelevant, <code>{"eve": 32, "adam": 25}</code> is the same dictionary as
+<code>{"adam": 25, "eve": 32}</code>. For readability, key/value pairs of dictionary
+literals are normally written in increasing order of their keys.
+<code>{"adam": 25, "eve": 32}</code> is thus preferred over <code>{"eve": 32, "adam": 25}</code>,
+as <code>adam</code> goes before <code>eve</code> in a phone book.</p>
+</div>
+<div class="paragraph">
+<p>Dictionary literals are often written using multiple lines, to get two
+'columns' for the keys and values, which can improve readability:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(string:int) age = {&quot;eve&quot;:  32,
+                             &quot;john&quot;: 34,
+                             &quot;adam&quot;: 25};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The default value for dictionary types, is an empty dictionary. The following
+two variables thus have the same initial value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(string:int) x1 = {};  // Explicitly initialized as empty.
+disc dict(string:int) x2;       // Implicitly initialized as empty.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Every key of a dictionary is unique, but they may be associated with the same
+value. For the above example with ages, the names (keys) are used to uniquely
+identify people, but multiple people may have the same age (values). It is not
+allowed to have the same key twice, in a dictionary literal, regardless of
+whether they map to the same value or to different values:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(int:int) x1 = {1: 2, 1: 2};  // Invalid due to duplicate key '1'.
+disc dict(int:int) x2 = {1: 2, 1: 3};  // Invalid due to duplicate key '1'.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The values of a dictionary can be obtained by <em>projection</em> on that dictionary,
+using the keys:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(string:int) age = {&quot;adam&quot;: 25, &quot;eve&quot;: 32, &quot;john&quot;: 34};
+disc int i;
+
+edge ... do i := age[&quot;adam&quot;];   // 'i' becomes '25'
+edge ... do i := age[&quot;eve&quot;];    // 'i' becomes '32'
+edge ... do i := age[&quot;carl&quot;];   // error (there is no &quot;carl&quot; key)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Projection using a key that exists in the dictionary, results in the associated
+value. Projection using a key that does not exist in the dictionary, leads to
+a runtime error.</p>
+</div>
+<div class="paragraph">
+<p>It is possible to modify single elements of a dictionary, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(string:int) age = {&quot;adam&quot;: 25, &quot;eve&quot;: 32, &quot;john&quot;: 34};
+
+edge ... do age[&quot;eve&quot;] := 33;  // Changes eve's age.
+edge ... do age[&quot;bob&quot;] := 47;  // Adds a new key/value pair.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The age of <code>eve</code> is changed from <code>32</code> to <code>33</code>. The age is thus replaced
+by a new age. The age of <code>bob</code> is set to <code>47</code>. Since there was no key/value
+pair for that person in the dictionary, a new key/value pair is added. After
+the updates of both edges, the value of variable <code>age</code> is
+<code>{"adam": 25, "bob": 47, "eve": 33, "john": 34}</code>.</p>
+</div>
+<div class="paragraph">
+<p>Several other standard operators and functions are available to work with
+dictionaries, including the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">{&quot;a&quot;: 1, &quot;b&quot;: 2} = {&quot;b&quot;: 2, &quot;a&quot;: 1}     // true (equality check)
+{&quot;a&quot;: 1, &quot;b&quot;: 2} = {&quot;a&quot;: 1, &quot;b&quot;: 3}     // false
+
+&quot;a&quot; in {&quot;a&quot;: 1, &quot;b&quot;: 2}                 // true (key existence check)
+&quot;c&quot; in {&quot;a&quot;: 1, &quot;b&quot;: 2}                 // false
+
+{&quot;a&quot;: 1, &quot;b&quot;: 2} + {&quot;b&quot;: 3, &quot;c&quot;: 4}     // {&quot;a&quot;: 1, &quot;b&quot;: 3, &quot;c&quot;: 4} (add/overwrite pairs)
+
+{&quot;a&quot;: 1, &quot;b&quot;: 2} - {&quot;b&quot;: 3, &quot;c&quot;: 4}     // {&quot;a&quot;: 1} (removal based on keys)
+{&quot;a&quot;: 1, &quot;b&quot;: 2} - {&quot;b&quot;, &quot;c&quot;}           // {&quot;a&quot;: 1}
+{&quot;a&quot;: 1, &quot;b&quot;: 2} - [&quot;b&quot;, &quot;c&quot;]           // {&quot;a&quot;: 1}
+
+empty({&quot;a&quot;: 1, &quot;b&quot;: 2})                 // false (empty check)
+size({&quot;a&quot;: 1, &quot;b&quot;: 2})                  // 2 (count pairs)</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-values-chapter-combining-values">Combining values</h4>
+<div class="paragraph">
+<p>Values of different types can usually be arbitrarily combined. For instance,
+consider the following example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">disc dict(int;tuple(real pos, weight)) boxes = {1: (0.0, 2.5),
+                                                2: (3.0, 1.7),
+                                                3: (4.0, 3.9};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>boxes</code> stores data about multiple boxes, in a dictionary with
+unique identification numbers (<code>1</code>, <code>2</code>, and <code>3</code>) used as keys. For each
+box, the position (<code>pos</code>) and <code>weight</code> are stored as a tuple. Initially,
+there are three boxes. The first box has identification number <code>1</code>,
+position <code>0.0</code>, and weight <code>2.5</code>. The second box has identification number
+<code>2</code>, position <code>3.0</code>, and weight <code>1.7</code>. Also consider the following
+example, where the data of that variable is manipulated:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">edge ... do boxes[1][weight] := 3.5;
+edge ... do boxes[2][pos] := boxes[2][pos] + 1;
+edge ... do boxes[4] := (1.0, 0.8);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first edge changes the <code>weight</code> of the box <code>1</code> (the box with
+identification number <code>1</code>), from <code>2.5</code> to <code>3.5</code>. The second edge
+increases the position (<code>pos</code>) of box <code>2</code> from <code>3.0</code> to <code>4.0</code>. The
+third edge adds data for a new box with identification number <code>4</code>.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-scalable-solutions-and-reuse-12">Scalable solutions and reuse (1/2)</h3>
+<div class="sect3">
+<h4 id="tut-reuse1-chapter-constants">Constants</h4>
+<div class="paragraph">
+<p>
+Through the use of <em>constants</em>, fixed values can be given a name. Using
+constants, it is easy to change certain fixed values. If the constant is
+used consistently throughout the model, the value needs to be changed only in
+one place. Constants can thus make it easier to keep the model consistent.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int STEP = 2;
+const int TARGET = 100;
+
+automaton movement:
+  disc int position = 0;
+  event move;
+
+  location:
+    initial;
+    edge move when position &lt; TARGET do position := position + STEP;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this example, the <code>movement</code> automaton keeps track of the <code>position</code> of
+an object. The object starts at position <code>0</code>. It can <code>move</code> until it
+reaches its target position. The target position is <code>100</code>. Rather than using
+<code>position &lt; 100</code> as guard, the value <code>100</code> is stored in a constant named
+<code>TARGET</code>. The constant can then be used instead the value <code>100</code>. Similarly,
+the step size of the object is stored in a constant named <code>STEP</code>.</p>
+</div>
+<div class="paragraph">
+<p>Constants have a name, which by contention is usually written using upper case
+letters. Using a constant instead of a fixed value makes it more clear what
+that value represents. For instance, by using <code>position &lt; TARGET</code> rather than
+<code>position &lt; 100</code>, the intention of the guard condition is more clear. Using a
+constant can thus enhance readability.</p>
+</div>
+<div class="paragraph">
+<p>Another benefit of constants, is that they can be used multiple times in the
+same model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int STEP = 2;
+const int TARGET = 100;
+
+automaton movement:
+  disc int position = 0;
+  event forward, backward;
+
+  location:
+    initial;
+    edge forward  when position &lt; TARGET do position := position + STEP;
+    edge backward when position &gt; 0      do position := position - STEP;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this modified example it is possible for the object to perform <code>forward</code>
+as well as <code>backward</code> movements. The step size is the same for both
+movements, making it possible to use the <code>STEP</code> constant in the updates of
+both edges. Since a constant is used, the speed of both movements can be
+changed by changing the value of the constant. Without using a constant, the
+speed would have to be changed separately for each edge.</p>
+</div>
+<div class="paragraph">
+<p>Constants are not limited to integer values. Consider the following example,
+where a more complex value is used:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum ProductType = A, B, C;
+const dict(ProductType:real) DURATION = {A: 3.5, B: 5.7, C: 0.8};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This example declares a <code>ProductType</code> enumeration, with three different
+product types: <code>A</code>, <code>B</code>, and <code>C</code>. The <code>DURATION</code> constant indicates
+for each product type, how long it takes to produce a product of that type.
+Products of type <code>A</code> can be produced in 3.5 hours, products of type <code>B</code>
+in 5.7 hours, etc. To get the production duration of products of type <code>C</code>,
+<a href="#tut-values-chapter-types-values-exprs">expression</a> <code>DURATION[C]</code> can be
+used. For more information, see the lessons on
+<a href="#tut-values-chapter-enumerations">enumerations</a> and
+<a href="#tut-values-chapter-dictionaries">dictionaries</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse1-chapter-algebraic-variables">Algebraic variables</h4>
+<div class="paragraph">
+<p>
+
+Consider a conveyor belt with a product on it:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/reuse1/conveyor.png" alt="conveyor">
+</div>
+</div>
+<div class="paragraph">
+<p>The product starts at the left side, at position <code>0</code>. There is a sensor that
+can detect the product between positions <code>13</code> and <code>14</code>. The product exits
+the conveyor at position <code>18</code>. The following CIF specification models the
+conveyor, product, and sensor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton conveyor:
+  disc real position = 0.0;
+  event move;
+
+  const real width = 6;
+  alg bool sensor = position + width &gt;= 13 and position &lt;= 14;
+
+  location:
+    initial;
+    edge move when position &lt; 18 do position := position + 0.1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>conveyor</code> automaton models the conveyor, with a product on it. The
+product is modeled by means of the <code>position</code> of the left side of the
+product, relative to the left side of the conveyor. As the conveyor starts to
+<code>move</code>, the product moves as well, and its position on the conveyor is
+updated. The product moves in steps of <code>0.1</code>.</p>
+</div>
+<div class="paragraph">
+<p>The <code>width</code> of the product is <code>6</code>. The sensor is on whenever
+the product, which spans from <code>position</code> to <code>position + width</code>, is within
+the sensor range, which spans from <code>13</code> to <code>14</code>. An <em>algebraic variable</em>
+named <code>sensor</code> is used here, to represent the value of the sensor.</p>
+</div>
+<div class="paragraph">
+<p>An algebraic variable is a variable whose value is determined by its
+definition. For the <code>sensor</code> variable, its value is determined from a
+calculation involving variable <code>position</code> and constant <code>width</code>. Unlike
+discrete variables, algebraic variables can not be assigned a new value. The
+value of algebraic variable <code>sensor</code> changes automatically as the value of
+discrete variable <code>position</code> changes. The value of algebraic variable
+<code>sensor</code> is <code>true</code> whenever the product is over the sensor, and it is
+<code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p>If we had modeled the value of the sensor as a discrete variable, we would have
+had to update the variable for every edge where the value of variable
+<code>position</code> is updated. In this example, that is only one edge. However, if
+the variable would have been updated on multiple edges, the sensor value would
+also have to be updated for all those edges. Furthermore, when adding
+another edge that updates the <code>position</code> variable, the edge needs to be
+adapted to also update the <code>sensor</code> discrete variable, which can easily be
+forgotten. Using an algebraic variable, the value computation needs to be
+specified only once, and no changes to its value are needed, as the value
+always remains consistent with its definition.</p>
+</div>
+<div class="paragraph">
+<p>Algebraic variables can be used to give an
+<a href="#tut-values-chapter-types-values-exprs">expression</a> (computations) a name,
+similar to how <a href="#tut-reuse1-chapter-constants">constants</a> can be used to
+give fixed values a name. The benefits of using an algebraic variable are
+similar to the benefits of using constants. Both can be used to improve
+readability, and to make it easier to consistently change the model.</p>
+</div>
+<div class="paragraph">
+<p>Algebraic variables can also be used as an abstraction. Consider the following
+extension of the specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton light:
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on  when     conveyor.sensor goto on;
+
+  location on:
+    edge turn_off when not conveyor.sensor goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The idea is to have a light turn on when a product is detected by the sensor,
+and have it turn off when the sensor no longer detects the product. The
+algebraic variable <code>sensor</code> is used in the guard conditions of the <code>light</code>
+automaton, to determine when the light should be turned on or off.</p>
+</div>
+<div class="paragraph">
+<p>In the example, the <code>light</code> automaton only uses the <code>sensor</code> variable from
+automaton <code>conveyor</code>. It does not matter how the value of that variable is
+defined. Currently, it is defined in terms of variable <code>position</code> and
+constant <code>width</code>. However, if the <code>conveyor</code> automaton were modeled
+differently, the expression that defines the value of the algebraic variable
+could be changed, without the need to change the use of the variable in
+automaton <code>light</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse1-chapter-algvar-equations">Algebraic variables and equations</h4>
+<div class="paragraph">
+<p>
+
+Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton car:
+  event start, stop, breakdown, start_repair, repaired;
+
+  alg bool can_drive = idle or moving;
+
+  location idle:
+    initial;
+    edge start goto moving;
+
+  location moving:
+    edge stop goto idle;
+    edge breakdown goto broken;
+
+  location broken:
+    edge start_repair goto repairing;
+
+  location repairing:
+    edge repaired goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>car</code> is initially <code>idle</code>. Once you <code>start</code> driving, the car is
+<code>moving</code>. Once you <code>stop</code> driving, the car is <code>idle</code> again. While
+<code>moving</code> it is possible for a <code>breakdown</code> to occur, meaning the car is
+<code>broken</code>. Once a mechanic starts the repair (<code>start_repair</code>), the mechanic
+is <code>repairing</code> the car. Once it is <code>repaired</code>, the car is <code>idle</code>, and you
+can <code>start</code> driving it again, etc.</p>
+</div>
+<div class="paragraph">
+<p>Algebraic variable <code>can_drive</code> indicates whether you can currently drive the
+car. As the value calculation indicates, the car can be driven whenever it is
+<code>idle</code> or <code>moving</code>. That is, it can&#8217;t be driven if the car is <code>broken</code>
+or a mechanic is <code>repairing</code> it.</p>
+</div>
+<div class="paragraph">
+<p>In the example above, the value of the algebraic variable is defined with the
+declaration, as was already explained in the lesson that introduced
+<a href="#tut-reuse1-chapter-algebraic-variables">algebraic variables</a>. However, it
+also possible to specify the value separately, using an equation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton car:
+  event start, stop, breakdown, start_repair, repaired;
+
+  alg bool can_drive;
+
+  equation can_drive = idle or moving;
+
+  // Locations omitted for brevity.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This allows for separation of variable declarations and equations. Both
+variants have the same algebraic variable with the same value. An equation of
+an algebraic variable must be placed in the same component as where the
+algebraic variable is declared. In the example above, the equation for
+algebraic variable <code>can_drive</code> must be placed in automaton <code>car</code>, as that
+is where the algebraic variable is declared.</p>
+</div>
+<div class="paragraph">
+<p>For algebraic variables declared in automata, it is also possible to specify
+the value using an equation per location of the automaton:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton car:
+  event start, stop, breakdown, start_repair, repaired;
+
+  alg bool can_drive;
+
+  location idle:
+    initial;
+    equation can_drive = true;
+
+    edge start goto moving;
+
+  location moving:
+    equation can_drive = true;
+
+    edge stop goto idle;
+    edge breakdown goto broken;
+
+  location broken:
+    equation can_drive = false;
+
+    edge start_repair goto repairing;
+
+  location repairing:
+    equation can_drive = false;
+
+    edge repaired goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Every algebraic variable must have a unique value in every situation. Algebraic
+variables must thus have a value with their declaration, a single equation in
+the same component, or an equation in every location of the automaton. For
+every algebraic variable, one of the three variants must be chosen. It is
+allowed to choose a different variant for different algebraic variables, but it
+is not allowed to use multiple variants for the same algebraic variable.</p>
+</div>
+<div class="paragraph">
+<p>Which variant fits best for a specific algebraic variable, depends on the
+situation. One of the benefits of using an equation per location, is
+that the equations are checked for completeness. If you add a new location, you
+must add an equation to that location as well, as otherwise the model is
+invalid (incomplete). This means you can&#8217;t forget to specify the value of the
+algebraic variable for that new location. If you use a value with the
+declaration or a single equation in the component, you might forget to update
+the value for the changes you made to the automaton.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse1-chapter-type-declarations">Type declarations</h4>
+<div class="paragraph">
+<p>
+
+Consider this slightly modified version of an example from the lesson on
+<a href="#tut-reuse1-chapter-constants">constants</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum ProductType = A, B, C;
+
+const dict(ProductType:real) M1_DURATION = {A: 3.5, B: 5.7, C: 0.8};
+const dict(ProductType:real) M2_DURATION = {A: 1.8, B: 4.2, C: 3.9};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This example declares a <code>ProductType</code> enumeration, with three different
+product types: <code>A</code>, <code>B</code>, and <code>C</code>. The <code>M1_DURATION</code> constant indicates
+for each product type, how long it takes to produce a product of that type,
+on machine 1. Products of type <code>A</code> can be produced in 3.5 hours, products of
+type <code>B</code> in 5.7 hours, etc. Constant <code>M2_DURATION</code> is similar, but for
+machine 2.</p>
+</div>
+<div class="paragraph">
+<p>The type of both constants is the same. To avoid having to repeat complex types
+in multiple places, a <em>type declaration</em> can be used:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum ProductType = A, B, C;
+type Durations = dict(ProductType:real)
+
+const Durations M1_DURATION = {A: 3.5, B: 5.7, C: 0.8};
+const Durations M2_DURATION = {A: 1.8, B: 4.2, C: 3.9};</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A type declaration with name <code>Durations</code> is introduced, and <code>Durations</code> can
+then be used wherever a type is expected, instead of
+<code>dict(ProductType:real)</code>. In the example above, <code>Durations</code> is used as
+type of the two constants. The original specification and the one with the
+type declaration have the same constants, with effectively the same type. That
+is, in both specification the value of constant <code>M1_DURATION</code> is a
+<a href="#tut-values-chapter-dictionaries">dictionary</a> with three key/value pairs.</p>
+</div>
+<div class="paragraph">
+<p>Type declarations can be used to give a type a name, similar to how
+<a href="#tut-reuse1-chapter-constants">constants</a> can be used to give fixed values
+a name, and <a href="#tut-reuse1-chapter-algebraic-variables">algebraic variables</a>
+can be used to give computations a name. The benefits are also similar, as type
+declarations can be used to make specifications more concise, to increase
+readability, and to make it easier to consistently change types throughout the
+specification.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-time">Time</h3>
+<div class="sect3">
+<h4 id="tut-time-chapter-intro">Timing</h4>
+<div class="paragraph">
+<p>
+
+So far, the tutorial has only used discrete event models as examples, which are
+all untimed. This lesson introduces the concept of timing.</p>
+</div>
+<div class="paragraph">
+<p>In CIF, time starts at zero (<code>0.0</code>). Time can progress continuously. That is,
+after one unit of time has passed, the model time is <code>1.0</code>. After an
+additional one and a half time units have passed, the model time is <code>2.5</code>,
+etc. By default, one time unit corresponds to one second. However, you can
+decide to use another unit, and tools such as the simulator can be configured
+to speed up or slow down the simulation accordingly.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-variable-time">Variable <code>time</code></h5>
+<div class="paragraph">
+<p>A variable named <code>time</code> is always available in every specification. The
+variable holds the current absolute model time as its value, and can be used
+throughout the model. Initially, time and thus the value of variable <code>time</code>
+start at zero (<code>0.0</code>). As time progresses, the value of variable <code>time</code> is
+automatically updated to ensure it properly represents the current time of the
+system.</p>
+</div>
+<div class="paragraph">
+<p>In this lesson, absolute time will be used. In most models, it is easier to use
+relative time. This can be achieved with
+<a href="#tut-time-chapter-continuous-variables">continuous variables</a>, discussed in
+the next lesson.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-timed-guards">Timed guards</h5>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event push, release;
+
+automaton user:
+  location start1:
+    initial;
+    edge push    when time &gt;= 1.5 goto stop1;
+
+  location stop1:
+    edge release when time &gt;= 2.3 goto start2;
+
+  location start2:
+    edge push    when time &gt;= 2.4 goto stop2;
+
+  location stop2:
+    edge release when time &gt;= 7.6 goto done;
+
+  location done;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>push</code> and <code>release</code> events represent pushing and releasing of a button
+respectively. The actual behavior of the button itself is omitted. The
+specification does model the behavior of a <code>user</code>. Initially, the <code>user</code>
+is in location <code>start1</code>, and no time has passed. The edge with the <code>push</code>
+event is not yet enabled, as the guard is not satisfied. As soon as one and a
+half time units have passed, the guard condition becomes satisfied, and the
+<code>push</code> event becomes enabled. This edge models that the user starts to push
+the button after <code>1.5</code> time units. The user then waits for another <code>0.8</code>
+(<code>2.3</code> - <code>1.5</code>) time units, before releasing the button (stop pushing it).
+After waiting another <code>0.1</code> (<code>2.4</code> - <code>2.3</code>) time unit, the user pushes
+the button again. Finally, after waiting <code>5.2</code> (<code>7.6</code> - <code>2.4</code>) time
+units, the user releases the button one last time. In the <code>done</code> location,
+the <code>push</code> and <code>release</code> events are never enabled (no edges for those
+events), and thus the user never pushes or releases the button again. No other
+events are enabled, so time keeps progressing forever, without any events
+happening.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-time-transitions">Time transitions</h5>
+<div class="paragraph">
+<p>The state space of the above specification is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/user_state_space.png" alt="user state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the names of the current locations of automaton
+<code>user</code> and the current values of variable <code>time</code>. The transitions labeled
+with event names are <em>event transitions</em>. The other transitions are
+<em>time transitions</em>, which are labeled with the duration of the time
+transitions, i.e. the number of time units that passes. At the end of the
+state space, a time transition of infinite duration is shown, to indicate that
+time can progress forever.</p>
+</div>
+<div class="paragraph">
+<p>The current locations of automata can not change as time passes as the result
+of taking a time transition. The only way for the current locations to change,
+is as the result of taking an edge as part of an event transition.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-urgency">Urgency</h5>
+<div class="paragraph">
+<p>By default, all events in CIF are <em>urgent</em>. Events being urgent means that
+edges are taken as soon as possible. In other words, event transitions take
+priority over time transitions. Time can only progress if no event transitions
+are possible. For further details on urgency, see the future
+<a href="#tut-time-chapter-urgency">urgency</a> lesson.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-numeric-time">Numeric time</h5>
+<div class="paragraph">
+<p>In the above example, guard <code>time &gt;= 1.5</code> is used. You might wonder why the
+guard is not <code>time = 1.5</code>, as the intention is that user pushes the button
+after exactly <code>1.5</code> time units, and not after <code>1.6</code> or <code>1.7</code> time units.
+The main reason is that the <a href="#tools-cifsim-chapter-index">simulator</a> uses finite
+precision in its numeric calculations to find the moment in time that the edge
+becomes enabled. The answer also has finite precision. It is often not exactly
+at <code>1.5</code> time units, but is slightly after it, say at time
+<code>1.50000000000001</code>. If you use <code>time = 1.5</code> as guard instead of
+<code>time &gt;= 1.5</code>, the simulator will most likely
+<a href="#tools-cifsim-solver-chapter-root-problems">miss the change</a> in enabledness of
+the edge, and will never enable the event.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-continuous-variables">Continuous variables</h4>
+<div class="paragraph">
+<p>
+
+In the lesson that introduced <a href="#tut-time-chapter-intro">timing</a>, variable
+<code>time</code> was used. Variable <code>time</code> uses absolute model time, i.e.
+the total amount of time that has passed since the start of the simulation.
+It is usually easier to use relative model time, i.e. a certain amount of time
+passes after a certain event. This is where <em>continuous variables</em> are ideal.
+A continuous variable is a variable that changes value automatically, as time
+progresses. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine:
+  event start, finished;
+  cont t = 0 der 1;
+
+  location idle:
+    initial;
+    edge start do t := 0 goto producing;
+
+  location producing:
+    edge finished when t &gt;= 3 goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models a <code>machine</code> that is initially <code>idle</code>. The machine
+can <code>start</code> to produce a product. After a while, it is done <code>producing</code>.
+Due to having <code>finished</code> the product, it becomes <code>idle</code> again, until it is
+starts to product the next product.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div id="lang-tut-time-continuous-variables-deriv" class="paragraph">
+<p>Continuous variable <code>t</code> is declared to initially have value <code>0</code>. Its
+<em>derivative</em> is <code>1</code>, meaning that every unit of time that passes, the value
+of <code>t</code> increases by <code>1</code>. Every time the <code>start</code> event happens, the value
+of continuous variable <code>t</code> is reset to <code>0</code> using an assignment. As a result
+of this reset, <code>t</code> will be <code>0</code> when the automaton enters the <code>producing</code>
+location. The edge for the <code>finished</code> event indicates that the event can only
+happen when <code>t &gt;= 3</code> holds. This condition will hold after three time units.
+This means that automaton <code>machine</code> remains in the <code>producing</code> location for
+three time units, before going to the <code>idle</code> location.  It will thus always
+take three units after entering the  <code>producing</code> location, before the guard
+becomes enabled, and the <code>finished</code> event can take place. The state space is
+as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/machine_state_space.png" alt="machine state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the first letters of the names of the current
+locations of automaton <code>machine</code> and the current values of variables <code>time</code>
+and <code>t</code>.</p>
+</div>
+<div class="paragraph">
+<p>Continuous variables always have <a href="#tut-values-chapter-reals">real</a> values.
+Similar to discrete variables, if their initial value is not specified, it is
+<code>0.0</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont t der 1; // Initial value is 0.0.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The derivative of a continuous variable can be used as a variable as well. The
+derivative of continuous variable <code>t</code> is <code>t'</code>. A derivative is read only;
+it can not be assigned. Similar to algebraic variables, it is always equal to
+its definition. In the case of variable <code>t</code>, its derivative is always <code>1</code>.
+The values of variables <code>time</code>, <code>t</code>, and <code>t'</code> as time progresses are:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/machine_plot.png" alt="machine plot">
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-contvar-equations">Continuous variables and equations</h4>
+<div class="paragraph">
+<p>
+
+
+
+Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton person:
+  event turn;
+  cont t = 0 der 1;
+
+  location:
+    initial;
+    edge turn when t &gt; 10 do t := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models a <code>person</code> walking back and forth. Every time that
+the person has walked <code>10</code> time units, (s)he will <code>turn</code> around, walking
+in the other direction.</p>
+</div>
+<div class="paragraph">
+<p>In the example above, the derivative of the continuous variable is defined with
+the declaration, as was already explained in the lesson that introduced
+<a href="#tut-time-chapter-continuous-variables">continuous variables</a>. However, it
+also possible to specify the derivative separately, using an equation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton person:
+  event turn;
+  cont t = 0;         // Declaration specifies only the initial value.
+
+  equation t' = 1;    // Derivative specified using separate equation.
+
+  location:
+    initial;
+    edge turn when t &gt; 10 do t := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This allows for separation of variable declarations and equations. Both
+variants have the same continuous variable with the same derivative. An
+equation of a derivative of a continuous variable must be placed in the same
+component as where the continuous variable is declared. In the example above,
+the equation for <code>t'</code> must be placed in automaton <code>person</code>, as that is
+where <code>t</code> is declared.</p>
+</div>
+<div class="paragraph">
+<p>We could extend this specification to keep track of the direction that the
+person is moving:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton person:
+  event turn;
+  cont t = 0 der 1;
+
+  location away:
+    initial;
+    edge turn when t &gt; 10 do t := 0.0 goto back;
+
+  location back:
+    edge turn when t &gt; 10 do t := 0.0 goto away;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For continuous variables declared in automata, it is also possible to specify
+the derivative using an equation per location of the automaton. This allows us
+to keep track of the exact position of the person:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton person:
+  event turn;
+  cont pos = 0;
+
+  location away:
+    initial;
+    equation pos' = 1;
+    edge turn when pos &gt; 10 goto back;
+
+  location back:
+    equation pos' = -2;
+    edge turn when pos &lt; 0 goto away;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the continuous variable <code>t</code> has been renamed to <code>pos</code>, to make it
+more clear that it indicates the position of the person. As long as the
+person is moving <code>away</code>, the derivative of <code>pos</code> is <code>1</code>, and the
+person moves away, one place every time unit. When the person reaches
+position <code>10</code>, the position is not reset to zero. Instead, only the location
+is changed to the <code>back</code> location. In that location, the derivative of
+<code>pos</code> is <code>-2</code>. This means that every time unit, the position decreases
+by <code>2</code>. That is, the person back to the original position, but at twice the
+speed. The values of variables <code>time</code>, <code>pos</code>, and <code>pos'</code> as time
+progresses are:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/person_plot.png" alt="person plot">
+</div>
+</div>
+<div class="paragraph">
+<p>As with <a href="#tut-reuse1-chapter-algvar-equations">algebraic variables</a>, every
+continuous variable must have a unique derivative in every situation.
+Continuous variables must thus have a derivative with their declaration, a
+single equation in the same component, or an equation in every location of the
+automaton. For every continuous variable, one of the three variants must be
+chosen. It is allowed to choose a different variant for different continuous
+variables, but it is not allowed to use multiple variants for the same
+continuous variable.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-equations">Equations</h4>
+<div class="paragraph">
+<p>
+Consider the following
+<a href="http://en.wikipedia.org/wiki/Nonlinear_system">non-linear system</a>:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/tank.png" alt="tank">
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>V</code> models the water volume of a tank. The water volume of the tank
+changes based on the incoming flow of water <code>Qi</code> and outgoing flow of water
+<code>Qo</code>. The tank can be modeled using the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont V = 5 der Qi - Qo;
+alg real Qi = 1;
+alg real Qo = sqrt(V);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Initially, the tank is filled with <code>5</code> liters of water. The incoming flow is
+constant at <code>1</code> liter per second. The outgoing flow increases as the water
+volume of the tank increases.</p>
+</div>
+<div class="paragraph">
+<p>By separating the declarations of the three variables from their equations, the
+specification becomes more readable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont V = 5;
+alg real Qi;
+alg real Qo;
+
+equation V' = Qi - Qo;
+equation Qi = 1;
+equation Qo = sqrt(V);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The values of the variables as time passes are shown in the following figure:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/tank_plot.png" alt="tank plot">
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-var-overview">Variables overview</h4>
+<div class="paragraph">
+<p>
+
+CIF features different kinds of variables, that have different functionality.
+Each is better suited for a particular purpose. The following table gives an
+overview:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Kind of variable</th>
+<th class="tableblock halign-center valign-top">Can be assigned</th>
+<th class="tableblock halign-center valign-top">Can change as time progresses</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tut-data-chapter-discrete-variables">Discrete variable</a></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>yes</strong></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tut-reuse1-chapter-algebraic-variables">Algebraic variable</a></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>yes</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tut-time-chapter-continuous-variables">Continuous variable</a></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>yes</strong></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>yes</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#lang-tut-time-continuous-variables-deriv">Derivative of a continuous variable</a></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>yes</strong></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Discrete variables can only change value when given an explicit new value by
+means of an assignment. They don&#8217;t change automatically as time progresses.</p>
+</div>
+<div class="paragraph">
+<p>Algebraic variables can&#8217;t be assigned. Instead, their values depend on their
+declarations or equation(s). If the computations that result in their values
+depend on a variable that can change value as time progresses, then so can
+the values of the algebraic variables. Algebraic variables are used as named
+shorthand notations for computations, for readability, reuse, consistency, and
+abstraction.</p>
+</div>
+<div class="paragraph">
+<p>Continuous variables automatically change value as time progresses, as
+specified by their derivatives. They can also be assigned new values, from
+which they then automatically change again, based on the current values of
+their derivatives.</p>
+</div>
+<div class="paragraph">
+<p>The derivatives of the continuous variables can be seen as variables
+themselves. Their values depend on their declaration or equation(s). If the
+computations that result in their values depend on a variable that can change
+value as time progresses, then so can the values of the derivatives.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-urgency">Urgency</h4>
+<div class="paragraph">
+<p>
+In CIF, urgency indicates whether or not time may progress. CIF has three forms
+of urgency: event urgency, location urgency, and edge urgency. Edge urgency
+should be avoided, and is not explained here.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="tut-event-urgency">Event urgency</h5>
+<div class="paragraph">
+<p>By default, all events in CIF are <em>urgent</em>. Events being urgent means that
+edges are taken as soon as possible. In other words, event transitions take
+priority over time transitions. Time can only progress if no event transitions
+are possible. It is not possible to make events non-urgent in a CIF model, but
+specific tools may allow making events non-urgent.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-time-urgloc">Location urgency</h5>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton use_case:
+  location first:
+    initial;
+    edge tau goto second;
+
+  location second:
+    edge tau goto done;
+
+  location done;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This automaton represents a use case, which goes from one location to the next.
+The state space is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/usecase_nonurg_state_space.png" alt="usecase nonurg state space">
+</div>
+</div>
+<div class="paragraph">
+<p>The states are labeled with the names of the current locations of automaton
+<code>use_case</code> and the current values of variable time. At the end of the use
+case, no events are possible, and thus time can progress infinitely. To force
+that in location <code>done</code> no time can progress, the location can be made
+urgent:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton use_case:
+  location first:
+    initial;
+    edge tau goto second;
+
+  location second:
+    edge tau goto done;
+
+  location done:
+    urgent; // Location is now urgent.
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The resulting state space is:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/time/usecase_urgloc_state_space.png" alt="usecase urgloc state space">
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-time-chapter-deadlock-livelock">Deadlock and livelock</h4>
+<div class="paragraph">
+<p>This lesson explains the concepts of deadlock and livelock.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-time-deadlock">Deadlock</h5>
+<div class="paragraph">
+<p>If no event transitions are possible, and also no time transitions are possible
+(time may not progress), then no transitions are possible. This is called
+<em>deadlock</em>. No behavior is possible, or will ever become possible. As an
+example, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton use_case:
+  location wait3:
+    initial;
+    urgent;
+    edge tau when time &gt; 3 goto done;
+
+  location done;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Location <code>wait3</code> is the initial location. Initially, <code>time</code> is zero. Time
+can not progress, as the location is <a href="#lang-tut-time-urgloc">urgent</a>.
+Since the guard of the edge also does not hold, event <code>tau</code> is also not
+possible. No transitions are possible, and the specification is in deadlock.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-time-livelock">Livelock</h5>
+<div class="paragraph">
+<p>As long as an event is possible, no time may pass. If by mistake always an
+event is possible, this prevents all passage of time. Consider the following
+CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton car:
+  event increase, decrease, arrived;
+  disc real speed = 0;
+  cont pos der speed;
+
+  location underway:
+    initial;
+    edge increase when speed &lt; 100 do speed := speed + 1;
+    edge decrease when speed &gt; 0   do speed := speed - 1;
+    edge arrived  when pos = 850 goto done;
+
+  location done;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models a <code>car</code> that can <code>increase</code> and <code>decrease</code> its
+speed, so that it is at least <code>0</code> and at most <code>100</code>. It keeps track of its
+position (continuous variable <code>pos</code>) that increases more quickly as the speed
+increases. When position <code>850</code> is reached, the car has <code>arrived</code> and is
+<code>done</code>.</p>
+</div>
+<div class="paragraph">
+<p>The car will be increasing and decreasing it speed, using the <code>increase</code> and
+<code>decrease</code> events. As always at least one of them is enabled at any moment,
+time can never progress, and <code>pos</code> remains zero. This effect is called
+<em>livelock</em>. While behavior is still possible, the model does not truly progress
+with useful behavior. The model gets 'stuck' repeating one or a few events.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-channel-communication">Channel communication</h3>
+<div class="sect3">
+<h4 id="tut-channels-chapter-intro">Channels</h4>
+<div class="paragraph">
+<p>
+
+Consider the following figure of a producer and two consumers, where rectangles
+represent entities and the arrows represent the data that is communicated:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/channels/producer_consumer.png" alt="producer consumer">
+</div>
+</div>
+<div class="paragraph">
+<p>The producer creates products, identified by a unique identification
+number. Each product produced by the producer, is provided either to
+the first or to the second consumer. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event provide1, provide2;
+
+automaton producer:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide1, provide2 do nr := nr + 1;
+end
+
+automaton consumer1:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide1 do nr := producer.nr;
+end
+
+automaton consumer2:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide2 do nr := producer.nr;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>producer</code> keeps track of the identification number (variable <code>nr</code>) of
+the current product, and provides products to either the first consumer
+(event <code>provide1</code>) or the second consumer (<code>provide2</code>). Both consumers
+have an identification number of their current product as well (variable
+<code>nr</code> in the consumer automata). Initially, the consumers don&#8217;t have a
+product, as indicated by value <code>-1</code>. When a consumer gets a new product, it
+looks up the identification number of the product at the producer, and stores
+it locally. The producer then moves on to the next product, by increasing its
+current identification number.</p>
+</div>
+<div class="paragraph">
+<p>We can identify two problems in this model.</p>
+</div>
+<div class="paragraph">
+<p>The first problem is that we need two events in order for the producer to
+provide products to <em>either</em> the one consumer <em>or</em> the other consumer. If we
+used only one event, both consumers would need to use that event, have the
+event in their <a href="#tut-basics-chapter-alphabet">alphabet</a>, and would thus have
+to simultaneously participate in the
+<a href="#tut-basics-chapter-synchronizing-events">synchronization</a>. A consequence of
+having an event per consumer, is that the <code>producer</code> automaton has both
+events on its edge. Adding a third consumer entails having to add another
+event, as well as having to modify the edge of the <code>producer</code> automaton. This
+is not a nice scalable solution.</p>
+</div>
+<div class="paragraph">
+<p>The second problem is that the consumer refers directly to the <code>nr</code> variable
+of the <code>producer</code> automaton. This introduces a very tight coupling between
+the producer and the consumers. It exposes the <code>nr</code> variable of the
+<code>producer</code> to the consumers, making it more difficult to change the producer
+without changing the consumers.</p>
+</div>
+<div class="paragraph">
+<p>
+
+Both these problems can be solved by using <em>channels</em>. Channels are a special
+form of events, that can be used to communicate or transmit data from a
+<em>sender</em> to a <em>receiver</em>. In our example, data that is communicated are the
+identification numbers of the products, the producer is the sender, and the
+consumers are the receivers.</p>
+</div>
+<div class="paragraph">
+<p>Channels require one or more potential senders, and one or more potential
+receivers. Automata cannot be both sender and receiver for a single channel.
+They may however be a sender for one channel, and a receiver for another
+channel. For every transition, exactly one of the senders and exactly one of
+the receivers participate. The sender sends a value, and the receiver
+receives that value. This type of communication is often called channel
+communication or <em>point-to-point</em> communication, as the data is communicated
+from one point (the sender) to another point (the receiver).</p>
+</div>
+<div class="paragraph">
+<p>Multiple automata that synchronize over the same event perform a transition
+together. Similarly, a sender and receiver that together perform a
+channel communication, perform a transition together. In both cases,
+all automata involved take their respective edges <em>synchronously</em>
+(simultaneously).</p>
+</div>
+<div class="paragraph">
+<p>Channels are ideally suited for modeling product flows, or more generally the
+movement of physical entities through a system. Physical objects usually don&#8217;t
+duplicate themselves or spontaneously stop to exist. This fits nicely with
+channels, where data is communicated or passed along from exactly one sender
+to one receiver. In our example, product produced by the producer are
+physically provided to one of the consumers.</p>
+</div>
+<div class="paragraph">
+<p>The following CIF specification models the above example using channels:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int provide;
+
+automaton producer:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton consumer1:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end
+
+automaton consumer2:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+The <code>provide1</code> and <code>provide2</code> events have been replaced by a single
+channel named <code>provide</code>. Channels are declared similar to events, but have a
+<a href="#tut-values-chapter-types-values-exprs">data type</a> that indicates the type
+of <a href="#tut-values-chapter-types-values-exprs">values</a> that are communicated
+over the channel. In this case <a href="#tut-values-chapter-integers">integers</a> are
+communicated.</p>
+</div>
+<div class="paragraph">
+<p>
+
+The <code>producer</code> now uses the channel on its edge, instead of the two events.
+The exclamation mark (<code>!</code>) after the channel name means that the producer
+is sending over the channel. After the exclamation mark, the value that the
+producer sends is given. In this case, the producer sends the identification
+number of its current product.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+The edges of the consumers have been modified as well. The channel is used
+with a question mark (<code>?</code>) after the channel name, indicating that the
+consumers receive over the channel. The received value, which is available as
+the <code>?</code> variable in the update, is directly assigned to the <code>nr</code> variable
+of the consumer.</p>
+</div>
+<div class="paragraph">
+<p>By using channels, we no longer need multiple events, and the producer does not
+need to be modified if another consumer is added. This makes the model scalable
+to varying amount of consumers. Furthermore, the consumers now use the <code>?</code>
+variable to obtain the received value, and no longer need direct access to the
+variables of the producer. This makes it easier to modify the producer
+without having to also modify the consumers.</p>
+</div>
+<div class="paragraph">
+<p>To conclude this lesson, we&#8217;ll extend the example with a second producer:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int provide;
+
+automaton producer1:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton producer2:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton consumer1:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end
+
+automaton consumer2:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>producer</code> automaton has been renamed to <code>producer1</code>, and a
+<code>producer2</code> has been added. Both producers independently produce products
+and provide them to the consumers. Both consumers can receive products from
+either producer. At all times, four transitions are possible:
+<code>producer1</code> communicates with <code>consumer1</code>, <code>producer1</code> communicates with
+<code>consumer2</code>, <code>producer2</code> communicates with <code>consumer1</code>, or <code>producer2</code>
+communicates with <code>consumer2</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-channels-chapter-void">Dataless channels</h4>
+<div class="paragraph">
+<p>
+
+
+
+Besides channels that communicate data, it is also possible to use dataless
+channels. A channel that does not communicate any data, is declared with the
+<code>void</code> type. Dataless channels are also called <code>void</code> channels. When using
+dataless channels, the sender does not provide a value to send over the
+channel. Also, the receiver cannot use the received value (variable <code>?</code>)
+since no data is communicated.</p>
+</div>
+<div class="paragraph">
+<p>Dataless channels are used in the same situations as 'normal' channels,
+for instance when physical product flow is modeled. If products don&#8217;t
+have an identification number, and can not be distinguished based on color or
+some other property, all products are essentially equal. It is then sufficient
+to communicate that a product is being 'transferred'. No further data is
+needed. While it is possible to communicate dummy values, dataless channels
+provide a better solution in such cases.</p>
+</div>
+<div class="paragraph">
+<p>Consider again the producer/consumer example from the
+<a href="#tut-channels-chapter-intro">previous lesson</a>, with one producer and two
+consumers, but without identification numbers for the products:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event void provide;
+
+automaton producer:
+  location:
+    initial;
+    edge provide!;
+end
+
+automaton consumer1:
+  location:
+    initial;
+    edge provide?;
+end
+
+automaton consumer2:
+  location:
+    initial;
+    edge provide?;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>producer</code> still produces products and provides them to either the first
+or the second consumer.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-channels-chapter-chan-sync-combi">Combining channel communication with event synchronization</h4>
+<div class="paragraph">
+<p>
+Consider again the producer/consumer example with two producers and two
+consumers, from a <a href="#tut-channels-chapter-intro">previous lesson</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int provide;
+
+automaton producer1:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton producer2:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton consumer1:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end
+
+automaton consumer2:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now assume we want to restrict communication to allow at most five products in
+total to be provided to the consumers. We could adapt both producers, as
+follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton producer1:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr when nr + producer2.nr &lt; 5 do nr := nr + 1;
+end
+
+automaton producer2:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr when producer1.nr + nr &lt; 5  do nr := nr + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each producer gets an additional guard condition whether it may provide a
+product to one of the consumers. If the total number of products provided by
+both providers does not exceed five, they may still provide a product. Having
+to adapt both producers is less than ideal.</p>
+</div>
+<div class="paragraph">
+<p>As an alternative solution, we can add an additional automaton, instead of
+adapting the producers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton controller:
+  disc int cnt = 0;
+
+  location:
+    initial;
+    edge provide when cnt &lt; 5 do cnt := cnt + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This <code>controller</code> automaton (together with the original producer automata)
+keeps track of the number of products provided to consumers, by counting them
+in variable <code>cnt</code>. It only allows the <code>provide</code> event when less than five
+products have been provided. If five or more products have been provided, it
+disables the <code>provide</code> event.</p>
+</div>
+<div class="paragraph">
+<p>In the <code>controller</code> automaton, the <code>provide</code> channel is used as an event
+rather than a channel. When one of the producers and one of the consumers
+together perform a channel communication, the <code>controller</code> automaton that has
+the <code>provide</code> event in its <a href="#tut-basics-chapter-alphabet">alphabet</a>, must
+synchronize with it. This allows the <code>controller</code> to impose additional
+restrictions on the channel communication, allowing or forbidding it in
+certain cases. The <code>controller</code> is added as a separate process, which
+improves scalability.</p>
+</div>
+<div class="paragraph">
+<p>In general, every automaton may either send over a channel, receive over a
+channel, or synchronize with a channel. An automaton may not take on more than
+one of these roles, for a single event. It may however send over one channel,
+receive over another channel, and synchronize with yet another one.</p>
+</div>
+<div class="paragraph">
+<p>Every event transition for a channel requires exactly one automaton that
+participates as sender, and exactly one automaton that participates as
+receiver. Furthermore, all automata that have the channel in their alphabet,
+must additionally participate as well, by synchronizing together with the
+sender and receiver. Automata that send or receive over a channel, do not have
+that channel in their alphabet. Only automata that synchronize with an event
+or channel have that event or channel in their alphabet.</p>
+</div>
+<div class="paragraph">
+<p>Automata that synchronize over a channel can be used to further <em>restrict</em> the
+allowed channel communications, as shown in the above example. It is however
+also possible for the additional synchronizing automata to
+<a href="#tut-data-chapter-monitoring">monitor</a> (observe) the channel communication.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-functions">Functions</h3>
+<div class="sect3">
+<h4 id="tut-functions-chapter-intro">Functions</h4>
+<div class="paragraph">
+<p>
+
+Functions can be used to compute values from other values. CIF has many
+built-in functions, called <em>standard library functions</em>. An example is the
+<code>size</code> function, which takes a <a href="#tut-values-chapter-lists">list</a> and
+returns the number of elements of the list. Another example is the <code>abs</code>
+function, which takes an <a href="#tut-values-chapter-integers">integer</a> or
+<a href="#tut-values-chapter-reals">real</a> number and computes the absolute value of
+that number.</p>
+</div>
+<div class="paragraph">
+<p>
+While many built-in functions are available, they may not always suffice.
+User-defined functions can be added to CIF models, to allow custom computations
+needed by the model. By putting the calculation in a user-defined function, the
+calculation can be used in several places, allowing for reuse. Furthermore,
+functions allow for more complex computations than would otherwise be possible.</p>
+</div>
+<div class="paragraph">
+<p>
+CIF features two kinds of user-defined functions: internal ones and external
+ones. Internal user-defined functions are fully defined within the CIF model.
+External user-defined functions declare only a header which indicates the
+existence of the function, while the actual implementation is obtained from an
+external source. The lessons of this category only explain internal
+user-defined functions. The language reference documentation gives more
+information on external user-defined functions.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-functions-chapter-internal-functions">Internal user-defined functions</h4>
+<div class="paragraph">
+<p>
+The most commonly used <a href="#tut-functions-chapter-intro">kind</a> of user-defined
+functions are the internal user-defined functions. Consider the following CIF
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func real mean(list real vs):
+  int length = size(vs);
+  int index = 0;
+  real sum = 0;
+
+  while index &lt; length:
+    sum := sum + vs[index];
+    index := index + 1;
+  end
+  return sum / length;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+This specification defines a function (keyword <code>func</code>) named <code>mean</code>. After
+the name of the function, between the parentheses, the <em>parameters</em> are listed.
+The parameters are the input values, which the function can use to compute its
+result. In this example, the function takes a
+<a href="#tut-values-chapter-lists">list</a> of <a href="#tut-values-chapter-reals">real</a>
+values as its only parameter. Parameter name <code>vs</code> can be used in the body of
+the function to refer to this input value. Just after the <code>func</code> keyword, the
+<a href="#tut-values-chapter-types-values-exprs">type</a> of the <em>result</em> of the
+computation is specified. In this case, the function results in a
+<a href="#tut-values-chapter-reals">real</a> typed value. The <code>mean</code> function takes a
+list of integer values and produces a single real value as result.</p>
+</div>
+<div class="paragraph">
+<p>
+
+In the <em>body</em> of the function, local variables can be declared. The <code>mean</code>
+function declares three variables: <code>length</code>, <code>index</code>, and <code>sum</code>. Local
+variables of functions are very similar to
+<a href="#tut-data-chapter-discrete-variables">discrete variables</a>. The main
+difference is that they are
+declared without the <code>disc</code> keyword. In the example, <code>length</code> is set to the
+number of elements in list <code>vs</code>. Variables <code>index</code> and <code>sum</code> are both
+initialized to <code>0</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+After the local variables (if any), the statements of the body are given. The
+statements implement the algorithm, the actual computation of the function.
+Statements are executed one after another, in the order they are given. In the
+<code>mean</code> function, the <code>while</code> statement is executed before the <code>return</code>
+statement. The <code>mean</code> function first calculates the sum of the input values,
+and then <em>returns</em> the mean value. The details of the statements are discussed
+in the <a href="#tut-functions-chapter-statements">next lesson</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+A function can be called (or applied) on concrete input values, to obtain the
+computation result for those specific input values. For instance, consider the
+following extension to the above CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg real m = mean([1.5, 3.2, 7.9, 15.8]);
+
+automaton a:
+  disc real x;
+
+  location:
+    initial;
+    edge do x := 2 * mean([0.4, 1.5, 6.8]);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Algebraic variable <code>m</code> is given the value that results from calling function
+<code>mean</code> on a single <em>argument</em>, a list with four values. Each argument of a
+function call must match with the corresponding parameter of the function being
+called. In this case, the list of four real values matches with the <code>vs</code>
+parameter of the <code>mean</code> function, which has type <code>list real</code>. Variable
+<code>m</code> becomes <code>7.1</code>, as the mean of those four values is <code>7.1</code>
+(<code>(1.5 + 3.2 + 7.9 + 15.8) / 4</code>).</p>
+</div>
+<div class="paragraph">
+<p>The edge in automaton <code>a</code> assigns a value to variable <code>x</code>. The mean of a
+list of three values is calculated, and multiplied by two, to obtain the new
+value of <code>x</code>. The mean of <code>0.4</code>, <code>1.5</code>, and <code>6.8</code> is
+<code>(0.4 + 1.5 + 6.8) / 3</code>, which is <code>2.9</code>. Variable <code>x</code> gets <code>5.8</code>
+(<code>2.9 * 2</code>) as its new value.</p>
+</div>
+<div class="paragraph">
+<p>Function <code>mean</code> is called in two places in the example, showing reuse of
+calculations.</p>
+</div>
+<div class="paragraph">
+<p>
+Functions in CIF are mathematical functions. That is, the result of a function
+is the same for the same input values, and functions have no side effects.
+Functions can not directly access variables outside their body. For example,
+they cannot access discrete, continuous, and algebraic variables. They can also
+not use variable <code>time</code>. To use the values of those variables in a function,
+they have to to be passed in through parameters.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-functions-chapter-statements">Function statements</h4>
+<div class="paragraph">
+<p>
+This lesson explains the different statements that can be used in internal
+user-defined functions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-tut-functions-statements-assignment">Assignment statement</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions-statements-if">If statement</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions-statements-return">Return statement</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions-statements-while">While statement</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions-statements-break">Break statement</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-functions-statements-continue">Continue statement</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-assignment">Assignment statement</h5>
+<div class="paragraph">
+<p>Assignments in functions are very similar to assignments to
+<a href="#tut-data-chapter-discrete-variables">discrete variables</a>. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">x := x + 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Besides local variables, it also allowed to assign new values to the
+parameters. Changes to parameters only have effect inside the function itself.</p>
+</div>
+<div class="paragraph">
+<p>For <a href="#lang-tut-data-asgn-old-vs-new-multi">multi-assignments</a>, the
+outer parentheses are not needed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Multi-assignment on an edge.
+edge do (x, y) := (1, 2);
+
+// Multi-assignment in a function.
+x, y := 1, 2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-if">If statement</h5>
+<div class="paragraph">
+<p>It is possible to perform different calculations under different circumstances.
+Consider the following function:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func int signum(real x):
+  if x &gt; 0:
+    return 1;
+  elif x &lt; 0:
+    return -1;
+  else
+    return 0;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This <code>signum</code> function takes a real number <code>x</code> and returns its
+<a href="http://en.wikipedia.org/wiki/Signum_function">sign</a>.
+The <code>if</code> statement
+is used to detect the different situations, and to return the correct result
+in each of those situations.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-return">Return statement</h5>
+<div class="paragraph">
+<p>The execution of a function ends when a <code>return</code> statement is encountered.
+The value following the <code>return</code> statement is the result of the entire
+function. Consider again the <code>return</code> statement from the <code>mean</code> function
+from the <a href="#tut-functions-chapter-internal-functions">previous lesson</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">return sum / length;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this case, the <code>sum</code> of the input values is divided by the number of input
+elements (variable <code>length</code>) to obtain the mean of the input values. The mean
+of the input values is the result of the function.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-while">While statement</h5>
+<div class="paragraph">
+<p>The <code>while</code> statements allows for repeated execution of the statements in its
+body, as long as the condition of the <code>while</code> loop holds. Consider again the
+<code>mean</code> function from the
+<a href="#tut-functions-chapter-internal-functions">previous lesson</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func real mean(list real vs):
+  int length = size(vs);
+  int index = 0;
+  real sum = 0;
+
+  while index &lt; length:
+    sum := sum + vs[index];
+    index := index + 1;
+  end
+  return sum / length;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>mean</code> function processes each of its input values, using a <code>while</code>
+loop. As long as the condition (<code>index &lt; length</code>) holds, the body of the
+<code>while</code> is executed over an over. The body consists of two assignments. The
+first assignment obtains an input value (<code>vs[index]</code>) and adds it to the
+<code>sum</code>. The second statement increases the index, to proceed with the next
+input value. After the two assignments have been executed, the condition of the
+<code>while</code> is evaluated again. If the condition still holds, the two assignments
+are executed again, etc. When the condition no longer holds, the <code>while</code>
+statement is done, and execution proceeds with the next statement, the
+<code>return</code> statement.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-break">Break statement</h5>
+<div class="paragraph">
+<p>A <code>break</code> statement 'jumps out' of a <code>while</code> statement, continuing with the
+first statement after the <code>while</code>. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Get the first 'n' values from 'xs' that are not 'bad'.
+func list int first_n(list int xs; int n; int bad):
+  int index = 0;
+  int x;
+  list int result = [];
+
+  while index &lt; size(xs):
+    x := xs[index];
+    if x != bad:
+      result := result + [x];
+    end
+    if size(result) = n:
+      break;
+    end
+    index := index + 1;
+  end
+  return result;
+end
+
+// The value of 'y' is [1, 5, 3].
+alg list int y = first_n([1, 2, 5, 3, 4, 1, 3], 3, 2);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>first_n</code> function takes a list of integer numbers <code>xs</code>, and returns a
+list <code>result</code> with the first <code>n</code> numbers from <code>xs</code> that are not <code>bad</code>.
+A <code>while</code> loop is used to process each of the numbers in list <code>xs</code>. The
+current number is stored in variable <code>x</code>. If the current number is not the
+same as <code>bad</code>, it is added to the <code>result</code>. If the <code>result</code> then contains
+<code>n</code> values, the <code>break</code> statement is used to break out of the <code>while</code>
+loop and continue execution at the first statement after the <code>while</code> loop,
+which is the <code>return</code> statement. If less than <code>n</code> values are in the result,
+<code>index</code> is incremented to ensure the next number of the list is processed in
+the next iteration of the <code>while</code> loop. The <code>return</code> statement at the end
+of the function is used to return the <code>result</code> list, which contains at most
+<code>n</code> values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-functions-statements-continue">Continue statement</h5>
+<div class="paragraph">
+<p>A <code>continue</code> statement 'jumps over' the remaining statements in the body
+of a <code>while</code> statement, and continues with the next iteration of that
+<code>while</code> statement. Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Get the values from 'xs' that are greater than 5.
+func list int filter_gt5(list int xs):
+  int index = 0;
+  int x;
+  list int result = [];
+
+  while index &lt; size(xs):
+    x := xs[index];
+    index := index + 1;
+    if x &lt;= 5:
+      continue;
+    end
+    result := result + [x];
+  end
+  return result;
+end
+
+// The value of 'y' is [8, 7, 6].
+alg list int y = filter_gt5([1, 8, 5, 7, 4, 6, 3]);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>filter_gt5</code> function takes a list of integer numbers, and returns a
+filtered list that only contains those integer number that are greater than 5.
+A <code>while</code> loop is used to process each of the numbers in list <code>xs</code>. The
+current number is stored in variable <code>x</code>, and <code>index</code> is incremented to
+ensure the next number of the list is processed in the next iteration of the
+<code>while</code> loop. If the current number is not greater than 5, the remaining
+statements in the body of the <code>while</code> are skipped, meaning <code>x</code> is not
+added to the <code>result</code>. The <code>while</code> loop then continues with the next
+iteration, for the next number in <code>xs</code>. If the current number (<code>x</code>) is
+greater than 5, execution continues after the <code>if</code> statement, and the number
+is added to the <code>result</code>. After all numbers in the list have been processed,
+the filtered <code>result</code> list is returned to the caller of the function.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-functions-chapter-functions-as-values">Functions as values</h4>
+<div class="paragraph">
+<p>Functions can be used as <a href="#tut-values-chapter-types-values-exprs">values</a>.
+By treating them as data, they can be stored in variables, and passed to other
+functions. This lesson shows one example of how that can be useful.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following list of numbers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg list real nrs = [0.5, 1.3, 0.1, 2.7, 1.4];</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Now assume we wanted to sort these numbers both in increasing and in decreasing
+order, using a single sorting function:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg list real inc = sort(nrs, cmp_inc); // [0.1, 0.5, 1.3, 1.4, 2.7]
+alg list real dec = sort(nrs, cmp_dec); // [2.7, 1.4, 1.3, 0.5, 0.1]</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>inc</code> contains the same numbers as <code>nrs</code>, but sorted in increasing
+order, while <code>dec</code> contains them in decreasing order. We use the same
+<code>sort</code> function in both cases, but with different comparison functions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func bool cmp_inc(real a, b):
+  return a &lt;= b;
+end
+
+func bool cmp_dec(real a, b):
+  return a &gt;= b;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Function <code>cmp_inc</code> takes two real numbers and returns <code>true</code> only if the
+first number is smaller than the second one (<code>a</code> and <code>b</code> are in increasing
+order). Function <code>cmp_dec</code> has the same parameters, but returns <code>true</code> only
+if the first number is larger than the second one (<code>a</code> and <code>b</code> are in
+decreasing order). The <code>sort</code> function is defined as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func list real sort(list real xs; func bool (real, real) cmp):
+  int i = 1, j;
+  real x;
+
+  while i &lt; size(xs):
+    j := i;
+    while j &gt; 0 and not cmp(xs[j-1], xs[j]):
+      // swap x[j-1] and x[j]
+      x := xs[j-1];
+      xs[j-1] := xs[j];
+      xs[j] := x;
+      j := j - 1;
+    end
+    i := i + 1;
+  end
+  return xs;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>sort</code> function has two parameters. The first parameter is <code>xs</code>, which
+contains the values to sort. The second parameter is <code>cmp</code>, the compare
+function to use to determine whether two numbers are correctly ordered. The
+<code>cmp</code> parameter has type <code>func bool (real, real)</code>, which means that a
+function that has two real parameters and a boolean return value is required.
+The <code>cmp_inc</code> and <code>cmp_dec</code> functions satisfy these requirements, and can
+be used as second argument when the function is called to determine the values
+of algebraic variables <code>inc</code> and <code>dec</code>.</p>
+</div>
+<div class="paragraph">
+<p>The <code>sort</code> function implements a standard
+<a href="http://en.wikipedia.org/wiki/Insertion_sort">insertion sort</a>
+algorithm. The
+<code>cmp</code> parameter is used in the <code>sort</code> function to compare two consecutive
+values in <code>xs</code>, and swap them if they are not correctly ordered.</p>
+</div>
+<div class="paragraph">
+<p>The <code>cmp</code> parameter of the <code>sort</code> function has a function type, allowing
+compare functions to be passed to the <code>sort</code> function, as data. This allows
+the <code>sort</code> function to sort lists of numbers in different orders, depending
+on the compare function that is provided.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-scalable-solutions-and-reuse-22">Scalable solutions and reuse (2/2)</h3>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-aut-def-inst">Automaton definition/instantiation</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+Parts of a system that are nearly identical, are often modeled as nearly
+identical automata. Having to specify them multiple times can be burdensome.
+It can also hinder scalability, as changes to one of them usually need to be
+applied to the others as well. Consider again the producer/consumer
+example from the <a href="#tut-channels-chapter-intro">lesson that introduced channels</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int provide;
+
+automaton producer:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton consumer1:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end
+
+automaton consumer2:
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The producer provides products either to the first consumer or to the second
+consumer. The consumers are modeled using identical automata. Only the names of
+the <code>consumer1</code> and <code>consumer2</code> automata differ. Ideally, we would have a
+sort of consumer template, and use that template twice, once for each of the
+actual consumers. This can be achieved in CIF using an <em>automaton definition</em>
+(the template) and two <em>automaton instantiations</em> (the uses of the template):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int provide;
+
+automaton producer:
+  disc int nr = 0;
+
+  location:
+    initial;
+    edge provide!nr do nr := nr + 1;
+end
+
+automaton def Consumer():
+  disc int nr = -1;
+
+  location:
+    initial;
+    edge provide? do nr := ?;
+end
+
+consumer1: Consumer();
+consumer2: Consumer();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>Consumer</code> automaton definition is identical to the original consumers,
+except that it is an automaton definition rather than an automaton. An
+automaton definition can be identified by the <code>def</code> keyword between the
+<code>automaton</code> keyword and the name of the automaton definition, as well as by
+the parentheses after its name. As a convention, names of automaton definitions
+start with an upper case letter (<code>Consumer</code> rather than <code>consumer</code>).</p>
+</div>
+<div class="paragraph">
+<p>An automaton definition by itself is not an automaton. The instantiations of
+the automaton definition (<code>consumer1</code> and <code>consumer2</code>) however, <em>are</em>
+automata. Before the colon (<code>:</code>), the name of the instantiation is given.
+This name is also the name of the actual automaton. After the colon, the name
+of the automaton definition that is instantiated is given.</p>
+</div>
+<div class="paragraph">
+<p>Using an automaton definition, the above example models the behavior of a
+consumer only once. Adding a third consumer is as easy as adding another
+automaton instantiation, which takes only one line of code
+(<code>consumer3: Consumer();</code>). Changing the behavior of all consumers only
+requires changes to the common automaton definition. Automaton
+definition/instantiation allows for scalability and reuse, and also improves
+maintainability.</p>
+</div>
+<div class="paragraph">
+<p>Automaton definition/instantiation can be eliminated, by replacing all
+automaton instantiations by the automaton definitions that they instantiate,
+and changing the automaton definition header (<code>automaton def Consumer():</code>) by
+an automaton header (<code>automaton consumer1:</code>). If we do that for the example
+above, we obtain the original specification from the beginning of this lesson.
+The two specifications are functionally equivalent. Automaton instantiation
+<code>consumer1</code> is also often referred to as automaton <code>consumer1</code>, when there
+is no confusion.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-aut-def-params">Parametrized automaton definitions</h4>
+<div class="paragraph">
+<p>
+
+
+In the <a href="#tut-reuse2-chapter-aut-def-inst">previous lesson</a>, automaton
+definition/instantiation was used to obtain two identical automata, while only
+having to specify their behavior once. What we have seen so far, is enough for
+exactly identical automata, but not for nearly identical automata. Consider the
+following two nearly identical consumers:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton consumer1:
+  disc list int buffer = [];
+
+  location:
+    initial;
+    edge provide? when size(buffer) &lt; 2 do buffer := buffer + [?];
+end
+
+automaton consumer2:
+  disc list int buffer = [];
+
+  location:
+    initial;
+    edge provide? when size(buffer) &lt; 3 do buffer := buffer + [?];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The consumers can accept products that the producer provides (channel
+<code>provide</code>). They store the identification numbers of those products in a
+<code>buffer</code>. The two consumers are identical except for the number of products
+that they can accept: the first consumer can accept two products, the second
+producer can accept three products. We can still use automaton definition and
+instantiation to model the consumer only once, but we need to parametrize the
+automaton definition:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Consumer(alg int capacity):
+  disc list int buffer = [];
+
+  location:
+    initial;
+    edge provide? when size(buffer) &lt; capacity do buffer := buffer + [?];
+end
+
+consumer1: Consumer(2);
+consumer2: Consumer(3);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>Consumer</code> automaton definition now has a parameter named <code>capacity</code>
+that indicates how many identification numbers can be stored in its <code>buffer</code>.
+The automaton instantiations <code>consumer1</code> and <code>consumer2</code> provide an
+argument (<code>2</code> and <code>3</code> respectively) to match the parameter of <code>Consumer</code>.
+That is, the instantiations indicate their <code>capacity</code>. Using parameters, the
+<code>Consumer</code> automaton definition models the behavior of both automata
+<code>consumer1</code> and <code>consumer2</code>, even though they have different capacities.</p>
+</div>
+<div class="paragraph">
+<p>The details of the different kind of parameters of automaton definitions are
+explained in the <a href="#tut-reuse2-chapter-aut-def-param-kinds">next lesson</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-aut-def-param-kinds">Automaton definition parameters</h4>
+<div class="paragraph">
+<p>
+
+In the <a href="#tut-reuse2-chapter-aut-def-params">previous lesson</a>, an automaton
+definition with parameter was used. The parameter was an algebraic parameter,
+which is only one of the different kinds of automaton definition parameters.
+This lesson explains each of them:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-tut-reuse2-aut-def-param-kinds-alg">Algebraic parameters</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-reuse2-aut-def-param-kinds-event">Event parameters</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-reuse2-aut-def-param-kinds-loc">Location parameters</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-reuse2-aut-def-param-kinds-aut">Automaton parameters</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>This lesson also explains how to use
+<a href="#lang-tut-reuse2-aut-def-param-kinds-multiple">multiple parameters</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-reuse2-aut-def-param-kinds-alg">Algebraic parameters</h5>
+<div class="paragraph">
+<p>An algebraic parameter is similar to an
+<a href="#tut-reuse1-chapter-algebraic-variables">algebraic variable</a>. Arbitrary
+values or expressions of matching type can be provided as arguments in
+automaton instantiations. For instance, consider the following partial CIF
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int accept, provide;
+
+automaton def Buffer(alg int capacity):
+  disc list int buf = [];
+
+  location:
+    initial;
+    edge accept?        when size(buf) &lt; capacity do buf := buf + [?];
+    edge provide!buf[0] when size(buf) &gt; 0        do buf := buf[1:];
+end
+
+buffer1: Buffer(5);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>Buffer</code> has an algebraic parameter that indicates the
+<code>capacity</code> of the buffer. The buffer can <code>accept</code> something when it has not
+yet reached its capacity. It can <code>provide</code> something when the buffer is not
+empty. Automaton instantiation <code>buffer1</code> has value <code>5</code> as its parameter.
+Value <code>5</code> is an integer number, which matches the integer type (<code>int</code>) of
+the <code>capacity</code> parameter.</p>
+</div>
+<div class="paragraph">
+<p>Algebraic parameters can be used inside an automaton definition, wherever a
+value is expected, e.g. in guards, updates, initial values of discrete
+variables, and invariants. The expression that is provided by the instantiation
+is essentially filled in wherever the parameter is used. The above is
+equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int accept, provide;
+
+automaton buffer1:
+  disc list int buf = [];
+
+  location:
+    initial;
+    edge accept?        when size(buf) &lt; 5 do buf := buf + [?];
+    edge provide!buf[0] when size(buf) &gt; 0 do buf := buf[1:];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-reuse2-aut-def-param-kinds-event">Event parameters</h5>
+<div class="paragraph">
+<p>Event parameters allow different instantiations to synchronize with different
+events or to communicate over different
+<a href="#tut-channels-chapter-intro">channels</a>. For instance, consider the
+following partial CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int generate, pass_along, exit;
+
+automaton def Buffer(event int accept, provide):
+  disc int buffer;
+
+  location accepting:
+    initial;
+    edge accept? do buffer := ? goto providing;
+
+  location providing:
+    edge provide!buffer goto accepting;
+end
+
+buffer1: Buffer(generate, pass_along);
+buffer2: Buffer(pass_along, exit);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>Buffer</code> is parametrized with two channels, one to
+<code>accept</code> a product into the one place buffer, and one to <code>provide</code> it to
+some other part of the system. The first buffer (<code>buffer1</code>) accepts products
+via the <code>generate</code> channel, and provides products via the <code>pass_along</code>
+channel. The second buffer (<code>buffer2</code>) accepts products via the
+<code>pass_along</code> channel, and provides products via the <code>exit</code> channel. The
+first buffer uses the <code>pass_along</code> channel as its <code>provide</code> channel
+parameter, and the second buffer uses that same <code>pass_along</code> channel as its
+<code>accept</code> channel parameter. The first buffer thus provides its items to the
+second buffer.</p>
+</div>
+<div class="paragraph">
+<p>Event and channel parameters can be used inside an automaton definition,
+wherever an event or channel is expected, e.g. on edges and in
+<a href="#tut-basics-chapter-alphabet">alphabets</a> if
+<a href="#lang-tut-basics-alphabet-explicit">explicitly specified</a>. The event or
+channel that is provided by the instantiation is essentially filled in wherever
+the parameter is used. The above is equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event int generate, pass_along, exit;
+
+automaton buffer1:
+  disc int buffer;
+
+  location accepting:
+    initial;
+    edge generate? do buffer := ? goto providing;
+
+  location providing:
+    edge pass_along!buffer goto accepting;
+end
+
+automaton buffer2:
+  disc int buffer;
+
+  location accepting:
+    initial;
+    edge pass_along? do buffer := ? goto providing;
+
+  location providing:
+    edge exit!buffer goto accepting;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+</p>
+</div>
+<div class="sect5">
+<h6 id="lang-tut-reuse2-aut-def-param-kinds-event-restrictions">Channel parameter usage restrictions</h6>
+<div class="paragraph">
+<p>If an event parameter is actually a channel (it has a data type), it may also
+be called a <em>channel parameter</em>. By default, a channel parameter can be used to
+send, receive, or synchronize. However, it is also possible to restrict the
+allowed usages. By putting certain event usage restriction flags after the name
+of the channel parameter, only those usages are allowed. The available flags
+are <code>!</code> to allow sending, <code>?</code> to allow receiving, and <code>~</code> to allow
+synchronizing. Duplicate flags are not allowed, the <code>!</code> should be before the
+<code>?</code> flag, and the <code>!</code> and <code>?</code> flags should be before the <code>~</code> flag.</p>
+</div>
+<div class="paragraph">
+<p>By restricting the usages, you can immediately see how a channel parameter is
+used within the automaton definition, as only the usages indicates by the
+parameter are allowed. It serves as sort of documentation of the intention of
+the channel parameter. This is much simpler than finding the actual usages of
+the parameter in the automaton. However, note that the parameter indicates the
+allowed usages, and doesn&#8217;t guarantee that the event/parameter is actually used
+at all.</p>
+</div>
+<div class="paragraph">
+<p>Another benefit of restricting the usages, is that it makes it possible to spot
+mistakes. You might for instance use a channel parameter on an edge (e.g.
+<code>edge e</code>), but forget to include the send part (e.g. <code>edge e!1</code>). If the
+parameter only allows sending, the accidental synchronization (<code>edge e</code>) is
+reported as an invalid use. Without the usage checking, you might not encounter
+the problem until for instance simulation, where it is much more difficult to
+find the cause.</p>
+</div>
+<div class="paragraph">
+<p>For the example above, we have the following <em>header</em> of the <code>Buffer</code>
+definition:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Buffer(event int accept, provide):</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We can change this as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Buffer(event int accept?, provide!):</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This makes it clearer that the <code>accept</code> channel is used to receive a
+product into the buffer, and the <code>provide</code> channel is used send a product
+from the buffer.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-reuse2-aut-def-param-kinds-loc">Location parameters</h5>
+<div class="paragraph">
+<p>An earlier lesson explained how a
+<a href="#tut-data-chapter-locs-as-var">location can be used as a variable</a>. Using
+location parameters, automaton definitions can be supplied with different
+locations. For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Machine(location other_processing):
+  location heat_up:
+    initial;
+    edge when not other_processing goto processing;
+
+  location processing:
+    edge tau goto cool_down;
+
+  location cool_down:
+    edge tau goto heat_up;
+end
+
+machine1: Machine(machine2.processing);
+machine2: Machine(machine1.processing);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>Machine</code> represents a machine that can heat up, process
+something, cool down, and repeat that forever. The system consists of two of
+those machines. The machines can not start processing if the other machine is
+already processing. That is, the machines perform
+<a href="http://en.wikipedia.org/wiki/Mutual_exclusion">mutually exclusive</a>
+processing. If the first machine is in its <code>processing</code> location, the other
+can&#8217;t also be processing (in its own <code>processing</code> location). To prevent a
+machine from starting to process if the other machine is already processing,
+each machine needs to know whether the other is already processing. Therefore,
+automaton definition <code>Machine</code> is parametrized with a location parameter
+<code>other_processing</code>, that indicates whether the other machine is currently
+processing (in its <code>processing</code> location). This parameter is used as a guard
+that determines whether a transition from location <code>heat_up</code> to location
+<code>processing</code> is allowed. Automaton instantiation <code>machine1</code> provides the
+first machine with the <code>processing</code> location of the second machine, by
+using <code>machine2.processing</code> as its instantiation argument.</p>
+</div>
+<div class="paragraph">
+<p>Location parameters can be used inside an automaton definition, wherever a
+<a href="#tut-values-chapter-booleans">boolean</a> value is expected, e.g. in guards.
+The location that is provided by the instantiation is essentially filled in
+wherever the parameter is used. The above is equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton machine1:
+  location heat_up:
+    initial;
+    edge when not machine2.processing goto processing;
+
+  location processing:
+    edge tau goto cool_down;
+
+  location cool_down:
+    edge tau goto heat_up;
+end
+
+automaton machine2:
+  location heat_up:
+    initial;
+    edge when not machine1.processing goto processing;
+
+  location processing:
+    edge tau goto cool_down;
+
+  location cool_down:
+    edge tau goto heat_up;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-reuse2-aut-def-param-kinds-aut">Automaton parameters</h5>
+<div class="paragraph">
+<p>When multiple declarations (variables, locations, etc) from one automaton are
+to be supplied as parameters to another automaton, it is also possible to
+supply the entire automaton as a parameter, but only if the provided automaton
+is an instantiation of an automaton definition. Consider for instance the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Sensor():
+  event go_on, go_off;
+
+  location off:
+    initial;
+    edge go_on goto on;
+
+  location on:
+    edge go_off goto off;
+end
+
+sensor1: Sensor();
+sensor2: Sensor();
+
+automaton def Actuator(Sensor sensor):
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on  when sensor.on  goto on;
+
+  location on:
+    edge turn_off when sensor.off goto off;
+end
+
+actuator1: Actuator(sensor1);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>Sensor</code> models a sensor that can go on an off. Both
+<code>sensor1</code> and <code>sensor2</code> are actual sensors. Automaton definition
+<code>Actuator</code> models an actuator that can be turned on if a sensor is on, and be
+turned off if that same sensor is off. The <code>actuator1</code> automaton is provided
+<code>sensor1</code> as sensor. If <code>sensor1</code> goes on, <code>actuator1</code> is turned on, and
+if <code>sensor1</code> goes off, <code>actuator1</code> is turned off. <code>sensor2</code> going on or
+off has no effect on <code>actuator1</code>.</p>
+</div>
+<div class="paragraph">
+<p>Automaton parameters can be used inside an automaton definition, to refer to
+declarations inside the automaton supplied for the automaton parameter. The
+automaton that is provided by the instantiation is essentially filled in
+wherever the parameter is used. The above is equivalent to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton sensor1:
+  event go_on, go_off;
+
+  location off:
+    initial;
+    edge go_on goto on:
+
+  location on:
+    edge go_off goto off:
+end
+
+automaton sensor2:
+  event go_on, go_off;
+
+  location off:
+    initial;
+    edge go_on goto on:
+
+  location on:
+    edge go_off goto off:
+end
+
+automaton actuator1:
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on  when sensor1.on  goto on;
+
+  location on:
+    edge turn_off when sensor1.off goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-reuse2-aut-def-param-kinds-multiple">Multiple parameters</h5>
+<div class="paragraph">
+<p>It is possible to use multiple parameters of the same kind, as well as
+different kinds of parameters:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def X(event a, b; alg real c; event d):
+  ...
+end
+
+event z;
+
+x: X(z, z, 3 * 5, z);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>X</code> has four parameters: <code>a</code>, <code>b</code>, <code>c</code>, and <code>d</code>.
+Since <code>a</code> and <code>b</code> are both event parameters, a comma (<code>,</code>) is used to
+make sure the <code>event</code> keyword does not need to be repeated for parameter
+<code>b</code>. Algebraic parameter <code>d</code> is of a different kind, and is therefore
+separated using a semicolon (<code>;</code>).</p>
+</div>
+<div class="paragraph">
+<p>Automaton instantiation <code>x</code> instantiates <code>X</code> with the event <code>z</code> (for the
+first, second, and fourth parameters), and value 15.0 (<code>3 * 5</code>, for the third
+parameter).</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-groups">Groups</h4>
+<div class="paragraph">
+<p>
+
+For large CIF specifications with many automata, it can be beneficial to add
+more structure to the specification. For this purpose, CIF has <em>groups</em>. Groups
+are named collections of automata and other declarations. For instance,
+consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group factory:
+  group hall1:
+    automaton machine1:
+      ...
+    end
+
+    automaton machine2:
+      ...
+    end
+  end
+
+  group hall2:
+    automaton machine1:
+      ...
+    end
+
+    automaton machine2:
+      ...
+    end
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specifications features four automata that model the behavior of machines.
+The details of the actual automata are omitted, as they are irrelevant for this
+lesson. All four machines are in the same factory, but they are divided into
+two halls. This physical subdivision is expressed in the CIF specification
+using groups named <code>factory</code>, <code>hall1</code>, and <code>hall2</code>. While in this case
+the subdivision into a hierarchical specification structure is based on the
+physical subdivision of the actual system, the modeler is free to base the
+specification structure on other criteria.</p>
+</div>
+<div class="paragraph">
+<p>Consider also the following partial CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group configuration:
+  const int  MAX_PRODUCTS        = 1500;
+  const real MAX_PRODUCTION_TIME = 3.7;
+  const real ARRIVAL_RATE        = 28.6;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>configuration</code> group is used to group together several configuration
+values, modeled by constants. By grouping these constants together, it is more
+clear that they together are the configuration settings of the system, and that
+they belong together.</p>
+</div>
+<div class="paragraph">
+<p>Finally, consider the following CIF specification, based on the
+<a href="http://en.wikipedia.org/wiki/Nonlinear_system">non-linear system</a>
+from the lesson on <a href="#tut-time-chapter-equations">equations</a>.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group tank:
+  cont V = 5;
+  alg real Qi;
+  alg real Qo;
+
+  equation V' = Qi - Qo;
+  equation Qi = 1;
+  equation Qo = sqrt(V);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By grouping the declarations and their equations together, it is becomes clear
+that together they model a <code>tank</code>. This is especially useful if other parts
+of the specification model something different.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-group-defs">Group definitions</h4>
+<div class="paragraph">
+<p>
+
+
+Similar to how <a href="#tut-reuse2-chapter-aut-def-inst">automaton definitions</a> can
+be used for reuse of automata, group definitions can be used for reuse of
+groups:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton def Machine():
+  location:
+    initial;
+  ...
+end
+
+group def Hall():
+  machine1: Machine();
+  machine2: Machine();
+end
+
+group def Factory():
+  hall1: Hall();
+  hall2: Hall();
+end
+
+factory1: Factory();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton definition <code>Machine</code> models a machine, but most of the details are
+omitted here, as they are not relevant for this lesson. Group definition
+<code>Hall</code> models that each hall has two machines. Similarly, group definition
+<code>Factory</code> models that each factory has two halls.</p>
+</div>
+<div class="paragraph">
+<p>
+
+Automata and groups are both <em>components</em> in CIF. Automaton definitions and
+group definitions can together be called <em>component definitions</em>. If we
+eliminate all component definitions and their instantiations, by replacing
+instantiations by their definitions, we get the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group factory1:
+  group hall1:
+    automaton machine1:
+      location:
+        initial;
+      ...
+    end
+
+    automaton machine2:
+      location:
+        initial;
+      ...
+    end
+  end
+
+  group hall2:
+    automaton machine1:
+      location:
+        initial;
+      ...
+    end
+
+    automaton machine2:
+      location:
+        initial;
+      ...
+    end
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Group definitions may be <a href="#tut-reuse2-chapter-aut-def-params">parametrized</a>
+using the same <a href="#tut-reuse2-chapter-aut-def-param-kinds">kinds of parameters</a>
+as automaton definitions.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-imports">Imports</h4>
+<div class="paragraph">
+<p>
+For large systems, having to model the entire system in a single CIF file can
+lead to long CIF specifications. Being able to split that single CIF file into
+multiple CIF files can help. Consider the following two CIF specifications in
+CIF files <code>producer.cif</code> and <code>consumer.cif</code> respectively:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// producer.cif
+
+event provide;
+
+automaton producer:
+  location:
+    initial;
+    edge provide;
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// consumer.cif
+
+import &quot;producer.cif&quot;;
+
+automaton consumer:
+  location:
+    initial;
+    edge provide;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The two CIF specifications together form a simplified producer/consumer system.
+The <code>producer.cif</code> file declares the <code>provide</code> event and the <code>producer</code>
+automaton. The <code>producer</code> can <code>provide</code> a product.</p>
+</div>
+<div class="paragraph">
+<p>The <code>consumer.cif</code> file declares the <code>consumer</code> automaton, that can accept
+products provided by a producer. The <code>provide</code> event is not declared in that
+CIF specification. However, the <code>producer.cif</code> file is imported, which does
+declare that event. By importing another CIF specification, all declarations
+from that imported CIF specification (<code>producer.cif</code> in the example) become
+available in the importing CIF specification, i.e. in the specification that
+does the import (<code>consumer.cif</code> in the example).</p>
+</div>
+<div class="paragraph">
+<p>The result of the import in <code>consumer.cif</code> is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event provide;
+
+automaton producer:
+  location:
+    initial;
+    edge provide;
+end
+
+automaton consumer:
+  location:
+    initial;
+    edge provide;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You can think of an import as being replaced by the content of the imported
+file. The <code>producer.cif</code> file contains only its own content, while the
+<code>consumer.cif</code> file contains the contents of both files, due to the use of
+the import.</p>
+</div>
+<div class="paragraph">
+<p>If one CIF specification is merged into another CIF specification, the names of
+the declarations in both CIF specifications must be different. It is not
+allowed to have declarations with the same name in multiple CIF specifications.
+For instance, in the example above, if the <code>provide</code> event were declared in
+both CIF specifications, the imports would be invalid. Exceptions to this rule
+are discussed in one of the next lessons, which explains the relation between
+<a href="#tut-reuse2-chapter-imports-groups">imports and groups</a>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-imports-libraries">Imports and libraries</h4>
+<div class="paragraph">
+<p>
+Using <a href="#tut-reuse2-chapter-imports">imports</a>, it is possible to make
+libraries that can be used by multiple CIF specifications. For instance,
+consider the following CIF specification in file <code>math.cif</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// math.cif
+
+func int inc(int x):
+  return x + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This CIF specification declares a single function <code>inc</code> that takes an integer
+number and returns that number incremented by one. Now also consider the
+following CIF specification in file <code>counter.cif</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// counter.cif
+
+import &quot;math.cif&quot;;
+
+automaton counter:
+  disc int count = 0;
+
+  location:
+    initial;
+    edge tau do count := inc(count);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By importing the <code>math.cif</code> file, the <code>counter</code> automaton can use the
+<code>inc</code> function. Other CIF files could similarly import the <code>math.cif</code> file,
+essentially turning <code>math.cif</code> into a library.</p>
+</div>
+<div class="paragraph">
+<p>It is possible to make a function library, consisting of commonly used
+functions, a constant library, with commonly used constants, or an automaton
+definition library, with automaton definitions. As libraries are just CIF
+files, they can contain anything as long as they are valid CIF files.
+Essentially, every CIF file that is imported in more than one other CIF file
+can be considered a library.</p>
+</div>
+<div class="paragraph">
+<p>
+The import as used above, only works if both CIF files are in the same
+directory. Library files however, are often placed in a different directory.
+Consider the same two CIF files, but organized into directories (or folders)
+as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/reuse2/library_dir_tree.png" alt="library dir tree">
+</div>
+</div>
+<div class="paragraph">
+<p>Directory <code>system</code> contains a sub-directories named <code>libraries</code>, which
+contains the <code>math.cif</code> library. The <code>system</code> directory also contains the
+<code>counter.cif</code> file. The import in the <code>counter.cif</code> file needs to be
+adapted to refer to the <code>math.cif</code> file in the <code>libraries</code> directory:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// counter.cif
+
+import &quot;libraries/math.cif&quot;;
+
+automaton counter:
+  disc int count = 0;
+
+  location:
+    initial;
+    edge tau do count := inc(count);
+end</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-imports-groups">Imports and groups</h4>
+<div class="paragraph">
+<p>
+Large systems can be hierarchically modeled using
+<a href="#tut-reuse2-chapter-groups">groups</a>. When using imports, two specifications
+may not have declarations with the same name. Groups however, are the exception
+to this rule. Consider a factory with two machines, each consisting of two
+parts. We can model this using five files, one for each of the parts of the
+machines, and one for the factory as a whole. The following CIF specifications
+show the contents of the five CIF files, where the comment at the first line
+indicates which file it is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// p1.cif
+
+group machine1:
+  automaton part1:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// p2.cif
+
+group machine1:
+  automaton part2:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// p3.cif
+
+group machine2:
+  automaton part1:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// p4.cif
+
+group machine2:
+  automaton part2:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// factory.cif
+
+import &quot;p1.cif&quot;;
+import &quot;p2.cif&quot;;
+import &quot;p3.cif&quot;;
+import &quot;p4.cif&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The four CIF specifications for the machine parts differ only in their group
+and automaton names. Their implementations are kept identical for simplicity.
+The <code>factory.cif</code> file imports all four part specifications, which together
+form the full factory. The effect of the imports in <code>factory.cif</code> is the
+following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group machine1:
+  automaton part1:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+
+  automaton part2:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end
+
+group machine2:
+  automaton part1:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+
+  automaton part2:
+    location idle:
+      initial;
+      edge tau goto running;
+
+    location running:
+      edge tau goto idle;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For groups with the same name, the contents of the groups is merged together.
+That is, automaton <code>part1</code> in the <code>machine1</code> group from one CIF file, and
+the automaton <code>part2</code> in that same <code>machine1</code> group from another CIF file,
+end up in a single <code>machine1</code> group after eliminating the imports.</p>
+</div>
+<div class="paragraph">
+<p>In general, contents of groups with the same name are merged into a single
+group. This works also for groups in groups, groups in groups in groups, etc.
+If two CIF files that are imported both contain a group <code>a</code> and in both CIF
+files those groups contain a group <code>b</code>, then the contents of both <code>a</code>
+groups are merged, and also the contents of both <code>b</code> groups are merged. It is
+not allowed for different CIF files to have declarations with the same name in
+the same group. It is allowed to have declarations with the same name in
+different groups. The file itself (the top level) can be considered a group as
+well.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-namespaces">Namespaces</h4>
+<div class="paragraph">
+<p>
+
+When using <a href="#tut-reuse2-chapter-imports-groups">imports and groups</a> to model
+large hierarchical systems, it is a common pattern to have groups around the
+entire specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group factory:
+  group machine1:
+    group part1:
+      automaton sensor1:
+        ...
+      end
+
+      automaton actuator1:
+        ...
+      end
+    end
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The groups around the entire specification lead to additional
+<a href="http://en.wikipedia.org/wiki/Indentation_%28typesetting%29">indentation</a>.
+As this is a common pattern, the CIF language provides <em>namespaces</em> to reduce the
+impact of large numbers of top level groups:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">namespace factory.machine1.part1;
+
+automaton sensor1:
+  ...
+end
+
+automaton actuator1:
+  ...
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>factory.machine1.part1</code> namespace has exactly the same effect as the
+original three groups. Both specifications can thus be considered identical.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-reuse2-chapter-input-variables">Input variables</h4>
+<div class="paragraph">
+<p>
+
+<em>Input variables</em> can be used to model that some data exists, without
+specifying the value or how or when the value changes. Input variables are used
+in cases where the CIF model is to be connected something else that provides
+the values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tut-hardware-example">Hardware example</h5>
+<div class="paragraph">
+<p>The CIF model may for instance be a controller that is to be connected to a
+piece of physical hardware. The input variables then model sensors, for which
+the behavior is not modeled in the CIF model. As an example, consider the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">input bool sensor;
+
+automaton controller:
+  cont t der 1;
+  alg bool actuator = on;
+
+  location off:
+    initial;
+    edge when sensor do t := 0 goto waiting;
+
+  location waiting:
+    edge when not sensor goto off;
+    edge when t &gt; 1.5 goto on;
+
+  location on:
+    edge when not sensor goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Input variable <code>sensor</code> models a digital sensor. When the sensor is on, the
+variable has value <code>true</code> and when the sensor is off, the variable has value
+<code>false</code>. When the sensor is on and when it is off is not known, and thus not
+modeled in the CIF specification.</p>
+</div>
+<div class="paragraph">
+<p>The <code>controller</code> waits (in location <code>off</code>) for the sensor to go on, and
+then resets continuous variable <code>t</code> to start measuring <code>1.5</code> time units
+(in location <code>waiting</code>). If that much time has passed, it goes to location
+<code>on</code>. If the sensor goes off then, or while it is waiting, it goes back to
+location <code>off</code>. Thus, the <code>controller</code> is only <code>on</code> if the sensor goes
+on, <code>1.5</code> time units have passed, and the sensor remains on.</p>
+</div>
+<div class="paragraph">
+<p>The <code>actuator</code> algebraic variable models that an actuator is only on if the
+<code>controller</code> is in its on location. The <code>actuator</code> is then on if the sensor
+is one, and <code>1.5</code> time units have passed. The actuator is always turned off
+when the sensor is off.</p>
+</div>
+<div class="paragraph">
+<p>Without a physical hardware system, the CIF specification is incomplete, as the
+value of the sensor is not known. The input variable acts as a placeholder for
+the actual sensor. If the CIF specification were to be coupled to a physical
+hardware system with a sensor and an actuator, the CIF model would then control
+the actuator based on the sensor values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-co-simulation-example">Co-simulation example</h5>
+<div class="paragraph">
+<p>A CIF specification could model a part of a system, while another part of that
+same system is modeled in another system or language, such as
+<a href="http://www.mathworks.nl/products/simulink/">Simulink</a>. Consider for instance
+a tank filled with water. Water flows out of the tank constantly. By opening a
+value, water also flows in to the tank. Consider the following CIF
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">input real level;
+
+automaton valve:
+  disc bool open = true;
+
+  location:
+    initial;
+    edge when     open and level &gt;= 10 do open := false;
+    edge when not open and level &lt;=  2 do open := true;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The water <code>level</code> is modeled as an input variable, meaning it is obtained
+from the Simulink model. The CIF specification models the valve, and the
+controller that opens and closes the value, based on the water level. It keeps
+the level between <code>2</code> and <code>10</code>.</p>
+</div>
+<div class="paragraph">
+<p>The CIF model obtains the water level from Simulink by means of input variable
+<code>level</code>. It also provides the <code>open</code> variable of the <code>valve</code> automaton to
+Simulink. This variable can be used in Simulink to model how the water level
+changes over time.</p>
+</div>
+<div class="paragraph">
+<p>Without the Simulink model, the CIF specification is incomplete, as the water
+level is not known. The input variable acts as a placeholder for the actual
+water level. If the CIF specification were to be coupled to a Simulink model
+that models the water level, the CIF specification would control the valve
+based on the water level.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-cif-models-example">CIF models example</h5>
+<div class="paragraph">
+<p>Input variables can also be used to couple CIF models. Consider again the above
+water level controller example. It models the valve and controls the valve, but
+does not model the water level. The following CIF specification could be used
+to model the water level:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont level der if valve.open: 1 else -1 end;
+
+group valve:
+  input bool open;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Continuous variable <code>level</code> models the water level. The water level increases
+(derivative <code>1</code>) if the valve is open, and decreases (derivative <code>-1</code>)
+otherwise. The <code>open</code> variable from the <code>valve</code> is used, but this variable
+is an input variable, and the value is not known in this specification. Input
+variable <code>open</code> acts as a placeholder for a value, and group <code>valve</code> acts
+as a placeholder for automaton <code>valve</code>.</p>
+</div>
+<div class="paragraph">
+<p>The two CIF specifications both model a part of the system. One specification
+models the water level, and has a placeholder for the variable that indicates
+whether the valve is open. The other specification models the valve and
+controls it, but has a placeholder for the water level. If we couple the two
+CIF specifications, they provide each other with actual variables for each
+others input variables.</p>
+</div>
+<div class="paragraph">
+<p>The two specifications can be coupled or <em>merged</em> together:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont level = 0.0 der if valve.open: 1 else -1 end;
+
+automaton valve:
+  disc bool open = true;
+
+  location:
+    initial;
+    edge when     open and level &gt;= 10 do open := false;
+    edge when not open and level &lt;=  2 do open := true;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Using input variables to couple CIF specifications is somewhat similar to using
+<a href="#tut-reuse2-chapter-imports">imports</a> to split a CIF specification over
+multiple files. There are however important differences.</p>
+</div>
+<div class="paragraph">
+<p>The first difference is that when using imports, one CIF specification is
+coupled to another CIF specification. The coupling is hard-coded in the CIF
+specification, and can not be changed without changing the import. When using
+input variables and merging, it is possible to couple a CIF specification
+to a second CIF specification, and later couple it with a third, different
+specification instead. The decision about which models to merge can thus be
+postponed, and does not require changes to any of the CIF specifications.</p>
+</div>
+<div class="paragraph">
+<p>Another difference is that with imports it is not allowed to have declarations
+with the same name in different CIF specifications (except for groups), while
+with the merger this is allowed in many situations. See the documentation of
+the <a href="#tools-chapter-mergecif">CIF merger</a> tool for further details on what can
+be merged using that tool.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-stochastics">Stochastics</h3>
+<div class="sect3">
+<h4 id="tut-stochastics-chapter-intro">Stochastics</h4>
+<div class="paragraph">
+<p>
+For many things in the world, the behavior is not the same every time. An
+example is a
+<a href="http://en.wikipedia.org/wiki/Coin_toss">coin toss</a>,
+where
+the result can be either heads or tails. Tossing a coin exhibits
+<a href="http://en.wikipedia.org/wiki/Randomness">randomness</a>.
+It is possible to
+model the different variants in a CIF model without specifying the likelihood
+of each of the outcomes. This approach was used in the lesson on
+<a href="#tut-basics-chapter-non-determinism">non-determinism</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+It is however also possible to explicitly specify the likelihood of each of the
+outcomes in the CIF model, using a <em>stochastic distribution</em> (also called
+<a href="http://en.wikipedia.org/wiki/Probability_distribution">probability distribution</a>).
+A stochastic
+distribution describes how likely the different outcomes are. There are many
+different stochastic distributions. The
+<a href="http://en.wikipedia.org/wiki/Bernoulli_distribution">Bernoulli distribution</a>
+for instance, can be
+used to model things with two potential outcomes, such as a coin toss.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton coin_toss:
+  disc dist bool d = bernoulli(0.5);
+  disc bool outcome;
+
+  location toss:
+    initial;
+    edge do (outcome, d) := sample d goto result;
+
+  location result:
+    edge when     outcome goto heads;
+    edge when not outcome goto tails;
+
+  location heads:
+    edge tau goto toss;
+
+  location tails:
+    edge tau goto toss;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>d</code> holds a stochastic distribution that produces
+<a href="#tut-values-chapter-booleans">boolean values</a> (<code>true</code> or <code>false</code>), as
+indicated by its <code>dist bool</code>
+<a href="#tut-values-chapter-types-values-exprs">type</a>. In this case it holds a
+Bernoulli distribution, with a probability of <code>0.5</code> (or chance of 50%) for
+<code>true</code>, and thus also the same probability/chance for <code>false</code> (the only
+other possible outcome).</p>
+</div>
+<div class="paragraph">
+<p>The <code>bernoulli</code> function is used to create a Bernoulli distribution with the
+proper parameter (probability of <code>0.5</code> for <code>true</code>). Different distributions
+have different parameters. See the language reference documentation for further
+details. Distribution functions, such as the <code>bernoulli</code> function can be used
+to create distributions with specific parameters, and may only be used to
+initialize discrete variables.</p>
+</div>
+<div class="paragraph">
+<p>
+Initially, the automaton is in its <code>toss</code> location, where the coin can be
+tossed. The edge uses the <code>sample</code> operator to get a <em>sample</em> from the
+bernoulli distribution. Each time the distribution is sampled, the <code>outcome</code>
+is either a <code>true</code> value or a <code>false</code> value. As we used a probability of
+<code>0.5</code> for both outcomes, half of the times <code>true</code> will be the outcome,
+and the other half of the times <code>false</code> will be the outcome, if we were to
+sample infinitely many times.</p>
+</div>
+<div class="paragraph">
+<p>Sampling does not only result in the <code>outcome</code>, but also the distribution
+itself. This is further explained in one of the next lessons, which explains
+<a href="#tut-stochastics-chapter-pseudo-randomness">pseudo-randomness</a>.</p>
+</div>
+<div class="paragraph">
+<p>The result of sampling is stored in the <code>outcome</code> variable. In the <code>result</code>
+location, the sampling result is used to make a decision to go to either the
+<code>heads</code> location (<code>true</code> outcome) or the <code>tails</code> location (<code>false</code>
+outcome). From there, it is possible to go back to the <code>toss</code> location, to
+proceed with the next coin toss.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-stochastics-chapter-discrete-continuous-constant">Discrete, continuous, and constant distributions</h4>
+<div class="paragraph">
+<p>CIF features over a dozen different stochastic distributions. These
+distributions can be categorized into three categories: discrete, continuous,
+and constant distributions. Discrete distributions can result in only a limited
+number of possible values. Examples include tossing a coin (heads and tails)
+and throwing a dice (six possible outcomes). Continuous distributions can
+result in all values from a certain range. Examples include the time it takes
+for a machine to produce a single product (positive amount of time), and the
+purity of produced medicine (0% to 100%). Constant distributions are discrete
+distributions that always result in the same sampled value. They are useful
+during the development of a model, or for debugging. The remainder of this
+lesson further explains these three categories, and illustrates them using some
+examples.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tut-discrete-distributions">Discrete distributions</h5>
+<div class="paragraph">
+<p>Discrete distributions can result in only a limited number of possible values.
+The lesson that <a href="#tut-stochastics-chapter-intro">introduced stochastics</a>
+used the discrete
+<a href="http://en.wikipedia.org/wiki/Bernoulli_distribution">Bernoulli distribution</a>
+to model
+<a href="http://en.wikipedia.org/wiki/Coin_toss">tossing of a coin</a>, which can result
+in either heads or tails.</p>
+</div>
+<div class="paragraph">
+<p>Throwing a
+<a href="http://en.wikipedia.org/wiki/Dice">dice</a>
+can result in six
+possible outcomes: 1, 2, 3, 4, 5, and 6. For a fair dice, each of the outcomes
+is equally likely, with chance 1/6. This can be modeled using a
+<a href="http://en.wikipedia.org/wiki/Uniform_distribution_(discrete)">discrete uniform distribution</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton dice:
+  disc dist int d = uniform(1, 7);
+  disc int result;
+  disc list int results = [];
+
+  location throw:
+    initial;
+    edge do (result, d) := sample d goto add;
+
+  location add:
+    edge do results := results + [result] goto throw;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>uniform</code> function is used to create a uniform integer distribution that
+produces <a href="#tut-values-chapter-integers">integer</a> samples from the range
+[1..7) (inclusive on the left side, exclusive on the right side). Each sample
+is stored in <code>result</code> and added to the <code>results</code>. If we were to simulate
+this model forever, the <code>results</code> list would contain equal amounts of each of
+the six values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-continuous-distributions">Continuous distributions</h5>
+<div class="paragraph">
+<p>Continuous distributions return a value from a continuous range. An example is
+the weight of
+<a href="http://en.wikipedia.org/wiki/Penny_(United_States_coin)">pennies</a>.
+This
+could for instance be approximated using a continuous
+<a href="http://en.wikipedia.org/wiki/Normal_distribution">normal distribution</a>
+with a
+<a href="http://en.wikipedia.org/wiki/Mean">mean</a>
+of 2.46 grams and a
+<a href="http://en.wikipedia.org/wiki/Variance">variance</a>
+of 0.0004 grams:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton pennies:
+  disc dist int d = normal(2.46, 0.0004);
+
+  location:
+    initial;
+    edge do (weight, d) := sample d;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>normal</code> function is used to create a normal distribution with a mean of
+<code>2.46</code> and a variance of <code>0.0004</code>. The sampled weight is stored in the
+<code>weight</code> variable each time the distribution is sampled. The probability of
+the different weights as a result of the used normal distribution is depicted
+in the following figure:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tutorial/stochastics/pennies.png" alt="pennies">
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-constant-distributions">Constant distributions</h5>
+<div class="paragraph">
+<p>When developing a model with stochastic behavior, it can be hard to validate
+whether the model behaves correctly, since the stochastic results make it
+difficult to predict the outcome of experiments. As a result, errors in the
+model may not be noticed, as they hide in the noise of the stochastic results.
+One solution is to first make a model without stochastic behavior, validate
+that model, and then extend the model with stochastic sampling. Extending the
+model with stochastic behavior is however an invasive change that may introduce
+new errors. These errors can again be hard to find due to the difficulties to
+predict the outcome of an experiment. The constant distributions aim to narrow
+the gap by reducing the amount of changes that need to be done after
+validation.</p>
+</div>
+<div class="paragraph">
+<p>With constant distributions, a stochastic model with sampling of distributions
+is developed, but the stochastic behavior is eliminated by temporarily using
+constant distributions. The model performs stochastic sampling of values, but
+with predictable outcome, and thus with predictable experimental results,
+making validation easier. After validating the model, the constant
+distributions are replaced with the distributions that fit the mean value and
+variation pattern of the modeled system, giving a model with stochastic
+behavior. Changing the used distributions is however much less invasive, making
+it less likely to introduce new errors at this stage in the development of the
+model.</p>
+</div>
+<div class="paragraph">
+<p>Constant distributions always produce the same sampled value. Consider the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton dice:
+  disc dist int d = constant(3); // Constant distribution.
+  disc int result;
+  disc list int results = [];
+
+  location throw:
+    initial;
+    edge do (result, d) := sample d goto add;
+
+  location add:
+    edge do results := results + [result] goto throw;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This model is identical to the dice model one used earlier in this lesson,
+except for distribution variable <code>d</code>, which now holds a constant distribution
+that only produces value <code>3</code> when sampled.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tut-stochastics-chapter-pseudo-randomness">Pseudo-randomness</h4>
+<div class="paragraph">
+<p>So far, the lessons on stochastics used the mathematical notion of stochastic
+distribution to describe how to model stochastic behavior. Simulating a model
+with stochastic behavior using a computer is however not stochastic at all.
+Computer systems are deterministic machines, and have no notion of varying
+results.</p>
+</div>
+<div class="sect4">
+<h5 id="tut-pseudorandom-number-generator-and-seed">Pseudorandom number generator and seed</h5>
+<div class="paragraph">
+<p>A
+<a href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator">pseudorandom number generator</a>
+is used to
+create stochastic results instead. It starts with an initial
+<a href="http://en.wikipedia.org/wiki/Random_seed">seed</a>,
+an integer number. From
+this seed, a function creates a stream of 'random' values. When looking at the
+values there does not seem to be any pattern. It is not truly random however.
+Using the same seed again gives exactly the same stream of numbers. This is the
+reason to call the function a pseudorandom number generator, as a true random
+number generator would never produce the exact same stream of numbers.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-simulation-and-initial-seed">Simulation and initial seed</h5>
+<div class="paragraph">
+<p>A sample of a distribution uses one or more numbers from the stream to compute
+its value. The value of the <em>initial seed</em> thus decides the value of all
+samples drawn in the simulation. By default, a different seed is used each time
+you run a simulation, leading to different results each time. You can also
+explicitly state what seed you want to use when simulating a model. See the
+<a href="#tools-cifsim-chapter-distr-seeds">Stochastic distributions and seeds</a> page of the simulator for information on how
+to supply a custom seed for simulation.</p>
+</div>
+<div class="paragraph">
+<p>While doing a stochastic simulation study, performing several experiments with
+the same initial seed invalidates the results, as it is equivalent to copying
+the outcome of a single experiment a number of times. On the other hand, when
+looking for the cause of a bug in the model, performing the exact same
+experiment is useful as outcomes of previous experiments should match exactly.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tut-sampling-and-tuple-results">Sampling and tuple results</h5>
+<div class="paragraph">
+<p>The seed determines the next sampled value. Whenever a distribution is sampled,
+the seed changes to the one that follows in the stream of random numbers
+generated by the pseudorandom number generator. This ensures that the next time
+the distribution is sampled, it results in a different sampled value.</p>
+</div>
+<div class="paragraph">
+<p>In CIF, the seed is stored with the distribution and its parameters. Therefore,
+sampling does not only result in the sampled value, it also results in an
+updated distribution, with the same parameters, but a different seed value.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton coin_toss:
+  disc dist bool d = bernoulli(0.5);
+  disc bool outcome;
+
+  location:
+    initial;
+    edge do (outcome, d) := sample d goto result;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>bernoulli</code> function to create a
+<a href="http://en.wikipedia.org/wiki/Bernoulli_distribution">Bernoulli distribution</a>
+with parameter <code>0.5</code>
+(the chance for <code>true</code>). This Bernoulli distribution, along with its
+parameter and the seed, are stored in variable <code>d</code>. When the distribution
+in variable <code>d</code> is sampled (<code>sample d</code>), the result is both a sampled
+value, and a distribution (as a <a href="#tut-values-chapter-tuples">tuple</a>). The
+distribution is the same distribution with the same parameters, but with an
+updated seed. The sampled value is usually stored in a variable (<code>outcome</code>
+in this case). The changed distribution is usually assigned to the same
+variable that contains the distribution that is sampled, to ensure that we can
+use the same variable for the next sampling. In other words, variable <code>d</code>
+is updated with the changed distribution each time it is sampled. The result
+of sampling is assigned to two variables, using
+<a href="#lang-tut-values-tuples-unpacking">tuple unpacking</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tut-language-extensions">Language extensions</h3>
+<div class="sect3">
+<h4 id="tut-extensions-chapter-synthesis">Supervisory controller synthesis</h4>
+<div class="paragraph">
+<p>
+Supervisory controller synthesis (or supervisor synthesis, or just synthesis)
+is a generative technique, where one derives a supervisory controller from a
+collection of plants and requirements. Synthesis allows to focus on the <em>what</em>,
+i.e. which requirements should hold, rather than on the <em>how</em>, i.e. how to
+implement this in a controller.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div id="lang-tut-extensions-synthesis-plant-req-sup" class="paragraph">
+<p>The <em>plants</em> describe capabilities or behavior of a physical system 'as is',
+without any integrated control. They represent the available behavior of the
+uncontrolled system. <em>Requirements</em> model (a part of) the functions a system is
+supposed to perform. They represents behavior that is allowed in the controlled
+system, or more precisely, they specify the behavior that is not allowed in the
+controlled system. In other words, requirements restrict the behavior of the
+plants, to ensure that only the desired behavior remains. The goal of
+supervisory controller synthesis is to compute a supervisory controller (or
+<em>supervisor</em>) that enforces the requirements, assuming the behavior of the
+plants, additionally preventing deadlock and livelock, and without restricting
+the system any further than is required.</p>
+</div>
+<div class="paragraph">
+<p>It is beyond the scope of the CIF language tutorial to go into the details of
+supervisory controller synthesis. However, CIF has several features that are
+used solely of modeling systems for the purpose of supervisory controller
+synthesis:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-tut-extensions-synthesis-autkind">Automaton kinds</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-extensions-synthesis-invkind">Invariant kinds</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-extensions-synthesis-evtctrl">Event controllability</a></p>
+</li>
+<li>
+<p><a href="#lang-tut-extensions-synthesis-marked">Marker predicates</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>These concepts are explained below. When a model is not used for supervisory
+controller synthesis, e.g. for simulation, these concepts are usually ignored.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-extensions-synthesis-autkind">Automaton kinds</h5>
+<div class="paragraph">
+<p>For supervisory controller synthesis, different kinds of automata are treated
+in different ways. Regular automata, as used in the language tutorial so far,
+are specified using only the <code>automaton</code> keyword. Regular automata do not
+specify a kind for supervisory controller synthesis, and are therefore
+sometimes also referred to as kindless automata. Synthesis tools typically
+require knowledge about the purpose of each of the automata, and therefore
+don&#8217;t support regular automata.</p>
+</div>
+<div class="paragraph">
+<p>For supervisory controller synthesis, three different kinds of automata are
+available: plant automata, requirement automata, and supervisor automata. These
+automata are identical to regular automata, except for the keywords used to
+declare their intent. The <code>automaton</code> keyword is preceded or replaced by the
+<code>plant</code>, <code>requirement</code>, or <code>supervisor</code> keyword respectively.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following are two alternative ways to model the same plant
+automaton:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Plant automaton, long form.
+plant automaton lamp:
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on goto on;
+
+  location on:
+    edge turn_off goto off;
+end
+
+// Plant automaton, short form.
+plant lamp:
+  event turn_on, turn_off;
+
+  location off:
+    initial;
+    edge turn_on goto on;
+
+  location on:
+    edge turn_off goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-extensions-synthesis-invkind">Invariant kinds</h5>
+<div class="paragraph">
+<p>Similar to automata, different kinds of invariants are treated in different
+ways for supervisory controller synthesis. Invariants can be declared as plant,
+requirement, or supervisor invariants, by preceding or replacing the
+<code>invariant</code> keyword with a <code>plant</code>, <code>requirement</code>, or <code>supervisor</code>
+keyword respectively.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">invariant lamp.on or lamp.off;      // Regular/kindless invariant.
+
+plant lamp:
+  event turn_on, turn_off;
+
+  requirement invariant not off;    // Explicit requirement invariant. Long form.
+  requirement not off;              // Explicit requirement invariant. Short form.
+
+  location off:
+    initial;
+    edge turn_on goto on;
+
+  location on:
+    edge turn_off goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first invariant, above the <code>lamp</code> automaton, does not specify an
+additional supervisory kind keyword, are is therefore a regular invariant, also
+called a kindless invariant. The second invariant, in the <code>lamp</code> automaton,
+explicitly specifies a <code>requirement</code> kind and is therefore a requirement
+invariant. The third and last invariant is identical to the second invariant,
+except that the <code>invariant</code> keyword has been omitted. It is also a
+requirement invariant, but written in a shorter form.</p>
+</div>
+<div id="lang-tut-extensions-synthesis-invkind-implicit" class="paragraph">
+<p>Invariants without an additional keyword to specify their supervisory kind, are
+regular invariants or kindless invariants. However, if such an invariant is
+placed in an automaton that has a supervisory kind, the invariant inherits the
+supervisory kind of that automaton. This is a deprecated feature that will
+result in a warning. To get rid of the warning, explicitly specify the
+supervisory kind of the invariant.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant lamp:
+  event turn_on, turn_off;
+
+  invariant on or off;          // Inherits 'plant' kind from automaton.
+  plant invariant on or off;    // Explicit plant invariant. Long form.
+  plant on or off;              // Explicit plant invariant. Short form.
+
+  location off:
+    initial;
+    edge turn_on goto on;
+
+  location on:
+    edge turn_off goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first invariant has no explicit supervisory kind specified, and therefore
+inherits the <code>plant</code> supervisory kind from the automaton. It is thus an
+invariant that is implicitly a plant invariant. This results in a warning. The
+second invariant is identical, except for the explicit specification of the
+<code>plant</code> kind. It is also a plant invariant, but due to the explicit kind
+specification, there is no warning. The third and last invariant is identical
+to the second invariant, except that the <code>invariant</code> keyword has been
+omitted. It is also explicitly a plant invariant, but written in a shorter
+form. Due to the explicit use of the <code>plant</code> keyword, this variant also gets
+no warning.</p>
+</div>
+<div class="paragraph">
+<p>There are two forms of invariants:
+<a href="#tut-data-chapter-stat-invariants">state invariants</a> and
+<a href="#tut-data-chapter-stat-evt-excl-invariants">state/event exclusion invariants</a>. Both forms can be used for
+synthesis. For instance, consider the following example of a counter:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant counter:
+  controllable increment, decrement;
+  disc int x = 0;
+
+  plant invariant 0 &lt;= x and x &lt;= 10;
+
+  requirement increment needs x &lt; 8;
+
+  location:
+    initial;
+    edge increment do x := x + 1;
+    edge decrement do x := x - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The counter can be incremented and decremented. The plant invariant specifies
+that it is not possible for the counter to count negative values, or values
+more than 10. It is a requirement that synthesis ensures that the counter can
+only be incremented as long as the counted value is less than 8.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-extensions-synthesis-evtctrl">Event controllability</h5>
+<div class="paragraph">
+<p>Supervisory controller synthesis distinguishes two kinds of
+<a href="#lang-tut-basics-automata-events">events</a>: controllable events and
+uncontrollable events.</p>
+</div>
+<div class="paragraph">
+<p>Uncontrollable events are events that a supervisor can not prohibit, and are
+usually related to sensors. A typical example are events that indicate that a
+button has been pushed or released. A button is essentially a sensor that is
+on if the user pushes the button, and off if the user doesn&#8217;t push it. The
+supervisor can not prevent a user from physically pushing or releasing a
+button, and can also not determine when the user pushes or releases it. The
+supervisor thus also can not prevent the events from occurring.</p>
+</div>
+<div class="paragraph">
+<p>Another example is an event that indicates that a moving part has reached its
+outer position (limit sensor turns on). If the part reaches its outer position,
+the event will occur. The supervisor can not control the sensor, as it is
+physically linked to the position of the moving part.</p>
+</div>
+<div class="paragraph">
+<p>Controllable events may be restricted by a supervisor, and are usually related
+to actuators. Typical examples are events used to turn a motor on or off, to
+turn a lamp on or off, or to change the direction of movement.</p>
+</div>
+<div class="paragraph">
+<p>Even though a supervisor may not be able to control a limit sensor directly,
+and thus restrict the corresponding events, it may be able to influence it
+indirectly. For instance, a motor may be available that makes it possible for
+the part to move. That motor may then be controlled using controllable on and
+off events. Stopping the motor then makes the part stop moving, ensuring that
+the part never reaches its outer position, indirectly preventing the limit
+sensor from turning on, and the corresponding event from happening.</p>
+</div>
+<div class="paragraph">
+<p>Events and <a href="#tut-channels-chapter-intro">channels</a> in CIF are declared
+using the <code>event</code> keyword. For controllable events, the <code>event</code> keyword
+may be preceded or replaced by the <code>controllable</code> keyword. Similarly,
+for uncontrollable events, the <code>event</code> keyword may be preceded or replaced
+by the <code>uncontrollable</code> keyword. Similar to event declarations, for
+<a href="#lang-tut-reuse2-aut-def-param-kinds-event">event parameters</a> the
+<code>event</code> keyword may by preceded or replaced by the <code>controllable</code> or
+<code>uncontrollable</code> keyword, for controllable and uncontrollable event
+parameters respectively.</p>
+</div>
+<div class="paragraph">
+<p>As a convention, controllable events are given names that start with <code>c_</code>,
+and uncontrollable events are given names that start with <code>u_</code>. This allows
+them to be highlighted in different colors.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">controllable c_on, c_off;
+uncontrollable u_pushed, u_released;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-tut-extensions-synthesis-marked">Marker predicates</h5>
+<div class="paragraph">
+<p>Marking is very weak form of liveness, and is used by supervisory controller
+synthesis to prevent livelocks, to ensure progress. It is also used to prevent
+deadlocks. A supervisor per definition ensures that a marked state can always
+be reached, for the entire system. A system is marked if all its automata are
+marked. An automaton is marked if its active location is a marked location. In
+literature, marked location are also called <em>safe</em> locations. Note that
+deadlock in marked states is not prevented, as a marker state (the state
+itself) can be reached by not taking any transition. In literature, marked
+deadlock states are also called <em>final</em> states.</p>
+</div>
+<div class="paragraph">
+<p>Marking can be specified using <em>marker predicates</em>. Locations can be marked
+using the <code>marked</code> keyword, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant lamp:
+  controllable c_turn_on, c_turn_off;
+
+  location off:
+    initial;
+    marked;
+    edge c_turn_on goto on;
+
+  location on:
+    edge c_turn_off goto off;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this example location <code>off</code> is both initial and marked, while location
+<code>on</code> is neither initial nor marked.</p>
+</div>
+<div class="paragraph">
+<p>Marker predicates are very similar to
+<a href="#tut-data-chapter-init-preds">initialization predicates</a>, as by default,
+locations are not marked, similar to how by default locations are not initial.
+Marker predicates can be specified in locations, automata,
+<a href="#tut-reuse2-chapter-groups">groups</a>, and the top level of the specification
+(which can be seen as a group), similar to initialization predicates.</p>
+</div>
+<div class="paragraph">
+<p>The following specification shows an example of a variable that is only marked
+for a certain value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant counter:
+  controllable c_increment, c_decrement;
+  disc int[0..10] count = 0;
+
+  marked count = 0;
+
+  location off:
+    initial;
+    marked;
+    edge c_increment do count := count + 1;
+    edge c_decrement do count := count - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable <code>count</code> of plant automaton <code>counter</code> is only marked if it has
+value zero. That is, the entire system can only be marked if <code>count</code> is zero.
+Supervisor synthesis will ensure that it is always possible to get back to a
+state where <code>count</code> is zero.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="lang-ref-chapter-index">Language reference</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The documentation in this language reference manual serves as reference.
+It is not intended to be read from beginning to end, but more to look up
+specific information when needed. The reference documentation generally
+provides detailed and complete information, but this information may not
+always be presented in the most accessible way.</p>
+</div>
+<div class="paragraph">
+<p>The information is divided into categories. The following categories and
+information is part of the language reference documentation:</p>
+</div>
+<div class="paragraph">
+<p><em>Syntax</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-syntax-lexical">Lexical syntax</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-syntax-grammar">Grammar</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect2">
+<h3 id="lang-ref-syntax-lexical">Lexical syntax</h3>
+<div class="paragraph">
+<p>This page describes the CIF lexical syntax.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-keywords">Keywords</h4>
+<div class="paragraph">
+<p><em>Language keywords</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg            disc       group       post          switch
+alphabet       dist       id          pre           tau
+any            do         if          print         text
+attr           edge       import      printfile     time
+automaton      elif       initial     real          to
+bool           else       input       requirement   true
+break          end        int         return        tuple
+case           enum       invariant   self          type
+const          equation   list        set           uncontrollable
+cont           event      location    string        urgent
+continue       false      marked      supervisor    value
+controllable   file       monitor     svgcopy       void
+def            final      namespace   svgfile       when
+der            for        needs       svgin         while
+dict           func       now         svgmove
+disables       goto       plant       svgout</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Trigonometric functions</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">acosh   asin    cosh   sin
+acos    atanh   cos    tanh
+asinh   atan    sinh   tan</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>General functions</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">abs    empty   ln    pop     sign
+cbrt   exp     log   pow     size
+ceil   floor   max   round   sqrt
+del    fmt     min   scale</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Distributions</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">bernoulli   erlang        lognormal   triangle
+beta        exponential   normal      uniform
+binomial    gamma         poisson     weibull
+constant    geometric     random</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Expression operators</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">and   mod   sample
+div   not   sub
+in    or</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-terminals">Terminals</h4>
+<div class="paragraph">
+<p>Besides the keyword terminals listed above, CIF features several other
+terminals:</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>IDENTIFIERTK</code></dt>
+<dd>
+<p>An identifier. Defined by the regular expression:
+<code>[$]?[a-zA-Z_][a-zA-Z0-9_]*</code>. They thus consist of letters, numbers
+and underscore characters (<code>_</code>). Identifiers may not start with a
+numeric digit. Keywords take priority over identifiers. To use a
+keyword as an identifier, prefix it with a <code>$</code> character.
+The <code>$</code> is not part of the identifier name.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">apple       // identifier
+bear        // identifier
+int         // keyword
+$int        // identifier 'int' (override keyword priority with $)</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>RELATIVENAMETK</code></dt>
+<dd>
+<p>A relative name. Defined by the regular expression:
+<code>[$]?[a-zA-Z_][a-zA-Z0-9_]*(\.[$]?[a-zA-Z_][a-zA-Z0-9_]*)+</code>.
+It thus consists of two or more <code>IDENTIFIERTK</code> joined together
+with periods (<code>.</code>).</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">some_automaton.some_location</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>ABSOLUTENAMETK</code></dt>
+<dd>
+<p>An absolute name. Absolute names can be used to refer to objects that are
+otherwise hidden. It represents an absolute name from the root of the
+current scope.</p>
+<div class="paragraph">
+<p>Defined by the regular expression:
+<code>\.[$]?[a-zA-Z_][a-zA-Z0-9_]*(\.[$]?[a-zA-Z_][a-zA-Z0-9_]*)*</code>.
+It starts with a period (<code>.</code>), and then follows an <code>IDENTIFIER</code> or
+<code>RELATIVENAMETK</code>.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">.some_event
+.some_group.some_event</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>ROOTNAMETK</code></dt>
+<dd>
+<p>A root name. Absolute names can be used to refer to objects that are
+otherwise hidden. It represents an absolute name from the root the current
+specification.</p>
+<div class="paragraph">
+<p>Defined by the regular expression:
+<code>\^[$]?[a-zA-Z_][a-zA-Z0-9_]*(\.[$]?[a-zA-Z_][a-zA-Z0-9_]*)*</code>.
+It starts with a circumflex accent (<code>^</code>), and then follows an <code>IDENTIFIER</code> or
+<code>RELATIVENAMETK</code>.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">^some_group.some_event</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>NUMBERTK</code></dt>
+<dd>
+<p>An integer literal. Defined by the regular expression: <code>0|[1-9][0-9]*</code>.
+Integers thus consist of numeric digits. Only for the number <code>0</code> may an
+integer literal start with <code>0</code>. E.g. <code>02</code> is invalid.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">0
+1
+123</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>REALTK</code></dt>
+<dd>
+<p>A real literal. Defined by the regular expression:
+<code>(0|[1-9][0-9]*)(\.[0-9]+|(\.[0-9]+)?[eE][\-\+]?[0-9]+)</code>.
+Simple double literals consist of an integer literal followed by
+a period (<code>.</code>) and some numeric digits. Double literals using scientific
+notation start with either an integer literal or a simple double literal.
+They then contain either an <code>e</code> or <code>E</code>, followed by the exponent.
+The exponent consists of numeric digits, optionally preceded by <code>+</code> or <code>-</code>.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">0.0
+1e5
+1E+03
+1.05e-78</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>STRINGTK</code></dt>
+<dd>
+<p>A string literal. Defined by the regular expression:
+<code>\"([^\\\"\n]|\\[nt\\\"])*\"</code>. String literals are enclosed in double
+quotes (<code>"</code>). String literals must be on a single line and must thus not
+include new line characters (<code>\n</code>, Unicode U+0A). To include a double quote
+(<code>"</code>) in a string literal, it must be escaped as <code>\"</code>. Since a
+backslash (<code>\</code>) serves as escape character, to include a backslash in a string
+literal it must be escaped as <code>\\</code>. To include a tab character in a string
+literal, use <code>\t</code>. To include a newline in a string literal, use <code>\n</code>.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">&quot;hello world&quot;
+&quot;first line\nsecond line&quot;</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-whitespace">Whitespace</h4>
+<div class="paragraph">
+<p>CIF supports spaces, tabs, and new line characters as whitespace.
+Whitespace is ignored (except in string literals), but can be used to separate
+tokens as well as for layout purposes. The use of tab characters is allowed,
+but should be avoided if possible, as layout will be different for text
+editors with different tab settings. You may generally format a CIF
+script as you see fit, and start on a new line when desired.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Normal layout.
+int x = 5;
+
+// Alternative layout.
+int
+  x    =
+    5
+  ;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-comments">Comments</h4>
+<div class="paragraph">
+<p>CIF features two types of comments. Single line comments start with
+<code>//</code> and end at end of the line. Multi line comments start with <code>/*</code> and
+end at <code>*/</code>. Comments are ignored.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">int x = 5; // Single line comment.
+
+int /* some comment */ x = /* some
+  more comments
+  and some more
+ end of the multi line comment */ 5;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="lang-ref-syntax-grammar">Grammar</h3>
+<div class="paragraph">
+<p>Below, the <a href="http://en.wikipedia.org/wiki/Formal_grammar">grammar</a> of the
+CIF language is shown, in a form closely resembling
+<a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form">Backus-Naur Form</a>
+(BNF). The <code>Specification</code>
+<a href="http://en.wikipedia.org/wiki/Nonterminal_symbol">non-terminal</a> is the
+<a href="http://en.wikipedia.org/wiki/Start_symbol_(formal_languages)">start symbol</a>
+of the grammar. Text between quotes are terminals. Names using only upper case
+letters are defined in the <a href="#lang-ref-syntax-lexical">lexical syntax</a>. The
+remaining names are the non-terminals of the grammar.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="bnf">Specification : GroupBody
+              ;
+
+GroupBody : OptGroupDecls
+          ;
+
+AutomatonBody : OptAutDecls Locations OptIoDecls
+              ;
+
+OptGroupDecls : /* empty */
+              | OptGroupDecls GroupDecl
+              ;
+
+GroupDecl : Decl
+          | &quot;import&quot; Imports &quot;;&quot;
+          | &quot;namespace&quot; IDENTIFIERTK &quot;;&quot;
+          | &quot;namespace&quot; RELATIVENAMETK &quot;;&quot;
+          | &quot;func&quot; Types Identifier FuncParams &quot;:&quot; FuncBody
+          | Identifier &quot;:&quot; Name ActualParms &quot;;&quot;
+          | &quot;group&quot;                &quot;def&quot; Identifier FormalParms &quot;:&quot; GroupBody     &quot;end&quot;
+          | OptSupKind &quot;automaton&quot; &quot;def&quot; Identifier FormalParms &quot;:&quot; AutomatonBody &quot;end&quot;
+          |    SupKind             &quot;def&quot; Identifier FormalParms &quot;:&quot; AutomatonBody &quot;end&quot;
+          | &quot;group&quot;                      Identifier             &quot;:&quot; GroupBody     &quot;end&quot;
+          | OptSupKind &quot;automaton&quot;       Identifier             &quot;:&quot; AutomatonBody &quot;end&quot;
+          |    SupKind                   Identifier             &quot;:&quot; AutomatonBody &quot;end&quot;
+          ;
+
+OptAutDecls : /* empty */
+            | OptAutDecls AutDecl
+            ;
+
+AutDecl : Decl
+        | &quot;alphabet&quot; Events &quot;;&quot;
+        | &quot;alphabet&quot; &quot;;&quot;
+        | &quot;monitor&quot; Events &quot;;&quot;
+        | &quot;monitor&quot; &quot;;&quot;
+        | &quot;disc&quot; Type DiscDecls &quot;;&quot;
+        ;
+
+Decl : &quot;type&quot; TypeDefs &quot;;&quot;
+     | &quot;enum&quot; Identifier &quot;=&quot; &quot;{&quot; Identifiers &quot;}&quot; &quot;;&quot;
+     | &quot;enum&quot; Identifier &quot;=&quot; Identifiers &quot;;&quot;
+     | OptControllability &quot;event&quot;           Identifiers &quot;;&quot;
+     | OptControllability &quot;event&quot; EventType Identifiers &quot;;&quot;
+     |    Controllability                   Identifiers &quot;;&quot;
+     |    Controllability         EventType Identifiers &quot;;&quot;
+     | &quot;const&quot; Type ConstantDefs &quot;;&quot;
+     | &quot;alg&quot; Type AlgVarsDefs &quot;;&quot;
+     | &quot;input&quot; Type Identifiers &quot;;&quot;
+     | &quot;cont&quot; ContDecls &quot;;&quot;
+     | &quot;equation&quot; Equations &quot;;&quot;
+     | &quot;initial&quot; Expressions &quot;;&quot;
+     | InvariantDecls
+     | &quot;marked&quot; Expressions &quot;;&quot;
+     | IoDecl
+     ;
+
+Identifier : IDENTIFIERTK
+           ;
+
+Imports : StringToken
+        | Imports &quot;,&quot; StringToken
+        ;
+
+StringToken : STRINGTK
+            ;
+
+TypeDefs : Identifier &quot;=&quot; Type
+         | TypeDefs &quot;,&quot; Identifier &quot;=&quot; Type
+         ;
+
+ConstantDefs : Identifier &quot;=&quot; Expression
+             | ConstantDefs &quot;,&quot; Identifier &quot;=&quot; Expression
+             ;
+
+AlgVarsDefs : Identifier
+            | Identifier &quot;=&quot; Expression
+            | AlgVarsDefs &quot;,&quot; Identifier
+            | AlgVarsDefs &quot;,&quot; Identifier &quot;=&quot; Expression
+            ;
+
+FuncParams : &quot;(&quot; &quot;)&quot;
+           | &quot;(&quot; FuncParamDecls &quot;)&quot;
+           ;
+
+FuncParamDecls : Type Identifiers
+               | FuncParamDecls &quot;;&quot; Type Identifiers
+               ;
+
+FuncBody : FuncVarDecls FuncStatements &quot;end&quot;
+         | StringToken &quot;;&quot;
+         ;
+
+FuncVarDecls : /* empty */
+             | FuncVarDecls Type FuncVarDecl &quot;;&quot;
+             ;
+
+FuncVarDecl : Identifier
+            | Identifier &quot;=&quot; Expression
+            | FuncVarDecl &quot;,&quot; Identifier
+            | FuncVarDecl &quot;,&quot; Identifier &quot;=&quot; Expression
+            ;
+
+FuncStatements : FuncStatement
+               | FuncStatements FuncStatement
+               ;
+
+FuncStatement : Addressables &quot;:=&quot; Expressions &quot;;&quot;
+              | &quot;if&quot; Expressions &quot;:&quot; FuncStatements
+                OptElifFuncStats OptElseFuncStat &quot;end&quot;
+              | &quot;while&quot; Expressions &quot;:&quot; FuncStatements &quot;end&quot;
+              | &quot;break&quot; &quot;;&quot;
+              | &quot;continue&quot; &quot;;&quot;
+              | &quot;return&quot; Expressions &quot;;&quot;
+              ;
+
+OptElifFuncStats : /* empty */
+                 | OptElifFuncStats &quot;elif&quot; Expressions &quot;:&quot; FuncStatements
+                 ;
+
+OptElseFuncStat : /* empty */
+                | &quot;else&quot; FuncStatements
+                ;
+
+Events : Name
+       | Events &quot;,&quot; Name
+       ;
+
+CoreEdge : EdgeEvents         OptEdgeGuard OptEdgeUrgent OptEdgeUpdate
+         | &quot;when&quot; Expressions              OptEdgeUrgent OptEdgeUpdate
+         | &quot;now&quot;                                         OptEdgeUpdate
+         | &quot;do&quot; Updates
+         ;
+
+OptEdgeGuard : /* empty */
+             | &quot;when&quot; Expressions
+             ;
+
+OptEdgeUrgent : /* empty */
+              | &quot;now&quot;
+              ;
+
+OptEdgeUpdate : /* empty */
+              | &quot;do&quot; Updates
+              ;
+
+EdgeEvents : EdgeEvent
+           | EdgeEvents &quot;,&quot; EdgeEvent
+           ;
+
+EdgeEvent : &quot;tau&quot;
+          | Name
+          | Name &quot;!&quot;
+          | Name &quot;!&quot; Expression
+          | Name &quot;?&quot;
+          ;
+
+Locations : Location
+          | Locations Location
+          ;
+
+Location : &quot;location&quot; &quot;;&quot;
+         | &quot;location&quot; Identifier &quot;;&quot;
+         | &quot;location&quot; &quot;:&quot; LocationElements
+         | &quot;location&quot; Identifier &quot;:&quot; LocationElements
+         ;
+
+LocationElements : LocationElement
+                 | LocationElements LocationElement
+                 ;
+
+LocationElement : &quot;initial&quot; &quot;;&quot;
+                | &quot;initial&quot; Expressions &quot;;&quot;
+                | InvariantDecls
+                | &quot;equation&quot; Equations &quot;;&quot;
+                | &quot;marked&quot; &quot;;&quot;
+                | &quot;marked&quot; Expressions &quot;;&quot;
+                | &quot;urgent&quot; &quot;;&quot;
+                | &quot;edge&quot; CoreEdge &quot;;&quot;
+                | &quot;edge&quot; CoreEdge &quot;goto&quot; Identifier &quot;;&quot;
+                ;
+
+ActualParms : &quot;(&quot; &quot;)&quot;
+            | &quot;(&quot; Expressions &quot;)&quot;
+            ;
+
+FormalParms : &quot;(&quot; &quot;)&quot;
+            | &quot;(&quot; FormalDecls &quot;)&quot;
+            ;
+
+FormalDecls : FormalDeclaration
+            | FormalDecls &quot;;&quot; FormalDeclaration
+            ;
+
+FormalDeclaration : OptControllability &quot;event&quot;           EventParamIds
+                  | OptControllability &quot;event&quot; EventType EventParamIds
+                  |    Controllability                   EventParamIds
+                  |    Controllability         EventType EventParamIds
+                  | Name Identifiers
+                  | &quot;location&quot; Identifiers
+                  | &quot;alg&quot; Type Identifiers
+                  ;
+
+EventParamIds : EventParamId
+              | EventParamIds &quot;,&quot; EventParamId
+              ;
+
+EventParamId : Identifier OptEventParamFlags
+             ;
+
+OptEventParamFlags : /* empty */
+                   | OptEventParamFlags EventParamFlag
+                   ;
+
+EventParamFlag : &quot;!&quot;
+               | &quot;?&quot;
+               | &quot;~&quot;
+               ;
+
+DiscDecls : DiscDecl
+          | DiscDecls &quot;,&quot; DiscDecl
+          ;
+
+DiscDecl : Identifier
+         | Identifier &quot;in&quot; &quot;any&quot;
+         | Identifier &quot;=&quot; Expression
+         | Identifier &quot;in&quot; &quot;{&quot; Expressions &quot;}&quot;
+         ;
+
+ContDecls : ContDecl
+          | ContDecls &quot;,&quot; ContDecl
+          ;
+
+ContDecl : Identifier OptDerivative
+         | Identifier &quot;=&quot; Expression OptDerivative
+         ;
+
+OptDerivative : /* empty */
+              | &quot;der&quot; Expression
+              ;
+
+Equations : Equation
+          | Equations &quot;,&quot; Equation
+          ;
+
+Equation : Identifier &quot;'&quot; &quot;=&quot; Expression
+         | Identifier &quot;=&quot; Expression
+         ;
+
+InvariantDecls : OptSupKind &quot;invariant&quot; Invariants &quot;;&quot;
+               |    SupKind             Invariants &quot;;&quot;
+               ;
+
+Invariants : Invariant
+           | Invariants &quot;,&quot; Invariant
+           ;
+
+Invariant : Expression
+          | Name                  &quot;needs&quot;    Expression
+          | NonEmptySetExpression &quot;needs&quot;    Expression
+          | Expression            &quot;disables&quot; Name
+          | Expression            &quot;disables&quot; NamesSet
+          ;
+
+NamesSet : &quot;{&quot; Names &quot;}&quot;
+         ;
+
+Names : Name
+      | Names &quot;,&quot; Name
+      ;
+
+Updates : Update
+        | Updates &quot;,&quot; Update
+        ;
+
+Update : Addressable &quot;:=&quot; Expression
+       | &quot;if&quot; Expressions &quot;:&quot; Updates
+         OptElifUpdates OptElseUpdate &quot;end&quot;
+       ;
+
+Addressables : Addressable
+             | Addressables &quot;,&quot; Addressable
+             ;
+
+Addressable : Identifier
+            | Identifier Projections
+            | &quot;(&quot; Addressable &quot;,&quot; Addressables &quot;)&quot;
+            ;
+
+Projections : Projection
+            | Projections Projection
+            ;
+
+Projection : &quot;[&quot; Expression &quot;]&quot;
+           ;
+
+OptElifUpdates : /* empty */
+               | OptElifUpdates &quot;elif&quot; Expressions &quot;:&quot; Updates
+               ;
+
+OptElseUpdate : /* empty */
+              | &quot;else&quot; Updates
+              ;
+
+Identifiers : Identifier
+            | Identifiers &quot;,&quot; Identifier
+            ;
+
+OptSupKind : /* empty */
+           | SupKind
+           ;
+
+OptControllability : /* empty */
+                   | Controllability
+                   ;
+
+Controllability : &quot;controllable&quot;
+                | &quot;uncontrollable&quot;
+                ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+OptIoDecls : /* empty */
+           | OptIoDecls IoDecl
+           ;
+
+IoDecl : SvgFile
+       | SvgCopy
+       | SvgMove
+       | SvgOut
+       | SvgIn
+       | PrintFile
+       | Print
+       ;
+
+SvgFile : &quot;svgfile&quot; StringToken &quot;;&quot;
+        ;
+
+OptSvgFile : /* empty */
+           | &quot;file&quot; StringToken
+           ;
+
+SvgCopy : &quot;svgcopy&quot; &quot;id&quot; Expression OptSvgCopyPre OptSvgCopyPost OptSvgFile &quot;;&quot;
+        ;
+
+OptSvgCopyPre : /* empty */
+              | &quot;pre&quot; Expression
+              ;
+
+OptSvgCopyPost : /* empty */
+               | &quot;post&quot; Expression
+               ;
+
+SvgMove : &quot;svgmove&quot; &quot;id&quot; Expression &quot;to&quot; Expression &quot;,&quot; Expression
+          OptSvgFile &quot;;&quot;
+        ;
+
+SvgOut : &quot;svgout&quot; &quot;id&quot; Expression SvgAttr &quot;value&quot; Expression OptSvgFile
+         &quot;;&quot;
+       ;
+
+SvgAttr : &quot;attr&quot; StringToken
+        | &quot;text&quot;
+        ;
+
+SvgIn : &quot;svgin&quot; &quot;id&quot; Expression &quot;event&quot; SvgInEvent OptSvgFile &quot;;&quot;
+      ;
+
+SvgInEvent : Name
+           | &quot;if&quot; Expression &quot;:&quot; Name OptSvgInEventElifs &quot;else&quot; Name &quot;end&quot;
+           | &quot;if&quot; Expression &quot;:&quot; Name SvgInEventElifs &quot;end&quot;
+           ;
+
+OptSvgInEventElifs : /* empty */
+                   | SvgInEventElifs
+                   ;
+
+SvgInEventElifs : &quot;elif&quot; Expression &quot;:&quot; Name
+                | SvgInEventElifs &quot;elif&quot; Expression &quot;:&quot; Name
+                ;
+
+PrintFile : &quot;printfile&quot; StringToken &quot;;&quot;
+          ;
+
+Print : &quot;print&quot; PrintTxt OptPrintFors OptPrintWhen OptPrintFile &quot;;&quot;
+      ;
+
+PrintTxt : Expression
+         | &quot;pre&quot; Expression
+         | &quot;post&quot; Expression
+         | &quot;pre&quot; Expression &quot;post&quot; Expression
+         ;
+
+OptPrintFors : /* empty */
+             | &quot;for&quot; PrintFors
+             ;
+
+PrintFors : PrintFor
+          | PrintFors &quot;,&quot; PrintFor
+          ;
+
+PrintFor : &quot;event&quot;
+         | &quot;time&quot;
+         | Name
+         | &quot;initial&quot;
+         | &quot;final&quot;
+         ;
+
+OptPrintWhen : /* empty */
+             | &quot;when&quot; Expression
+             | &quot;when&quot; &quot;pre&quot; Expression
+             | &quot;when&quot; &quot;post&quot; Expression
+             | &quot;when&quot; &quot;pre&quot; Expression &quot;post&quot; Expression
+             ;
+
+OptPrintFile : /* empty */
+             | &quot;file&quot; StringToken
+             ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+Types : Type
+      | Types &quot;,&quot; Type
+      ;
+
+EventType : &quot;void&quot;
+          | Type
+          ;
+
+Type : &quot;bool&quot;
+     | &quot;int&quot;
+     | &quot;int&quot; &quot;[&quot; Expression &quot;..&quot; Expression &quot;]&quot;
+     | &quot;real&quot;
+     | &quot;string&quot;
+     | &quot;list&quot; Type
+     | &quot;list&quot; &quot;[&quot; Expression &quot;]&quot; Type
+     | &quot;list&quot; &quot;[&quot; Expression &quot;..&quot; Expression &quot;]&quot; Type
+     | &quot;set&quot; Type
+     | &quot;dict&quot; &quot;(&quot; Type &quot;:&quot; Type &quot;)&quot;
+     | &quot;tuple&quot; &quot;(&quot; Fields &quot;)&quot;
+     | &quot;func&quot; Type &quot;(&quot; &quot;)&quot;
+     | &quot;func&quot; Type &quot;(&quot; Types &quot;)&quot;
+     | &quot;dist&quot; Type
+     | Name
+     ;
+
+Fields : Field
+       | Fields &quot;;&quot; Field
+       ;
+
+Field : Type Identifiers
+      ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+Expressions : Expression
+            | Expressions &quot;,&quot; Expression
+            ;
+
+OptExpression : /* empty */
+              | Expression
+              ;
+
+Expression : OrExpression
+           | OrExpression &quot;=&gt;&quot; OrExpression
+           | OrExpression &quot;&lt;=&gt;&quot; OrExpression
+           ;
+
+OrExpression : AndExpression
+             | OrExpression &quot;or&quot; AndExpression
+             ;
+
+AndExpression : CompareExpression
+              | AndExpression &quot;and&quot; CompareExpression
+              ;
+
+CompareExpression : AddExpression
+                  | CompareExpression &quot;&lt;&quot;  AddExpression
+                  | CompareExpression &quot;&lt;=&quot; AddExpression
+                  | CompareExpression &quot;=&quot;  AddExpression
+                  | CompareExpression &quot;!=&quot; AddExpression
+                  | CompareExpression &quot;&gt;=&quot; AddExpression
+                  | CompareExpression &quot;&gt;&quot;  AddExpression
+                  | CompareExpression &quot;in&quot; AddExpression
+                  | CompareExpression &quot;sub&quot; AddExpression
+                  ;
+
+AddExpression : MulExpression
+              | AddExpression &quot;+&quot; MulExpression
+              | AddExpression &quot;-&quot; MulExpression
+              ;
+
+MulExpression : UnaryExpression
+              | MulExpression &quot;*&quot; UnaryExpression
+              | MulExpression &quot;/&quot; UnaryExpression
+              | MulExpression &quot;div&quot; UnaryExpression
+              | MulExpression &quot;mod&quot; UnaryExpression
+              ;
+
+UnaryExpression : FuncExpression
+                | &quot;-&quot; UnaryExpression
+                | &quot;+&quot; UnaryExpression
+                | &quot;not&quot; UnaryExpression
+                | &quot;sample&quot; FuncExpression
+                ;
+
+FuncExpression : ExpressionFactor
+               | FuncExpression &quot;[&quot; Expression &quot;]&quot;
+               | FuncExpression
+                 &quot;[&quot; OptExpression &quot;:&quot; OptExpression &quot;]&quot;
+               | FuncExpression &quot;(&quot; &quot;)&quot;
+               | FuncExpression &quot;(&quot; Expressions &quot;)&quot;
+               | StdLibFunction &quot;(&quot; &quot;)&quot;
+               | StdLibFunction &quot;(&quot; Expressions &quot;)&quot;
+               ;
+
+ExpressionFactor : &quot;true&quot;
+                 | &quot;false&quot;
+                 | NUMBERTK
+                 | REALTK
+                 | StringToken
+                 | &quot;time&quot;
+                 | &quot;[&quot; &quot;]&quot;
+                 | &quot;[&quot; Expressions &quot;]&quot;
+                 | &quot;{&quot; &quot;}&quot;
+                 | NonEmptySetExpression
+                 | &quot;{&quot; DictPairs &quot;}&quot;
+                 | &quot;(&quot; Expression &quot;,&quot; Expressions &quot;)&quot;
+                 | &quot;&lt;&quot; Type &quot;&gt;&quot; ExpressionFactor
+                 | &quot;if&quot; Expressions &quot;:&quot; Expression
+                   OptElifExprs &quot;else&quot; Expression &quot;end&quot;
+                 | &quot;switch&quot; Expression &quot;:&quot; SwitchBody &quot;end&quot;
+                 | &quot;(&quot; Expression &quot;)&quot;
+                 | Name
+                 | Name &quot;'&quot;
+                 | &quot;?&quot;
+                 | &quot;self&quot;
+                 ;
+
+NonEmptySetExpression : &quot;{&quot; Expressions &quot;}&quot;
+                      ;
+
+DictPairs : Expression &quot;:&quot; Expression
+          | DictPairs &quot;,&quot; Expression &quot;:&quot; Expression
+          ;
+
+OptElifExprs : /* empty */
+             | OptElifExprs &quot;elif&quot; Expressions &quot;:&quot; Expression
+             ;
+
+SwitchBody : SwitchCases
+           | SwitchCases &quot;else&quot; Expression
+           |             &quot;else&quot; Expression
+           ;
+
+SwitchCases : &quot;case&quot; Expression &quot;:&quot; Expression
+            | SwitchCases &quot;case&quot; Expression &quot;:&quot; Expression
+            ;
+
+Name : Identifier
+     | RELATIVENAMETK
+     | ABSOLUTENAMETK
+     | ROOTNAMETK
+     ;
+
+SupKind : &quot;plant&quot;
+        | &quot;requirement&quot;
+        | &quot;supervisor&quot;
+        ;
+
+StdLibFunction : &quot;acosh&quot;
+               | &quot;acos&quot;
+               | &quot;asinh&quot;
+               | &quot;asin&quot;
+               | &quot;atanh&quot;
+               | &quot;atan&quot;
+               | &quot;cosh&quot;
+               | &quot;cos&quot;
+               | &quot;sinh&quot;
+               | &quot;sin&quot;
+               | &quot;tanh&quot;
+               | &quot;tan&quot;
+               | &quot;abs&quot;
+               | &quot;cbrt&quot;
+               | &quot;ceil&quot;
+               | &quot;del&quot;
+               | &quot;empty&quot;
+               | &quot;exp&quot;
+               | &quot;floor&quot;
+               | &quot;fmt&quot;
+               | &quot;ln&quot;
+               | &quot;log&quot;
+               | &quot;max&quot;
+               | &quot;min&quot;
+               | &quot;pop&quot;
+               | &quot;pow&quot;
+               | &quot;round&quot;
+               | &quot;scale&quot;
+               | &quot;sign&quot;
+               | &quot;size&quot;
+               | &quot;sqrt&quot;
+               | &quot;bernoulli&quot;
+               | &quot;beta&quot;
+               | &quot;binomial&quot;
+               | &quot;constant&quot;
+               | &quot;erlang&quot;
+               | &quot;exponential&quot;
+               | &quot;gamma&quot;
+               | &quot;geometric&quot;
+               | &quot;lognormal&quot;
+               | &quot;normal&quot;
+               | &quot;poisson&quot;
+               | &quot;random&quot;
+               | &quot;triangle&quot;
+               | &quot;uniform&quot;
+               | &quot;weibull&quot;
+               ;</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="tools-chapter-index">Tools</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Below you can find information about the individual applications of the CIF toolset.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p><strong>Applications</strong></p>
+</div>
+<div class="paragraph">
+<p>The CIF toolset consists of applications that cover a wide range of
+functionality. The available applications are listed below, categorized by the
+different phases of the development process.</p>
+</div>
+<div class="paragraph">
+<p><em>Specification</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-chapter-text-editor">CIF text editor</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-cif2yed">CIF to yEd transformer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Supervisory controller synthesis</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-chapter-datasynth">Data-based supervisory controller synthesis</a></p>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-index">Event-based synthesis toolset</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-cif2supremica">CIF to Supremica transformer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Simulation, validation, and visualization</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-index">CIF simulator</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Verification</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-chapter-cif2mcrl2">CIF to mCRL2 transformer</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-cif2uppaal">CIF to UPPAAL transformer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Real-time testing, code generation, and implementation</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-codegen-chapter-index">CIF code generator</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2plc-chapter-index">CIF PLC code generator</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Miscellaneous</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-index">CIF to CIF transformer</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-mergecif">CIF merger</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-event-disabler">CIF event disabler</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-cif-explorer">CIF explorer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p><strong>Scripting</strong></p>
+</div>
+<div class="paragraph">
+<p>The CIF tools can be used on the command line, as well as in the
+Eclipse IDE. They can also be used in ToolDef scripts. The following additional
+information is available on scripting related to CIF and ToolDef scripts:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-scripting-chapter-intro">Introduction to scripting</a></p>
+</li>
+<li>
+<p><a href="#tools-scripting-chapter-tools">Overview of scriptable tools</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="tools-specification-tools">Specification tools</h3>
+<div class="sect3">
+<h4 id="tools-chapter-text-editor">CIF text editor</h4>
+<div class="paragraph">
+<p>
+Part of the CIF tooling is a textual editor for CIF specifications. This
+editor is part of the Eclipse IDE. Below is a list of some of the more
+notable features of this text editor:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>continuous background validation (integrated parsing and type checking), with
+error markings directly in the source</p>
+</li>
+<li>
+<p>comment spell checking</p>
+</li>
+<li>
+<p>code folding</p>
+</li>
+<li>
+<p>commands to comment/uncomment the (partially) selected line or lines</p>
+</li>
+<li>
+<p>block selection mode</p>
+</li>
+<li>
+<p>detection of external changes to files</p>
+</li>
+<li>
+<p>shows line numbers</p>
+</li>
+<li>
+<p>drag-and-drop editing</p>
+</li>
+<li>
+<p>optionally can show whitespace characters</p>
+</li>
+<li>
+<p>configurable tab key settings</p>
+</li>
+<li>
+<p>automatic removal of trailing whitespace from all lines on save</p>
+</li>
+<li>
+<p>automatic addition of a new line character at the end of the file on save,
+if none is present (includes smart detection of the platform dependent new
+line characters that are used in the file)</p>
+</li>
+</ul>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./screenshot_ide.png" alt="Screenshot CIF text editor">
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-cif2yed">CIF to yEd transformer</h4>
+<div class="paragraph">
+<p>
+
+
+The CIF to yEd transformer can be used to transform CIF specifications to
+yEd diagrams. Several <a href="#tools-cif2yed-diagram-kinds">kinds of diagrams</a>
+can be generated. These diagrams can be used to better understand the
+specification, to communicate the specification to other, or to be included in
+reports.</p>
+</div>
+<div class="paragraph">
+<p>The
+<a href="http://www.yworks.com/en/products/yfiles/yed/">yEd Graph Editor</a>
+is an
+application that can be used to view, create, edit, arrange, import and export
+various kinds of diagrams. It is freely available and runs on Windows, Linux,
+and Mac OS X.</p>
+</div>
+<div class="paragraph">
+<p>The yEd diagrams are generated as
+<a href="http://graphml.graphdrawing.org/">GraphML</a>
+files (<code>*.graphml</code> files), using yEd specific extensions to specify the
+graphical representation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<b class="menuref">Convert CIF to yEd diagram&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<b class="menuref">Convert CIF to yEd diagram&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>Use the <code>cif2yed</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2yed</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2yed-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative local file system path to the
+output yEd/GraphML diagram file. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>.kind.graphml</code> file extension is added. For the added default file
+extension, <code>kind</code> is replaced by the diagram kind (see other option), e.g.
+<code>model</code>, resulting in file extension <code>.model.graphml</code>. If multiple
+diagrams are generated, the output file path may not be specified. In such
+cases, either use the implicit/default file names, or generate one diagram at
+a time, allowing you to specify an explicit output file path for each of
+them.</p>
+</li>
+<li>
+<p><em>Diagram kinds</em>: The kinds of diagrams to generate. The default is to
+generate all the different kinds of diagrams. See the
+<a href="#tools-cif2yed-diagram-kinds">Diagram kinds</a> section for details.</p>
+</li>
+<li>
+<p><em>Syntax highlighting</em>: Whether to apply syntax highlighting (if option is
+enabled), or use plain text (if option is disabled). By default, syntax
+highlighting is enabled. For large diagrams, disabling syntax highlighting
+can significantly improve the performance, when displaying the diagrams in
+yEd.</p>
+</li>
+<li>
+<p><em>Transparent edge labels</em>: Enable option to use a transparent background for
+edge labels. Disable option to use a light gray background. By default, the
+option is disabled (a light gray background is used). See the
+<a href="#tools-cif2yed-layout">Layout</a> section below for further details.</p>
+</li>
+<li>
+<p><em>Model filters</em>: The kinds of features to include in the diagram. Only
+applies to model diagrams. See the <a href="#tools-cif2yed-diagram-model">Model diagram</a> section
+for details.</p>
+</li>
+<li>
+<p><em>Relations</em>: The kinds of relations to include in relations diagrams. The
+default is to include all kinds of relations. See the
+<a href="#tools-cif2yed-diagram-relations">Relations diagram</a> section for details.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications">Supported specifications</h5>
+<div class="paragraph">
+<p>For <a href="#tools-cif2yed-diagram-model">model diagrams</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>This transformation supports all CIF specifications.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For <a href="#tools-cif2yed-diagram-relations">relations diagrams</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>CIF specifications with
+<a href="#lang-tut-reuse2-aut-def-param-kinds-aut">component parameters</a> are not
+supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing">Preprocessing</h5>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2yed-diagram-kinds">Diagram kinds</h5>
+<div class="paragraph">
+<p>Several types of diagrams can be created. They are each described below. Using
+the <em>Diagram kinds</em> option (see the <a href="#tools-cif2yed-options">Options</a> section
+above), generation of certain kind of diagrams can be enabled or disabled.</p>
+</div>
+<div class="paragraph">
+<p>In the option dialog, each diagram kind can be enabled and disabled
+individually, using a checkbox.</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>-k</code> or <code>--diagram-kinds</code> option, the
+names of the diagram kinds, as indicates for each diagram kind in the sections
+below, should be used, separated by commas. By default, i.e. when the <code>-k</code> or
+<code>--diagram-kinds</code> option is not used, diagrams are generated for all the
+different kinds. As an example, consider <code>-k model</code> or
+<code>--diagram-kinds=model</code>. Only a model diagram is generated, while all
+other diagrams are not generated.</p>
+</div>
+<div class="paragraph">
+<p>The diagram kinds that are specified using the option replace the default
+diagram kinds. However, it is also possible to specify additions and removals
+relative to the default features, by prefixing features with a <code>+</code> or <code>-</code>
+respectively. For instance, when using <code>-k -model</code> or
+<code>--diagram-kinds=-model</code> the default diagrams are generated, except for the
+model diagram (due to <code>-model</code>). Replacements (no prefix) may not be
+combined with additions/removals (<code>+</code> or <code>-</code> prefix).</p>
+</div>
+<div class="paragraph">
+<p>Specifying a replacement diagram kind twice leads to a warning being printed to
+the console. Adding a diagram kind that is already present or removing a
+diagram kind that is not present, also leads to a warning being printed.
+A warning is also printed to the console if all diagram kinds are disabled, and
+thus no output is generated.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2yed-diagram-model">Model diagram</h6>
+<div class="paragraph">
+<p>The option value to use on the command line, for this kind of diagrams, is
+<code>model</code>.</p>
+</div>
+<div class="paragraph">
+<p>A diagram of the model itself, with all its details. That is, the diagram can
+be used instead of the textual representation of the model, without loss of
+details. Changes with respect to the textual representation include among
+others elimination of <a href="#tut-reuse2-chapter-imports">imports</a>, and the loss
+of comments and textual layout.</p>
+</div>
+<div class="paragraph">
+<p>All components (<a href="#tut-basics-chapter-automata">automata</a>,
+<a href="#tut-reuse2-chapter-groups">groups</a>, automaton
+<a href="#tut-reuse2-chapter-aut-def-inst">instantiations</a>, and group
+instantiations) and components
+<a href="#tut-reuse2-chapter-aut-def-inst">definitions</a> (automata and group
+definitions) are visualized in a hierarchical manner, as rectangles contained
+in other rectangles. Automaton and group instantiations are grouped together
+into a single node in the diagram. All of them can be closed (collapsed) and
+opened (expanded) in yEd, allowing to hide unimportant details while focusing
+on only a part of the diagram. The header of the component or component
+definition is shown at the top of the rectangle, while for instantiations the
+word <code>Instantiations</code> is used as header. For groups and group definitions an
+italic font is used, while for automata, automaton definitions, and
+automaton/group instantiations, a regular font is used. The background (of the
+header) is colored as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_comp_header.png" alt="cif2yed color comp header"></span>
+A component (group/automaton)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_def_header.png" alt="cif2yed color def header"></span>
+A component definition (group/automaton definition)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_inst_header.png" alt="cif2yed color inst header"></span>
+A component instantiation (group/automaton instantiation)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For instantiations, the complete instantiations are shown as code block in the
+body of the rectangle.</p>
+</div>
+<div class="paragraph">
+<p>For the declarations (e.g.
+<a href="#tut-data-chapter-discrete-variables">variables</a>),
+<a href="#tut-data-chapter-stat-invariants">invariants</a>, I/O declarations (e.g.
+<a href="#tools-cifsim-output-svgviz-chapter-cifsvg">SVG declarations</a>), etc a block of
+code is used. Code blocks use header and background colors that are distinct
+from the colors used for components, component definitions, and component
+instantiations:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_code_header.png" alt="cif2yed color code header"></span>
+A code block (header)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_code_bg.png" alt="cif2yed color code bg"></span>
+A code block (background)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For automata, the <a href="#lang-tut-basics-automata-location">locations</a> are
+visualized as rectangles with rounded colors. Their names (if applicable),
+invariants, equations, etc are shown as code in the rectangles. The
+<a href="#tut-data-chapter-init-preds">initialization</a> of the location (if present
+and not <code>false</code>) is visualized as an incoming arrow without source location,
+with a label indicating the initialization predicates if they are not <code>true</code>.
+<a href="#lang-tut-basics-edge">Edges</a> are visualized as arrows between locations,
+with arrows to the source location itself for self loop edges. The events,
+guards, <code>now</code> keywords (for <a href="#tut-time-chapter-urgency">urgent</a> edges),
+and updates are put as labels on the edges. Locations use a background color
+that is distinct from the colors used for components, component definitions,
+and code blocks:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_loc_bg.png" alt="cif2yed color loc bg"></span>
+A location (background)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>As an example consider the following diagram of the CIF <code>tank</code> example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cif2yed/tank.model.layouted.png" alt="tank.model.layouted">
+</div>
+</div>
+<div class="paragraph">
+<p>Using the <em>Model filters</em> option (see the <a href="#tools-cif2yed-options">Options</a> section
+above), certain features of the model can be included or excluded from the
+diagram. The table below indicates the features that can be enabled and
+disabled using the option. The first column lists the names to use on the
+command line. The second column indicates whether the feature is enabled
+(included) by default. The third column describes what parts of the model are
+included/excluded when the feature is enabled/disabled.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Name</th>
+<th class="tableblock halign-left valign-top">Default</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>io</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The I/O declarations, e.g. <a href="#tools-cifsim-output-svgviz-chapter-cifsvg">SVG declarations</a>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>decls</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The declarations of the components. Includes the alphabet (if explicitly
+specified) and monitors of the automata, event declarations, constant
+declarations, variable declarations, function declarations, invariants,
+initialization predicates, marker predicates, equations, etc.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>loc-decls</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The declarations of the locations. Includes the invariants, marker
+predicates, equations, and urgency.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The guards of the edges. Includes also the urgency of the edge (the
+<code>now</code>) keyword.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>updates</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The updates of the edges.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>In the option dialog, each of the features can be enabled and disabled
+individually, using a checkbox.</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>-f</code> or <code>--model-filters</code> option, the
+names of the different features, as indicates in the first column of the table
+above, should be used, separated by commas. The features indicated as default
+in the second column of the table, are enabled when default settings are used,
+i.e. when the <code>-f</code> or <code>--model-filters</code> option is not used. As an example,
+consider <code>-f guards,updates</code> or <code>--model-filters=guards,updates</code>. Only
+the guards and updates are included, while all the other features are excluded.</p>
+</div>
+<div class="paragraph">
+<p>The features that are specified using the option replace the default features.
+However, it is also possible to specify additions and removals relative to the
+default features, by prefixing features with a <code>+</code> or <code>-</code> respectively. For
+instance, when using <code>-f -loc-decls,+io</code> or
+<code>--model-filters=-loc-decls,+io</code> the default features are used, with the
+declarations of the locations disabled (due to <code>-loc-decls</code>), and with I/O
+declarations enabled (due to <code>+io</code>). Replacements (no prefix) may not be
+combined with additions/removals (<code>+</code> or <code>-</code> prefix).</p>
+</div>
+<div class="paragraph">
+<p>Specifying a replacement feature type twice leads to a warning being printed to
+the console. Adding a feature that is already present or removing a feature
+that is not present, also leads to a warning being printed.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2yed-diagram-relations">Relations diagram</h6>
+<div class="paragraph">
+<p>The option value to use on the command line, for this kind of diagrams, is
+<code>relations</code>.</p>
+</div>
+<div class="paragraph">
+<p>A diagram of only the <a href="#lang-tut-basics-automata-events">event</a> and
+data relations. The diagram can be used to see which events are used by which
+<a href="#tut-basics-chapter-automata">automata</a> (are in the
+<a href="#tut-basics-chapter-alphabet">alphabet</a> of those automata). It can also be
+used to see which data (variables, locations, etc) exist in the model and where
+they are used. Furthermore, it can also be used to see how events and data are
+passed via automaton and group
+<a href="#tut-reuse2-chapter-aut-def-inst">instantiations</a>. Events, variables, and
+locations can thereby potentially be renamed if the
+<a href="#tut-reuse2-chapter-aut-def-params">parameters</a> of the
+corresponding automaton or <a href="#tut-reuse2-chapter-groups">group</a>
+<a href="#tut-reuse2-chapter-aut-def-inst">definitions</a> have different names than
+the events, variables, and locations that are passed via the instantiations.</p>
+</div>
+<div class="paragraph">
+<p>All components (automata, groups, automaton instantiations, and group
+instantiations) and component definitions (automaton and group definitions) are
+visualized in a hierarchical manner, as rectangles contained in other
+rectangles. Automaton and group instantiations are unfolded to their contents
+(the body of the corresponding automaton or group definition). Essentially, it
+is as if component definition/instantiation has been
+<a href="#tools-cif2cif-chapter-elim-comp-def-inst">eliminated</a>, but the parameters are
+kept. Within components and component definition bodies, the components
+(including the component instantiations) and declarations (event declarations,
+event parameters, algebraic variables, algebraic parameters, locations, etc)
+are separated from the component definitions, using additional wrapping boxes.
+Such wrapping boxes are only added if both components and component definitions
+are present, and thus separation is needed.</p>
+</div>
+<div class="paragraph">
+<p>However, all internal details of component instantiations are omitted, as they
+can be seen in the graphical representations of component definitions (that are
+instantiated by the instantiations). That is, only the external connections are
+included, as they show the actual relations (definition here and use there,
+synchronizations between components, etc). By excluding the internal details,
+duplication is avoided for multiple instantiations of the same definition. All
+empty components and components definitions are also excluded, as they only
+clutter the diagram, and have no relations whatsoever.</p>
+</div>
+<div class="paragraph">
+<p>All components can be closed (collapsed) and opened (expanded) in yEd, allowing
+to hide unimportant details while focusing on only a part of the diagram. By
+default, all components are closed (collapsed). This allows seeing the top
+level structure. By selectively opening (expanding) components, more details
+can be shown. It is also possible to focus on a single component, to show only
+that component and its contents, by selecting
+<span class="menuseq"><b class="menu">Grouping</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">View Group Content</b></span>
+in yEd, while a closed or
+opened component is selected.</p>
+</div>
+<div class="paragraph">
+<p>The header of the component is shown at the top of the rectangle. It includes
+the name of the component or component definition, whether it is a group or
+automaton, whether it is a definition or not, etc. The parameters of component
+definitions, and the arguments of component instantiations, are all omitted
+from the headers. For wrappers either <em>Components</em> or <em>Component definitions</em>
+is used as header text. For groups, group definitions, and group instantiations
+an italic font is used, while for automata, automaton definitions, automaton
+instantiations, and wrapping boxes, a regular font is used. The background of
+the header is colored as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_comp_header.png" alt="cif2yed color comp header"></span>
+A component (group/automaton)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_def_header.png" alt="cif2yed color def header"></span>
+A component definition (group/automaton definition)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_inst_header.png" alt="cif2yed color inst header"></span>
+A component instantiation (group/automaton instantiation)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_color_wrap_box_header.png" alt="cif2yed color wrap box header"></span>
+A wrapping box for components (incl. instantiations) or component definitions</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Event <a href="#lang-tut-basics-automata-events">declarations</a>,
+<a href="#tut-data-chapter-discrete-variables">discrete variables</a>,
+<a href="#tut-time-chapter-continuous-variables">continuous variables</a>,
+<a href="#tut-reuse1-chapter-algebraic-variables">algebraic variables</a>,
+<a href="#tut-reuse2-chapter-input-variables">input variables</a>, and
+<a href="#lang-tut-basics-automata-location">locations</a> are all visualized as
+rectangles with a thick border. The text in the rectangle is a keyword
+(<code>event</code>, <code>disc</code>, <code>cont</code>, etc), followed by the name of the declaration.
+For <a href="#tut-channels-chapter-intro">channels</a> (events with a data type), the
+name is followed by <code>!?~</code>.</p>
+</div>
+<div class="paragraph">
+<p>Event, location, and algebraic
+<a href="#tut-reuse2-chapter-aut-def-params">parameters</a> are visualized as
+octagons with a thin dashed border. The text in the rectangle is a keyword
+(<code>event</code>, <code>location</code>, etc), followed by the name of the parameter. For
+<a href="#tut-channels-chapter-intro">channels</a> (events with a data type), the name
+is followed by the <a href="#lang-tut-reuse2-aut-def-param-kinds-event-restrictions">event parameter usage restriction flags</a> (e.g. <code>!</code> for send,
+<code>?</code> for receive, and/or <code>~</code> for synchronization). For channel parameters
+without flags, <code>!?~</code> is used as text after the name of the parameter.</p>
+</div>
+<div class="paragraph">
+<p>Uses of events and data are visualized as circles. For uses of events by
+automata (event in the alphabet of the automaton), the circles indicate the
+type of use: <code>!</code> if the automaton sends over the channel, <code>?</code> if the
+automaton receives over the channel, and no text if the automaton
+<a href="#tut-basics-chapter-synchronizing-events">synchronizes</a> over the event (the
+event is in the alphabet of the automaton). For data uses, the circles never
+contain text.</p>
+</div>
+<div class="paragraph">
+<p>Different colors are used for declarations, parameters, and uses, as well as
+for events and data:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_event_decl.png" alt="cif2yed event decl"></span>
+An event declaration</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_event_param.png" alt="cif2yed event param"></span>
+An event parameter</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_event_usage_send.png" alt="cif2yed event usage send"></span>
+An event usage (automaton sends)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_event_usage_recv.png" alt="cif2yed event usage recv"></span>
+An event usage (automaton receives)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_event_usage_sync.png" alt="cif2yed event usage sync"></span>
+An event usage (automaton synchronizes)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_data_decl.png" alt="cif2yed data decl"></span>
+A variable declaration or a location</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_data_param.png" alt="cif2yed data param"></span>
+A location parameter or an algebraic parameter</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2yed/cif2yed_data_usage.png" alt="cif2yed data usage"></span>
+A data (variable, location, parameter) usage in a component</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Each event usage is coupled to the event declaration or event parameter that it
+refers to, using a directed or undirected edge. For synchronizing usage an
+undirected edge is used, for send usage a directed edge from the usage to the
+event declaration or event parameter is used, and for receive usage a directed
+edge from the event declaration or event parameter to the usage is used.</p>
+</div>
+<div class="paragraph">
+<p>Each data usage in a component not related to a declaration (variable,
+location, or parameter) gets a circular node to indicate usage. It is coupled
+to the declaration it uses, via a directed edge from the declaration to the
+use, to indicate the flow of data. Duplicate edges are avoided.</p>
+</div>
+<div class="paragraph">
+<p>Event parameters of component instantiations are coupled to the actual event
+(or event parameter) that is provided by the instantiation, using a directed or
+undirected edge. If the parameter is a channel parameter that explicitly allows
+sending (has a <code>!</code> flag) and doesn&#8217;t allow receiving (has no <code>?</code> flag), a
+directed edge from the parameter to the actual event is used. If it explicitly
+allows receiving (has <code>?</code> flag) and doesn&#8217;t allow sending (has no <code>!</code>
+flag), a directed edge from the actual event to the parameter is used. If it
+explicitly allows both sending and receiving (has both a <code>!</code> and a <code>?</code>
+flag), a bidirectional edge is used. In all other cases, an undirected edge is
+used.</p>
+</div>
+<div class="paragraph">
+<p>Location parameters of component instantiations are coupled to the actual
+location (or location parameter) that is provided by the instantiation, using a
+directed edge from the actual location to the parameter, to indicate the flow
+of data. Similarly, algebraic parameters are related to the actual arguments.
+However, for algebraic parameters, an
+<a href="#tut-values-chapter-types-values-exprs">expression</a> may be provided. For
+each variable, location, and parameter used in the actual argument, a directed
+edge is added. Duplicate edges are avoided.</p>
+</div>
+<div class="paragraph">
+<p>From declarations (variables, locations, parameters), directed edges are
+included in the diagram for all relations to other declarations. For instance,
+if a discrete variable is initialized using the value of an algebraic variable,
+there will be an edge from the algebraic variable to the discrete variable.
+Similarly, if in a continuous variable is used in a guard, there will be an
+edge from the continuous variable to the location that contains the edge.
+Duplicate edges are avoided.</p>
+</div>
+<div class="paragraph">
+<p>As an example consider the following relations diagram of the CIF
+'machine/buffer' example, showing only the event relations:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cif2yed/machine_buffer.events.layouted.png" alt="machine buffer.events.layouted">
+</div>
+</div>
+<div class="paragraph">
+<p>Using the <em>Relations</em> option (see the <a href="#tools-cif2yed-options">Options</a> section
+above), certain kinds of relations included or excluded from the diagram. By
+default all kinds of relations are included. The following kinds of relations
+are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>event relations (<code>event</code>)</p>
+</li>
+<li>
+<p>data relations (<code>data</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In the option dialog, each of the features can be enabled and disabled
+individually, using a checkbox.</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>-r</code> or <code>--relations</code> option, the
+names of the different kinds of relations, as indicates between parentheses
+above, should be used, separated by commas. As an example, consider
+<code>-r event</code> or <code>--relations=event</code>. Only the event relations are included,
+while all the other relations are excluded.</p>
+</div>
+<div class="paragraph">
+<p>The kinds that are specified using the option replace the default kinds.
+However, it is also possible to specify additions and removals relative to the
+default kinds, by prefixing names with a <code>+</code> or <code>-</code> respectively. For
+instance, when using <code>-r -event</code> or <code>--relations=-event</code> the default kinds
+are used, with the event relations excluded (due to <code>-event</code>). Replacements
+(no prefix) may not be combined with additions/removals (<code>+</code> or <code>-</code>
+prefix).</p>
+</div>
+<div class="paragraph">
+<p>Specifying a replacement kind type twice leads to a warning being printed to
+the console. Adding a kind that is already present or removing a kind that is
+not present, also leads to a warning being printed. Finally, generating a
+relations diagram without any relations also leads to a warning being printed.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2yed-layout">Layout</h5>
+<div class="paragraph">
+<p>The generated diagrams can be opened in the yEd Diagram Editor using
+<span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Open&#8230;&#8203;</b></span>. After opening the diagram, all nodes
+overlap, as the generated diagrams don&#8217;t contain any positions for them. yEd
+can automatically layout the diagram. Several layout algorithms are available
+in the
+<b class="menuref">Layout</b>
+menu.</p>
+</div>
+<div class="paragraph">
+<p>Good results for <a href="#tools-cif2yed-diagram-model">model diagrams</a> can often
+be obtained by using the
+<b class="button">Orthogonal layout</b>.
+Select
+<span class="menuseq"><b class="menu">Layout</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Orthogonal</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Classic</b></span> to show the
+'Orthogonal Layout' window. Click the
+<b class="button">Dock</b>
+button to dock
+the window. Once docked, select
+<b class="button">Integrated</b>
+for
+<b class="button">Edge Labeling</b>
+and
+<b class="button">Free</b>
+for
+<b class="button">Edge Label Model</b>.
+Also enable the
+<b class="button">Length Reduction</b>
+and
+<b class="button">Consider Node Labels</b>
+options. Press the
+<b class="button">Apply changes</b>
+button (the green rectangle) at the top of the docked window to apply the
+changes to the layout.</p>
+</div>
+<div class="paragraph">
+<p>You may want to try different values for the 'Grid' option, to get
+more or less spacing between nodes. Once you change a value, just apply the new
+layout, as before. The automatic layout algorithms aren&#8217;t perfect, but they are
+usually a good starting point.</p>
+</div>
+<div class="paragraph">
+<p>By default, edge labels have a light gray background. This makes them easier
+to read when placed on the edges. By changing the 'Edge Label Model' from
+'Free' to 'Side Slider' , labels are not placed on the
+edges, but besides them. However, this often leads to some overlap, requiring
+manual layouting. If the 'Side Slider' variant is used, you may want
+to change the background of the edge labels to be transparent. This can be
+achieved by enabling the <em>Transparent edge labels</em> option (see the
+<a href="#tools-cif2yed-options">Options</a> section above).</p>
+</div>
+<div class="paragraph">
+<p>Good results for <a href="#tools-cif2yed-diagram-relations">relations diagrams</a>
+can often be obtained using the 'One-Click Layout' functionality of
+yEd. Select <span class="menuseq"><b class="menu">Layout</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">One-Click Layout</b></span> or use the
+corresponding toolbar button. This option is only available in yEd 3.14 or
+newer.</p>
+</div>
+<div class="paragraph">
+<p>You can also close (collapse) and open (expand) groups and apply the layout
+again.</p>
+</div>
+<div class="paragraph">
+<p>yEd has many more options. You can explore them using the included help text,
+by selecting <span class="menuseq"><b class="menu">Help</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Help</b></span>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-structure-view">Structure View</h5>
+<div class="paragraph">
+<p>yEd has a <em>Structure View</em> window that can be enabled via
+<span class="menuseq"><b class="menu">Windows</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Structure View</b></span>. The <em>Structure View</em> can be used
+to see and navigate the structure of the CIF model. By switching from
+'Text' to 'Description' (see upper right corner of the
+<em>Structure View</em> window), useful descriptions are shown for all elements.
+Furthermore, switching also ensures that the HTML code that is used for syntax
+highlighting is not shown in the <em>Structure Viewer</em> (if syntax highlighting is
+enabled, see the <a href="#tools-cif2yed-options">Options</a> section above). The following
+image shows the difference:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cif2yed/yed_structure_view.png" alt="yed structure view">
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-supervisory-controller-synthesis-tools">Supervisory controller synthesis tools</h3>
+<div class="sect3">
+<h4 id="tools-chapter-datasynth">Data-based supervisory controller synthesis</h4>
+<div class="paragraph">
+<p>
+
+
+The data-based supervisory controller synthesis tool performs data-based
+supervisory controller synthesis, or simply data-based synthesis. It can be
+used to <a href="#tut-extensions-chapter-synthesis">synthesize</a> a supervisor for an
+untimed CIF specification, with data
+(e.g. <a href="#tut-data-chapter-discrete-variables">discrete variables</a>). For a CIF
+specification with plants and requirements, the tool computes a supervisor.
+The supervisor restricts the plants in such a way that the resulting controlled
+system satisfies the following properties:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The controlled system is safe. That is, all reachable states in the
+controlled system satisfy the requirements.</p>
+</li>
+<li>
+<p>The controlled system is controllable. That is, for all reachable states in
+the controlled system, the
+<a href="#lang-tut-extensions-synthesis-evtctrl">uncontrollable</a> events that are
+enabled in the same state in the uncontrolled system are still possible in
+the controlled system. In other words, uncontrollable events are not
+restricted.</p>
+</li>
+<li>
+<p>The controlled system is non-blocking. That is, it is possible to reach a
+<a href="#lang-tut-extensions-synthesis-marked">marked</a> state from all reachable
+states in the controlled system.</p>
+</li>
+<li>
+<p>The controlled system is maximally permissive (or simply maximal). That is,
+the controlled system permits all safe, controllable, and non-blocking
+behaviors.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Note that <a href="#lang-tut-time-deadlock">deadlock</a> is not prevented for marked
+states.</p>
+</div>
+<div class="paragraph">
+<p>The synthesis algorithm is based on the following paper: Lucien Ouedraogo,
+Ratnesh Kumar, Robi Malik, and Knut Åkesson: Nonblocking and Safe
+Control of Discrete-Event Systems Modeled as Extended Finite Automata, IEEE
+Transactions on Automation Science and Engineering, Volume 8, Issue 3, Pages
+560-569, July 2011.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-2">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply data-based synthesis&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply data-based synthesis&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifdatasynth</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifdatasynth</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application several other
+options.</p>
+</div>
+<div class="paragraph">
+<p>The following options are part of the <em>Synthesis</em> category:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative local file system path to the
+output CIF file. If not specified, defaults to the input file path, where the
+<code>.cif</code> file extension is removed (if present), and a <code>.ctrlsys.cif</code>
+file extension is added.</p>
+</li>
+<li>
+<p><em>Supervisor name</em>: The name of the resulting supervisor automaton. If not
+specified, it defaults to <code>sup</code>. For more information, see the section on
+the <a href="#tools-datasynth-supervisor">resulting supervisor</a> below.</p>
+</li>
+<li>
+<p><em>Supervisor namespace</em>: The namespace of the resulting supervisor. If not
+specified, it defaults to the empty namespace. For more information, see the
+section on <a href="#tools-datasynth-supervisor-namespace">namespaces</a> below.</p>
+</li>
+<li>
+<p><em>Forward reachability</em>: Whether to perform forward reachability during
+synthesis, or omit it. Is disabled by default. For more information, see the
+section on <a href="#tools-datasynth-forward-reach">forward reachability</a> below.</p>
+</li>
+<li>
+<p><em>Statistics</em>: The kinds of statistics to print. By default, no statistics
+are printed. For more information, see the section on
+<a href="#tools-datasynth-stats">statistics</a> below.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Internally during synthesis, predicates are represented using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). There are
+various options that can influence the use of BDDs. The following options are
+part of the <em>BDD</em> sub-category of the <em>Synthesis</em> category:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>BDD output mode</em>: This option can be used to control how the BDDs are
+converted to CIF for the output of synthesis. For more information, see the
+<a href="#tools-datasynth-supervisor-bdd">BDD representation in CIF</a> section below.</p>
+</li>
+<li>
+<p><em>BDD output name prefix</em>: The prefix to use for BDD related names in the
+output. Only has an effect if the <em>BDD output mode</em> option is set to
+represent the internal BDD nodes directly in CIF. The default prefix is
+<code>bdd</code>. For more information, see the <a href="#tools-datasynth-supervisor-bdd">BDD representation in CIF</a>
+section below.</p>
+</li>
+<li>
+<p><em>BDD variable order</em>: CIF variables and automata are represented using one or
+more boolean variables. The initial order of the boolean variables is
+determined by this option. For more information, see the
+<a href="#tools-datasynth-var-order">BDD variable order</a> section below.</p>
+</li>
+<li>
+<p><em>BDD FORCE variable ordering algorithm</em>: CIF variables and automata are
+represented using one or more boolean variables. The initial order of the
+boolean variables can be improved by enabling this option. For more
+information, see the <a href="#tools-datasynth-var-order">BDD variable order</a> section below.</p>
+</li>
+<li>
+<p><em>BDD sliding window variable ordering algorithm</em>: CIF variables and automata
+are represented using one or more boolean variables. The initial order of the
+boolean variables can be improved by enabling this option. For more
+information, see the <a href="#tools-datasynth-var-order">BDD variable order</a> section below.</p>
+</li>
+<li>
+<p><em>BDD sliding window size</em>: The maximum length of the window to use for the
+BDD sliding window variable ordering algorithm. This option only has effect
+if the <em>BDD sliding window variable ordering algorithm</em> option is enabled.
+The size must be an integer number in the range [1 .. 12]. The default size
+is 4. For more information, see the <a href="#tools-datasynth-var-order">BDD variable order</a> section
+below.</p>
+</li>
+<li>
+<p><em>BDD predicate simplify</em>: Several BDD predicates may be simplified under the
+assumption of other predicates, resulting in smaller/simpler output. This may
+decrease the size of the resulting controller, and may give more insight. For
+more information, see the <a href="#tools-datasynth-simplification">Simplification</a> section
+below.</p>
+</li>
+<li>
+<p><em>BDD library initial node table size</em>: The BDD library that is used maintains
+an internal node table. This option can be used to set the initial size of
+that node table. The size will automatically be increased during synthesis,
+if necessary. Increasing the initial size can increase performance for large
+systems, as it will not be necessary to repeatedly increase the size of the
+node table. However, a larger node table requires more memory, and can lead
+to the node table no longer fitting within CPU caches, degrading performance.
+The default is <code>100000</code> nodes. The initial node table size must be in the
+range [1 .. 2<sup>31</sup> - 1]. For more information, see the
+<a href="#tools-datasynth-stats">Statistics</a> section.</p>
+</li>
+<li>
+<p><em>BDD library operation cache size</em>: The BDD library that is used maintains
+an internal operation cache. This option can be used to set the fixed size of
+that cache. The operation cache size must be in the range
+[2 .. 2<sup>31</sup> - 1]. By default, this option is disabled (value <code>off</code> on
+the command line), and the <em>BDD library operation cache ratio</em> option is
+used instead. For more information, see the <a href="#tools-datasynth-op-caches">BDD operation caches</a>
+section below.</p>
+</li>
+<li>
+<p><em>BDD library operation cache ratio</em>: The BDD library that is used maintains
+an internal operation cache. This option can be used to set the ratio of the
+size of the operation cache of the BDD library to the size of the node table
+of the BDD library. For instance, a ratio of <code>0.1</code> means that the size of
+the operation cache is 10% of the size of the node table. The operation cache
+ratio must be in the range [0.01 .. 1000]. The default ratio is 1.0. This
+option has no effect if the <em>BDD library operation cache size</em> option is
+enabled. For more information, see the <a href="#tools-datasynth-op-caches">BDD operation caches</a>
+section below.</p>
+</li>
+<li>
+<p><em>BDD debug max nodes</em>: Internally, predicates are represented
+using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). This option
+control the maximum number of BDD nodes for which to convert a BDD to a
+readable CNF/DNF representation for the debug output. The default is <code>10</code>
+nodes. The maximum must be in the range [1 .. 2<sup>31</sup> - 1].
+The option
+can be set to have an infinite maximum (no maximum), using option value
+<code>inf</code>. For more information, see the <a href="#tools-datasynth-dbg-output">Debug output</a>
+section below.</p>
+</li>
+<li>
+<p><em>BDD debug max paths</em>: Internally, predicates are represented
+using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). This option
+control the maximum number of BDD true paths for which to convert a BDD to a
+readable CNF/DNF representation for the debug output. The default is <code>10</code>
+paths. The maximum must be in the range [0 .. 1.7e308]. The option
+can be set to have an infinite maximum (no maximum), using option value
+<code>inf</code>. For more information, see the <a href="#tools-datasynth-dbg-output">Debug output</a>
+section below.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-2">Supported specifications</h5>
+<div class="paragraph">
+<p>The data-based supervisory controller synthesis tool supports a subset of CIF
+specifications. The following restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Only <code>plant</code> and <code>requirement</code> automata are supported. Automata with a
+<code>supervisor</code> kind, as well as kindless/regular automata (without a
+supervisory kind) are not supported.</p>
+</li>
+<li>
+<p>Specifications without plant automata are not supported.</p>
+</li>
+<li>
+<p>Events not declared as controllable or uncontrollable are not supported.
+This includes the <code>tau</code> event, both explicitly used on edges, as well as
+implicitly for edges without explicitly mentioned events.</p>
+</li>
+<li>
+<p>The use of channels (events with data types) in requirements is not
+supported. That is, requirements that send or receive (with or without data)
+are not supported.</p>
+</li>
+<li>
+<p>Regular invariants, plant invariants, and supervisor invariants are not
+supported. Only requirement invariants are supported. To allow plant
+state/event exclusion invariants to be used in the input, manually eliminate
+them first using the <a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a> CIF to
+CIF transformation.</p>
+</li>
+<li>
+<p>Continuous variables are not supported.</p>
+</li>
+<li>
+<p>Only discrete/input variables with a boolean type, ranged integer type
+(e.g. <code>int[0..5]</code>), or enumeration type are supported. For integer types,
+ranges that include negative integer values are not supported. For algebraic
+variables and algebraic parameters of components, all types are supported.</p>
+</li>
+<li>
+<p>Discrete variables must have supported initial values. If explicit initial
+values are given, they must be supported predicates (for boolean variables)
+or supported expressions as described below (for all other variables).</p>
+</li>
+<li>
+<p>Automata with non-determinism for controllable events are not supported.
+That is, automata that have locations with multiple outgoing edges for the
+same controllable event, with overlapping guards (e.g. <code>x &gt; 1</code> and
+<code>x &lt; 4</code>), are not supported. Note that this check is performed on the
+<a href="#tools-cif2cif-chapter-linearize-product">linearized</a> guards, and may
+therefore lead to false positives, as the check is an over-approximation and
+guard overlap may be detected for unreachable states.</p>
+</li>
+<li>
+<p>Conditional updates (<code>if</code> updates), multi-assignments, and partial variable
+assignments are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only limited forms of predicates (for markers, invariants, initialization,
+guards, etc) are supported. The supported predicates are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Boolean literals (<code>true</code>, <code>false</code>).</p>
+</li>
+<li>
+<p>Discrete/input/algebraic boolean variables (<code>x</code>, for <code>x</code> a discrete,
+input, or algebraic variable with a boolean type).</p>
+</li>
+<li>
+<p>Locations (<code>aut.loc</code>, for <code>aut</code> and automaton and <code>loc</code> a location of
+that automaton).</p>
+</li>
+<li>
+<p>The unary inverse operator (<code>not</code>) on a supported predicate.</p>
+</li>
+<li>
+<p>The binary logical conjunction (<code>and</code>) on two supported predicates.</p>
+</li>
+<li>
+<p>The binary logical disjunction (<code>or</code>) on two supported predicates.</p>
+</li>
+<li>
+<p>The binary logical implication (<code>=&gt;</code>) on two supported predicates.</p>
+</li>
+<li>
+<p>The binary logical bi-conditional (<code>&lt;=&gt;</code>) on two supported predicates.</p>
+</li>
+<li>
+<p>The binary equality comparison (<code>=</code>) on two supported predicates, or on two
+supported integer or enumeration expressions.</p>
+</li>
+<li>
+<p>The binary inequality comparison (<code>!=</code>) on two supported predicates, or on
+two supported integer or enumeration expressions.</p>
+</li>
+<li>
+<p>The binary less than comparison (<code>&lt;</code>) on two supported integer expressions.</p>
+</li>
+<li>
+<p>The binary less than or equal comparison (<code>&lt;=</code>) on two supported integer
+expressions.</p>
+</li>
+<li>
+<p>The binary greater than comparison (<code>&gt;</code>) on two supported integer
+expressions.</p>
+</li>
+<li>
+<p>The binary greater than or equal comparison (<code>&gt;=</code>) on two supported integer
+expressions.</p>
+</li>
+<li>
+<p>Conditional expressions (<code>if</code> expressions) with supported guard and
+resulting value predicates.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only limited forms of integer and enumeration expressions (for binary
+comparisons, initial values of variables, right hand sides of assignments, etc)
+are supported. The supported expressions are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A non-negative integer literal/value.</p>
+</li>
+<li>
+<p>An enumeration literal/value.</p>
+</li>
+<li>
+<p>Discrete/input/algebraic integer/enumeration variables (<code>x</code>, for <code>x</code> a
+discrete, input, or algebraic variable with an integer or enumeration type).</p>
+</li>
+<li>
+<p><code>+i</code> for <code>i</code> a supported integer expression.</p>
+</li>
+<li>
+<p><code>i + j</code> for <code>i</code> and <code>j</code> supported integer expressions.</p>
+</li>
+<li>
+<p><code>i div j</code> and <code>i mod j</code> for <code>i</code> a supported integer expressions, and
+<code>j</code> a positive integer value, or a computation that results in a positive
+integer value, as long as the computation is not too complex to be performed
+statically. That is, <code>j</code> must essentially be constant.</p>
+</li>
+<li>
+<p>Conditional expressions (<code>if</code> expressions) with supported guard predicates
+and supported resulting values.</p>
+</li>
+<li>
+<p>Any other valid CIF expression (computation) that that results in a
+non-negative integer value or an enumeration value, as long as the
+computation is not too complex to be performed statically. That is, the
+computation must essentially represent a fixed/constant value.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples of computations that can be statically evaluated:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>true and false</code> (result is <code>false</code>)</p>
+</li>
+<li>
+<p><code>c or false</code>, for a constant <code>c</code> with value <code>false</code> (result is
+<code>false</code>)</p>
+</li>
+<li>
+<p><code>1 + 1</code> (result is <code>2</code>)</p>
+</li>
+<li>
+<p><code>2 * 5</code> (result is <code>10</code>)</p>
+</li>
+<li>
+<p><code>floor(3.14)</code> (result is <code>3</code>)</p>
+</li>
+<li>
+<p><code>c + 1</code>, for a constant <code>c</code> with value <code>2</code> (result is <code>3</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples of computations that can <em>not</em> be statically evaluated:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>v + 1</code>, for <code>v</code> a discrete variable. The computation results in
+different values for different values of <code>v</code>.</p>
+</li>
+<li>
+<p><code>v = true</code> for <code>v</code> a discrete variable. The computation results in
+different values for different values of <code>v</code>.</p>
+</li>
+<li>
+<p><code>v = e</code> for <code>v</code> a discrete variable and <code>e</code> an enumeration
+literal/value. The computation results in different values for different
+values of <code>v</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only limited forms of assignments are supported. The supported assignments are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>xb := p</code></p>
+</li>
+<li>
+<p><code>xi := ie</code></p>
+</li>
+<li>
+<p><code>xi := ie - ie</code></p>
+</li>
+<li>
+<p><code>xe := ee</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For the following constraints:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>xb</code> is a boolean variable.</p>
+</li>
+<li>
+<p><code>xi</code> is a supported integer variable, as described above.</p>
+</li>
+<li>
+<p><code>xe</code> is an enumeration variable.</p>
+</li>
+<li>
+<p><code>p</code> is a supported predicate, as described above.</p>
+</li>
+<li>
+<p><code>ie</code> is a supported integer expression, as described above.</p>
+</li>
+<li>
+<p><code>ee</code> is a supported enumeration expression, as described above.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Additionally, the tool warns about state/event exclusion invariants for events
+that are not in the alphabet of any automaton. Such invariants have no effect,
+as they try to (further) restrict events that are never enabled to begin with.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-2">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be synthesized:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Additionally, the CIF specification is converted to an internal representation
+on which the synthesis is performed. This conversion also applies
+<a href="#tools-cif2cif-chapter-linearize-product">linearization (product variant)</a> to
+the edges. Predicates are represented internally using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-requirements">Supported requirements</h5>
+<div class="paragraph">
+<p>Three types of requirements are supported:
+<a href="#tut-data-chapter-stat-invariants">state invariants</a>,
+<a href="#tut-data-chapter-stat-evt-excl-invariants">state/event exclusion invariants</a>, and
+<a href="#lang-tut-extensions-synthesis-autkind">requirement automata</a>.</p>
+</div>
+<div class="paragraph">
+<p>State invariants are global conditions over the values of variables (and
+locations of automata) that must always hold. Such requirements are sometimes
+also called mutual state exclusions. Here are some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">requirement invariant x != 0 and not p.b;
+requirement invariant x &gt; 5;
+requirement invariant not(x = 1 and y = 1) or q.x = a;
+
+requirement (x = 1 and y = 1) or (x = 2 and y = 2);
+requirement (3 &lt;= x and x &lt; = 5) or (2 &lt;= y and y &lt;= 7);
+requirement x = 1 =&gt; y &gt; 2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>State/event exclusion invariants or simply state/event exclusions are
+additional conditions under which transitions may take place for certain
+events. Here are some examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">requirement invariant buffer.c_add    needs buffer.count &lt; 5;
+requirement invariant buffer.c_remove needs buffer.count &gt; 0;
+requirement invariant button.on = 1 disables lamp.c_turn_on;
+
+requirement {lamp.c_turn_on, motor.c_turn_on} needs button.Off;
+requirement p.x = 3 and p.y &gt; 7 disables p.u_something;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Requirement automata are simply automata marked as <code>requirement</code>. They
+usually introduce additional state by using multiple locations or a variable.
+The additional state is used to be able to express the requirement. One common
+example is a counter. For instance, consider the following requirement, which
+prevents more than three products being added to a buffer:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">requirement automaton counter:
+  disc int[0..5] count = 0;
+
+  requirement invariant count &lt;= 3;
+
+  location:
+    initial;
+    marked;
+
+    edge buffer.c_add do count := count + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Another common example is a requirement that introduces ordering. For instance,
+consider the following requirement, which states that <code>motor1</code> must always be
+turned on before <code>motor2</code> is turned on, and they must always be turned off in
+the opposite order:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">requirement automaton order:
+  location on1:
+    initial;
+    marked;
+    edge motor1.c_on goto on2;
+
+  location on2:
+    edge motor2.c_on goto off2;
+
+  location off2:
+    edge motor2.c_off goto off1;
+
+  location off1:
+    edge motor1.c_off goto on1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Besides the explicit requirements, synthesis also prevents runtime errors. This
+includes enforcing that integer variables stay within their range of allowed
+values. This is essentially an implicit requirement. For instance, for a CIF
+specification with a variable <code>x</code> of type <code>int[0..5]</code> and a variable <code>y</code>
+of type <code>int[1..3]</code>, requirement invariant
+<code>0 &lt;= x and x &lt;= 5 and 1 &lt;= y and y &lt;= 3</code> is
+implicitly added and enforced by the synthesis algorithm. In the resulting
+controlled system, no runtime errors due to variables being assigned values
+outside their domain (integer value range) occur.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-supervisor">Resulting supervisor</h5>
+<div class="paragraph">
+<p>If the supervisor has to restrict so much of the behavior of the uncontrolled
+system that no initial state remains, the controlled system becomes empty. The
+synthesis algorithm then ends with an <em>empty supervisor</em> error, and no output
+CIF file is created.</p>
+</div>
+<div class="paragraph">
+<p>If an initial state remains after synthesis, an output CIF file is created. The
+contents is the controlled system. The controlled system is obtained by taking
+the input specification, and modifying it. The requirement automata are changed
+to supervisor automata. Some or all of the requirement invariants may be
+<a href="#tools-cif2cif-chapter-remove-reqs">removed</a>, depending on the
+<a href="#tools-datasynth-simplification">simplifications</a> that are applied. An
+additional external supervisor automaton is added. Also, depending on the
+simplifications that are applied, the requirement automata may serve as
+<a href="#tut-data-chapter-monitoring">monitors</a> or <em>observers</em> for the external
+supervisor, or may actually impose the requirement restrictions. An external
+supervisor is a <code>supervisor</code> automaton that adds restrictions to the
+uncontrolled system (the plants), and potentially the requirement automata,
+depending on the simplifications that are applied. The supervisor uses the
+same events as the plants, and refers to plant and requirement locations and
+variables in its conditions.</p>
+</div>
+<div class="paragraph">
+<p>By default, the resulting external supervisor automaton is put in the empty
+<a href="#tut-reuse2-chapter-namespaces">namespace</a>, at the top level of the
+resulting specification. That is, the supervisor automaton is not put in any
+groups. See the <a href="#tools-datasynth-supervisor-namespace">Namespace</a> section for more
+information.</p>
+</div>
+<div class="paragraph">
+<p>By default, the added supervisor automaton is named <code>sup</code>. Using the
+<em>Supervisor name</em> option (see <a href="#tools-datasynth-options">options</a> section
+above), it is possible to specify a different name. Custom supervisor automaton
+names must be valid CIF identifiers, i.e. they may consist of letters, digits,
+and underscores (<code>_</code>), but may not start with a digit. If the resulting
+supervisor automaton has a name that conflicts with an existing declaration, it
+is automatically renamed to have a non-conflicting name. In such cases, a
+warning is printed to the console to inform the user.</p>
+</div>
+<div class="paragraph">
+<p>The resulting supervisor has exactly one self loop edge for each of the
+controllable events in the alphabet of the controlled system (which is equal to
+the alphabet of the uncontrolled system). These self loops represent the
+possible conditions under which the supervisor allows the events to occur in
+the controlled system. The exact predicates may vary, depending on the
+<a href="#tools-datasynth-simplification">simplifications</a> that are applied.</p>
+</div>
+<div class="paragraph">
+<p>The resulting supervisor may have an initialization predicate that restricts
+the states in which the system may be initialized (may start), on top of the
+initialization constraints already present in the uncontrolled system. For more
+information on this initialization predicate, see the section on
+<a href="#tools-datasynth-init">initialization</a> below.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-datasynth-supervisor-namespace">Namespace</h6>
+<div class="paragraph">
+<p>As indicated above, by default the resulting supervisor automaton is put in the
+empty <a href="#tut-reuse2-chapter-namespaces">namespace</a>, at the top level of the
+resulting specification. That is, the supervisor automaton is not put in any
+groups.</p>
+</div>
+<div class="paragraph">
+<p>It is possible to add a namespace to the entire resulting specification. That
+is, to put groups around the original plants and requirements, the added
+supervisor automaton, etc. A namespace can be added using the
+<em>Supervisor namespace</em> option (see <a href="#tools-datasynth-options">options</a>
+section above). By default, no additional namespace is added.</p>
+</div>
+<div class="paragraph">
+<p>By adding a namespace around the entire resulting specification, the synthesis
+result can be easily <a href="#tools-chapter-mergecif">merged</a> with for instance a
+simulation model. The added namespace ensures that there are no naming
+conflicts between the plants of the simulation model and the similarly original
+plants. The events are not put in the new namespace, but are instead kept in
+their original place, wrapped in groups as necessary to keep their original
+identities (absolute names). This ensures that it remains possible to connect
+(merge) the events of the synthesis output with the events of the simulation
+model.</p>
+</div>
+<div class="paragraph">
+<p>The namespace specified using the option, must consist of one or more valid CIF
+identifiers, separated by dots (<code>.</code>). Valid CIF identifiers consist of one or
+more letters, digits, and underscores (<code>_</code>), but may not start with a digit.
+As an example, consider namespace <code>a.b</code>. A group <code>b</code> is wrapped around the
+entire synthesis result, and a group <code>a</code> is wrapped around group <code>b</code>. Group
+<code>a</code> is then the new synthesis result.</p>
+</div>
+<div class="paragraph">
+<p>If a part of the namespace has the same name as an event that remains in its
+original place, this leads to a conflict, and synthesis fails. If the namespace
+does not conflict, but is non-empty (it contains an event or it contains a
+group that contains an event), synthesis also fails.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-datasynth-supervisor-bdd">BDD representation in CIF</h6>
+<div class="paragraph">
+<p>Internally, predicates are represented using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). The supervisor
+that is the output of synthesis, contains several predicates as well. For
+instance, it has self loops with guard predicates, and it may have an
+initialization predicate. The predicates represented as BDDs need to be
+represented as CIF predicates. There are multiple approaches to do this, and
+the <em>BDD output mode</em> option (see <a href="#tools-datasynth-options">options</a>
+section above), can be used to configure the approach to use.</p>
+</div>
+<div class="paragraph">
+<p>The first approach, which is also the default approach (named <code>normal</code>), is
+to use either
+<a href="http://en.wikipedia.org/wiki/Conjunctive_normal_form">Conjunctive Normal Form</a>
+(CNF) or
+<a href="http://en.wikipedia.org/wiki/Disjunctive_normal_form">Disjunctive Normal Form</a>
+(DNF) predicates. This
+approach has as benefit that for relatively small predicates (usually for small
+systems), the CIF predicates are often intuitive, and can easily understood.
+The downside is that for larger systems, the CIF predicates often grow
+exponentially in size.</p>
+</div>
+<div class="paragraph">
+<p>The second approached (named <code>nodes</code>), is to represent the internal BDD nodes
+directly in CIF. The BDD is then more or less coded directly in CIF, using
+some constants and algebraic variables, and is evaluated using a BDD evaluation
+function. The benefit is that for larger systems, this representation remains
+relatively small, and at the very least doesn&#8217;t blow up nearly as much as the
+CNF and DNF representations. The downside to this approach, is that it leads to
+a supervisor that can not be easily understood by inspecting it. For this
+approach, several objects are created in the top level scope of the CIF
+specification. The names of these declarations all share a common prefix. The
+default prefix is <code>bdd</code>, but it can be changed using the
+<em>BDD output name prefix</em> option (see
+<a href="#tools-datasynth-options">options</a> section above). No existing
+declarations, whose names start with that prefix, should be present in the top
+level scope of the specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-init">Initialization</h5>
+<div class="paragraph">
+<p>The synthesis algorithm ensures that in the controlled system, the requirement
+state invariants hold in all reachable states. It also ensures that in the
+controlled system, for all transitions from reachable states, the events only
+occur if the requirement automata and state/event exclusion invariants allow
+them.</p>
+</div>
+<div class="paragraph">
+<p>The synthesis algorithm does not restrict any uncontrollable events. Instead,
+such restrictions are propagated backwards to the source state of the edge with
+the uncontrollable event, and from there to the transitions that lead to the
+source state, etc. They are propagated backwards until an edge with a
+controllable event is encountered (for which the guard can be restricted) or
+the initial state is reached (and the initialization predicate can be
+restricted).</p>
+</div>
+<div class="paragraph">
+<p>If a variable in the uncontrolled system has a single initial value, and the
+initialization predicate is restricted to not allow this initial value,
+initialization will be impossible, causing an <em>empty supervisor</em> error. For
+discrete variables with
+<a href="#lang-tut-data-discvar-init-multiple">multiple potential initial values</a>,
+the synthesis algorithm may restrict initialization to disallow certain initial
+values, while still leaving possibilities for initialization. For discrete
+variables declared to initially have an
+<a href="#lang-tut-data-discvar-init-any">arbitrary</a> initial value, as well as
+for input variables, the synthesis algorithm essentially determines under which
+conditions the system can be started, and still exhibits only safe,
+non-blocking behavior.</p>
+</div>
+<div class="paragraph">
+<p>If the controlled system requires more strict initialization than the
+uncontrolled system, an additional initialization predicate is added to the
+resulting supervisor. The exact predicate may differ, depending on the
+<a href="#tools-datasynth-simplification">simplifications</a> that are applied.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-forward-reach">Forward reachability</h5>
+<div class="paragraph">
+<p>Synthesis essentially works by calculations that involve predicates that
+partition the entire state space into states that satisfy a property or don&#8217;t
+satisfy a property. For instance, a marker predicate may indicate which states
+of the state space are marked. All other states are thus not marked.</p>
+</div>
+<div class="paragraph">
+<p>
+
+Calculations during synthesis often involve
+<a href="https://en.wikipedia.org/wiki/Reachability">reachability</a>.
+For instance,
+from which states is it possible to reach a marker state? To compute the states
+that can reach a marker state, the marker predicate of the input specification
+is used. The marker predicate indicates the states that are themselves marked.
+Then, the states are calculated that can reach one of those marked states, via
+a single transition. They are put together, to form the states that are marked
+or can be marked after one transition. By taking another such step, we can add
+the states that can reach a marked state via two transitions. We then have all
+states that can reach a marked state via zero, one, or two transitions. We can
+repeat this until no new states are found, which is called reaching a
+<a href="https://en.wikipedia.org/wiki/Fixed_point_%28mathematics%29">fixed point</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+This form of reachability is called backward reachability, as it starts with
+some target (e.g. marked states), and goes backwards to find all states from
+which the target can be reached. Backward reachability can lead to states that
+could never be reached from an initial state, even in the uncontrolled system.
+This leads to two separate issues.</p>
+</div>
+<div class="paragraph">
+<p>The first issue is about unintuitive resulting supervisor guards. The
+resulting supervisor forbids certain transitions, by restricting controllable
+events. It among others forbids transitions that end up in states from which no
+marked state can be reached. However, if those forbidden states can never be
+reached from an initial state, there is no reason to restrict the controllable
+events in such cases. The guards of the resulting supervisor then appear to
+restrict the controllable events, while in fact the guard doesn&#8217;t impose a
+restriction for the controlled system. The supervisor simply doesn&#8217;t have the
+necessary information to know this.</p>
+</div>
+<div class="paragraph">
+<p>The second issue is about performance. Expanding unreachable states during
+backward reachability takes time and costs memory, while it has no useful
+effect on the resulting controlled system.</p>
+</div>
+<div class="paragraph">
+<p>
+The use of forward reachability can be a solution to both problems. Forward
+reachability starts with the initial states, and adds states reachable via one
+transitions, then via two transitions, then via three transitions, etc. This
+is repeated until all reachable states are found.</p>
+</div>
+<div class="paragraph">
+<p>By combining both forward and backward reachability, the supervisor knows about
+states that exist in the uncontrolled system (due to forward reachability) and
+about states that it should forbid (due to backward reachability). This leads
+to the supervisor only restricting transitions that are strictly necessary.
+However, both when using forward reachability and when not using it, the
+synthesized supervisor is safe, non-blocking, and maximally permissive. It is
+only the guards that are more complex than they might need to be, if forward
+reachability is not used. More complex guards are often less readable, and
+potentially more expensive to implement in an actual controller.</p>
+</div>
+<div class="paragraph">
+<p>By combining both forward and backward reachability, parts of the state space
+that are not relevant may not have to be expanded (as much), which may improve
+performance. However, computing the forward reachability may also take time
+and cost memory, thus reducing performance.</p>
+</div>
+<div class="paragraph">
+<p>It depends on the specification being synthesized whether enabling forward
+reachability increases or decreases performance. It also depends on the
+specification whether there is any benefit to using forward reachability for
+the guards of the supervisor. Forward reachability is disabled by default. It
+can be enabled using the <em>Forward reachability</em> option (see
+<a href="#tools-datasynth-options">options</a> section above).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-simplification">Simplification</h5>
+<div class="paragraph">
+<p>The synthesis algorithm computes various predicates, such as the conditions
+under which the controllable events may take place in the controlled system,
+and the initialization predicate of the controlled system. These predicates
+are included in the supervisor that results from synthesis.</p>
+</div>
+<div class="paragraph">
+<p>However, if the controlled system imposes the exact same restrictions as the
+uncontrolled system, there is no need to list the full conditions in the
+supervisor, as the plants already define that behavior. The supervisor imposes
+no additional restrictions with respect to the plants, and it suffices to use
+<code>true</code> as condition for the supervisor to make that explicit.</p>
+</div>
+<div class="paragraph">
+<p>There are several predicates in the synthesis result that can be simplified
+under the assumption of conditions that are already present in the input
+specification. In some cases this leads to smaller/simpler supervisor
+representations. In other cases it gives insight, indicating that the
+supervisor does not impose any additional restrictions. The following
+simplifications are available:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 15%;">
+<col style="width: 5%;">
+<col style="width: 30%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Option value</th>
+<th class="tableblock halign-left valign-top">Default</th>
+<th class="tableblock halign-left valign-top">Predicate</th>
+<th class="tableblock halign-left valign-top">May be simplified assuming</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards-plants</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Supervisor guards of controllable events</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Plant guards, for the matching events</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards-req-auts</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Supervisor guards of controllable events</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">State/event exclusion requirement invariants derived from the
+requirement automata, for the matching events</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards-se-excl-req-invs</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Supervisor guards of controllable events</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">State/event exclusion requirement invariants from the input
+specification, for the matching events</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards-state-req-invs</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Supervisor guards of controllable events</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">State requirement invariants from the input specification (includes the
+range requirement invariants added by the synthesis algorithm)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>guards-ctrl-beh</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Supervisor guards of controllable events</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Controlled behavior as computed by synthesis</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>initial-unctrl</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Initialization predicate of the controlled system</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Initialization predicate of the uncontrolled system</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Which simplifications should be performed, can be specified using the
+<em>BDD predicate simplify</em> option (see <a href="#tools-datasynth-options">options</a>
+section above).</p>
+</div>
+<div class="paragraph">
+<p>The table above lists in the first column, the option values to use for each of
+the simplifications, on the command line. The names given in the first column
+should be combined using commas, and used as option value. The simplifications
+that are specified using the option replace the default simplifications (see
+the second column of the table). However, it is also possible to specify
+additions and removals relative to the default simplifications, by prefixing
+simplifications (from the first column) with a <code>+</code> or <code>-</code> respectively.
+Replacements (no prefix) may not be combined with additions/removals (<code>+</code> or
+<code>-</code> prefix). Specifying a simplification twice leads to a warning being
+printed to the console. Adding a simplification that is already present or
+removing a simplification that is not present, also leads to a warning being
+printed.</p>
+</div>
+<div class="paragraph">
+<p>In the option dialog, each of the simplifications can be enabled or disabled
+using a checkbox.</p>
+</div>
+<div class="paragraph">
+<p>The second column indicates for each simplification whether it is enabled by
+default. By default, all simplifications are enabled. The third column
+indicates the predicate in the synthesis result that can be simplified. The
+fourth column indicates under the assumption of which predicate the
+simplification is applied.</p>
+</div>
+<div class="paragraph">
+<p>The simplification algorithm is not perfect, and may not simplify the
+predicates as much as could potentially be possible.</p>
+</div>
+<div class="paragraph">
+<p>When simplifying with respect to state requirement invariants, the supervisor
+no longer enforces those requirements, as they are assumed to already hold. As
+such, the simplification prevents such invariants from being removed from the
+resulting CIF specification. This applies to some of the other simplifications
+as well. For instance, the simplification over state/event exclusion
+requirement invariants leads to them being part of the output as well. This may
+affect whether other tools can handle the resulting supervisor model as input,
+depending on what kind of features they support. In particular, for code
+generation, simplification of the guards with respect to the state requirement
+invariants and state/event exclusion requirement invariants may need to be
+disabled.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-dbg-output">Debug output</h5>
+<div class="paragraph">
+<p>By default, the synthesis algorithm shows no progress information, and does not
+explain how the resulting supervisor is obtained. By enabling debug output,
+detailed information is printed to the console. Debug output can be enabled
+by setting the
+<b class="menuref">Output mode</b>
+option (<b class="menuref">General</b>
+category) to
+<b class="menuref">Debug</b>.</p>
+</div>
+<div class="paragraph">
+<p>The debug output also contains information about the number of states in the
+resulting controlled system (the uncontrolled system restricted by the
+synthesized supervisor). If the resulting supervisor (and thus the controlled
+system) is empty, or if
+<a href="#tools-datasynth-forward-reach">forward reachability</a> is enabled, the
+number of states that is printed is an exact number (e.g. <code>exactly 0 states</code>,
+<code>exactly 1 state</code>, <code>exactly 1,234 states</code>). In other situations, the
+controlled behavior predicate that is used to determine the number potentially
+gives an over-approximation, and an upper bound on the number of states is
+printed (e.g. <code>at most 1,234 states</code>).</p>
+</div>
+<div class="paragraph">
+<p>Enabling debug output may significantly slow down the synthesis algorithm,
+especially for larger models. The performance degradation stems mostly from the
+printing of predicates. Predicates are internally represented using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). To print them,
+they are converted to CNF or DNF predicates, similar to one of the approaches
+to <a href="#tools-datasynth-supervisor-bdd">convert</a> BDDs to CIF predicates for
+synthesis output.</p>
+</div>
+<div class="paragraph">
+<p>To limit the performance degradation, options are available to limit the
+conversion of BDDs to CNF/DNF predicates. The <em>BDD debug max nodes</em> controls
+the maximum number of BDD nodes for which to convert a BDD to a readable
+CNF/DNF representation for the debug output. The default is <code>10</code> nodes. The
+maximum must be in the range [1 .. 2<sup>31</sup> - 1].
+The option can be set to
+have an infinite maximum (no maximum), using option value <code>inf</code>. The <em>BDD
+debug max paths</em> option controls the maximum number of BDD true paths for which
+to convert a BDD to a readable CNF/DNF representation for the debug output. The
+default is <code>10</code> paths. The maximum must be in the range [1 .. 1.7e308]. The
+option can be set to have an infinite maximum (no maximum), using option value
+<code>inf</code>. If a BDD has more than the specified maximum number of nodes, or more
+than the specified number of true paths, it is not converted to a CNF/DNF
+predicate. Instead, it is converted to a textual representation that indicates
+the number of nodes and true paths, e.g. <code>&lt;bdd 1,234n 5,678p&gt;</code> for a BDD with
+1,234 nodes and 5,678 true paths.</p>
+</div>
+<div class="paragraph">
+<p>By limiting the conversion of BDDs to CNF/DNF predicates, debug output can
+still be used for large models to see progress information, while not degrading
+the performance too much.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-stats">Statistics</h5>
+<div class="paragraph">
+<p>The data-based synthesis tool supports printing various kinds of statistics to
+the console. By default, no statistics are printed. Statistics can be enabled
+using the the <em>Statistics</em> option (see <a href="#tools-datasynth-options">options</a>
+section above). The following statistics are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Timing</em> [<code>timing</code>]</p>
+<div class="paragraph">
+<p>Print statistics for timing of various parts of the tool. Is printed to the
+console, after execution, just termination of the tool. Timing is only
+printed for parts of the tool that were actually executed. Timing is printed
+as a tree. The root of the tree represents the total time of the synthesis
+tool. For some parts of the tool, timing is also measured for sub-parts.
+Timing is printed in milliseconds, to make it easier to compare timing for
+various parts.</p>
+</div>
+<div class="paragraph">
+<p>When measuring performance, always perform multiple measurements, and take
+the average. Also, use a warm-up phase, to avoid skewed results.</p>
+</div>
+</li>
+<li>
+<p><em>BDD garbage collection</em> [<code>bdd-gc</code>]</p>
+<div class="paragraph">
+<p>The BDD library that is used maintains an internal node table. Whenever new
+nodes no longer fit in the node table, a garbage collection is started by
+the BDD library, to clean out all nodes that are no longer needed. BDD
+garbage collection statistics are printed before and after garbage
+collection. The printed information includes the size of the node table, the
+number of free nodes, timing information, etc. See also the
+BDD library initial node table size option (see
+<a href="#tools-datasynth-options">options</a>` section above).</p>
+</div>
+</li>
+<li>
+<p><em>BDD node table resize</em> [<code>bdd-resize</code>]</p>
+<div class="paragraph">
+<p>The BDD library that is used maintains an internal node table. Whenever new
+nodes no longer fit in the node table, a garbage collection is started by
+the BDD library, to clean out all nodes that are no longer needed. If only
+very limited space could be reclaimed by garbage collection, the size of the
+node table is increased. BDD node table resize statistics are printed when
+the node table is resized. The printed information includes the old and the
+new sizes of the node table. See also the BDD library initial node table
+size option (see <a href="#tools-datasynth-options">options</a>` section above).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In the option dialog, each of the different kinds of statistics can be enabled
+and disabled individually, using a checkbox.</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>--stats</code> option, the names of the different
+kinds of statistics, as indicated above between square brackets, should be
+used, separated by commas. For instance, use <code>--stats=bdd-gc,bdd-resize</code> to
+enable both BDD garbage collection statistics and BDD node table resize
+statistics, but keep all other statistics disabled.</p>
+</div>
+<div class="paragraph">
+<p>Specifying a statistics kind twice leads to a warning being printed to the
+console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-early-problem-detection">Early problem detection</h5>
+<div class="paragraph">
+<p>The synthesis algorithm checks the uncontrolled system for common issues, for
+early detection of problems that will lead to an empty supervisor. If such a
+problem is detected, a warning is printed to the console. Among others, checks
+are included for no initial states/variables, no marked states, and no states
+due to the invariants.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-var-order">BDD variable order</h5>
+<div class="paragraph">
+<p>Internally, predicates are represented using
+<a href="http://en.wikipedia.org/wiki/Binary_decision_diagram">Binary Decision Diagrams</a>
+(BDDs). CIF
+variables and automata are represented using one or more boolean variables
+(also called BDD variables or bits). For instance, a boolean CIF variable is
+represented using a single boolean/BDD variable, and a CIF variable of type
+<code>int[0..8]</code> is represented using four boolean/BDD variables (9 possible
+values, log<sub>2</sub>(9) ≈ 3.17). For each automaton with two or
+more locations, a location pointer variable is created, that represents the
+current or active location of that automaton. For instance, an automaton with
+three locations is represented using two boolean/BDD variables. Two boolean/BDD
+variables can represent 2<sup>2</sup> = 4 values, so one value is not
+used.</p>
+</div>
+<div class="paragraph">
+<p>The CIF variables and location pointer variables for the automata
+(together called synthesis variables) can be ordered. This ordering can
+significantly influence the performance of synthesis. Synthesis variables that
+have a higher influence on the result of predicates (simply put, occur more
+frequently in predicates) should generally be put earlier in the ordering.
+Furthermore, in general, strongly related synthesis variables (e.g. by
+comparison, integer computation, or assignment) should be kept closely together
+in the order. For two synthesis variables <code>x</code> and <code>y</code>, examples of
+predicates that introduce relations are <code>x = y</code> (by comparison) and
+<code>5 &lt; x + y</code> (by integer computation), and examples of assignments that
+introduce relations are <code>x := y</code> and <code>x := y + 1</code> (both by assignment).</p>
+</div>
+<div class="paragraph">
+<p>For the initial variable ordering, it is possible to order the BDD variables
+per synthesis variable, or to interleave the BDD/boolean variables of some
+synthesis variables. This can significantly influences the performance of
+synthesis. Generally, strongly related synthesis variables should be
+interleaved.</p>
+</div>
+<div class="paragraph">
+<p>For more information on ordering and its influence on performance, see
+Chapter 3 of <a href="#minato">[minato]</a>.</p>
+</div>
+<div class="paragraph">
+<p>For each CIF variable and location pointer, two synthesis variables are
+created, one storing the old/current value (before a transition), and one
+storing the new value (after a transition). For a single CIF variable or
+location pointer, the old and new synthesis variables are always kept together,
+and interleaved. The old synthesis variable is also always before the new
+synthesis variable.</p>
+</div>
+<div class="paragraph">
+<p>The initial order of the boolean/BDD variables is determined by the
+<em>BDD variable order</em> option (see <a href="#tools-datasynth-options">options</a>
+section above). Several default orders exist, and it is also possible to
+define a custom order. By default, the sorted order is used. The following
+default orders exist:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>model ordering without interleaving</em> (option value <code>model</code>)</p>
+<div class="paragraph">
+<p>The initial order of the synthesis variables is as they occur in the model.
+A location pointer, for an automaton with two or more locations, is put
+before the variables declared in that automaton.</p>
+</div>
+<div class="paragraph">
+<p>No synthesis variables are interleaved, except for each old variable with
+its corresponding new variable.</p>
+</div>
+</li>
+<li>
+<p><em>reverse model ordering without interleaving</em> (option value <code>reverse-model</code>)</p>
+<div class="paragraph">
+<p>The initial order of the synthesis variables is as they occur in the model,
+but reversed. A location pointer, for an automaton with two or more
+locations, is put after the variables declared in that automaton, in this
+reverse order.</p>
+</div>
+<div class="paragraph">
+<p>No synthesis variables are interleaved, except for each old variable with
+its corresponding new variable. The old variables are still before the new
+variables; this is not reversed.</p>
+</div>
+</li>
+<li>
+<p><em>sorted ordering without interleaving</em> (option value <code>sorted</code>)</p>
+<div class="paragraph">
+<p>The initial order of the synthesis variables is based on the names of the
+variables and automata. They are sorted alphabetically in ascending
+order, based on their absolute names.</p>
+</div>
+<div class="paragraph">
+<p>No synthesis variables are interleaved, except for each old variable with
+its corresponding new variable.</p>
+</div>
+</li>
+<li>
+<p><em>reverse sorted ordering without interleaving</em> (option value <code>reverse-sorted</code>)</p>
+<div class="paragraph">
+<p>The initial order of the synthesis variables is based on the names of the
+variables and automata. They are sorted alphabetically in descending
+order, based on their absolute names.</p>
+</div>
+<div class="paragraph">
+<p>No synthesis variables are interleaved, except for each old variable with
+its corresponding new variable. The old variables are still before the new
+variables; this is not reversed.</p>
+</div>
+</li>
+<li>
+<p><em>random ordering without interleaving</em> (option value <code>random</code> or <code>random:SEED</code>)</p>
+<div class="paragraph">
+<p>The variables and automata are initially ordered randomly. If no
+seed is specified, a random seed is used, resulting in a random random order.
+If a seed is specified, a fixed random order is used. That is, using the same
+seed again, results in the same random order. The <code>SEED</code> must be an integer
+number in the range [0 .. 2<sup>64</sup> - 1]. For instance, use
+<code>random:123</code> as option value to get a random order that can be repeated on
+a subsequent synthesis for the same model.</p>
+</div>
+<div class="paragraph">
+<p>No synthesis variables are interleaved, except for each old variable with
+its corresponding new variable.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Furthermore, a custom initial order can be defined. Custom orders consist of
+absolute names of variables and automata. That is, for an automaton
+<code>a</code>, with a discrete variable <code>x</code>, the absolute name of the variable is
+<code>a.x</code>. The <code>*</code> character can be used as wildcard in those names, and
+indicates zero or more characters. In case of multiple matches, the matches are
+sorted increasingly on their absolute names, and interleaved.</p>
+</div>
+<div class="paragraph">
+<p>Multiple names can be separated with <code>;</code> characters. The synthesis variables
+matching the name pattern before the <code>;</code> are ordered before the synthesis
+variables matching the name pattern after the <code>;</code>. The <code>;</code> separator does
+not introduce interleaving. The <code>,</code> separator can be used instead of the
+<code>;</code> separator to introduce order but also introduce interleaving.</p>
+</div>
+<div class="paragraph">
+<p>Each name pattern in the order must match at least one variable or automaton.
+A variable or automaton may not be included more than once in the
+order. Every variable and automaton (with two or more locations) needs to be
+included in the order. It is not possible to specify new variables, as they
+are always directly after their corresponding old variables, and they are
+always interleaved.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider two automata: <code>a</code> and <code>b</code>, each with three
+variables of type <code>int[0..3]</code>: <code>x1</code>, <code>x2</code>, and <code>x3</code>. The automata have
+three locations each, so location pointers are created for them. We thus have
+six discrete variables: <code>a.x1</code>, <code>a.x2</code>, <code>a.x3</code>, <code>b.x1</code>, <code>b.x2</code>, and
+<code>b.x3</code>, and two location pointer variables: <code>a</code> and <code>b</code>. Consider the
+following custom order: <code>b*;a.x3,a.x1;a.x2,a</code>. Pattern <code>b*</code> matches
+location pointer variable <code>b</code> as well as the three discrete variables of
+automaton <code>b</code> (<code>b.x1</code>, <code>b.x2</code>, and <code>b.x3</code>). They are ordered in
+increasing alphabetic order, and are interleaved. Variables <code>a.x3</code> and
+<code>a.x1</code> are also interleaved, with <code>a.x3</code> before <code>a.x1</code>. Finally, variable
+<code>a.x2</code> is ordered before the location pointer for automaton <code>a</code>, and they
+are interleaved as well. This results in the following initial boolean/BDD
+variable ordering, with bits whose name ends with <code>+</code> representing bits of
+new variables rather than current/old variables, and <code>x#0</code> representing bit
+zero of variable <code>x</code>:</p>
+</div>
+<div class="paragraph">
+<p><code>b#0</code><br>
+<code>b+#0</code><br>
+<code>b.x1#0</code><br>
+<code>b.x1+#0</code><br>
+<code>b.x2#0</code><br>
+<code>b.x2+#0</code><br>
+<code>b.x3#0</code><br>
+<code>b.x3+#0</code><br>
+<code>b#1</code><br>
+<code>b+#1</code><br>
+<code>b.x1#1</code><br>
+<code>b.x1+#1</code><br>
+<code>b.x2#1</code><br>
+<code>b.x2+#1</code><br>
+<code>b.x3#1</code><br>
+<code>b.x3+#1</code></p>
+</div>
+<div class="paragraph">
+<p><code>a.x3#0</code><br>
+<code>a.x3+#0</code><br>
+<code>a.x1#0</code><br>
+<code>a.x1+#0</code><br>
+<code>a.x3#1</code><br>
+<code>a.x3+#1</code><br>
+<code>a.x1#1</code><br>
+<code>a.x1+#1</code></p>
+</div>
+<div class="paragraph">
+<p><code>a.x2#0</code><br>
+<code>a.x2+#0</code><br>
+<code>a#0</code><br>
+<code>a+#0</code><br>
+<code>a.x2#1</code><br>
+<code>a.x2+#1</code><br>
+<code>a#1</code><br>
+<code>a+#1</code></p>
+</div>
+<div class="paragraph">
+<p>The default orders are often not optimal performance-wise. Manually
+specifying a custom order often requires specialist knowledge and can take
+quite some time. Luckily, there are algorithms that can automatically compute
+a decent variable order.</p>
+</div>
+<div class="paragraph">
+<p>The algorithms all take an initial variable ordering, and try to improve it
+using a fast heuristic. A better initial variable ordering may result in a
+better final variable ordering (a better local optimum), and may speed up the
+automatic variable ordering algorithm (reaching an optimum faster).</p>
+</div>
+<div class="paragraph">
+<p>For the initial variable ordering, the CIF variables and location pointers
+may be arbitrarily interleaved. If an automatic variable ordering algorithm
+changes the initial order, no synthesis variables are interleaved, except for
+each old variable with its corresponding new variable.</p>
+</div>
+<div class="paragraph">
+<p>The automatic variable ordering algorithms are not applied if the CIF model has
+less than two synthesis variables. They are also not applied if the model has
+no guards, updates, or other predicates to use as input for the algorithms,
+i.e. there are no <em>hyperedges</em> to which to apply the algorithms.</p>
+</div>
+<div class="paragraph">
+<p>The following algorithms are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>FORCE</em></p>
+<div class="paragraph">
+<p>The <a href="#force">[force]</a> algorithm is enabled by default, but can be disabled using the
+<em>BDD FORCE variable ordering algorithm</em> option (see
+<a href="#tools-datasynth-options">options</a> section above).</p>
+</div>
+<div class="paragraph">
+<p>At most 10 * ceil(log<sub>e</sub>(n)) iterations of the FORCE
+algorithm are performed, with <code>n</code> the number of current/old BDD/boolean
+variables.</p>
+</div>
+</li>
+<li>
+<p><em>Sliding window</em></p>
+<div class="paragraph">
+<p>The sliding window algorithm is enabled by default, but can be disabled using
+the <em>BDD sliding window variable ordering algorithm</em> option (see
+<a href="#tools-datasynth-options">options</a> section above).</p>
+</div>
+<div class="paragraph">
+<p>The default maximum length of the window that is used is 4. The actual window
+may be smaller, if less than 4 variables and/or location pointers are present
+in the model. The maximum length of the window can be configured using the
+<em>BDD sliding window size</em> option (see
+<a href="#tools-datasynth-options">options</a> section above). The option to set
+the maximum length only has effect if the sliding window variable ordering
+algorithm is enabled. The size must be an integer number in the range
+[1 .. 12].</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If enabled, the algorithms are applied in the order they are listed above.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-datasynth-op-caches">BDD operation caches</h5>
+<div class="paragraph">
+<p>One of the main properties of BDDs is that they employ full sharing. That is,
+if a part of a binary tree needs to be represented more than once, it is stored
+only once, and reused. This leads to BDDs being represented using directed
+acyclic graphs, rather than binary trees.</p>
+</div>
+<div class="paragraph">
+<p>The BDD library uses an operation cache to speed up synthesis. Whenever a
+certain operation is performed on one or more nodes of a BDD graph, the result
+is cached. If that same operation is performed again on the same nodes, the
+cached result is reused, if available. This way, repeated calculations can be
+prevented for shared sub-graphs.</p>
+</div>
+<div class="paragraph">
+<p>The operation cache is essential for the performance of the synthesis
+algorithm. With infinite caches, the operations are generally linear in the
+number of nodes used to represent the BDDs on which they are applied. Without
+caching, the computation time grows exponentially.</p>
+</div>
+<div class="paragraph">
+<p>Obviously, in practice we can&#8217;t have infinite caches, as a computer only has a
+finite amount of memory available. We thus need to work with finite caches.
+Whenever a new cached operation result doesn&#8217;t fit in the cache, an older
+result is overwritten, and will need to be recomputed if it is needed again.</p>
+</div>
+<div class="paragraph">
+<p>Increasing the cache size can significantly increase performance for large
+systems, as a cache that is too small is ineffective, and results in many
+operations needing to be repeated, that could have otherwise been obtained from
+the cache. However, a larger than needed cache may also significantly decrease
+performance, as a cache that is too large may no longer fit within CPU caches,
+leading to more expensive accesses to the main memory rather than e.g. L1/L2/L3
+caches.</p>
+</div>
+<div class="paragraph">
+<p>The operation cache size can be configured in two ways: as a fixed size that
+remains the same during the entire synthesis, or a variable cache size that
+grows in size as the node table grows in size. See the
+<a href="#tools-datasynth-options">options</a> section above for details.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-performance">Performance</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-datasynth-options">options</a> have an effect on the
+performance of data-based synthesis:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 5.2631%;">
+<col style="width: 15.7894%;">
+<col style="width: 15.7894%;">
+<col style="width: 21.0526%;">
+<col style="width: 42.1055%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Kind</th>
+<th class="tableblock halign-left valign-top">Option</th>
+<th class="tableblock halign-left valign-top">Section</th>
+<th class="tableblock halign-left valign-top">Effect</th>
+<th class="tableblock halign-left valign-top">Choose</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD output mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-supervisor-bdd">BDD representation in CIF</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Representation of BDDs in the output model</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Use <code>nodes</code> output variant for best performance</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD predicate simplify</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-simplification">Simplification</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Potentially smaller BDDs in the output</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enable for smaller output, although simplification itself also takes
+time</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Order</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD variable order</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-var-order">BDD variable order</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Better order for smaller BDD representations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Choose the best order, depends on the model, (reversed) model/sorted
+usually good choices, custom order allows for best performance</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Order</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD FORCE variable ordering algorithm</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-var-order">BDD variable order</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Better order for smaller BDD representations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enable for automatic ordering</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Order</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD sliding window variable ordering algorithm</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-var-order">BDD variable order</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Better order for smaller BDD representations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enable for automatic ordering</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Order</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD sliding window size</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-var-order">BDD variable order</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Better order for smaller BDD representations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Larger windows might allow for more optimization, but take more time</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Library</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD library initial node table size</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-stats">Statistics</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">More storage for less resizes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Increase size for less resizes, at the cost of less memory locality</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Library</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD library operation cache size/ratio</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-op-caches">BDD operation caches</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Increase cache for less computations</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enable, larger costs more memory, larger leads to less memory locality,
+size/ratio depends on model</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Algorithm</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Forward reachability</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-forward-reach">Forward reachability</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Explore only reachable state space</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enable to reduce state space, although calculation itself may also be
+expensive, depends on model</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Debug</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Output mode</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-dbg-output">Debug output</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Debug output on console</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Disable for better performance</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Debug</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">BDD debug max nodes/paths</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-dbg-output">Debug output</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Size of predicates in debug output</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The smaller, the less blowup, the better the performance</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Debug</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Statistics</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-datasynth-stats">Statistics</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Statistics output on console</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Disable for better performance</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The first column categorizes the different options a bit, for different kind of
+options. The second column lists the different options. The third column
+indicates in which section on this page of the documentation you can find more
+information about that option. The fourth column indicates the effect of the
+option. The fifth column indicates what to choose for the option, for best
+performance, although a trade-off may be involved.</p>
+</div>
+<div class="paragraph">
+<p>Obviously, the actual model that is used has a large impact as well. More
+variables often leads to longer synthesis times. However, the predicates that
+are used may also significantly impact performance.</p>
+</div>
+<div class="paragraph">
+<p>Try to use state/event exclusion requirement invariants instead of requirement
+automata with a single location and self loops. Also, try to avoid an
+event-based modeling style, and use a data-based modeling style instead, if
+possible.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-input-variables">Input variables</h5>
+<div class="paragraph">
+<p>Data-based synthesis supports input variables. The model itself doesn&#8217;t specify
+which value an input variable has at any given moment. Input variables can thus
+have any value (as long as it fits within the data type of the variable), and
+the value can change at any time. Input variables are ideal to model sensors.</p>
+</div>
+<div class="paragraph">
+<p>To support this for data-based synthesis, the input variable is treated as a
+discrete variable with an arbitrary initial value. To allow the input variable
+to arbitrarily change, an uncontrollable event is added (with the same absolute
+name as the input variable). Also, a single edge is added for that event. The
+edge is always enabled (guard <code>true</code>, since the input variable can always
+change value), and the update indicates that it can get any value that it
+doesn&#8217;t currently have (<code>x+ != x</code> for <code>x</code> an input variable, with <code>x</code>
+the value of the variable before the update, and <code>x+</code> the value of the
+variable after the update). Obviously, the value of the input variable is kept
+within the range of values that is allowed by its data type.</p>
+</div>
+<div class="paragraph">
+<p>Using synthesis with requirements that restrict the allowed values of an input
+variable will result in an empty supervisor, as a supervisor can&#8217;t prevent the
+environment from changing the value of the input variable (it would have to
+restrict the uncontrollable event that is internally added to model value
+changes of the input variable). A supervisor can however impose additional
+restrictions on the <a href="#tools-datasynth-init">initial</a> value of an input
+variable. The supervisor can then only guarantee safe, non-blocking behavior
+if the system is initialized in accordance with the additional initialization
+restrictions.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-references">References</h5>
+<div class="ulist bibliography">
+<ul class="bibliography">
+<li>
+<p><a id="minato"></a>[minato] Shin-ichi Minato. Binary Decision Diagrams and Applications for
+VLSI CAD: The Springer International Series in Engineering and Computer Science,
+Volume 342, 1996, Springer US, ISBN 978-1-4613-1303-8 (E-book),
+ISBN 978-0-7923-9652-9 (hardcover), ISBN 978-1-4612-8558-8 (softcover)</p>
+</li>
+<li>
+<p><a id="force"></a>[force] Fadi A. Aloul, Igor L. Markov, Karem A. Sakallah.
+FORCE: A Fast and Easy-To-Implement Variable-Ordering Heuristic:
+GLSVLSI '03 Proceedings of the 13th ACM Great Lakes symposium on VLSI
+pages 116-119, 2003, ACM New York, NY, USA, ISBN 1-58113-677-3</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-eventbased-chapter-index">Event-based synthesis toolset</h4>
+<div class="paragraph">
+<p>
+
+Synthesis, 'supervisor synthesis', or 'supervisory controller synthesis', is a
+generative technique, where one derives a (supervisor) automaton from a
+collection of plants and requirements. The resulting supervisor is maximally
+permissive under the conditions of being free of deadlocks, and always having
+the option of reaching a marked state.</p>
+</div>
+<div class="paragraph">
+<p>While there is only one true synthesis tool (the tool that actually derives a
+supervisor automaton from a collection of plant and requirement automata),
+other tools exist to support the process. These tools together form the
+<em>event-based synthesis toolset</em>.</p>
+</div>
+<div class="paragraph">
+<p>These tools use and modify the sequences of events that can be performed. This
+in contrast to state-based tools, which operate primarily on the
+<a href="#tools-cifsim-traces-state">state</a> of the system. Event sequences
+directly hook into language theory, which places these tools firmly in the
+language theory mathematical framework.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-supported-specifications">Supported specifications</h5>
+<div class="paragraph">
+<p>The application supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Channels (events with data types), if used (present on an edge of at least
+one automaton), are not supported.</p>
+</li>
+<li>
+<p>Any use of the <code>tau</code> event is not supported. Note that both explicit use
+(keyword <code>tau</code>) and implicit use (no events on an edge) are unsupported.</p>
+</li>
+<li>
+<p>Automata with multiple initial locations are not supported.</p>
+</li>
+<li>
+<p>Edges with updates are not supported.</p>
+</li>
+<li>
+<p>Urgent locations and edges are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in components are not supported.</p>
+</li>
+<li>
+<p>Invariants in components are not supported.</p>
+</li>
+<li>
+<p>Marker predicates in components are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in locations that are not trivially true or false
+are not supported.</p>
+</li>
+<li>
+<p>State invariants in locations that are not trivially true are not supported.</p>
+</li>
+<li>
+<p>Marker predicates in locations that are not trivially true or false are not
+supported.</p>
+</li>
+<li>
+<p>State/event exclusion invariants are not supported.</p>
+</li>
+<li>
+<p>Guards of edges that are not trivially true or false are not supported.</p>
+</li>
+<li>
+<p>Multiple initialization predicates in a single location are not supported.</p>
+</li>
+<li>
+<p>Multiple state invariant predicates in a single location are not supported.</p>
+</li>
+<li>
+<p>Multiple marker predicates in a single location are not supported.</p>
+</li>
+<li>
+<p>Multiple guards on a single edge are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To allow state/event exclusion invariants to be used in the input, manually
+eliminate them first using the <a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a>
+CIF to CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p>For meaningful results, it is recommended to have an initial location and at
+least one marked location, in each automaton.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-3">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-kinds">Automaton kinds</h5>
+<div class="paragraph">
+<p>The event-based toolset recognizes the CIF automaton kinds <code>plant</code>,
+<code>requirement</code>, and <code>supervisor</code>, and interprets them using the
+corresponding concepts of the mathematical framework of supervisor synthesis.
+Kindless/regular automata (without a supervisory kind) are treated as unknown.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-location-names-in-reports-and-errors">Location names in reports and errors</h5>
+<div class="paragraph">
+<p>Several tools output reports or give errors with locations that are
+interesting in some way.</p>
+</div>
+<div class="paragraph">
+<p>Tools that take a single automaton as input report locations by their name in
+the input specification, for example <code>location "button.off"</code> denotes the
+<code>off</code> location in the <code>button</code> automaton. The location of automata that
+have a single unnamed location use <code>*</code> as location name, for example
+<code>location "req.*"</code> denotes the single unnamed location in the <code>req</code>
+automaton.</p>
+</div>
+<div class="paragraph">
+<p>Tools that take a number of automata together, like supervisor synthesis
+report interesting states as <code>state</code> followed by the names of the locations,
+for example <code>state "button.on", "machine.idle"</code>. Such a state refers to a
+location that represents the combined locations of the automata, in the
+example, the combined locations <code>button.off</code> and <code>machine.idle</code>.</p>
+</div>
+<div class="paragraph">
+<p>Tools that combine or merge locations, like projection, report such combined
+locations as a partition, for example <code>partition "machine.down",
+"machine.off"</code> represents a location that is a combination of the <code>down</code>
+and the <code>off</code> locations in the <code>machine</code> automaton.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-available-tools">Available tools</h5>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-eventbased-chapter-product">Event-based synchronous product</a></p>
+<div class="paragraph">
+<p>Computes the product of a number of deterministic or non-deterministic
+automata, where common events are synchronized. Essentially computes the
+<a href="#tools-cifsim-traces-state-space">state space</a>.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-supervisorsynthesis">Event-based supervisor synthesis</a></p>
+<div class="paragraph">
+<p>Derivation of a maximal permissive supervisor from a collection of
+deterministic plant and requirement automata.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-synthesis-analysis">Event-based synthesis analysis</a></p>
+<div class="paragraph">
+<p>Analysis of the removed parts of a synthesized supervisor.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-nonconflicting-check">Event-based nonconflicting check</a></p>
+<div class="paragraph">
+<p>Verifies whether automata are conflicting, that is together could lead to
+non-coreachable states.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-controllability-check">Event-based controllability check</a></p>
+<div class="paragraph">
+<p>Verifies whether the supervisor does not disable uncontrollable events
+of the plant.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-language-equivalence-check">Event-based language equivalence check</a></p>
+<div class="paragraph">
+<p>Verifies whether two automata produce the same events at each point.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-nfa-to-dfa">Event-based NFA to DFA automaton conversion</a></p>
+<div class="paragraph">
+<p>Converts a non-deterministic automaton to a deterministic automaton while
+preserving the event behavior.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-dfa-minimization">Event-based DFA minimization</a></p>
+<div class="paragraph">
+<p>Minimize the number of locations of an automaton while preserving the
+event behavior.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-projection">Event-based automaton projection</a></p>
+<div class="paragraph">
+<p>Computes a projection of an automaton, resulting in a deterministic and
+language equivalent automaton over a subset of its alphabet.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-observer-check">Event-based observer check</a></p>
+<div class="paragraph">
+<p>Verifies whether an automaton can act as an observer of occurrences of
+observable events.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-automaton-abstraction">Event-based automaton abstraction</a></p>
+<div class="paragraph">
+<p>Abstracts an automaton to a set of observable events.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-trim-check">Event-based trim check</a></p>
+<div class="paragraph">
+<p>Verifies whether the automata are trim, that is, in each automaton, the
+locations must be both reachable and co-reachable.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-eventbased-chapter-trim">Event-based trim</a></p>
+<div class="paragraph">
+<p>Removes all locations that are not reachable or coreachable.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-product">Event-based synchronous product</h5>
+<div class="paragraph">
+<p>
+
+
+
+The event-based synchronous product takes one or more plant or requirement
+automata, and computes the synchronous product. Synchronous product means
+events on edges can only be taken if all automata with that event in their
+alphabet can take an edge with the same event at that time. This tool
+essentially computes the <a href="#tools-cifsim-traces-state-space">state space</a>.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing all automata to combine, and
+produces a new <code>.cif</code> file with the product automaton. If the
+<a href="#tools-eventbased-kinds">kinds</a> of the source automata are all the same,
+the resulting product automaton is of that kinds as well. Otherwise, the
+product automaton has unknown kind.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-synchronous-product-tool">Starting the synchronous product tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply synchronous product&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply synchronous product&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifprod</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifprod</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_product.cif</code> file extension is added. The <code>product</code> part of the default
+extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the product automaton. If not specified,
+defaults to <code>product</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-supervisorsynthesis">Event-based supervisor synthesis</h5>
+<div class="paragraph">
+<p>
+
+
+
+The supervisor synthesis procedure takes one or more deterministic plant
+automata, one or more deterministic requirement automata, and combines
+them to a maximal permissive supervisor.</p>
+</div>
+<div class="paragraph">
+<p>
+The tool takes a <code>.cif</code> file containing <code>plant</code> and <code>requirement</code>
+automata. Besides the general event-based restrictions listed at
+<a href="#tools-eventbased-supported-specifications">Supported specifications</a>, the current implementation
+does not support:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Having no <code>plant</code> automata at all.</p>
+</li>
+<li>
+<p>Having no <code>requirement</code> automata at all.</p>
+</li>
+<li>
+<p>Having any other kind of automaton in the file. See
+<a href="#tools-eventbased-kinds">Automaton kinds</a> for a list of all automaton kinds.</p>
+</li>
+<li>
+<p>Non-determinism in the input automata. The tool reports the violating
+automaton, location, and event, for ease of reference.</p>
+</li>
+<li>
+<p>Events in the alphabet of the requirements that are not in the alphabet of
+the plants.</p>
+</li>
+<li>
+<p>Events that are not controllable or uncontrollable, if used (present in the
+alphabet or on an edge of at least one automaton).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In addition, it warns about common mistakes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Automata without a marked location.</p>
+</li>
+<li>
+<p>Non-<a href="#tools-eventbased-chapter-trim-check">trim</a> automata.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Finally, it can also perform checks about correct constructs that may not be
+the intention of its author. Each of these checks has to be enabled with an
+option:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Automata with a marked deadlock location. In a system with infinite
+behavior, you should probably never enter a deadlock location.</p>
+</li>
+<li>
+<p>Automata with an empty alphabet. Such automata never participate in an
+event, and can be removed.</p>
+</li>
+<li>
+<p>Controllable events that are used in exactly one automaton. Not always
+wrong, but creating a controllable event, and not using it for control may
+be a mistake.</p>
+</li>
+<li>
+<p>Groups of automata that share events only within the group (and not with any
+automaton outside the group). Such a group is completely independent, and
+can be synthesized separately.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The synthesis tool produces a new <code>.cif</code> file with the supervisor
+automaton (of kind <code>supervisor</code>) if the resulting automaton has at
+least an initial location. Otherwise, synthesis fails with a <code>Supervisor is
+empty</code> error, and no <code>.cif</code> file is written.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-supervisor-synthesis-tool">Starting the supervisor synthesis tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply supervisor synthesis&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply supervisor synthesis&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifsupsynth</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifsupsynth</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-2">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_sup.cif</code> file extension is added. The <code>sup</code> part of the default
+extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the supervisor automaton. If not
+specified, defaults to <code>sup</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+<li>
+<p><em>Enable Synthesis dump</em>: If enabled, the synthesis algorithm writes a
+dump file containing the actions performed by the algorithm, for later
+analysis. The name of the file is decided by the <em>Dump file</em> option.</p>
+</li>
+<li>
+<p><em>Synthesis dump file</em>: The name of the dump file. Setting this option will enable
+dumping of the synthesis algorithm actions. The options contains the
+absolute or relative local file system path to the
+synthesis dump file. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>.synth_dump</code> file extension is added.</p>
+</li>
+<li>
+<p><em>Disjunct groups check</em>: If enabled, the tool will report about groups of
+automata that share events in the group only.</p>
+</li>
+<li>
+<p><em>Empty alphabet check</em>: If enabled, the tool will report about automata
+without events in their alphabet.</p>
+</li>
+<li>
+<p><em>Marked deadlock location check</em>: If enabled, the tool will report about
+marked locations without outgoing edges.</p>
+</li>
+<li>
+<p><em>Single use controllable check</em>: If enabled, the tool will report about
+controllable events that are used in exactly one automaton.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-synthesis-analysis">Event-based synthesis analysis</h5>
+<div class="paragraph">
+<p>
+
+
+
+While developing a controller with supervisory controller synthesis, the
+result is not always what you expect. To assist, the synthesis analysis tool
+has been developed. Its primary purpose is to explain why certain states or
+edges have been removed.</p>
+</div>
+<div class="paragraph">
+<p>To use the tool, enable creation of the <em>Synthesis Dump</em> file during
+synthesis, using the <em>Enable Synthesis dump</em> option or the <em>Synthesis dump
+file</em> option of the <a href="#tools-eventbased-chapter-supervisorsynthesis">Supervisor synthesis tool</a>.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_enable_synthesis_dump.png" alt="analysis enable synthesis dump">
+</div>
+</div>
+<div class="paragraph">
+<p>By double clicking the generated dump file, or by right-clicking the dump file
+and selecting
+<b class="menuref">Analyze Synthesis Result</b>,
+the analysis tool is
+started. It loads the file (which can take a some time if the file is big),
+eventually giving the following display:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_startup.png" alt="analysis startup">
+</div>
+</div>
+<div class="paragraph">
+<p>At the left, all automata with their initial location are shown. You can
+select a different supervisor state by changing these locations. At the top,
+in the middle, there are three buttons. The bottom button labeled <em>Search
+state</em> is used to search the information about a supervisor state selected at
+the left. The <em>Jump to initial state</em> button resets the automata locations
+to their initial state, useful when you want to start again. The middle button
+is disabled now, but allows you to go back to the previous state.</p>
+</div>
+<div class="paragraph">
+<p>At the right, a number of options are available in case the displayed
+information is not sufficient. These are explained later.</p>
+</div>
+<div class="paragraph">
+<p>Below the buttons and options is the report area, which just displays some
+statistics. When you press <em>Search</em>, the tool analyzes the selected state at
+the left. Depending on what happened with that state, different things may be
+shown. In this example, you get:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_basic.png" alt="analysis basic">
+</div>
+</div>
+<div class="paragraph">
+<p>The report area changes to display the information about the selected state.
+It starts with the internal number of this state (<code>#0</code>), and its properties.
+The <code>initial</code> means this state is the initial state, <code>marked</code> means this
+state is marked. Then follows an explicit list of locations of every
+automaton. It is the same list as the selected locations at the left, but more
+compact. Then the analysis result is shown. This state exists in the
+supervisor, and has no outgoing edges. In other words, this state is the only
+state in the result. Below it, the edges removed by the requirements are
+listed, together with the name of the requirement automaton that disabled it.</p>
+</div>
+<div class="paragraph">
+<p>Not displayed here is the list of edges removed due to plant automata. These
+can be displayed by enabling the <em>Display disabled plant events</em> option at the
+top-right.</p>
+</div>
+<div class="paragraph">
+<p>If a state does have outgoing edges, these are displayed as well:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_outgoing.png" alt="analysis outgoing">
+</div>
+</div>
+<div class="paragraph">
+<p>State <code>#7</code> has one outgoing edge, leading to state <code>#9</code> using event
+<code>Sensor_In_Off</code>. The last line with the removed controllable events
+displays a removed edge because destination state <code>#8</code> was removed.</p>
+</div>
+<div class="paragraph">
+<p>If you want to know what states <code>#9</code> or <code>#8</code> are, you can enable the
+<em>Display full state</em> at the top-right, and the tool will display the full
+list of automaton locations with each state, just like the first line in the
+report. You can also go to these states, by double-clicking at the blue area.
+If you click at removed state <code>#8</code> you get a display like:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_removed.png" alt="analysis removed">
+</div>
+</div>
+<div class="paragraph">
+<p>As expected, the analysis tools displays that the state was removed,
+apparently because it was not co-reachable. Again you get the list of removed
+edges from this state, as an aid to decide which requirement should be
+checked, if this was not expected.</p>
+</div>
+<div class="paragraph">
+<p>The final screenshot shows what is displayed if a state is removed because
+another state is removed:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/eventbased/analysis_chain.png" alt="analysis chain">
+</div>
+</div>
+<div class="paragraph">
+<p>This is an example from a bigger system, where the supervisor is empty. The
+analysis of the initial state reveals that it was removed due to a removal of
+a chain of other states. State <code>#24</code> was removed due to a requirement
+(reading from bottom to top), which caused the chain of states <code>#9</code>, <code>#2</code>,
+and eventually <code>#0</code> to be removed.</p>
+</div>
+<div class="paragraph">
+<p>Removed edges with controllable events are not displayed here, since these
+have no influence to the disappearing of the states. If you want, you can
+display them by toggling the <em>Always display disabled controllable events</em>
+option at the top-right.</p>
+</div>
+<div class="paragraph">
+<p>In this example, the number of states in the chain to the disabling
+requirement was 4 states. This chain can be longer. Usually the middle part
+is not that interesting and it is omitted from the display, but if you want to
+see them, you can increase the number of displayed states at the top-right
+(which is by default <code>5</code>).
+Another way to see them is to double-click at a state in the chain, and the
+analysis tool will display the chain starting from that state.</p>
+</div>
+<div class="paragraph">
+<p>A situation that is not shown here, is that the analysis tool has no
+information about a state. It happens when the synthesis encountered a bad
+state on all paths to that state. In such a case, it displays that there is no
+information about the queried state.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-synthesis-analysis-tool">Starting the synthesis analysis tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, double-click a <code>.synth_dump</code> file generated by the supervisor
+synthesis dump.</p>
+</li>
+<li>
+<p>In Eclipse, right click a <code>.synth_dump</code> file in the
+'Project Explorer' tab or 'Package Explorer' tab and choose
+<b class="menuref">Analyze Synthesis Result</b>.</p>
+</li>
+<li>
+<p>Use the <code>cifsynthanalys</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifsynthanalys</code>
+command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-3">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input Synthesis dump file.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-nonconflicting-check">Event-based nonconflicting check</h5>
+<div class="paragraph">
+<p>
+
+
+
+The nonconflicting check verifies whether two or more automata are conflicting,
+that is, whether they together could result in non-coreachable states.</p>
+</div>
+<div class="paragraph">
+<p>One practical application is to check a supervisor, either synthesized or
+manually created, against a plant. That is, when the supervisor is used to
+control the plant, will it always stay in the safe coreachable area? If not, at
+what point does it fail to do so?</p>
+</div>
+<div class="paragraph">
+<p>Another practical application is to check several supervisors synthesized for
+parts of a system. That is, when the supervisors are used together to control
+a system, could that result in non-coreachable states? If so, which states are
+conflicting?</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing two or more automata, that must be
+both deterministic and trim. Besides those restrictions, the general
+event-based restrictions listed at
+<a href="#tools-eventbased-supported-specifications">Supported specifications</a> apply as well.</p>
+</div>
+<div class="paragraph">
+<p>The nonconflicting check tool produces a text file, listing the traces that
+lead to a conflicting state. If no such traces are found, the automata are
+nonconflicting.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-nonconflicting-check-tool">Starting the nonconflicting check tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply nonconflicting check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply nonconflicting check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifncchk</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifncchk</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-4">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Report file</em>: The absolute or relative local file system path to the
+output report file with conflicts. If not specified, defaults to the input
+file path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_conflicts.txt</code> file extension is added.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-controllability-check">Event-based controllability check</h5>
+<div class="paragraph">
+<p>
+
+
+
+The controllability check verifies whether a supervisor automaton does not
+disable edges with uncontrollable events of the (combined) plant automata. If
+the check fails, the tool reports where it fails. If the check succeeds, it
+reports the edges with controllable events that are disabled by the
+supervisor.</p>
+</div>
+<div class="paragraph">
+<p>
+The tool takes a <code>.cif</code> file containing a <code>supervisor</code> automaton, and one
+or more <code>plant</code> automata. Besides the general event-based restrictions listed
+at <a href="#tools-eventbased-supported-specifications">Supported specifications</a>, the current implementation
+does not support:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Having more than one <code>supervisor</code> automaton.</p>
+</li>
+<li>
+<p>Having no <code>plant</code> or <code>supervisor</code> automaton.</p>
+</li>
+<li>
+<p>Having an automaton with a different kind than <code>plant</code> or <code>supervisor</code>.</p>
+</li>
+<li>
+<p>Having a non-deterministic automaton.</p>
+</li>
+<li>
+<p>Events that are not controllable or uncontrollable, if used (present in the
+alphabet or on an edge of at least one automaton).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The controllability check tool produces a report text file with its findings.
+It states whether the controllability property holds (no edges with
+uncontrollable events of the plant are disabled) or fails (one or more edges
+with uncontrollable events in the plant are disabled by the supervisor).</p>
+</div>
+<div class="paragraph">
+<p>If the controllability property holds, the tool lists the disabled controllable
+events, which can be useful in the design process. If the property fails, the
+tool lists the edges that are disabled by the supervisor.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-controllability-check-tool">Starting the controllability check tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply controllability check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply controllability check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifctrlchk</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifctrlchk</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-5">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Report file</em>: The absolute or relative local file system path to the
+output report file with disabled events. If not specified, defaults to the
+input file path, where the <code>.cif</code> file extension is removed (if present),
+and a <code>_disableds.txt</code> file extension is added.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-language-equivalence-check">Event-based language equivalence check</h5>
+<div class="paragraph">
+<p>
+
+
+
+The language equivalence check verifies whether two automata produce the same
+language, that is, at every point they are marked in the same way and can
+produce the same events. Note that even automata with a different number of
+locations or edges can be language equivalent.</p>
+</div>
+<div class="paragraph">
+<p>All reachable locations of the automata are checked. In particular, it also
+checks locations that are outside the marked behavior (that is, reachable
+locations that are not marked and are not on a path to a marked location). To
+avoid false positives, you may want to ensure that both automata are
+<a href="#tools-eventbased-chapter-trim">trim</a>.</p>
+</div>
+<div class="paragraph">
+<p>One practical application is to verify whether a manually created supervisor
+is equivalent to an automatically generated one. If they are not, a counter
+example is produced.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing exactly two automata, that must
+be deterministic, have the same alphabet, and have an initial location. In
+addition, the general event-based restrictions listed at
+<a href="#tools-eventbased-supported-specifications">Supported specifications</a> apply as well.</p>
+</div>
+<div class="paragraph">
+<p>The language equivalence check tool produces output stating
+<code>Automata have the same language</code>, or it produces a counter example
+where an event can be
+performed in a location in one automaton, while from the equivalent
+location in the other automaton the same event cannot be performed.
+The equivalent location is derived by walking from the initial
+location to the location of interest in both automata, using the same
+sequence of events.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-language-equivalence-check-tool">Starting the language equivalence check tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply language equivalence check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply language equivalence check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>ciflngeqv</code> tool in a ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>ciflngeqv</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-6">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-nfa-to-dfa">Event-based NFA to DFA automaton conversion</h5>
+<div class="paragraph">
+<p>
+
+
+
+The event-based NFA to DFA automaton conversion takes an non-deterministic
+automaton. The algorithm produces a deterministic automaton with the same
+language.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing a single automaton. The output is
+a <code>.cif</code> file containing a deterministic automaton that is language
+equivalent with the input automaton. The resulting automaton has the same kind
+as the input automaton.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-nfa-to-dfa-automaton-conversion-tool">Starting the NFA to DFA automaton conversion tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply NFA to DFA automaton conversion&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply NFA to DFA automaton conversion&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifnfadfa</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifnfadfa</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-7">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_dfa.cif</code> file extension is added. The <code>dfa</code> part of the
+default extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the projected automaton. If not
+specified, defaults to <code>dfa</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-dfa-minimization">Event-based DFA minimization</h5>
+<div class="paragraph">
+<p>
+
+
+
+Minimizing the number of locations of an automaton while preserving the
+language gives a canonical representation of the language, making it easier to
+compare automata. The DFA minimization tool computes such a minimal automaton.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing one deterministic automaton with an
+initial location. In addition, the general event-based restrictions listed at
+<a href="#tools-eventbased-supported-specifications">Supported specifications</a> apply as well.</p>
+</div>
+<div class="paragraph">
+<p>The DFA minimization tool produces an automaton with the same language, but
+with the minimal number of locations. If the original automaton already had
+the minimal number of locations, the result is the same as the input.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-dfa-minimization-tool">Starting the DFA minimization tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply DFA minimization&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply DFA minimization&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifdfamin</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifdfamin</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-8">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_minimal.cif</code> file extension is added. The <code>minimal</code> part of the default
+extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the minimized automaton. If not specified,
+defaults to <code>minimal</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-projection">Event-based automaton projection</h5>
+<div class="paragraph">
+<p>
+
+
+
+The event-based automaton projection takes an automaton and a subset of the
+events of its alphabet that should be preserved. The other events of the
+alphabet are considered to be internal steps and get replaced by <code>epsilon</code>
+at the edges. The algorithm produces a deterministic automaton with the subset
+as its alphabet that has the same language.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing a single automaton, and the names
+of the events that should be preserved. The output is a <code>.cif</code> file
+containing a deterministic automaton that is language equivalent with the
+input automaton with respect to the set of preserved events.
+The resulting automaton has the same kind as the input automaton.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-automaton-projection-tool">Starting the automaton projection tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply automaton projection&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply automaton projection&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifproj</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifproj</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-9">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Preserved events</em>: Comma and/or whitespace separated absolute names of
+events that should be preserved.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_projected.cif</code> file extension is added. The <code>projected</code> part of the
+default extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the projected automaton. If not
+specified, defaults to <code>projected</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-observer-check">Event-based observer check</h5>
+<div class="paragraph">
+<p>
+
+
+
+The event-based observer check takes an automaton, and a subset of the events
+of its alphabet that are observable. The check verifies whether the automaton
+after projection (see <a href="#tools-eventbased-chapter-projection">Event-based automaton projection</a>) can derive the
+(abstracted) state of another component by synchronizing only on the
+observable events.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing a single automaton, and the names
+of the events that are observable. The output is a report file that indicates
+whether the observer check property holds. If it fails, the events causing
+failure are also listed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-observer-check-tool">Starting the observer check tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply observer check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply observer check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifobschk</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifobschk</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-10">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Observable events</em>: Comma and/or whitespace separated absolute names of
+events that are observable.</p>
+</li>
+<li>
+<p><em>Report file</em>: The absolute or relative local file system path to the
+output report file. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_observation.txt</code> file extension is added.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-automaton-abstraction">Event-based automaton abstraction</h5>
+<div class="paragraph">
+<p>
+
+
+
+The event-based automaton abstraction takes an automaton, and a subset of the events
+of its alphabet that are observable. The abstraction produces a
+non-deterministic abstracted automaton with the observable events as its
+alphabet, that is weakly bisimilar to the original automaton.</p>
+</div>
+<div class="paragraph">
+<p>The tool takes a <code>.cif</code> file containing a single automaton, and the names
+of the events that are observable. The output is a <code>.cif</code> file with the
+abstracted automaton. The resulting automaton has the same kind as the input
+automaton.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-automaton-abstraction-tool">Starting the automaton abstraction tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply automaton abstraction&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply automaton abstraction&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifabstr</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifabstr</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-11">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Observable events</em>: Comma and/or whitespace separated absolute names of
+events that are observable.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF file. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_abstracted.cif</code> file extension is added. The <code>abstracted</code> part of the
+default extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the abstracted automaton. If not
+specified, defaults to <code>abstracted</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-trim-check">Event-based trim check</h5>
+<div class="paragraph">
+<p>
+
+
+
+This check verifies that the automata in the given file are trim, that is, in
+each automaton, all the locations must be both reachable and coreachable. If
+the check fails for one or more automata, the tool reports for each automaton,
+whether all its locations are reachable and coreachable. It also lists the
+locations where the property fails.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-trim-check-tool">Starting the trim check tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply trim check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply trim check&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>ciftrimchk</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>ciftrimchk</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-12">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Report file</em>: The absolute or relative local file system path to the
+output report file with disabled events. If not specified, defaults to the
+input file path, where the <code>.cif</code> file extension is removed (if present),
+and a <code>_trimcheck.txt</code> file extension is added.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-eventbased-chapter-trim">Event-based trim</h5>
+<div class="paragraph">
+<p>
+
+
+
+The trim tool makes an automaton trim by removing all locations that are not
+reachable or coreachable.
+The input is a <code>.cif</code> file with a single automaton, and the tool produces a
+new <code>.cif</code> file with the trim automaton. If the automaton in the input was
+already trim, all locations are preserved.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-trim-tool">Starting the trim tool</h6>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply trim&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Event-based synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply trim&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>ciftrim</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>ciftrim</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-13">Options</h6>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_trim.cif</code> file extension is added. The <code>trim</code> part of the default
+extension depends on the <em>Result name</em> option.</p>
+</li>
+<li>
+<p><em>Result name</em>: The name to use for the trim automaton. If not
+specified, defaults to <code>trim</code>. Also affects the <em>Output file</em> option.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-cif2supremica">CIF to Supremica transformer</h4>
+<div class="paragraph">
+<p>
+
+
+The CIF to Supremica transformer can be used to transform CIF specifications
+to Supremica modules (<code>*.wmod</code> files).
+<a href="http://supremica.org/">Supremica</a>
+is a tool for synthesis of discrete event supervisors.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-3">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to Supremica&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF synthesis tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to Supremica&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cif2supremica</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2supremica</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2supremica-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative local file system path to the
+output Supremica module file. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>.wmod</code> file extension is added.</p>
+</li>
+<li>
+<p><em>Supremica module name</em>: The name of the Supremica module. If not specified,
+defaults to the name of the output file, after removal of the <code>.wmod</code>
+extension (if present).</p>
+</li>
+<li>
+<p><em>Eliminate enumerations</em>: Enable this option to eliminate enumerations before
+generating transforming to Supremica. Disable this option to keep
+enumerations in the generated Supremica module. By default this option is
+disabled.</p>
+<div class="paragraph">
+<p>Even though Supremica supports enumerations in its language, it doesn&#8217;t
+support them in all its algorithms. Even if the original CIF transformation
+being transformed does not use enumerations, enumerations may still be
+generated internally during
+<a href="#tools-cif2supremica-preprocessing">preprocessing</a>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-3">Supported specifications</h5>
+<div class="paragraph">
+<p>The CIF to Supremica transformer supports a subset of CIF specifications. The
+following restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Kindless/regular automata (without a supervisory kind) are not supported.
+Only <code>plant</code>, <code>requirement</code>, and <code>supervisor</code> automata are supported.</p>
+</li>
+<li>
+<p>Events not declared as controllable or uncontrollable are not supported.
+This includes the <code>tau</code> event, both explicitly used on edges, as well as
+implicitly for edges without explicitly mentioned events.</p>
+</li>
+<li>
+<p>Initialization predicates outside of locations are not supported.</p>
+</li>
+<li>
+<p>Marker predicates outside of locations are only supported if they have the
+form <code>discrete_variable = marked_value</code>.</p>
+</li>
+<li>
+<p>Discrete variables with multiple marker predicates are not supported.</p>
+</li>
+<li>
+<p>Locations with initialization or marker predicates that are not trivially
+true or false are not supported.</p>
+</li>
+<li>
+<p>Automata that do not have exactly one initial location are not supported.</p>
+</li>
+<li>
+<p>Invariants in locations are not supported.</p>
+</li>
+<li>
+<p>Invariants are only supported if they are requirement invariants.</p>
+</li>
+<li>
+<p>Only state invariants are supported. State/event exclusion invariants are
+not supported. To allow state/event exclusion invariants to be used in the
+input, manually eliminate them first using the
+<a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a> CIF to CIF transformation.</p>
+</li>
+<li>
+<p>Discrete variables that have multiple potential initial values
+(<code>in {...}</code> or <code>in any</code>) are not supported.</p>
+</li>
+<li>
+<p>Continuous variables are not supported.</p>
+</li>
+<li>
+<p>Input variables are currently unsupported.</p>
+</li>
+<li>
+<p>Multi-assignments on edges (such as <code>do (x, y) := (1, 2)</code>) are not
+supported. However, it is allowed to use multiple assignments on an edge
+(such as <code>do x := 1, y := 2</code>).</p>
+</li>
+<li>
+<p>Partial variable assignments (such as <code>do x[0] := 5</code>) are not supported.</p>
+</li>
+<li>
+<p>Conditional updates on edges (such as <code>do if b: x := 5 end</code>) are not
+supported.</p>
+</li>
+<li>
+<p>Urgent locations and urgent edges are not supported.</p>
+</li>
+<li>
+<p>User-defined functions are not supported.</p>
+</li>
+<li>
+<p>Channels (events with data types) are not supported.</p>
+</li>
+<li>
+<p>Only the following data types are supported: boolean types, ranged integer
+types, and enumeration types.</p>
+</li>
+<li>
+<p>Only the following expressions are supported: boolean literal values, integer
+literal values, binary expressions (partially, see below), unary expressions
+(partially, see below), and references to constants, discrete variables,
+enumeration literals, and casts that don&#8217;t change the type.</p>
+</li>
+<li>
+<p>Only the following binary operators are supported: logical equivalence
+(<code>&lt;=&gt;</code>), logical implication (<code>=&gt;</code>), conjunction (<code>and</code>) on boolean
+operands, disjunction (<code>or</code>) on boolean operands, addition (<code>+</code>) on
+ranged integer operands, subtraction (<code>-</code>) on ranged integer operands,
+multiplication (<code>*</code>) on ranged integer operands, integer division (<code>div</code>)
+on ranged integer operands, integer modulus (<code>mod</code>) on ranged integer
+operands, equality (<code>=</code>), inequality (<code>!=</code>), less than (<code>&lt;</code>) on ranged
+integer operands, less than or equal to (<code>&lt;=</code>) on ranged integer operands,
+greater than (<code>&gt;</code>) on ranged integer operands, and greater than or equal to
+(<code>&gt;=</code>) on ranged integer operands.</p>
+</li>
+<li>
+<p>Only the following unary operators are supported: logical inverse (<code>not</code>),
+negation (<code>-</code>) on a ranged integer operand, and plus (<code>+</code>) on a ranged
+integer operand.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2supremica-preprocessing">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-pos-info">Remove position information</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-alg-vars">Eliminate algebraic variables</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-type-decls">Eliminate type declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-monitors">Eliminate monitors</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a> (if enabled via the corresponding
+<a href="#tools-cif2supremica-options">option</a>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-others">Simplify others</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-transformation-result">Transformation result</h5>
+<div class="paragraph">
+<p>The CIF automata kinds <code>plant</code>, <code>requirement</code>, and <code>supervisor</code> are
+mapped to Supremica kinds <code>Plant</code>, <code>Specification</code>, and <code>Supervisor</code>,
+respectively.</p>
+</div>
+<div class="paragraph">
+<p>All generated Supremica automata are tagged as non-deterministic, as CIF
+automata may be non-deterministic.</p>
+</div>
+<div class="paragraph">
+<p>Nameless CIF locations are given the name <code>X</code> in Supremica automata.</p>
+</div>
+<div class="paragraph">
+<p>Supremica does not support boolean values. Instead of <code>true</code>, value <code>1</code> is
+used, and instead of <code>false</code>, value <code>0</code> is used. For boolean types
+(<code>bool</code>), ranged integer types (<code>int[0..1]</code>) are used.</p>
+</div>
+<div class="paragraph">
+<p>The absolute names of all CIF objects (automata, variables, etc) are used,
+where the <code>.</code> characters are replaced by <code>:</code> characters. For enumeration
+literals, the non-absolute name of the enumeration literal is used, prefixed
+with <code>:lit:</code>.</p>
+</div>
+<div class="paragraph">
+<p>No geometry is generated. When the generated Supremica file is opened in
+Supremica, Supremica will perform auto layouting.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-initialization">Initialization</h5>
+<div class="paragraph">
+<p>For the initial values of the variables, initialization predicates are
+generated (e.g. <code>x == 3</code>). Earlier versions of Supremica that support
+variables allowed deterministic initialization (only the initial value), and
+non-deterministic initialization (initialization predicates). The most recent
+version only allows non-deterministic initialization, which is why we generate
+initialization predicates.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-marking">Marking</h5>
+<div class="paragraph">
+<p>In CIF, if none of the locations of an automaton are indicated as marked, the
+automaton has no marked locations. In Supremica, if none of the locations of
+an automaton are indicated as marked (<code>:accepting</code>), all locations of the
+automaton are implicitly marked. When transforming a CIF automaton without any
+marked locations, a warning is printed to the console to inform the user of
+this difference.</p>
+</div>
+<div class="paragraph">
+<p>In CIF, if none of the values of a variable is indicated as marked, the
+variable has no marked values. In Supremica, if none of the values of
+a variable is indicated as marked (<code>:accepting</code>), all values of the
+variable are implicitly marked. When transforming a CIF variable without any
+marked values, a warning is printed to the console to inform the user of
+this difference.</p>
+</div>
+<div class="paragraph">
+<p>Location pointer variables that are automatically generated, such as the ones
+generated by the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF
+transformation, have no marking and thus lead to warnings.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-invariants">Invariants</h5>
+<div class="paragraph">
+<p>If the CIF model being transformed contains state invariants, an uncontrollable
+<code>u_inv_bad</code> event is added to the Supremica module. It is renamed if the name
+is not unique. A plant automaton named <code>inv_plant</code> (renamed if not unique) is
+added as well. This plant enables the <code>u_inv_bad</code> event if and only if at
+least one of the invariants doesn&#8217;t hold. A requirement automaton <code>inv_req</code>
+(renamed if not unique) is added as well. The requirement disables the event
+globally. Since blocking an uncontrollable plant event in a requirement is
+forbidden, synthesis will prevent such blockage (by disabling controllable
+events), thereby ensuring that the state invariants hold after synthesis.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-alphabets">Alphabets</h5>
+<div class="paragraph">
+<p>In CIF, it is possible to explicitly specify the alphabet of an automaton. This
+alphabet may include more events than occur on the edges of the automaton,
+thereby globally disabling those additional events. Supremica automatically
+determines the alphabet automatically, based on the events that occur on the
+edges of the automaton, just like CIF does if no explicit alphabet is
+specified. If a CIF automaton with 'additional' events is transformed, a self
+loop is added to the initial state for each 'additional' event, with a
+<code>false</code> guard (<code>0</code> in Supremica). This ensures that the event occurs on
+an edge, and is thus part of the alphabet, but is not enabled.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-range-semantics">Range semantics</h5>
+<div class="paragraph">
+<p>In CIF, if an update of an edge results in out of range values of variables,
+the CIF specification is considered invalid, and the simulation will result
+in a runtime error. In Supremica, the simulation does not result in a runtime
+error, but instead the offending transition is disabled/forbidden.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-jumping-semantics">Jumping semantics</h5>
+<div class="paragraph">
+<p>Consider the following CIF model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton p:
+  controllable c_event;
+  disc int[0..3] v = 0;
+
+  location loc1:
+    initial;
+    marked;
+    edge c_event do v := v + 1 goto loc2;
+
+  location loc2:
+    edge c_event               goto loc1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>There are two locations, and the edges allow for moving from one location to
+the other. Both edges use the same event. Every odd transition (the first
+transition, the third transition, etc), the value of variable <code>v</code> is
+increased by one. Every even transition, the value of variable <code>v</code> is not
+changed. After a few transitions, the simulation crashes due to overflow of
+variable <code>v</code>.</p>
+</div>
+<div class="paragraph">
+<p>To ensure the same semantics in Supremica, such that for every even transition
+the value of variable <code>v</code> does not change, the CIF model is modified by the
+transformation, to the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton p:
+  controllable c_event;
+  disc int[0..3] v = 0;
+
+  location loc1:
+    initial;
+    marked;
+    edge c_event do v := v + 1 goto loc2;
+
+  location loc2:
+    edge c_event do v := v     goto loc1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Users of the transformation don&#8217;t have to do anything themselves, as the tool
+automatically adds the dummy assignments as needed. If the tool would not have
+added such dummy assignments, then the value of variable <code>v</code> would have
+been able to <em>jump</em> to any value (in its range <code>[0..3]</code>) for every even
+transition, according to the Supremica semantics.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-simulation-validation-and-visualization-tools">Simulation, validation, and visualization tools</h3>
+<div class="sect3">
+<h4 id="tools-cifsim-chapter-index">CIF simulator</h4>
+<div class="paragraph">
+<p>
+
+The CIF simulator can be used to explore the
+<a href="#tools-cifsim-traces-state-space">state space</a> of CIF specifications, either
+interactively, or using a more automated approach. Powerful visualization
+features allow for interactive visualization-based validation of the CIF
+specification.</p>
+</div>
+<div class="paragraph">
+<p><strong>Basics</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-supported">Supported specifications</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-start">Starting the simulator</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-init">Initialization of the CIF specification</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-termination">Terminating the simulator</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-traces">Simulation of traces</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-repeated-simulation">Repeated simulation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Input/Output</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-chapter-index">Input modes</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-env-events">Environment events</a> (non-urgent events)</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-index">Simulation output</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Advanced</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-options">Simulator options</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-performance">Simulation performance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-index">ODE solver</a> (integration and guard/event detection)</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-java-compiler">Java compiler</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Miscellaneous</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-complete-mode">Complete mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-extfuncs">External user-defined functions</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-profiling">Profiling</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-distr-seeds">Stochastic distributions and seeds</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Developers</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-max-time-point-tol">Maximum time point tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-debug-gen-code">Debugging generated code</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-test-mode">Test mode</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-simulation-basics">Simulation basics</h4>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-supported">Supported specifications</h5>
+<div class="paragraph">
+<p>
+The CIF simulator supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Input variables are currently not supported.</p>
+</li>
+<li>
+<p>Time dependent <a href="#tut-data-chapter-stat-invariants">state invariants</a> are
+not supported. This applies only to state invariants.
+<a href="#tut-data-chapter-stat-evt-excl-invariants">State/event exclusion invariants</a> are supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Specifications with component definitions/instantiations are not natively
+supported by the CIF simulator. Therefore, they are automatically eliminated
+by the simulator, as a preprocessing step, using the CIF to CIF transformation
+to <a href="#tools-cif2cif-chapter-elim-comp-def-inst">eliminate component definition/instantiation</a>.</p>
+</div>
+<div class="paragraph">
+<p>Automata with multiple possible initial locations and discrete variables with
+multiple possible initial values (including <code>any</code>) are not supported, unless
+additional <a href="#tools-cifsim-chapter-init">initialization</a> is provided.</p>
+</div>
+<div class="paragraph">
+<p>The controllability of events is ignored by the simulator, as are marker
+predicates.</p>
+</div>
+<div class="paragraph">
+<p>All automata are simulated as plants. That is, all automaton kinds are ignored
+by the simulator. However, simulating requirements as plants may lead to
+unexpected results. Therefore, the simulator prints warnings to the console,
+whenever requirements are simulated. It is highly recommended to first apply
+<a href="#tools-eventbased-chapter-supervisorsynthesis">supervisor synthesis</a> to the
+specification, and simulate the resulting specification using the simulator.
+Alternatively, apply verification to the specification,
+<a href="#tools-cif2cif-chapter-remove-reqs">remove</a> the verified requirements, and
+simulate the resulting specification using the simulator.</p>
+</div>
+<div class="paragraph">
+<p>Similar to requirement automata, the simulator warns about simulation of
+requirement invariants.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-start">Starting the simulator</h5>
+<div class="paragraph">
+<p>
+The CIF simulator can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<b class="menuref">Simulate CIF specification&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<b class="menuref">Simulate CIF specification&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>Use the <code>cifsim</code> tool in a ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifsim</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Once you start the simulator, an option dialog will appear, where you can
+configure the simulation <a href="#tools-cifsim-chapter-options">options</a>.</p>
+</div>
+<div class="paragraph">
+<p>Instead of a CIF model (e.g. a <code>.cif</code> file), simulation can also be started
+for a <a href="#tools-cifsim-chapter-repeated-simulation">compiled code file</a> (e.g. a
+<code>.cifcode</code> file). For compiled code files, an additional option is
+available. The simulator can also be started by double clicking such a file.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-init">Initialization of the CIF specification</h5>
+<div class="paragraph">
+<p>
+CIF supports <a href="#tut-data-chapter-discrete-variables">discrete variables</a> with
+<a href="#lang-tut-data-discvar-init-multiple">multiple potential initial values</a>,
+as well as discrete variables with an
+<a href="#lang-tut-data-discvar-init-any">arbitrary initial value</a>. Furthermore,
+CIF supports automata with
+<a href="#lang-tut-data-init-preds-aut">multiple potential initial locations</a>.
+The simulator however, needs to know how to initialize the specification. The
+initial values of discrete variables, and the initial locations of automata,
+can be specified using the
+<b class="menuref">CIF specification initialization</b>
+option
+(<b class="menuref">Simulator</b>
+category). Initialization can be provided using the
+option, per discrete variable or automaton.</p>
+</div>
+<div class="paragraph">
+<p>For a discrete variable, initialization is of the form <code>var:value</code>, where
+<code>var</code> is the absolute name of a discrete variable, and <code>value</code> is a CIF
+<a href="#lang-tut-values-types-values-exprs-literal">literal</a> that represents a
+valid initial value for the variable. Providing an initialization for a
+discrete variable with a
+<a href="#tut-functions-chapter-functions-as-values">function type</a> or a
+<a href="#tut-stochastics-chapter-intro">distribution</a> type, is not supported.</p>
+</div>
+<div class="paragraph">
+<p>For an automaton, initialization is of the form <code>aut:loc</code>, where <code>aut</code> is
+the absolute name of an automaton, and <code>loc</code> is the name of a location of
+that automaton. Providing an initialization for an automata with only one
+nameless location, is not supported.</p>
+</div>
+<div class="paragraph">
+<p>It is not allowed to provide multiple initializations for a single variable or
+automaton.</p>
+</div>
+<div class="paragraph">
+<p>If insufficient initializations are provided, variables and automata may not be
+initialized. That is, the simulator may not be able to choose between the
+multiple potential initial values or locations. The simulator will report such
+problems, indicating the specification is
+<a href="#tools-cifsim-chapter-supported">unsupported</a> without additional or alternative
+initializations.</p>
+</div>
+<div class="paragraph">
+<p>It is also possible that initializations in the CIF specification itself are
+incomplete or conflicting, the provided initializations are conflicting, or
+their combination is conflicting. Furthermore, initializations may be provided
+for values or locations that are not potential initial values or locations. In
+all such cases, initialization fails. The simulator will report such problems,
+providing detailed information about what caused the initialization failure.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-termination">Terminating the simulator</h5>
+<div class="paragraph">
+<p>
+The CIF simulator can terminate for various reasons. This page explains each
+of them, as well as some other information related to termination of the
+simulator.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-initialization-failure">Initialization failure</h6>
+<div class="paragraph">
+<p>If <a href="#tools-cifsim-chapter-init">initialization</a> of the specification fails,
+the simulation will terminate immediately.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-deadlock">Deadlock</h6>
+<div class="paragraph">
+<p>If simulation results in deadlock, no more transitions are possible, and the
+simulation will terminate.</p>
+</div>
+<div class="paragraph">
+<p>Simulation does not immediately terminate when deadlock occurs, if an
+interactive <a href="#tools-cifsim-input-chapter-index">input mode</a> is used and
+<a href="#tools-cifsim-input-chapter-history">history</a> is enabled. Instead, the user is
+asked whether to terminate the simulation,
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> one or more transitions, or
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> the simulation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-termination-endtime">Simulation end time</h6>
+<div class="paragraph">
+<p>Using the
+<b class="menuref">Simulation end time</b>
+option (<b class="menuref">Simulator</b>
+category), the end time of the simulation can be configured. By setting a
+simulation end time, you ensure that when the value of variable <code>time</code>
+reaches that value, the simulation terminates.</p>
+</div>
+<div class="paragraph">
+<p>By default the simulation end time is set to 'infinite', which means that
+simulation termination is not limited by a simulation end time. Settings a
+simulation end time also limits the <a href="#tools-cifsim-solver-chapter-endtime-maxdelay">maximum duration of a time transition</a>.</p>
+</div>
+<div class="paragraph">
+<p>Simulation does not immediately terminate when the configured end time is
+reached, if an interactive <a href="#tools-cifsim-input-chapter-index">input mode</a> is
+used and <a href="#tools-cifsim-input-chapter-history">history</a> is enabled. Instead, the
+user is asked whether to terminate the simulation,
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> one or more transitions, or
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> the simulation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-runtime-error">Runtime error</h6>
+<div class="paragraph">
+<p>If simulation results in a runtime error, the simulation will terminate
+immediately.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-end-of-trace-file">End of trace file</h6>
+<div class="paragraph">
+<p>If the <a href="#tools-cifsim-input-chapter-trace">trace input mode</a> is used, and no
+more commands are available in the trace file, the simulation will terminate
+immediately.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-user-requested-termination">User-requested termination</h6>
+<div class="paragraph">
+<p>The user can manually request termination of the simulation in several ways.</p>
+</div>
+<div class="paragraph">
+<p>Termination requests have no effect while the simulator interactively asks
+for input from the <a href="#tools-cifsim-input-chapter-console">console</a> or via the GUI
+of the <a href="#tools-cifsim-input-chapter-gui">interactive GUI input component</a>.
+However, once input is provided via the console and <kbd>ENTER</kbd> is pressed, or
+a choice is made via the GUI, the termination request will be processed.</p>
+</div>
+<div class="paragraph">
+<p>Termination requests issued between
+<a href="#tools-cifsim-output-realtime-frames">intermediate frames</a> are delayed
+until the next intermediate frame.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-interactive-console-input">Interactive console input</h7>
+<div class="paragraph">
+<p>Termination of the simulation can be requested, when using the interactive
+<a href="#tools-cifsim-input-chapter-console">console</a> input mode, by typing <code>q</code>
+and pressing <kbd>ENTER</kbd>, whenever the simulator interactively asks for input
+via the console.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-interactive-gui-input">Interactive GUI input</h7>
+<div class="paragraph">
+<p>Termination of the simulation can be requested, when using the interactive
+<a href="#tools-cifsim-input-chapter-gui">interactive GUI input mode</a>, by closing the
+GUI of the interactive GUI input component, when the simulator asks for input
+via that GUI.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-applications-view">Applications view</h7>
+<div class="paragraph">
+<p>The <em>Applications</em> view has several termination features that may terminate
+any application, including the CIF simulator. See the documentation for
+that view, for details.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-console-termination-button">Console termination button</h7>
+<div class="paragraph">
+<p>Simulation can be terminated at any time, by using the <b class="menuref">Terminate</b>
+button (<span class="image"><img src="./tools/cifsim/terminate_button.png" alt="terminate button"></span>), located at the upper right corner of the console.</p>
+</div>
+<div class="paragraph">
+<p>Note however that if the console does not have the focus, this button may not
+be visible. If the button is not visible, click somewhere in the console to
+make the button appear. If even then the button is still not available, it may
+still appear if you <b class="menuref">Maximize</b> the console. Due to these issues, use
+of the termination features of the <em>Applications</em> view is recommended over
+using the <b class="menuref">Terminate</b> button of the console. See the documentation for
+that view, for details.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-closing-last-real-time-visualizer">Closing last real-time visualizer</h7>
+<div class="paragraph">
+<p>If the last remaining
+<a href="#tools-cifsim-output-realtime-outcomp">real-time output component</a>
+(visualizer) is closed by the user, the simulator will be asked to terminate as
+soon as possible.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-termination-confirm">Confirming termination</h6>
+<div class="paragraph">
+<p>When simulating within Eclipse, all
+<a href="#tools-cifsim-output-components">visualizers</a> remain open, after the
+simulation has terminated. This allows you to observe the final state of the
+simulation, before manually closing the visualizers.</p>
+</div>
+<div class="paragraph">
+<p>When simulating on the command line (outside of Eclipse), termination of the
+simulator means that the visualizers are also closed. To allow you to observe
+the final state of the simulation, you are asked to confirm termination of the
+simulator, and therefore closing of the visualizers, by pressing <kbd>ENTER</kbd>
+at the console.</p>
+</div>
+<div class="paragraph">
+<p>By default, you are only asked to confirm termination of the simulator when
+simulating on the command line (outside of Eclipse), at least one visualizer
+is visible at the end of the simulation, simulation did not result in a runtime
+error, and <a href="#tools-cifsim-chapter-test-mode">test mode</a> is disabled. The
+<b class="menuref">Ask to confirm simulator termination</b>
+option (<b class="menuref">Simulator</b>
+category) can be used to configure whether the simulator asks the user to
+confirm termination of the simulator, terminate automatically, or decides by
+itself whether to ask the user for confirmation or terminate automatically. The
+latter (letting the simulator decide by itself) is the default.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-traces">Simulation of traces</h5>
+<div class="paragraph">
+<p>
+The CIF simulator simulates one particular trace through the state space of
+the specification. To better understand what the previous sentence means, this
+page further explains each of those concepts.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-traces-state">State</h6>
+<div class="paragraph">
+<p>Automata consist of one or more locations. However, at any time, an automaton
+can only be in <em>one</em> of its locations. This location is called the <em>current</em>
+or <em>active</em> location. The current location of an automaton is also called the
+<em>state</em> of the automaton.</p>
+</div>
+<div class="paragraph">
+<p>Similar to having multiple locations in automata, variables usually have many
+possible values. However, similar to automata having only one current location,
+variables can not have two values at the same time.</p>
+</div>
+<div class="paragraph">
+<p>The current location of each of the automata (i.e. the states of the automata),
+together with the current values of the variables (all discrete and continuous
+variables, including variable <code>time</code>), is called the <em>state</em> of the
+specification. The state of the specification (or simply 'the state'), is
+all the information that needs to be maintained about the history of the
+simulation, going forward.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton button:
+  event pushed, released;
+
+  location Released:
+    initial;
+    edge pushed goto Pushed;
+
+  location Pushed:
+    edge released goto Released;
+end
+
+automaton machine:
+  event producing, produced;
+
+  location Idle:
+    initial;
+    edge producing when button.Pushed goto Producing;
+
+  location Producing:
+    edge produced goto Idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We have two automata, <code>button</code> and <code>machine</code>. Pushing the button (event
+<code>button.pushed</code>) turns on the machine. Releasing the button (event
+<code>button.released</code>) turns it off. Initially, the machine is <code>Idle</code>. While
+the button is pushed (location <code>button.Pushed</code> is the current location of
+automaton <code>button</code>), the machine can start to create a product (event
+<code>machine.producing</code>). Once the machine has produced a product (event
+<code>machine.produced</code>), the machine becomes idle again. Note that once the
+machine starts producing a product, it always finishes producing it, even if it
+is turned off in the mean time.</p>
+</div>
+<div class="paragraph">
+<p>The state of automaton <code>button</code> is either of its locations:
+<code>button.Released</code> or <code>button.Pushed</code>. Similarly, the state of automaton
+<code>machine</code> is <code>machine.Idle</code> or <code>machine.Producing</code>. Initially, the system
+is in state <code>button: Released, machine: Idle, time: 0.0</code>. For the remainder of
+variable <code>time</code> will omitted from the state, for brevity only. Furthermore,
+also for brevity only, we&#8217;ll omit the names of the automata. Therefore, the
+initial state is <code>Released, Idle</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-traces-state-space">State space</h6>
+<div class="paragraph">
+<p>The <em>state space</em> of a specification consists all the possible states of the
+specification, connected by the transitions via which they can be reached.</p>
+</div>
+<div class="paragraph">
+<p>For the example above, the state space is (event names are abbreviated):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/state_space.png" alt="state space">
+</div>
+</div>
+<div class="paragraph">
+<p>Since both automata can be in two states, the state space in this case consists
+of four states. From the initial state (the upper left state), the button can
+be pushed, leading to the upper right state, where the button is pushed, while
+the machine has not yet started to produce a product. The machine can then
+start to produce a product (going to the lower right state). If however the
+button is released before the machine can respond by starting to produce a
+product, we go back to the upper left state. When the machine finishes
+creation of the product, we go from the lower right state back to the upper
+right state. If on the other hand the button is released, while the product is
+still being produced, we go from the lower right state to the lower left state.
+If we then push the button again, we go back to the lower right state. If
+instead the button is not pushed, and the machine finishes producing the
+product, we go from the lower left state back to the upper left state.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-traces-traces">Traces</h6>
+<div class="paragraph">
+<p>A <em>trace</em> is a sequence of transitions, from the initial state, through the
+state space.</p>
+</div>
+<div class="paragraph">
+<p>In state spaces, most states usually have multiple outgoing transitions. This
+means there is <em>choice</em>. That is, it is possible to choose to which next state
+to go. Furthermore, it is usually possible to keep taking transitions forever,
+which means we can have infinite traces.</p>
+</div>
+<div class="paragraph">
+<p>For the example above, some of the possible traces are shown below. Only the
+first five transitions of the traces are shown. State names are abbreviated,
+to the first letters of the names of the locations.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>RI
+→ <code>pushed</code>   → PI → <code>released</code>  → RI
+→ <code>pushed</code>   → PI → <code>released</code>  → RI
+→ <code>pushed</code>   → PI → &#8230;&#8203;</p>
+</li>
+<li>
+<p>RI
+→ <code>pushed</code>   → PI → <code>producing</code> → PP
+→ <code>produced</code> → PI → <code>producing</code> → PP
+→ <code>produced</code> → PI → &#8230;&#8203;</p>
+</li>
+<li>
+<p>RI
+→ <code>pushed</code>   → PI → <code>producing</code> → PP
+→ <code>released</code> → RP → <code>produced</code>  → RI
+→ <code>pushed</code>   → PI → &#8230;&#8203;</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In the first trace, we push the button, release it, push it again, release it,
+and push it again, all without ever starting to produce a product. This traces
+shows us what happens if the button is constantly being pushed and released,
+as quickly as possible, without the machine being able to respond to this, by
+starting to produce a product.</p>
+</div>
+<div class="paragraph">
+<p>In the second trace, we push the button, we start to produce a product, we
+finish producing it, start to produce another product (the button is still
+pushed), finish producing the second product, and start to produce a third
+product. This is a trace of a typical usage scenario, where we start the
+machine, and the machine keeps running.</p>
+</div>
+<div class="paragraph">
+<p>In the third trace, we push the button, start to produce a product, release the
+button before the product is finished, finish producing the product, and push
+the button again. This trace is another typical usage scenario, which also
+includes turning off the machine.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-traces-simulation">Simulation</h6>
+<div class="paragraph">
+<p>As stated at the top of the page: <em>'The CIF simulator simulates one
+particular trace through the state space of the specification'</em>. To see why
+this is the case, we take a look at the main simulation loop, as used by the
+simulator:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Calculate the initial state, and set it as the current state.</p>
+</li>
+<li>
+<p>Forever, do:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>If the user-provided simulation end time is reached, stop simulation.</p>
+</li>
+<li>
+<p>Calculate the possible transitions for the current state.</p>
+</li>
+<li>
+<p>If no transitions are possible (deadlock), stop simulation.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-index">Choose</a> one of the possible transitions.</p>
+</li>
+<li>
+<p>Take the chosen transition, and set its target state as the new current
+state.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>While this main simulation loop is simplified with respect to the real
+implementation, it gives some insight into the inner workings of the simulator.
+The simulator keeps taking transitions. Once a transition is taken, the current
+state is updated to the target state of the transition. This means that the
+other possible transitions (the ones that were not chosen), are not taken.
+Therefore, if we want to take a different transition, we should restart
+simulation from the initial state, and make different choices. That is, if we
+want to simulate a different trace, we perform another simulation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-traces-validation">Validation</h6>
+<div class="paragraph">
+<p>The simulator can be used to gain confidence in the correctness of the
+specification. By simulating various traces, we can observe what happens in
+different scenarios (use cases). Since the number of traces if often infinite,
+covering the entire state space, and all possible traces, is impossible.
+However, by wisely choosing the traces we simulate, we can cover a large part
+of the state space.</p>
+</div>
+<div class="paragraph">
+<p>It should be clear by now, that simulating a single trace is almost never
+enough to conclude that your specification is 'correct'. Different traces lead
+to different behavior, and only by testing enough traces, and thus covering
+enough of the system&#8217;s behavior, can you conclude that your specification
+works as expected (for those traces).</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-repeated-simulation">Repeated simulation</h5>
+<div class="paragraph">
+<p>
+
+When simulating a CIF model, the simulator reads the CIF file, checks it for
+validity, generates
+<a href="http://oracle.com/java">Java</a>
+code,
+<a href="#tools-cifsim-chapter-java-compiler">compiles</a> the code, and uses the compiled
+code using the actual simulation. All of this takes a bit of time, or even
+quite some time, depending on the size of the model. This situation is not
+ideal for repeated simulations, for instance when trying different scenarios
+or use cases, when simulating with different
+<a href="#tools-cifsim-chapter-options">options</a>, or when repeating simulations with
+various different <a href="#tools-cifsim-chapter-init">initializations</a> or due to
+<a href="#tut-stochastics-chapter-intro">stochastic</a> behavior. The startup time for
+the first simulation is also present for the second simulation, etc.</p>
+</div>
+<div class="paragraph">
+<p>It would be much better to generate and compile the code just once, and then
+simulate multiple times using the already compiled code, significantly reducing
+the startup time of the simulations. This is especially useful for automated
+repeated simulations, where the same simulation model, either with different
+options (for instance different initializations) or with the same options for a
+model with stochastics, is simulated multiple times and the results of
+simulation are for instance compared or aggregated in some way.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-repeated-sim-compile-once">Compiling just once</h6>
+<div class="paragraph">
+<p>The simulator can be used to generate code and compile it only once. By
+enabling the <em>Compile only</em> option (<em>Compiler</em> category), the simulator will
+perform all steps needed to generate and compile the code, and will then save
+the compiled code to a file. After saving the file, the simulator will
+terminate, not simulating the model.</p>
+</div>
+<div class="paragraph">
+<p>By default, the input file name (e.g. <code>some_file.cif</code>) is used to construct
+the name of the simulator compiled Java code file, by removing the <code>.cif</code>
+file extension if present, and adding a <code>.cifcode</code> file extension to it (e.g.
+resulting in <code>some_file.cifcode</code>). It is possible to change this file name
+by using the <em>Compiled code file</em> option (<em>Compiler</em> category). If used, it
+specifies the absolute or relative local file system path to the compiled Java
+code file.</p>
+</div>
+<div class="paragraph">
+<p>The compiled code file can be put in any directory. It does not have to be in
+the same directory as the original CIF model. However, make sure that any
+additional files, such as <a href="#tools-cifsim-output-svgviz-chapter-svg">SVG images</a>
+for <a href="#tools-cifsim-output-svgviz-chapter-index">visualization</a>, remain in their
+original locations. They will be resolved relative to the original location of
+the CIF model that was compiled.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-simulating-using-a-compiled-code-file">Simulating using a compiled code file</h6>
+<div class="paragraph">
+<p>There are several ways to start simulation with a compiled code file. In fact,
+all the ways to <a href="#tools-cifsim-chapter-start">start</a> simulation for normal CIF
+models (e.g. <code>.cif</code> files), apply to compiled code files (e.g. <code>.cifcode</code>
+file) as well. The simulator checks whether the input file name ends with
+<code>.cifcode</code> and then loads the compiled code file, instead of treating the
+input model as CIF model.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, a <code>.cifcode</code> file can be double clicked in the Eclipse
+'Project Explorer' tab or 'Package Explorer' tab, to immediately
+start simulation. An option dialog is shown to configure any simulator
+<a href="#tools-cifsim-chapter-options">options</a>.</p>
+</div>
+<div class="paragraph">
+<p>A warning is printed to the console if the compiled code file was generated
+by a different version of the simulator than the one used to simulate it.
+Ignoring the warning may lead to unexpected simulation results, or even
+simulator crashes.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-option-effects-and-priorities">Option effects and priorities</h6>
+<div class="paragraph">
+<p>Most simulator <a href="#tools-cifsim-chapter-options">options</a> have no effect when the
+<em>Compile only</em> option (<em>Compiler</em> category) is enabled, as after code is
+generated, compiled, and saved to a file, the simulator terminates, and no
+actual simulation is performed.</p>
+</div>
+<div class="paragraph">
+<p>The <em>Compile only</em> option (<em>Compiler</em> category) has no effect when
+<a href="#tools-cifsim-chapter-debug-gen-code">debugging generated code</a>, by enabling
+the <em>Load debug code</em> option (<em>Simulator</em> category).</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-example">Example</h6>
+<div class="paragraph">
+<p>As an example, consider the following CIF model in file <code>machine.cif</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event enter;
+event processed;
+event exit;
+
+automaton machine:
+  disc int count = 0;
+  disc real process_time;
+  disc dist real d = normal(10, 7);
+  cont t der 1.0;
+
+  location waiting:
+    initial;
+    edge enter do (process_time, d) := sample d, t := 0 goto processing;
+
+  location processing:
+    edge processed when t &gt;= process_time goto done;
+
+  location done:
+    edge exit do count := count + 1 goto waiting;
+end
+
+print machine.count for final;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model consists of a <code>machine</code> that processes products. Initially, the
+machine is <code>waiting</code>. Once a product enters the system, the machine will
+start <code>processing</code>. Once the product is <code>processed</code>, the machine is
+<code>done</code> and will be <code>waiting</code> for the next product to <code>enter</code>. The time it
+takes to process a product varies with each product. A
+<a href="http://en.wikipedia.org/wiki/Normal_distribution">normal distribution</a>
+with
+a mean of <code>10</code> and a variance of <code>7</code> is used to model the varying
+processing times.</p>
+</div>
+<div class="paragraph">
+<p>The <a href="#tools-cifsim-output-print-chapter-ref-printdecl">print declaration</a> at the
+end of the model is used to <a href="#tools-cifsim-output-print-chapter-index">print</a>
+the number of processed products at the end of the simulation.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following ToolDef <a href="#tools-scripting-chapter-intro">script</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(&quot;machine.cif --compile-only=on&quot;);
+
+rmfile(&quot;out.txt&quot;, force=true);
+
+for x in range(1000):
+    string args = &quot;machine.cifcode -i auto -a first -t 100 -o print&quot;;
+    cifsim(args, stdout=&quot;out.txt&quot;, appendOut=true);
+end
+
+double minimum = 9999;
+double maximum = -9999;
+for line in readlines(&quot;out.txt&quot;):
+    double value = &lt;double&gt;line;
+    minimum = min(minimum, value);
+    maximum = max(maximum, value);
+end
+
+outln(&quot;Minimum: %.2f&quot;, minimum);
+outln(&quot;Maximum: %.2f&quot;, maximum);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>import</code> statement makes the CIF tools available. The first <code>cifsim</code>
+command generates code for the <code>machine.cif</code> model, compiles it, and saves it
+to <code>machine.cifcode</code>. The <code>rmfile</code> command removes the <code>out.txt</code> file, in
+case it was left over from a previous run of the script.</p>
+</div>
+<div class="paragraph">
+<p>The body of the <code>for</code> statement is executed <code>1000</code> times. Each time, the
+<code>cifsim</code> command is used to simulate the model, using the already compiled
+code in <code>machine.cifcode</code>. The simulation uses
+<a href="#tools-cifsim-input-chapter-automatic">automatic mode</a> due to <code>-i auto</code>,
+always chooses the <a href="#tools-cifsim-input-automatic-trans">first</a> available
+transition due to <code>-a first</code>, <a href="#tools-cifsim-termination-endtime">ends</a>
+at time <code>100</code> due to <code>-t 100</code>, and only
+<a href="#tools-cifsim-output-chapter-normal">outputs</a> text for print declarations due
+to <code>-o print</code>. The output of the simulation is not written to the console,
+but to <code>out.txt</code> due to the use of the <code>stdout</code> parameter of the
+<code>cifsim</code> tool. The <code>appendOut</code> parameter is enabled to ensure that the
+output of each simulation is appended (added) to the <code>out.txt</code> file instead
+of overwriting the file for each simulation. After the simulations, the
+<code>out.txt</code> file will contain the number of processed products for each of the
+simulation experiments.</p>
+</div>
+<div class="paragraph">
+<p>The remainder of the script computes the minimum and maximum number of products
+(minimum and maximum throughput) of the machine, as observed from the
+experiments. Both the <code>minimum</code> and <code>maximum</code> are initialized. Then each
+line of the <code>out.txt</code> file is processed. The numeric value is obtained by
+casting the text of the line to a <code>double</code> number. Then the <code>minimum</code> and
+<code>maximum</code> are updated as needed. After the minimum and maximum are
+calculated, they are printed to the console as floating point numbers with two
+digits after the decimal mark.</p>
+</div>
+<div class="paragraph">
+<p>The output of the execution of the script could look like this, but may vary
+given that stochastics are used:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">Minimum: 7.00
+Maximum: 12.00</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-applications-view-2">Applications view</h6>
+<div class="paragraph">
+<p>The <em>Applications</em> view shows the current status
+of each running application. For repeated simulation, lots of applications may
+be started in a short period of time. Also, a lot of status updates need to
+be processed by the view in a short amount of time. This may lead to many
+updates of the GUI of the <em>Applications</em> view, which could potentially reduce
+the responsiveness of Eclipse, and decrease the performance of the simulation.
+If you experience such problems, simply close the <em>Applications</em> view while
+running a repeated simulation.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-simulation-inputoutput">Simulation input/Output</h4>
+<div class="sect4">
+<h5 id="tools-cifsim-input-chapter-index">Input modes</h5>
+<div class="paragraph">
+<p>
+
+
+
+The CIF simulator simulates <a href="#tools-cifsim-chapter-traces">traces</a> through the
+<a href="#tools-cifsim-traces-state-space">state space</a> of a specification. If
+multiple transitions are possible, a choice must be made. The simulator defers
+this choice to an <em>input component</em>.</p>
+</div>
+<div class="paragraph">
+<p>The primary responsibility or an input component is to choose the transition to
+take, from the given possible transitions, calculated for the current
+<a href="#tools-cifsim-traces-state">state</a>. If the chosen transition is a time
+transition, the input component must also decide the amount of time to delay.</p>
+</div>
+<div class="paragraph">
+<p>The input component to use for the simulation, depends on the <em>input mode</em>,
+which can be configured via the
+<b class="menuref">Input mode</b>
+option
+(<b class="menuref">Input</b>
+category). The simulator has several input modes:</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-chapter-console">Interactive console input mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-gui">Interactive GUI input mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-automatic">Automatic input mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-trace">Trace input mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-svg-chapter-index">SVG input mode</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only one input mode, and thus one input component, can be used for each
+simulation. By default, the <em>GUI input mode</em> is used.</p>
+</div>
+<div class="paragraph">
+<p>The following information on other topics, related to input modes, is
+available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-chapter-semi-automatic">Semi-automatic mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-history">State history</a> (reset, undo)</p>
+</li>
+</ul>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-console">Interactive console input mode</h6>
+<div class="paragraph">
+<p>
+
+In the interactive console input mode, the simulator interactively asks the
+user to choose the transitions to take, etc. The questions are asked via text
+printed to the console. The user enters his/her choice via the console as well.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-a-transition-to-take">Choosing a transition to take</h7>
+<div class="paragraph">
+<p>The following is an example of the simulator interactively asking the user to
+choose a possible transition:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">Possible transitions:
+  #1: event machine1.c_start
+  #2: event machine2.c_start
+  #3: delay for (0 .. 100.0]
+
+Select a transition ([1..3]). Enter q to quit. Enter h for help and additional commands. Confirm with &lt;ENTER&gt;:</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, three possible transitions are given, numbered <code>1</code> to <code>3</code>. For your
+convenience, they are sorted alphabetically on the names of the events, with
+event <code>tau</code> always at the end, just before time transitions.</p>
+</div>
+<div class="paragraph">
+<p>The user should enter a command, and confirm that choice by pressing
+<kbd>ENTER</kbd>. Several command are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Entering a number in the given range, corresponding to the transition with
+that number, will result in that specific transition being taken. So,
+entering <code>2</code> and pressing <kbd>ENTER</kbd>, will result in the simulator taking
+the transition for event <code>machine2.c_start</code>. The valid choices for the
+transitions are indicated by the range <code>[1..3]</code>. In case of an invalid
+number, an error message is printed to the console, and the user can choose
+again.</p>
+</li>
+<li>
+<p>Entering nothing, and only pressing <kbd>ENTER</kbd>, defaults to choosing
+transition <code>1</code>.</p>
+</li>
+<li>
+<p>Entering <code>r</code> or <code>R</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> the simulation to the
+initial state. If reset is not enabled, or not possible for the current
+state, an error message is printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>u</code> or <code>U</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> one transition. If undo is
+not enabled, or not possible for the current state, an error message is
+printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>u &lt;n&gt;</code> or <code>U &lt;n&gt;</code>, with <code>&lt;n&gt;</code> a positive number, and
+confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> <code>n</code> transitions. If undo is
+not enabled, it is not possible to undo <code>n</code> transitions for the current
+state, an error message is printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>q</code> or <code>Q</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-chapter-termination">terminate</a> the simulation.</p>
+</li>
+<li>
+<p>Entering <code>h</code> or <code>H</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+result in the simulator printing a short help text to the console, that
+shows the available commands. The user is then again asked to choose.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If a choice is made that is invalid or is not available for the current state,
+an error message is printed to the console, and the user is asked to make an
+other choice.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-a-time-transition-duration">Choosing a time transition duration</h7>
+<div class="paragraph">
+<p>If the user chooses a time transition (choice <code>3</code> in the above example), the
+simulator subsequently asks for the duration of the time delay:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">Select a duration from (0 .. 100.0]. Empty choice equals maximum delay. Enter q to quit. Confirm with &lt;ENTER&gt;:</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the duration of the time delay is to be entered. In this case, the
+duration must be in the <code>(0 .. 100.0]</code> interval. That is, it must be larger
+than zero, and less or equal to <code>100.0</code>. Both integer and real values are
+allowed. As before, confirm with <kbd>ENTER</kbd>.</p>
+</div>
+<div class="paragraph">
+<p>Pressing <kbd>ENTER</kbd> without having entered anything, defaults to the maximum
+delay, which in this case is <code>100.0</code>. Entering <code>q</code> or <code>Q</code>, and confirming
+that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-chapter-termination">terminate</a> the simulation.</p>
+</div>
+<div class="paragraph">
+<p>If a choice is made that is invalid, an error message is printed to the
+console, and the user is asked to make an other choice.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-between-termination-or-going-back">Choosing between termination or going back</h7>
+<div class="paragraph">
+<p>If no transitions are possible, for instance due to
+<a href="#lang-tut-time-deadlock">deadlock</a> or reaching the
+<a href="#tools-cifsim-termination-endtime">end-user provided simulation end time</a>,
+the simulator may interactively ask the
+user to choose between termination of the simulation, resetting the simulation
+to the initial state, or undoing some transitions. This choice is only
+presented if either reset or undo is enabled, as otherwise there is no choice
+to make.</p>
+</div>
+<div class="paragraph">
+<p>The following is an example of the simulator interactively asking the user to
+choose between termination and going back:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">Simulation resulted in deadlock. Enter q to quit. Enter h for help and additional commands. Confirm with &lt;ENTER&gt;:</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The user should enter a command, and confirm that choice by pressing
+<kbd>ENTER</kbd>. Several command are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Entering <code>r</code> or <code>R</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> the simulation to the
+initial state. If reset is not enabled, or not possible for the current
+state, an error message is printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>u</code> or <code>U</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> one transition. If undo is
+not enabled, or not possible for the current state, an error message is
+printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>u &lt;n&gt;</code> or <code>U &lt;n&gt;</code>, with <code>&lt;n&gt;</code> a positive number, and
+confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> <code>n</code> transitions. If undo is
+not enabled, it is not possible to undo <code>n</code> transitions for the current
+state, an error message is printed and the user can choose again.</p>
+</li>
+<li>
+<p>Entering <code>q</code> or <code>Q</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+<a href="#tools-cifsim-chapter-termination">terminate</a> the simulation.</p>
+</li>
+<li>
+<p>Entering <code>h</code> or <code>H</code>, and confirming that by pressing <kbd>ENTER</kbd>, will
+result in the simulator printing a short help text to the console, that
+shows the available commands. The user is then again asked to choose.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If a choice is made that is invalid or is not available for the current state,
+an error message is printed to the console, and the user is asked to make an
+other choice.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-semi-automatic-mode">Semi-automatic mode</h7>
+<div class="paragraph">
+<p>By default, in the interactive console input mode, the user is asked to choose,
+even if for instance there is only one possible transition. Having to choose
+for every transition can become tiresome. To reduce the number of situations
+where a choice is required, the
+<a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a> mode is available.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-gui">Interactive GUI input mode</h6>
+<div class="paragraph">
+<p>
+
+In the interactive GUI input mode, the simulator interactively asks the user to
+choose the transitions to take, etc. Choices are presented using a GUI
+(Graphical User Interface). The user makes choices via the GUI as well.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-layout">Layout</h7>
+<div class="paragraph">
+<p>The following is an example of the simulator interactively asking the user to
+choose a possible transition:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_basic.png" alt="interactive gui basic">
+</div>
+</div>
+<div class="paragraph">
+<p>The events of the system are vertically listed, in alphabetical order, with
+event <code>tau</code> at the end, just before the
+<b class="menuref">time delay</b>,
+and
+<b class="menuref">reset</b>
+and
+<b class="menuref">undo</b>.
+If there are too many elements to fit
+vertically, more columns are used. If things still don&#8217;t fit, a horizontal
+scroll bar is shown.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-gui-availability">Availability</h7>
+<div class="paragraph">
+<p>Choices for events are only present if the events are interactively chosen. If
+they are (semi-)automatically chosen, they are not shown in the GUI. Similarly,
+choices for
+<b class="menuref">time delay</b>
+are only shown if time transitions or their
+durations are interactively chosen. For more information, see the
+<a href="#tools-cifsim-input-gui-semiauto">Semi-automatic mode</a> section below.</p>
+</div>
+<div class="paragraph">
+<p>For event <code>tau</code>, the choices are additionally only shown if there is at least
+one <code>tau</code> edge in the specification.</p>
+</div>
+<div class="paragraph">
+<p>The choice to
+<b class="menuref">reset</b>
+the simulation is only shown if
+<a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation is enabled.
+Similarly, the choice to
+<b class="menuref">undo</b>
+transitions is only shown if
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> is enabled.</p>
+</div>
+<div class="paragraph">
+<p>If none of the choices are to be shown in the GUI, the GUI itself is not shown
+at all.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-buttons">Buttons</h7>
+<div class="paragraph">
+<p>For each element, there are two buttons. The left button shows the name of the
+event, or a description of the choice (e.g.
+<b class="menuref">time delay</b>,
+<b class="menuref">reset</b>),
+and can be used to quickly choose a transition. The second
+button shows an arrow, and can be used to show a popup menu, presenting
+additional choices. What exactly is chosen when clicking the button, and what
+exactly is shown in the popup menu, differs for the different choices. The
+sections below provide further details.</p>
+</div>
+<div class="paragraph">
+<p>If no choice needs to be made at the moment, all buttons are disabled. If a
+choice needs to be made, only those buttons that represent active choices are
+enabled.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-styling">Styling</h7>
+<div class="paragraph">
+<p>For <a href="#tools-cifsim-chapter-env-events">environment</a> (non-urgent) events, the
+label of the left button is italic. For non-environment (urgent) events, as
+well as for non-event choices, the label uses a normal font.</p>
+</div>
+<div class="paragraph">
+<p>Before each element a colored box is shown. The box is gray while that
+particular choice is not available. If choices are available, the box is green
+for <a href="#lang-tut-extensions-synthesis-evtctrl">controllable</a> events, red for
+<a href="#lang-tut-extensions-synthesis-evtctrl">uncontrollable</a> events, blue for
+other events, and black for everything else (<b class="menuref">time delay</b>,
+<b class="menuref">reset</b>,
+and
+<b class="menuref">undo</b>).
+The text of the left button has
+the same color as the box. The colors help to quickly identify elements with
+possible choices.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-labels">Labels</h7>
+<div class="paragraph">
+<p>Between the buttons, a label may be shown, to provide more details. When the
+label is shown, and what text is shown, differs for the different choices. The
+sections below provide further details.</p>
+</div>
+<div class="paragraph">
+<p>In the above image, the system has five events, besides the <code>tau</code> event. The
+simulator asks the user to choose between a transition for event
+<code>Switch.u_on</code> and a time transition.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-an-event-transition">Choosing an event transition</h7>
+<div class="paragraph">
+<p>For an event, the first button makes it possible to quickly choose a transition
+for that event. If clicked, the possible transitions are filtered to those for
+the chosen event, and the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input component</a> is asked to
+make the actual choice, based on its own configuration.</p>
+</div>
+<div class="paragraph">
+<p>If multiple transitions are possible for a single event, the number of possible
+transitions is displayed as label between the two buttons for that event. The
+following image shows an example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_event.png" alt="interactive gui event">
+</div>
+</div>
+<div class="paragraph">
+<p>In this example, two transitions are possible for event <code>b2m</code>. By clicking
+the button labeled with <code>b2m</code>, the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input component</a> is asked to
+choose between the two transitions, based on its own configuration. By clicking
+the arrow button, a popup menu is shown, showing the two transitions. The popup
+menu allows manually choosing which transition to take, by clicking the menu
+item of the transition you wish to take.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-a-time-transition-and-duration">Choosing a time transition and duration</h7>
+<div class="paragraph">
+<p>The
+<b class="button">time delay</b>
+button makes it possible to quickly choose the time
+transition. By default the maximum allowed delay duration will be used. This
+duration is displayed as label between the two buttons, in short form with
+three significant digits. By clicking the arrow button, additional options
+become available. These options also show the complete durations. The following
+image shows an example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_time.png" alt="interactive gui time">
+</div>
+</div>
+<div class="paragraph">
+<p>At most <code>0.30000000000000066</code> units of time can pass (<code>0.300</code> in short
+form). The first option is to choose a custom duration. The second option is
+to choose that maximum duration, similar to clicking the
+<b class="menuref">time delay</b>
+button. The following image shows the dialog that is presented to the user to
+enter the custom duration:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_duration.png" alt="interactive gui duration">
+</div>
+</div>
+<div class="paragraph">
+<p>By entering an integer or real number for the duration, that exact amount of
+time units will pass, after clicking the
+<b class="button">OK</b>
+button. If the
+<b class="button">Cancel</b>
+button is clicked instead, the choice is canceled, and the
+user is again free to choose between all available choices.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-to-reset-the-simulation">Choosing to reset the simulation</h7>
+<div class="paragraph">
+<p>The
+<b class="button">reset</b>
+button makes it possible to
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> the simulation to the initial
+state. The popup menu that can be shown by clicking on the arrow button, has
+only one option, which the same effect as clicking the button. The following
+image shows the popup menu:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_reset.png" alt="interactive gui reset">
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-choosing-to-undo-some-transitions">Choosing to undo some transitions</h7>
+<div class="paragraph">
+<p>The
+<b class="button">undo</b>
+button makes it possible to
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> a single transition, and go back
+to the state just prior to that transition. The number of transitions that can
+be undone, is displayed as label between the two buttons.</p>
+</div>
+<div class="paragraph">
+<p>Clicking the arrow button shows a popup menu with additional options. Menu
+items are present to undo 1 transition, to undo 2 transitions, to undo 3
+transitions, etc, for as many transitions as can be undone. The following image
+shows an example with two transitions that can be undone:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_undo2.png" alt="interactive gui undo2">
+</div>
+</div>
+<div class="paragraph">
+<p>At most 10 such menu items are shown. If more than 10 transitions can be
+undone, an additional choice is present, that allows entering a custom number
+of transitions to undo. The following image shows an example with 12
+transitions that can be undone:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_undo12.png" alt="interactive gui undo12">
+</div>
+</div>
+<div class="paragraph">
+<p>Selecting that last option will present the user with a dialog, to select the
+number of transitions to undo:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/interactive_gui_undo_count.png" alt="interactive gui undo count">
+</div>
+</div>
+<div class="paragraph">
+<p>The number of transitions needs to be entered as a positive number, within the
+given range. Clicking the
+<b class="button">OK</b>
+button will undo the requested number
+of transitions. If the
+<b class="button">Cancel</b>
+button is clicked instead, the choice
+is canceled, and the user is again free to choose between all available
+choices.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-gui-semiauto">Semi-automatic mode</h7>
+<div class="paragraph">
+<p>By default, in the interactive GUI input mode, the user is asked to choose,
+even if for instance there is only one possible transition. Having to choose
+for every transition can become tiresome. To reduce the number of situations
+where a choice is required, the
+<a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a> mode is available.</p>
+</div>
+<div class="paragraph">
+<p>Choices that are no longer available due to them being automatically chosen by
+enabling semi-automatic mode, are not shown in the GUI of the interactive GUI
+input mode. See also the <a href="#tools-cifsim-input-gui-availability">Availability</a> section
+above.</p>
+</div>
+<div class="paragraph">
+<p>By enabling semi-automatic mode to automatically choose time transitions
+(option value <code>time</code>), while not automatically choosing the delay durations
+of time transitions (option value <code>timedur</code>), time transitions are
+automatically chosen, but the user is still asked to choose the duration of the
+time transitions. For this choice, all non-time choices are disabled, making
+only the time related choices available. The effect of the
+<b class="menuref">time delay</b>
+button remains the same, i.e. choosing the maximum
+allowed or available delay. The popup menu for the time delay also still shows
+the default options, to choose either a specific custom delay duration, or the
+maximum duration.</p>
+</div>
+<div class="paragraph">
+<p>By enabling semi-automatic mode to automatically choose the delay durations of
+time transitions (option value <code>timedur</code>), while not automatically choosing
+the time transition themselves (option value <code>time</code>), the effect of the
+<b class="menuref">time delay</b>
+button changes from choosing the time transition with
+the maximum allowed or available delay, to choosing the time transition and
+letting the <a href="#tools-cifsim-input-chapter-automatic">automatic input component</a>
+choose the actual delay duration, based on its own configuration. The popup
+menu for the time delay then only shows one option, to let the automatic input
+component choose, identical to the effect of the
+<b class="menuref">time delay</b>
+button.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-termination">Termination</h7>
+<div class="paragraph">
+<p>By closing the GUI of the interactive GUI input component, no more interactive
+choices can be made. The next time an interactive choice is to be made,
+simulation <a href="#tools-cifsim-chapter-termination">terminates</a>.</p>
+</div>
+<div class="paragraph">
+<p>While an interactive choice is to be made via the GUI, the red stop button of
+the Eclipse console does not function. Once a choice is made, simulation will
+<a href="#tools-cifsim-chapter-termination">terminate</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-automatic">Automatic input mode</h6>
+<div class="paragraph">
+<p>
+
+In the automatic input mode, the simulator automatically chooses transitions
+as well time transition durations. How the simulator chooses however, can be
+influenced using options. These options are explained below. The final section
+of this page explains the
+<a href="#tools-cifsim-input-automatic-limitations">limitations</a> of using these
+options.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-automatic-trans">Automatic mode choice algorithm option</h7>
+<div class="paragraph">
+<p>In the automatic input mode, the simulator automatically chooses the
+transitions to take, without any user interaction. The choice that is made
+can however be influenced using the
+<b class="menuref">Automatic mode choice algorithm</b>
+option (<b class="menuref">Input</b>
+category). The following choices are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>First transition.</p>
+</li>
+<li>
+<p>Last transition.</p>
+</li>
+<li>
+<p>Random transition (random seed).</p>
+</li>
+<li>
+<p>Random transition (specific seed).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The options to choose the first or last transition do exactly what they state,
+i.e. they choose the first respectively the last transition from the list of
+possible transitions. Note that event transitions are always listed before
+time transitions, but event transitions can only be listed together with time
+transitions if <a href="#tools-cifsim-chapter-env-events">environment events</a> are
+present. Also note that if transitions for the <code>tau</code> event are present, they
+are listed after the transitions for all other events.</p>
+</div>
+<div class="paragraph">
+<p>
+The other two options randomly choose a transition from the possible
+transitions. If a random seed (for the random number generator) is used, each
+simulation will potentially choose a different trace. In this case, the seed
+that is used, is <a href="#tools-cifsim-output-chapter-normal">printed</a> to the console
+at the start of the simulation. If a specific seed is used, then the choices
+are still random, but can be reproduced. Each simulation, using random
+automatic input mode, with the same seed, for the same specification, should
+lead to the same <a href="#tools-cifsim-chapter-traces">trace</a>. Seeds are integer
+numbers from the range [0 .. 2<sup>30</sup>].</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-automatic-time">Automatic mode time transition duration option</h7>
+<div class="paragraph">
+<p>In the automatic input mode, the simulator automatically chooses the durations
+of the time transitions, without any user interaction. The choice that is made
+can however be influenced using the
+<b class="menuref">Automatic mode time transition duration</b>
+option (<b class="menuref">Input</b>
+category). The following choices are
+available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Maximum allowed duration.</p>
+</li>
+<li>
+<p>Random duration (random seed).</p>
+</li>
+<li>
+<p>Random duration (specific seed).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The option to choose the maximum allowed duration does exactly what it states,
+i.e. it chooses the maximum allowed duration for each time transition, until
+the next potential state event.</p>
+</div>
+<div class="paragraph">
+<p>
+The other two options randomly choose a duration for the time transitions.
+For both options, a uniform random distribution is used, which is sampled to
+obtain the time at which time transitions are to be 'interrupted' or 'cut off'.
+The upper bound (exclusive) of the uniform random distribution is to be
+provided by the user. You can think of these random options as adding an extra
+automaton to the specification, that could look as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton auto_time_trans_duration:
+  const real UPPER = ...;
+  disc dist real d = uniform(0.0, UPPER);
+  disc real timeToWait;
+  cont t der 1.0;
+
+  location sampling:
+    initial;
+    edge do (timeToWait, d) := sample d goto waiting;
+
+  location waiting:
+    edge when t &gt;= timeToWait do t := 0.0 goto sampling;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The upper bound of the uniform real distribution (<code>UPPER</code> &gt; 0), is provided
+by the user. A sample is taken from the distribution, indicating the time to
+wait before the time transition is to be interrupted. Once that much time has
+elapsed, a new sample is taken, and the process repeats itself. The actual
+implementation is slightly different, in that no actual automaton is added,
+no additional <code>tau</code> transitions result from using this option, and no zero
+length time transitions are chosen. However, the effect is very similar.</p>
+</div>
+<div class="paragraph">
+<p>So, say the user wants to use a uniform distribution over interval [0 .. 10).
+The simulator takes a sample, say 3.0. Assume we then get a time transition for
+at most 0.5 time units. We take that entire transition and are left with 2.5
+remaining time units (3.0 - 0.5). If we then get another time transition for at
+most 1.2 time units, we take that one entirely as well. We are left with 1.3
+(2.5 - 1.2) time units. If we would then get a time transition for at most 5.0
+time units, the automatic input component ensures that we instead get a time
+transition for at most 1.3 time units, instead of one for at most 5.0 time
+units. Since we choose to interrupt after 1.3 time units anyway, there is no
+reason to compute the remainder of the time transition after those 1.3 time
+units. We choose the entire time transition of 1.3 time units, and compute a
+new sample. The simulator then once again calculates new transitions, and the
+process repeats. The next time transition that is calculated will be for the
+remaining 3.7 (5.0 - 1.3) time units, unless it is interrupted again before
+that time, i.e. if the new sample is smaller than 3.7.</p>
+</div>
+<div class="paragraph">
+<p>If a random seed (for the random number generator) is used, each simulation
+will potentially choose a different trace. In this case, the seed that is used,
+is <a href="#tools-cifsim-output-chapter-normal">printed</a> to the console at the start of
+the simulation. If a specific seed is used, then the choices are still random,
+but can be reproduced. Each simulation, using random automatic time transition
+duration, with the same seed, for the same specification, should lead to the
+same <a href="#tools-cifsim-chapter-traces">trace</a>. Seeds are integer numbers from the
+range [0 .. 2<sup>30</sup>].</p>
+</div>
+<div class="paragraph">
+<p>The random durations are particularly useful in combination with
+<a href="#tools-cifsim-chapter-env-events">environment events</a>, as it allows the
+environment events to be chosen at the time the time transition is interrupted.
+That is, it allows the environment events to occur at random times.
+Using this option, the user can specify the distribution used for 'cutting up'
+the time transitions, and thus the possible moments when environment events can
+potentially take place. This is in addition to the state events, at which the
+environment events can also be chosen. These new additional possibilities
+however, are not influenced by the occurrence rate of the events of the system,
+and allow more control for the user. In particular for cases where the
+simulation allows infinite time transitions (no state events), the infinite
+time transitions can then be interrupted to allow environment events to take
+place.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-automatic-limitations">Limitations</h7>
+<div class="paragraph">
+<p>Using the two options described above, and choosing random for each of them,
+introduces a certain degree of randomness to the
+<a href="#tools-cifsim-chapter-traces">trace</a> that the simulator will explore. This
+randomness however, is rather limited. For one, the distributions that are
+used are mostly fixed, as the options don&#8217;t allow using for instance an
+exponential distribution. Furthermore, there is no way to specify the
+distribution for events individually, and it is not possible to specify the
+distribution between event transitions and time transitions. Concretely, the
+options for instance don&#8217;t enforce that environment events get chosen. They
+<em>may</em> be chosen when the time transitions are interrupted, or at state events,
+but that is not guaranteed, as the simulator may choose the time transition
+again, after the interruption.</p>
+</div>
+<div class="paragraph">
+<p>The options provide a lightweight, quick, and easy to use approach to adding
+some randomness. If more control is needed, the environment can instead be
+modeled explicitly in the CIF model, thus defining when the environment events
+may or will occur. One way to accomplish this, is by adding a use case.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-undoreset">Undo/reset</h7>
+<div class="paragraph">
+<p>The automatic input mode does not support
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> and
+<a href="#tools-cifsim-input-history-reset-undo">reset</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-trace">Trace input mode</h6>
+<div class="paragraph">
+<p>
+
+In the trace input mode, the simulator automatically chooses transitions as
+well as time transition durations, based on a user provided trace file.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-trace-file">Trace file</h7>
+<div class="paragraph">
+<p>If the trace input mode is used, the
+<b class="menuref">Trace input file</b>
+option
+(<b class="menuref">Input</b>
+category) can be used to specify the path to the trace file.
+If the path is not explicitly specified, the input CIF file path is used, where
+the <code>.cif</code> file extension is removed if present, and a <code>.trace</code> file
+extension is added.</p>
+</div>
+<div class="paragraph">
+<p>The trace file uses a line based file format. Leading (at the beginning of the
+line) and trailing (at the end of the line) whitespace is ignored. Empty lines
+as well as lines starting with a hash character (<code>#</code>) are ignored as well.
+Lines starting with a hash character can be used as comment lines. All other
+lines contain commands.</p>
+</div>
+<div class="paragraph">
+<p>There are two types of commands: option commands and non-option commands. The
+option commands must always be before the non-option commands.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-option-commands">Option commands</h7>
+<div class="paragraph">
+<p>All option commands use the <code>option NAME VALUE</code> syntax, where <code>NAME</code> is the
+name of the option, and <code>VALUE</code> is the value of the option. Option commands
+must be specified in the trace file, before any other (non-option) commands.
+The remainder of this section explains the available options.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>option strict on/off</em> (default <code>off</code>)</p>
+<div class="paragraph">
+<p>The strict option can be used to specify whether a strict match is
+expected for an event. If strict mode is on (option strict on), it is
+considered an error if more than one transition is possible for an event from
+the trace. If strict mode is off (option strict off), and there are
+multiple possible transitions for an event from the trace, the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input component</a> is asked to
+choose between those possible transitions for that single event, based on its
+own configuration. The strict option applies only to events, not time delays.</p>
+</div>
+</li>
+<li>
+<p><em>option time off/implicit/explicit</em> (default <code>implicit</code>)</p>
+<div class="paragraph">
+<p>The time option can be used to specify the time mode to use.
+If the time mode is off (option time off) , time passage is not
+allowed. That is, time delays/transitions are never chosen, and the value of
+variable time remains zero during the entire simulation. For this mode,
+the time command is not allowed.</p>
+</div>
+<div class="paragraph">
+<p>If the time mode is implicit (option time implicit), time delays are
+chosen if necessary. The simulator will use the least amount of time passage
+possible, to still enable the events as specified in the trace. In other
+words, if an event is possible no time delays occur, and otherwise the
+simulator delays for as long as is needed until the event becomes enabled.
+For this mode, the time command is not allowed.</p>
+</div>
+<div class="paragraph">
+<p>If the time mode is explicit (option time explicit), time delays are
+only possible if the time command explicitly allows time passage.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-transition-commands">Transition commands</h7>
+<div class="paragraph">
+<p>The transition commands can be used to specify the actual trace itself, to
+choose specific transitions. The following commands are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>event NAME</em></p>
+<div class="paragraph">
+<p>The event command indicates that an event transition should be taken. The
+event to choose is indicated by the <code>NAME</code> part, which must be an absolute
+name of an event. For an automaton <code>a</code> with an event <code>e</code>, <code>NAME</code> must
+be <code>a.e</code>, and the full command would thus be event <code>a.e</code>.</p>
+</div>
+<div class="paragraph">
+<p>If CIF textual syntax keyword are used as names for events (such as
+<code>plant</code>), then they must be escaped in <code>.cif</code> files (e.g. <code>$plant</code>).
+For event commands however, no escape characters (<code>$</code>) should be used
+in event names.</p>
+</div>
+<div class="paragraph">
+<p>If the specified event is not enabled in the current state, the simulator
+checks whether time passage is allowed and possible. For the off time
+mode, time passage is not allowed, and the simulation results in deadlock.
+For the implicit time mode, the simulator delays if a time transition is
+possible, and otherwise simulation results in deadlock. For the explicit
+time mode, if the current event command was preceded by an explicit
+time command, the simulator delays if a time transition is possible, and
+otherwise (current command not preceded by time command or no time
+transition possible) simulation results in deadlock. Upon deadlock,
+simulation <a href="#tools-cifsim-chapter-termination">ends</a>, and a warning is printed
+to the console to indicate the event that was not enabled.</p>
+</div>
+<div class="paragraph">
+<p>If multiple transitions are possible for the event, due to
+<a href="#tut-basics-chapter-non-determinism">non-determinism</a>, the strict
+option (see above) determines if and how the simulator proceeds.</p>
+</div>
+</li>
+<li>
+<p><em>time</em></p>
+<div class="paragraph">
+<p>The time command explicitly indicates that time is allowed to pass, i.e.
+the simulator may delay by choosing a time transition. This command is only
+allowed for the explicit time mode.</p>
+</div>
+<div class="paragraph">
+<p>The time command does not ensure that time passes. It specifies that time
+passage is allowed, not that it is required. Specifying the time command
+multiple times without an intermediate event command has the same effect
+as specifying the time command only once. That is, it doesn&#8217;t matter
+how many times you allow time passage, once is enough.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The trace input mode does not support
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> and
+<a href="#tools-cifsim-input-history-reset-undo">reset</a>.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-simulation">Simulation</h7>
+<div class="paragraph">
+<p>The commands from the trace file are processed in the order they occur in the
+trace file. After all commands have been used to select transitions, and no
+more commands are available, the simulation
+<a href="#tools-cifsim-chapter-termination">ends</a>. The simulator indicates the
+simulation has terminated at the request of the user, as the user did not
+include any more commands in the trace file.</p>
+</div>
+<div class="paragraph">
+<p>Simulation is also terminated if deadlock occurs or the
+<a href="#tools-cifsim-termination-endtime">user-specified simulation end time</a>
+is reached, even if more (unprocessed) commands are still available.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-svg-chapter-index">SVG input mode</h6>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+In the SVG input mode, the <a href="#tools-cifsim-output-svgviz-chapter-svg">SVG</a> images
+that are used for <a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualization</a>
+can be used to interactively control the simulation. Since the SVG images are
+reused, using the SVG input mode requires the use of SVG visualization.</p>
+</div>
+<div class="paragraph">
+<p>The idea is that certain SVG elements are coupled (mapped) to events from the
+CIF specification. Clicking on those graphical elements then results in the
+corresponding event being executed by the simulator. This way, the user
+interface of a system can be modeled graphically, and can be coupled to the
+specification (during simulation), by means of events. The user interface of
+the system is thus part of the specification, but is controlled interactively
+at runtime (during simulation) by the user.</p>
+</div>
+<div class="paragraph">
+<p>The events that are coupled to visualization elements are called
+<em>SVG interactive events</em> or <em>SVG input events</em>.</p>
+</div>
+<div class="paragraph">
+<p><em>Topics</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-svg-chapter-svgin">CIF/SVG input mappings</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-svg-chapter-simulation">Simulation with SVG input</a></p>
+</li>
+</ul>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-svg-chapter-svgin">CIF/SVG input mappings</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+CIF/SVG input mappings couple <a href="#tools-cifsim-output-svgviz-svg-id">ids</a>
+of <a href="#tools-cifsim-output-svgviz-chapter-svg">SVG</a> elements to events from the
+CIF specification. CIF/SVG input mappings are
+<a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a>, similar to
+<a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a>. If the
+CIF specification contains input mappings, and SVG input mode is not used, the
+input mappings are simply ignored.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-single-event-input-mapping">Single event input mapping</h8>
+<div class="paragraph">
+<p>The simplest form of an SVG input mapping maps to a single event. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgin id &quot;button&quot; event machine.button.toggle;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This input mapping maps the SVG element with
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a> <code>button</code> to the
+<code>machine.button.toggle</code> event from the CIF specification.</p>
+</div>
+<div class="paragraph">
+<p>Every input mapping must
+<a href="#tools-cifsim-output-svgviz-svgout-id">specify the id</a> of an SVG
+element, and an SVG element with that id must exist in the SVG image.
+Specifying an input mapping for an SVG element turns that SVG element into an
+<em>interactive SVG element</em>. Note that
+<a href="#tools-cifsim-input-svg-simulation-groups">groups</a> may be used as
+interactive SVG elements as well.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-if-event-input-mapping"><code>if</code> event input mapping</h8>
+<div class="paragraph">
+<p>Sometimes, the simple <em>single event input mapping</em> is not enough. Consider
+for instance the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton button:
+  event u_pushed, u_released;
+
+  location Released:
+    initial;
+    edge u_pushed goto Pushed;
+
+  location Pushed:
+    edge u_released goto Released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification models a <code>button</code> that is initially released (location
+<code>Released</code>). When the button is pushed (event <code>u_pushed</code>), the location is
+updated to <code>Pushed</code>. If we now want to couple a graphical representation of
+a button to this CIF specification, the event to choose depends on the current
+location of the <code>button</code> automaton. This can be mapped using an
+<em>if event input mapping</em>, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgin id &quot;button&quot; event
+  if   button.Released: button.u_pushed
+  elif button.Pushed:   button.u_released
+  end;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the button is released, the <code>u_pushed</code> event is chosen, and if the button
+is pushed, the <code>u_released</code> event is chosen.</p>
+</div>
+<div class="paragraph">
+<p>The <code>if</code> event input mappings are essentially an <code>if</code> expressions that
+result in an event rather than a value. The conditions (such as
+<code>button.Released</code> are guard expressions that evaluates to a boolean value.
+The guard expressions may be arbitrary expressions, similar to the use of
+expressions in output mappings.</p>
+</div>
+<div class="paragraph">
+<p>If a condition holds, the corresponding event is chosen. The entries are
+processed in the order they are specified: if the first guard (of the <code>if</code>)
+holds, the first event is chosen, otherwise if the second guard
+(of an <code>elif</code>) holds, the second event is chosen, etc.</p>
+</div>
+<div class="paragraph">
+<p>The last part of the <code>if</code> is allowed to be an <code>else</code>, to indicate that
+if none of the previous guards hold, the event of the <code>else</code> is to be chosen.
+Using an <code>else</code> entry is optional, but if used, there may only be one such
+entry, and it must be the last entry of the input mapping.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-uniqueness">Uniqueness</h8>
+<div class="paragraph">
+<p>Similar to output mappings, all input mappings must be unique, per SVG image.
+That is, no two input mappings for the same SVG image may use the
+same SVG element id. Note that it is allowed to have an input mapping and an
+output mapping (or even multiple output mappings) for the same SVG element.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-completeness">Completeness</h8>
+<div class="paragraph">
+<p>Input mappings must be complete. Single event input mappings are always
+complete, as are <code>if</code> event input mappings with an <code>else</code>. For <code>if</code>
+event input mappings without an <code>else</code>, at least one of the guards must hold.
+If none of the guards holds, the mapping results in a runtime error during
+simulation.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-svg-chapter-simulation">Simulation with SVG input</h7>
+<div class="paragraph">
+<p>
+This page explains the use of the SVG input mode of the CIF simulator at
+runtime (during simulation).</p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-input-svg-simulation-works">How it works</h8>
+<div class="paragraph">
+<p>During simulation, as long as none of the interactive SVG elements (the SVG
+elements for which an input mapping exists) are clicked, the corresponding
+events are never chosen. For the other events (the non-interactive events), a
+choice is made using the <a href="#tools-cifsim-input-chapter-automatic">automatic input component</a>.
+The automatic input component makes a choice
+based on its own settings.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect8">
+<h9 id="tools-hovering">Hovering</h9>
+<div class="paragraph">
+<p>When moving over one of the interactive SVG elements of the SVG visualization,
+using the mouse pointer, the border of the SVG element is highlighted in red.
+This makes it easier to identify the interactive SVG elements in the
+<a href="#tools-cifsim-output-svgviz-chapter-viewer">SVG visualizer</a>. When an
+interactive SVG element is clicked, the color is changed from red to green, for
+as long as the mouse button is not released.</p>
+</div>
+</div>
+<div class="sect8">
+<h9 id="tools-clicking">Clicking</h9>
+<div class="paragraph">
+<p>The mouse click (and <em>not</em> the release) makes that the input component will
+interrupt any time transition that is currently being taken by the simulator.
+Then, when asked to choose a next transition, it will apply the input mapping
+for the interactive SVG element that was clicked. The event that results from
+the input mapping is then chosen. If the event is not enabled at that time,
+simulation ends in deadlock. To prevent such deadlocks, you can use a
+<a href="#tut-data-chapter-monitoring">monitor</a> automaton. If multiple transitions
+are possible for that event, the choice (between the transitions for that event
+only) is deferred to the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input component</a>, which makes
+a choice based on its own settings. Note that multiple transitions are only
+possible if <a href="#tools-cifsim-chapter-complete-mode">complete mode</a> is enabled.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect8">
+<h9 id="tools-queue">Queue</h9>
+<div class="paragraph">
+<p>The SVG input mode allows interactively choosing certain events by clicking on
+interactive elements of an SVG image. The SVG input mode is however not
+officially an interactive input mode.</p>
+</div>
+<div class="paragraph">
+<p>The image plays the part of the environment. Whenever an interactive element is
+clicked, the element is added to a queue. If a user quickly clicks the same
+element multiple times, or quickly clicks different elements, they are all
+stored in the queue, and the queue can grow. The transition to take is
+automatically chosen, based on the queue of events. If the queue is empty, the
+environment (the SVG image and the user) doesn&#8217;t allow the interactive events.
+If the queue is not empty, the environment allows exactly one interactive
+event, the one at the head of the queue. The model, together with the queue,
+form a closed model, without further interaction. Each interactive SVG element
+that is clicked, will be used in the order they were clicked, to choose
+transitions.</p>
+</div>
+<div class="paragraph">
+<p>The SVG input mode internally acts as an automated input mode, that makes
+choices about which transitions to take, without further user interaction.
+Since no further user interaction is possible,
+<a href="#tools-cifsim-input-history-reset-undo">undo</a> and
+<a href="#tools-cifsim-input-history-reset-undo">reset</a> are also not supported.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-input-svg-simulation-debugging">Debugging</h8>
+<div class="paragraph">
+<p>The <a href="#tools-cifsim-output-svgviz-debugging-console">console debugging output</a> for CIF/SVG mappings includes
+debugging output for SVG input mappings. Input mappings that encounter runtime
+errors have <a href="#tools-cifsim-output-svgviz-debugging-stacktrace">stack traces</a> similar to those of output
+mappings.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-input-svg-simulation-responsiveness">Responsiveness</h8>
+<div class="paragraph">
+<p>SVG input is usually combined with <a href="#tools-cifsim-output-chapter-realtime">real-time simulation</a>.
+Clicking an interactive SVG element results
+in the application of an input mapping, which results in an event. That event
+is put in the queue. If a time transition is being taken by the simulator, the
+simulator will continue to take that time transition until the input component
+interrupts it. However, an input component can only interrupt a time transition
+during <a href="#tools-cifsim-output-realtime-frames">intermediate frames</a>. As
+such, choosing a low <a href="#tools-cifsim-output-realtime-framerate">frame rate</a>
+(typically less than 10 frames per
+second) can significantly reduce the responsiveness of the SVG input.</p>
+</div>
+<div class="paragraph">
+<p>Hovering interactive SVG elements highlights their borders in red. This too
+becomes less responsive when a low frame rate is used.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-input-svg-simulation-groups">Interactive groups</h8>
+<div class="paragraph">
+<p>It is possible to make a group of SVG elements (an <code>svg:g</code> element) an
+interactive element. By doing so, all the elements that are part of the group
+together become one single interactive element.</p>
+</div>
+<div class="paragraph">
+<p>One practical example where this is very useful, is for buttons with a text
+label. In SVG, this requires the use of a rectangle and a text label. To ensure
+that clicking either one of them results in the same event, group the rectangle
+and text label together in a group. Then assign an
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a> to the group and use that id in
+an <a href="#tools-cifsim-input-svg-chapter-svgin">input mapping</a>. During simulation,
+when hovering over either the rectangle or the text label, both will will be
+highlighted. Clicking on either of them results in the corresponding input
+mapping being applied, and the resulting event being chosen by the SVG input
+component.</p>
+</div>
+<div class="paragraph">
+<p>In general, if an SVG image is clicked, the simulator will figure out on which
+graphical element the user clicked. If that element is itself an interactive
+SVG element, then the corresponding mapping is applied. If it is not an
+interactive SVG element, its parent (which may be a group) is checked. If the
+parent is not an interactive SVG element either, the parent of the parent is
+checked, etc. If none of the ancestors is an interactive SVG element, clicking
+the element has no effect on the simulation. Because of this behavior, it is
+strongly recommended not to make a child (or descendant in general) of an
+interactive SVG element interactive as well.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-semi-automatic">Semi-automatic mode</h6>
+<div class="paragraph">
+<p>
+By default, in the interactive <a href="#tools-cifsim-input-chapter-console">console</a>
+and <a href="#tools-cifsim-input-chapter-gui">GUI</a> input modes, the user is asked
+to choose, even if for instance there is only one possible transition. Having
+to choose for every transition can become tiresome. To reduce the number of
+situations where input is required, the semi-automatic mode is available.
+Semi-automatic mode allows the simulator to automatically choose certain
+transitions, while leaving the remaining choices for the user. The following
+choices can be automatically made by the simulator, in semi-automatic mode:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Automatically choose a transition if there is only one transition possible.</p>
+</li>
+<li>
+<p>Automatically choose time transitions, regardless of how many transitions
+are possible.</p>
+</li>
+<li>
+<p>Automatically choose the delay duration of time transitions.</p>
+</li>
+<li>
+<p>Automatically choose event transitions (for certain events), regardless of
+how many transitions are possible.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Each of these possible automatic choices can be individually enabled,
+through the
+<b class="menuref">Interactive mode automatic transition choice</b>
+option
+(<b class="menuref">Input</b>
+category). As value for the option, comma separated
+<em>filters</em> should be supplied. The following filters are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>1</code> to automatically choose a transition if there is only one transition
+possible.</p>
+</li>
+<li>
+<p><code>time</code> to automatically choose time transitions.</p>
+</li>
+<li>
+<p><code>timedur</code> to automatically choose the delay duration of time transitions.</p>
+</li>
+<li>
+<p>The name of an event, to automatically choose event transitions for that
+event.</p>
+</li>
+<li>
+<p><code>urgent</code> to automatically choose event transitions for all
+<a href="#tools-cifsim-chapter-env-events">urgent</a> (non-environment) events.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For events, the absolute names of the events are used. That is, for an
+automaton <code>a</code>, with an event <code>e</code>, the absolute name of the event is
+<code>a.e</code>. If CIF textual syntax keyword are used as names for events (such as
+<code>plant</code>), then they must be escaped in <code>.cif</code> files (<code>$plant</code>). For
+filters however, all escape characters (<code>$</code>) in event names are ignored.
+The <code>*</code> character can be used as wildcard, to indicate zero or more
+characters. The special <code>urgent</code> event filter matches all
+<a href="#tools-cifsim-chapter-env-events">urgent</a> events of the specification. If an
+event filter doesn&#8217;t match any of the events of the CIF model, a warning is
+printed to the console. If a filter doesn&#8217;t have any effect, because a previous
+filter already turned ensured that the matching events into are automatically
+chosen, a warning is printed as well.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>1, g*, t*</code> consist of three filters: <code>1</code>,
+<code>g*</code>, and <code>t*</code>. The first filter indicates that the simulator should
+automatically choose a transition if there is only one transition possible. The
+second and third filters indicate that the simulator should also automatically
+choose all events starting with an <code>g</code> or a <code>t</code>, such as <code>g</code>, <code>g1</code>,
+<code>go</code>, etc. Note that the wildcards apply only to events, so <code>t*</code> does not
+mean that time transitions should be automatically chosen. The <code>t*</code> filter
+always matches the <code>tau</code> event, as that event is implicitly always present.</p>
+</div>
+<div class="paragraph">
+<p>If an automatic choice can be made, given the filter and the possible
+transitions, the transitions are filtered to only keep the ones that can be
+chosen automatically, and they are sent to the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input component</a>, which then makes the actual choice,
+depending on its own configuration. Similarly, if the delay duration of a time
+transition is to be automatically chosen, the automatic input component is
+asked to choose, based on its own configuration.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-input-chapter-history">State history</h6>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="paragraph">
+<p>The CIF simulator can be used to explore the
+<a href="#tools-cifsim-traces-state-space">state space</a> of a CIF model. It is
+possible to see step by step, what is possible, and choose some transitions.
+Sometimes, after exploring a bit, you may want to go back a bit, to explore
+some alternative behavior. Obviously, you can terminate the simulation, and
+start a new one. There are several downsides to this. First, you have to start
+from the initial state again, while you may want to only go back a few states,
+and continue from there. Second, restarting the simulator may take some time,
+especially for large models. Third, if you use several visualizations, you may
+have to layout them again, to be able to see all of them.</p>
+</div>
+<div id="tools-cifsim-input-history-reset-undo" class="paragraph">
+<p>To make it easier to explore alternatives, the simulator supports resetting the
+simulation to the initial state, as well as undoing a certain number of
+transitions. This page explains that functionality in more detail.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-history-enable">Enabling history</h7>
+<div class="paragraph">
+<p>The <em>History</em> option (<em>Input</em> category) can be used to enable or disable
+history. By default history is enabled. Using the option, it can be disabled.
+Disabling history disables both the reset and the undo functionality, which
+ensures no time or memory is consumed in keeping track of earlier states.</p>
+</div>
+<div class="paragraph">
+<p>If history is enabled, it only has an effect if an interactive input mode is
+used. Other (automatic) input modes will never perform a reset or undo. That
+is, the simulator will not keep track of any history states, unless an
+interactive (either fully interactive or
+<a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a>) input mode is
+used, and history is enabled via the <em>History</em> option.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-state-stack">State stack</h7>
+<div class="paragraph">
+<p>In order for the simulator to be able to go back to earlier states, it will
+need to remember those states. To that end, the simulator can store states that
+it has encountered in a state stack. The initial state is remembered
+separately. So, initially, the following is remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_0.png" alt="history 0">
+</div>
+</div>
+<div class="paragraph">
+<p>Here, state <code>0</code> is the initial state. After two transitions are taken, the
+following is remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_012.png" alt="history 012">
+</div>
+</div>
+<div class="paragraph">
+<p>Here, two more states, numbered <code>1</code> and <code>2</code> are remembered. After one more
+transitions is taken, the following is remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_0123.png" alt="history 0123">
+</div>
+</div>
+<div class="paragraph">
+<p>Here, one more state, numbered <code>3</code>, is remembered. In each case, the last
+shown state is the current state. If we undo two transitions, the following is
+remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_01.png" alt="history 01">
+</div>
+</div>
+<div class="paragraph">
+<p>As two transitions are undone, their resulting states (the last two states) are
+forgotten. If we take one more transition after the undo, we get the following:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_012.png" alt="history 012">
+</div>
+</div>
+<div class="paragraph">
+<p>This state <code>2</code> may be the same one as before, or it may be a new one, if a
+different simulation choice was made. If we reset the simulation, we forget all
+but the initial state, and end with up:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_0.png" alt="history 0">
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-input-history-size">Stack size</h7>
+<div class="paragraph">
+<p>For long simulations, a lot of states will need to be remembered. Each state
+that needs to be remembered costs some amount of memory. To limit the amount
+of states that are remembered, the <em>History size</em> option (<em>Input</em> category)
+can be used.</p>
+</div>
+<div class="paragraph">
+<p>If set to infinite, there is no limit to the amount of states that can be
+remembered. If set to a finite (non-negative) number, at most the given number
+of states are remembered, apart from the initial state. So, if set to zero,
+only the initial state is remembered. If set to one, one additional state is
+remembered, etc. The default history size is <code>100</code> states. Since if set to
+zero, only the initial state is remembered, this completely disables undo
+functionality.</p>
+</div>
+<div class="paragraph">
+<p>By introducing a maximum number of states that can be remembered, this also
+introduces a maximum number of transitions that can be undone. Let&#8217;s consider a
+history size of <code>3</code>. After three transitions, the following is remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_0123.png" alt="history 0123">
+</div>
+</div>
+<div class="paragraph">
+<p>State <code>3</code> is the current state. It is possible to undo one, two, or three
+transitions, going back to states <code>2</code>, <code>1</code>, and <code>0</code>, respectively. Now
+consider what happens when we take another transition. We already remember
+three states besides the initial state, and have thus reached the maximum
+number of states to remember. By remembering the new target state of the fourth
+transition, we need to let go of state <code>1</code>, as it is the oldest remembered
+state, not taking into account the initial state. After this fourth transition,
+the following is remembered:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/input/history_0234.png" alt="history 0234">
+</div>
+</div>
+<div class="paragraph">
+<p>State <code>4</code> is the current state. We can undo one transition, to go back to
+state <code>3</code>. We can also undo two transitions, to go back to state <code>2</code>.
+However, as we forgot all about state <code>1</code>, we can&#8217;t undo three transitions.
+Due to the <em>gap</em> between states <code>0</code> and <code>2</code>, we can&#8217;t undo past state
+<code>2</code>. As you can see from this example, for a history size of 3, we can undo
+at most 3 transitions when there is no gap, and at most 2 transitions when
+there is a gap.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-availability">Availability</h7>
+<div class="paragraph">
+<p>If history is disabled, reset is not available. If history is enabled, reset
+is available only if the current state is not the initial state. That is, reset
+is enabled for every state, except for the initial state.</p>
+</div>
+<div class="paragraph">
+<p>If history is disabled, or the history size is zero, undo is not available. If
+history is enabled, and the history size is positive or infinite, undo is
+available. The number of transitions that can be undone depends on the number
+of states that is remembered. If <code>n</code> states are currently remembered,
+excluding the initial state, then <code>n - 1</code> transitions can be undone, at the
+least. If there is no gap, and the current state is not the initial state, then
+<code>n</code> transitions can be undone.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-requests">Requests</h7>
+<div class="paragraph">
+<p>Reset and undo are only supported by interactive input modes, as explained
+above.</p>
+</div>
+<div class="paragraph">
+<p>When the simulator interactively asks the user to choose between some possible
+transitions, it may also provide the possibility to reset the simulation to
+the initial state, or to undo some transitions. The details on how the
+different choices are presented, and how the choice can be made, are explained
+in the documentation for each of the interactive input modes.</p>
+</div>
+<div class="paragraph">
+<p>If no transitions are possible, for instance due to
+<a href="#lang-tut-time-deadlock">deadlock</a> or reaching the
+<a href="#tools-cifsim-termination-endtime">end-user provided simulation end time</a>,
+the simulator may interactively ask the
+user to choose between termination of the simulation, resetting the simulation
+to the initial state, or undoing some transitions. This choice is only
+presented if either reset or undo is enabled, as otherwise there is no choice
+to make. The details on how the different choices are presented, and how the
+choice can be made, are explained in the documentation for each of the
+interactive input modes.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-semi-automatic-mode-2">Semi-automatic mode</h7>
+<div class="paragraph">
+<p>By using <a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a> mode, a
+purely interactive input mode, can be made semi-automatic. This can lead to
+unexpected results, in combination with reset and undo.</p>
+</div>
+<div class="paragraph">
+<p>Consider a situation where four transitions have been taken. The first
+transition was manually chosen, as was the third. The second and fourth
+transition were automatically chosen. The user is asked to interactively choose
+the fifth transition. Consider what happens if the user chooses to undo three
+transitions. The simulator goes back to the state reached after the first
+transition. The possible transitions are the same as the first time they were
+calculated. An automatic choice was made for the second transition, so one will
+also be made the second time around. So, after the second transition is once
+again automatically chosen, the user is interactively asked to choose the third
+transition. So, instead of undoing three transitions and getting a choice for
+the second transition, three transitions are undone, a second transition is
+automatically chosen, and the user is asked to choose for the third transition.</p>
+</div>
+<div class="paragraph">
+<p>Similarly, undoing the fourth transition, will result in a fourth transition
+being automatically chosen again. If the same choice is made as before, undoing
+the fourth transition has no effect.</p>
+</div>
+<div class="paragraph">
+<p>Resetting the simulation to the initial state, will not lead to the user being
+able to choose the transition to take from the initial state, if the first
+transition is automatically chosen.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-env-events">Environment events</h5>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+By default, the CIF simulator treats all events are urgent. That is, whenever
+a transition is possible for any event, time may not progress. In other words,
+events take priority over time passage. However, not all events should be
+urgent. As such, the simulator has an
+<b class="menuref">Environment events</b>
+option
+(<b class="menuref">Input</b>
+category), that makes it possible to let the simulator know
+about the <em>environment events</em> (non-urgent events). An example of an
+environment event (non-urgent event) is a button that can be pushed. The button
+can always be pushed, now or in the future. The corresponding event is thus
+always enabled, but time should still be able to progress, as the event may
+not actually happen at this time.</p>
+</div>
+<div class="paragraph">
+<p>As value for the
+<b class="menuref">Environment events</b>
+option, comma separated
+<em>filters</em> should be supplied. Each filter specifies one or more environment
+events. The absolute names of the events are used. That is, for an automaton
+<code>a</code>, with an event <code>e</code>, the absolute name of the event is <code>a.e</code>. If CIF
+textual syntax keyword are used as names for events (such as <code>plant</code>),
+then they must be escaped in <code>.cif</code> files (<code>$plant</code>). For filters however,
+all escape characters (<code>$</code>) in event names are ignored. The <code>*</code> character
+can be used as wildcard, to indicate zero or more characters. The special
+<code>svg</code> filter can be used to turn all
+<a href="#tools-cifsim-input-svg-chapter-index">SVG interactive/input events</a> into
+environment (non-urgent) events. If a filter doesn&#8217;t match any of the events of
+the CIF model, a warning is printed to the console. If a filter doesn&#8217;t have
+any effect, because a previous filter already turned the matching events into
+environment events, a warning is printed as well.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>e, a.e, f*, t*</code> consists of four filters: <code>e</code>,
+<code>a.e</code>, <code>f*</code>, and <code>t*</code>. The first filter indicates that event <code>e</code> is an
+environment event. The second filter indicates that event <code>e</code> in automaton
+<code>a</code> is an environment event. The third filter indicates that all events
+whose absolute name starts with an <code>f</code> are environment events. This could
+include events <code>f</code>, <code>f1</code>, <code>foo</code>, <code>f.e</code>, etc. The fourth filter is
+similar to the third filter, but uses character <code>t</code> as a prefix, rather than
+character <code>f</code>. The <code>t*</code> filter always matches the <code>tau</code> event, as that
+event is implicitly always present.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-input-modes">Input modes</h6>
+<div class="paragraph">
+<p>By default, the simulator does not know which events of the model are
+environment events (non-urgent events). By letting the simulator know about
+them, it can properly simulate them with non-urgent semantics. The CIF
+simulator however, has several <a href="#tools-cifsim-input-chapter-index">input modes</a>.
+This section discusses for each input mode, the influence of environment
+events, and their practical use.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-chapter-console">Interactive console input mode</a></p>
+<div class="paragraph">
+<p>When using the interactive console input mode, the simulator will
+interactively ask the user to choose transitions, from the list of possible
+transitions printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>If however the CIF model contains events that are always enabled (such as a
+button that can always be pushed), time may never progress. The simulator
+treats all events as urgent. By specifying the always enabled events as
+environment events, those events become non-urgent, and the user is free to
+choose between those environment events and time passage (time transitions).
+If combined with the <a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic mode</a>
+for the urgent events, the user can
+choose the environment events and time transitions, while the other/urgent
+events are automatically chosen by the simulator, reducing the number of
+choices the user has to make.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-gui">Interactive GUI input mode</a></p>
+<div class="paragraph">
+<p>When using the interactive GUI input mode, the simulator will interactively
+ask the user to choose transitions, using a GUI (Graphical User Interface).</p>
+</div>
+<div class="paragraph">
+<p>If however the CIF model contains events that are always enabled (such as a
+button that can always be pushed), time may never progress. The simulator
+treats all events as urgent. By specifying the always enabled events as
+environment events, those events become non-urgent, and the user is free to
+choose between those environment events and time passage (time transitions).
+If combined with the <a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic mode</a>
+for the urgent events, the user can
+choose the environment events and time transitions, while the other/urgent
+events are automatically chosen by the simulator, reducing the number of
+choices the user has to make.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-automatic">Automatic input mode</a></p>
+<div class="paragraph">
+<p>When using the automatic input mode, the simulator will automatically choose
+transitions, based on certain criteria. If the CIF model contains a use case,
+the simulator automatically simulates that use case.</p>
+</div>
+<div class="paragraph">
+<p>If however the CIF model contains events that are always enabled (such as a
+button that can always be pushed), time may never progress. The simulator
+treats all events as urgent. By specifying the always enabled events as
+environment events, those events become non-urgent, and the simulator is
+free to choose between those environment events and time passage (time
+transitions). If combined with the <em>random</em>
+<a href="#tools-cifsim-input-automatic-trans">automatic mode choice algorithm</a>,
+and <em>random</em>
+<a href="#tools-cifsim-input-automatic-time">automatic mode time transition duration</a>,
+this allows for the automatic validation of arbitrary traces.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-svg-chapter-index">SVG input mode</a></p>
+<div class="paragraph">
+<p>When using the SVG input mode, the simulator will automatically choose
+transitions, based on certain criteria. The environment events are usually
+coupled to the SVG image (using <a href="#tools-cifsim-input-svg-chapter-svgin">CIF/SVG input mappings</a>).
+This ensures that the environment
+events are only enabled when the corresponding interactive element of the
+image is clicked by the user. The SVG image plays the role of the
+environment, closing the system. If the SVG image only partially closes the
+system, the remaining environment events can be specified, similar to the
+way they are specified for the automatic input mode.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-supervisory-control-application-domain">Supervisory control application domain</h6>
+<div class="paragraph">
+<p>This section discusses environment events in the application domain of
+supervisory control, where the system consists of a plant (the hardware),
+and a supervisor (or other controller that restricts the plant behavior).</p>
+</div>
+<div class="paragraph">
+<p>Informally, we can distinguish the following types of events:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Controller events</em></p>
+<div class="paragraph">
+<p>Controller events are those events that are initiated by a controller, such
+as a supervisor. These events are usually controllable events. However, if
+supervisor synthesis is not used, the events need not necessarily be
+controllable.</p>
+</div>
+<div class="paragraph">
+<p>For controller events, the behavior is usually fully specified in the CIF
+model. That is, if the CIF model contains both the plant and the controller,
+the CIF model determines when the events are enabled, and when they are
+disabled. The controller events should happen as soon as they are enabled.
+That is, once the controller determines that for instance a motor should be
+turned on, the motor should be turned on without further delays. Thus,
+controller events are urgent.</p>
+</div>
+<div class="paragraph">
+<p>For low-level controllers, the events generally correspond directly to the
+events of the actuators. For instance, a controller may turn a lamp on or
+off. For higher level controllers however, there usually is no such direct
+relation. Furthermore, internal events of the controller (usually event
+<code>tau</code>, or other events that are neither controllable nor uncontrollable),
+are considered controller events as well.</p>
+</div>
+</li>
+<li>
+<p><em>Plant events</em></p>
+<div class="paragraph">
+<p>Plant events are those events that are initiated by the plants. These events
+are usually uncontrollable events. However, if supervisor synthesis is not
+used, the events need not necessarily be uncontrollable.</p>
+</div>
+<div class="paragraph">
+<p>For plant events, the behavior is usually fully specified in the CIF model.
+The CIF model models exactly when the events become enabled. For instance,
+when an elevator moves and reaches its top position, the event that indicates
+that 'the top position sensor goes on' becomes enabled, and should be
+executed at that time. That is, the plant model models/follows the physical
+behavior, and determines when the plants events are enabled. This behavior
+is fully specified and known, and further delays are undesirable. As such,
+plant events are urgent.</p>
+</div>
+<div class="paragraph">
+<p>For low-level plants, the events generally correspond directly to the events
+of sensors. Typical examples include limit sensors, such as the elevator top
+position sensor described above, and sensors that detect products throughout
+the system. For higher level plants however, there usually is no such
+direct relation. Furthermore, internal events of the plants (usually event
+<code>tau</code>, or other events that are neither controllable nor uncontrollable),
+may be considered plant events as well.</p>
+</div>
+</li>
+<li>
+<p><em>Environment events</em></p>
+<div class="paragraph">
+<p>Environment events are those events that are initiated by the environment
+(anything outside and the plants and the controller). These events are
+usually uncontrollable events. However, if supervisor synthesis is not used,
+the events need not necessarily be uncontrollable.</p>
+</div>
+<div class="paragraph">
+<p>The CIF model only observes or monitors the environment events. The
+environment (outside of the behavior specified in the CIF model), determines
+when, if ever, the events actually happen, and thus defines their behavior.
+From the point of view of the CIF model, the environment events can happen at
+any time, and as such the CIF model allows them at all times. The
+behavior is left completely unrestricted/free in the CIF specification, as
+it is unknown when the events will actually happen. Since time may pass
+before these events actually happen (as determined by the environment, rather
+than the CIF model), these events are thus non-urgent (from the point of view
+of the CIF model). If the CIF model would instead consider them to be urgent,
+the model would always forbid time to progress, even if the environment does
+not currently allow any environment event to occur, leading to deadlock.</p>
+</div>
+<div class="paragraph">
+<p>For low-level plants, the events generally correspond directly to the events
+of sensors. For instance, the buttons of a user interface can be pushed and
+released. Other typical examples of environment events include events for
+other user interface elements, and events that indicate that a product has
+entered the system, from the environment of the system. For higher level
+plants however, there usually is no such direct relation. Furthermore,
+internal events of the plants (usually event <code>tau</code>, or other events that
+are neither controllable nor uncontrollable), may be considered plant events
+as well.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Thus, for plant events as well as for controller events, the CIF model
+specifies/defines when the events may/should occur, while for environment
+events the specification always allows them, and lets the environment
+choose/determine when they actually occur. In other words, plant/controller
+events originate from within the specification (internal behavior), while
+environment events originate outside of the specification (external behavior).</p>
+</div>
+<div class="paragraph">
+<p>A closed system is a system for which the entire behavior is specified in the
+CIF model. Closed systems have no environment events.</p>
+</div>
+<div class="paragraph">
+<p>An open system does not model the environment. As such, open systems typically
+have plant events, controller events, and environment events. The environment
+events are then unrestricted in the CIF model, leaving the environment (which
+is not specified) free to determine its own behavior, and thus the behavior
+(enabledness) of the environment events.</p>
+</div>
+<div class="paragraph">
+<p>An open system can be closed by adding a use case, which models one possible
+sequence of behavior of the environment, over time. That is, the added use case
+eliminates environment events, by defining when they are enabled. Open systems
+can also be closed by the simulator, as described above for the different
+input modes.</p>
+</div>
+<div class="paragraph">
+<p>As an example, consider the following open system:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton Button:
+  uncontrollable u_pushed, u_released;
+
+  location Released:
+    initial;
+    edge u_pushed goto Pushed;
+
+  location Pushed:
+    edge u_released goto Released;
+end
+
+plant automaton Lamp:
+  controllable c_on, c_off;
+
+  location Off:
+    initial;
+    edge c_on goto On;
+
+  location On:
+    edge c_off goto Off;
+end
+
+supervisor automaton ButtonLampController:
+  location:
+    initial;
+    edge Lamp.c_on  when Button.Pushed;
+    edge Lamp.c_off when Button.Released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here we have a simple button and a lamp. The lamp can only be turned on while
+the button is pushed, and will be turned off as soon as the button is released.
+The button events are environment events, since it always possible to either
+push the button, or release it.</p>
+</div>
+<div class="paragraph">
+<p>By specifying the button events as environment events, and specifying the the
+lamp events as <a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a>
+events, we can use the <a href="#tools-cifsim-input-chapter-console">interactive console input mode</a>
+or the <a href="#tools-cifsim-input-chapter-gui">interactive GUI input mode</a> to try different traces,
+where we only have to
+choose between the button events and how much time we want to let pass.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, we could add a use case, modeling one possible behavior of a
+user:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton User:
+  cont t der 1.0;
+
+  location:
+    initial;
+    edge Button.u_pushed, Button.u_released when t &gt;= 1 do t := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specifies that the user either pushes or releases the button, after one
+unit of time has passed (typically one second). Since clock <code>t</code> is reset each
+time, the user repeats this behavior. Thus, the button is pushed after one
+second, for one second, after three seconds, for one second, after five
+seconds, for one second, etc. This extended model (with use case), can be
+simulated using the <a href="#tools-cifsim-input-chapter-automatic">automatic input mode</a>, as the
+<code>User</code> plant automaton closes the system.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-output-chapter-index">Simulation output</h5>
+<div class="paragraph">
+<p>
+
+The CIF simulator can produce various forms of output.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-console">Console output</h6>
+<div id="tools-cifsim-output-mode" class="paragraph">
+<p>The default form of output is to the console. The type of console output to
+produce, is determined by the
+<b class="menuref">Output mode</b>
+option
+(<b class="menuref">General</b>
+category). The following modes are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Error</em>: produces only error output. It is recommended not to use this mode.
+Use the warning mode instead, if you wish to limit the amount of console
+output.</p>
+</li>
+<li>
+<p><em>Warning</em>: produces error and warning output. Use this mode to be informed
+about potential problems, while keeping the amount of console output to a
+minimum.</p>
+</li>
+<li>
+<p><em>Normal</em>: produces error, warning, and normal output. This is the default
+output mode. The information that is printed to the console for normal output
+can be configured using the <a href="#tools-cifsim-output-chapter-normal">Normal output</a> option.</p>
+</li>
+<li>
+<p><em>Debug</em>: produces error, warning, normal, and debug output. This mode can be
+used to print additional debugging information to the console. The
+information that is printed to the console for normal output can be
+configured using the <a href="#tools-cifsim-output-chapter-debug">Debug output</a>
+option.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The simulator can thus produce two types of configurable console output:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-chapter-normal">Normal console output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-debug">Debug console output</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="tools-cifsim-output-components" class="paragraph">
+<p><strong>Output components</strong></p>
+</div>
+<div class="paragraph">
+<p>Besides console output, the simulator also features a powerful and extensible
+output framework. This framework allows for the addition of output components,
+such as visualizers. The following output components are currently available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-index">Print output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualizer</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-trajdata">Trajectory data output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-plotviz">Plot visualizer</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-stateviz">State visualizer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Other topics</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-chapter-realtime">Real-time simulation</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-normal">Normal console output</h6>
+<div class="paragraph">
+<p>
+
+
+Normal console output mainly focuses on the state of the specification, and the
+progress of the simulation.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-normal-types">Available types of normal output</h7>
+<div class="paragraph">
+<p>The following types of normal output are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>The initial state</em> [<code>state-init</code>] (default)</p>
+<div class="paragraph">
+<p>Prints the initial state to the console.</p>
+</div>
+</li>
+<li>
+<p><em>The target states</em> [<code>state-target</code>] (default)</p>
+<div class="paragraph">
+<p>Prints all target states to the console. This
+includes all states reached by event transitions and time transitions.
+Specifically, it excludes the initial state, and it includes the
+final/deadlock state.</p>
+</div>
+</li>
+<li>
+<p><em>The final state</em> [<code>state-final</code>]</p>
+<div class="paragraph">
+<p>Prints the final state to the console, regardless of whether or not the final
+state is a deadlock state.</p>
+</div>
+</li>
+<li>
+<p><em>The deadlock state</em> [<code>state-deadlock</code>]</p>
+<div class="paragraph">
+<p>Prints the final state to the console, but only if it is a deadlock state.</p>
+</div>
+</li>
+<li>
+<p><em>The intermediate states</em> [<code>state-intermediate</code>]</p>
+<div class="paragraph">
+<p>Prints all intermediate states to the console. Intermediate states are the
+states that are used to generate
+<a href="#tools-cifsim-output-realtime-frames">intermediate frames</a>, for smooth
+visualizations. The intermediate states are generated for states between the
+start and end states of time transitions, when
+<a href="#tools-cifsim-output-chapter-realtime">real-time</a> simulation is enabled. Note
+that this does not include the initial state, target states, and
+final/deadlock states.</p>
+</div>
+</li>
+<li>
+<p><em>The algebraic variables as part of the state</em> [<code>state-alg-vars</code>] (default)</p>
+<div class="paragraph">
+<p>Prints the algebraic variables (derived state) as part of the state. This
+applies to all states, including the states for intermediate frames. If no
+state information is printed, this output type has no effect. Disabling
+printing of algebraic variables excludes algebraic variables, regardless of
+whether <a href="#tools-cifsim-output-normal-state-filter">state filtering</a>
+includes or excludes them.</p>
+</div>
+</li>
+<li>
+<p><em>The derivatives as part of the state</em> [<code>state-derivs</code>] (default)</p>
+<div class="paragraph">
+<p>Prints the derivatives of the continuous variables (derived state) as part of
+the state. This applies to all states, including the states for intermediate
+frames. If no state information is printed, this output type has no effect.
+The derivative of variable <code>time</code> is not included. Disabling printing of
+derivatives excludes derivatives, regardless of whether
+<a href="#tools-cifsim-output-normal-state-filter">state filtering</a> includes
+or excludes them.</p>
+</div>
+</li>
+<li>
+<p><em>The possible transitions (for interactive console choice only)</em> [<code>trans-minimal</code>]</p>
+<div class="paragraph">
+<p>Prints the possible transitions to the console, if the
+<a href="#tools-cifsim-input-chapter-console">interactive console input mode</a> is used. Multiple possible
+transition are always printed. Single possible transitions are only printed
+if automatic choice for a single possible transition is disabled. Nothing
+is printed if no transitions are possible.</p>
+</div>
+</li>
+<li>
+<p><em>The possible transitions (for interactive console choice, or if more than one transition)</em> [<code>trans-default</code>]</p>
+<div class="paragraph">
+<p>Similar to 'interactive console choice only', but additionally always prints
+the possible transitions, if there are multiple possible transitions,
+regardless of the <a href="#tools-cifsim-input-chapter-index">input mode</a>.</p>
+</div>
+</li>
+<li>
+<p><em>The possible transitions (always)</em> [<code>trans-always</code>]</p>
+<div class="paragraph">
+<p>Always print the possible transitions to the console, regardless of the input
+mode, and the number of possible transitions. However, nothing is printed if
+no transitions are possible.</p>
+</div>
+</li>
+<li>
+<p><em>The chosen transitions</em> [<code>chosen-trans</code>] (default)</p>
+<div class="paragraph">
+<p>Prints the chosen transitions (the transitions that are about to be taken),
+to the console.</p>
+</div>
+</li>
+<li>
+<p><em>The interrupted transitions</em> [<code>interrupted-trans</code>] (default)</p>
+<div class="paragraph">
+<p>Prints information about interrupted transitions (time transitions that are
+stopped prematurely) to the console.</p>
+</div>
+</li>
+<li>
+<p><em>The simulation result</em> [<code>sim-rslt</code>] (default)</p>
+<div class="paragraph">
+<p>Prints the simulation result the console, at the end of the simulation, if
+simulation did not result in a runtime error.</p>
+</div>
+</li>
+<li>
+<p><em>The random seeds used for the random generators</em> [<code>seeds</code>] (default)</p>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-normal-seeds" class="paragraph">
+<p>Prints the seeds used for the random generators to the console, to allow
+reproducing the simulation <a href="#tools-cifsim-chapter-traces">trace</a>. Only if a
+random seed is used, is the seed printed. That is, for user-specified seeds,
+the seed is not printed. The following seeds may be printed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The seed used for the random <a href="#tools-cifsim-input-automatic-trans">automatic mode choice algorithm</a>.</p>
+</li>
+<li>
+<p>The seed used for the random <a href="#tools-cifsim-input-automatic-time">automatic mode time transition duration</a>.</p>
+</li>
+<li>
+<p>The seed used for the first random generator for a <a href="../distr-seeds.html">stochastic distribution</a>.
+The seed is only printed if it is used to create a random number generator for at least one stochastic
+distribution.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p><em>The print declarations output</em> [<code>print</code>] (default)</p>
+<div id="tools-cifsim-output-normal-print" class="paragraph">
+<p>Prints the output generated by <a href="#tools-cifsim-output-print-chapter-ref-printdecl">print declarations</a>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-normal-output-option">Normal output option</h7>
+<div class="paragraph">
+<p>In the option dialog, each of the different types of output can be enabled and
+disabled individually (<b class="menuref">Normal output</b>
+option,
+<b class="menuref">Output</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>-o</code> or <code>--output</code> option, the names of
+the different types of normal output, as specified between square brackets,
+should be used, separated by commas. The output types indicated with
+'(default)' are enabled when default settings are used, i.e. when the
+<code>-o</code> or <code>--output</code> option is not used. As an example, consider
+<code>-o print,seeds</code> or <code>--output=print,seeds</code>. Only output generated by print
+declarations (due to <code>print</code>) and output about the used seeds for random
+generators (due to <code>seeds</code>) is enabled, while all other output is disabled.</p>
+</div>
+<div class="paragraph">
+<p>The output types that are specified using the option replace the default output
+types. However, it is also possible to specify additions and removals relative
+to the default output, by prefixing output types with a <code>+</code> or <code>-</code>
+respectively. For instance, when using <code>-o -print,+trans-always</code> or
+<code>--output=-print,+trans-always</code> the default output is used, with print
+declarations output excluded from it (due to <code>-print</code>), and with always
+printing possible transitions enabled (due to <code>+trans-always</code>). Replacements
+(no prefix) may not be combined with additions/removals (<code>+</code> or <code>-</code>
+prefix).</p>
+</div>
+<div class="paragraph">
+<p>Specifying a replacement output type twice leads to a warning being printed to
+the console. Adding an output type that is already present or removing an
+output type that is not present, also leads to a warning being printed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-output-details">Output details</h7>
+<div class="paragraph">
+<p>When printing states, variable <code>time</code> is always printed first. It is followed
+by the current location of each of the automata, the current values of the
+state variables (the discrete and continuous variables), the current values of
+the derivatives of the continuous variables, and the current values of the
+algebraic variables. Except for variable <code>time</code>, the state objects are sorted
+alphabetically based on their absolute names. For automata with a single
+nameless location, the current location is always <code>*</code>.</p>
+</div>
+<div class="paragraph">
+<p>For variables with a function type and implicit default values, the
+default values may include <code>defaultValueFunc</code>, <code>defaultValueFunc2</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>When printing the possible transitions, the event transitions are printed
+first, followed by the <code>tau</code> transitions, and the time transition. The event
+transitions are sorted alphabetically on the names of the events.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-normal-state-filter">State filtering</h7>
+<div class="paragraph">
+<p>By default, when printing states, all state objects are included. Using
+the
+<b class="menuref">Normal output state filters</b>
+option
+(<b class="menuref">Output</b>
+category), the state objects can be filtered. The
+<b class="menuref">Normal output state filters</b>
+option only has effect
+if states are printed at all.</p>
+</div>
+<div class="paragraph">
+<p>As value for the option, comma separated <em>filters</em> should be supplied. Each
+filter specifies one or more state objects. The absolute names of the objects
+are used. That is, for an automaton <code>a</code>, with a variable <code>x</code>, the absolute
+name of the variable object is <code>a.x</code>. If CIF textual syntax keyword are
+used as names for events (such as <code>plant</code>), then they must be escaped in
+<code>.cif</code> files (<code>$plant</code>). For filters however, all escape characters (<code>$</code>)
+in the names are ignored. The <code>*</code> character can be used as wildcard, to
+indicate zero or more characters. If a filter doesn&#8217;t match any of the state
+objects of the CIF model, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>By default, filters include matching state objects. Filters may however be
+preceded by a <code>-</code> character, turning them into exclusion filters, which
+exclude matching states objects rather than including them. Filters are
+processed in the order they are specified, allowing for alternating additions
+and removals. If a filter does not result in the addition/removal of any state
+objects to/from the filter result, a warning is printed to the console. A
+warning is also printed if the entire state is filtered out.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>a.*,-a.b*,a.bc*</code> consists of three filters:
+<code>a.*</code>, <code>-a.b*</code>, and <code>a.bc*</code>. The first filter indicates that state
+objects whose absolute names start with <code>a.</code> are to be included. The second
+filter indicates that from those matching state objects, the state objects
+whose absolute names start with <code>a.b*</code> are to be excluded. To that result,
+the third filter adds those state objects whose absolute names start with
+<code>a.bc*</code>. For instance, if a specification contains state objects <code>time</code>,
+<code>a.a</code>, <code>a.b</code> <code>a.bb</code>, <code>a.bc</code>, <code>a.b.c</code>, <code>a.bc</code>, <code>a.bcc</code>, and
+<code>a.bcd</code>, the result of the three filters is that the following state objects
+are displayed: <code>a.a</code>, <code>a.bc</code>, <code>a.bc</code>, <code>a.bcc</code>, and <code>a.bcd</code>.</p>
+</div>
+<div class="paragraph">
+<p>The default option value (filter) is <code>*</code>.</p>
+</div>
+<div class="paragraph">
+<p>Regardless of whether the filtered result includes them or not, all algebraic
+variables and derivatives of continuous variables may be excluded, using the
+<a href="#tools-cifsim-output-normal-types">Normal output option</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-profiling">Profiling</h7>
+<div class="paragraph">
+<p>If <a href="#tools-cifsim-chapter-profiling">profiling</a> is enabled, all normal output is
+automatically disabled. That is, profiling suppresses all normal output.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-debug">Debug console output</h6>
+<div class="paragraph">
+<p>
+
+
+The following types of debug output are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Debug the CIF/SVG declarations</em> [<code>svg</code>]</p>
+<div class="paragraph">
+<p>Prints debugging information to the console, for the
+<a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a>. For more
+information on this kind of debugging output, see the page on
+<a href="#tools-cifsim-output-svgviz-debugging-console">console debugging</a> for
+CIF/SVG declarations.</p>
+</div>
+</li>
+<li>
+<p><em>Debug the parser</em> [<code>parser</code>]</p>
+<div class="paragraph">
+<p>Prints debugging information to the console, for the parser. This information
+is primarily intended for the developers of the simulator, and not for end
+users.</p>
+</div>
+</li>
+<li>
+<p><em>Debug the generated code (by writing it to disk)</em> [<code>gen-code</code>]</p>
+<div class="paragraph">
+<p>The simulator generates highly optimized code for the specification. Enabling
+this debugging output, writes the generated code to disk, for
+<a href="#tools-cifsim-chapter-debug-gen-code">further debugging</a>. This information is primarily
+intended for the developers of the simulator, and not for end users.</p>
+</div>
+</li>
+<li>
+<p><em>Debug the ODE solver</em> [<code>ode</code>]</p>
+<div class="paragraph">
+<p>Prints debugging information to the console, for the
+<a href="#tools-cifsim-solver-chapter-index">ODE solver</a>. This information can for
+instance be used to figure out why a state event (guard change)
+<a href="#tools-cifsim-solver-chapter-root-problems">was missed</a>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-debug-output-option">Debug output option</h7>
+<div class="paragraph">
+<p>In the option dialog, each of the different types of output can be enabled and
+disabled individually
+(<b class="menuref">Debug output</b>
+option,
+<b class="menuref">Output</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p>From the command line, using the <code>-d</code> or <code>--debug</code> option, the names of
+the different types of debug output, as specified between square brackets,
+should be used, separated by commas. By default, i.e. when not using the
+<code>-d</code> or <code>--debug</code> option, all debug output is disabled. As an example,
+consider <code>-d parser,svg</code> or <code>--debug=parser,svg</code>. Debug output is printed
+for the parser (due to <code>parser</code>) and CIF/SVG declarations (due to <code>svg</code>).</p>
+</div>
+<div class="paragraph">
+<p>Specifying an output type twice leads to a warning being printed to the
+console.</p>
+</div>
+<div class="paragraph">
+<p>Enabling any debug output, automatically changes the <a href="#tools-cifsim-output-chapter-index">output mode</a>
+to 'debug mode'.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-profiling-2">Profiling</h7>
+<div class="paragraph">
+<p>If <a href="#tools-cifsim-chapter-profiling">profiling</a> is enabled, all debug output is
+automatically disabled. That is, profiling suppresses all debug output.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-print-chapter-index">Print output</h6>
+<div class="paragraph">
+<p>
+
+
+The CIF simulator supports several forms of
+<a href="#tools-cifsim-output-chapter-index">output</a>. By default, simulation results, such as the
+current <a href="#tools-cifsim-traces-state">state</a>, are printed to the console.
+While this provides useful information, it can also be useful to generate
+custom output, tailored to ones specific needs. To allow this, the CIF
+simulator supports <em>print output</em>.</p>
+</div>
+<div class="paragraph">
+<p>Simulation using the CIF simulator results in a
+<a href="#tools-cifsim-traces-traces">trace</a>. A trace consists of the
+<a href="#tools-cifsim-traces-state">states</a> that are encountered and the
+transitions that are taken, during the simulation. The print output
+declarations allow specifying for which transitions text should be printed
+(for instance only for transitions for a certain event), when the text should
+be printed (for instance before or after the transition), where the text should
+be printed (for instance to a file), and what text should be printed.</p>
+</div>
+<div class="paragraph">
+<p>Print output declarations are an extension to the CIF language, and can be
+specified directly in the CIF specification. They are only used to couple
+the model to textual output. They don&#8217;t influence the behavior of the model
+itself. The CIF <a href="#tools-chapter-text-editor">text editor</a> provides full
+integration for the print output declarations extension, complete with syntax
+highlighting, background validation, etc.</p>
+</div>
+<div class="paragraph">
+<p>
+Print output can be used to generate text that after simulation is further
+processed, for instance for visualization or for analysis using statistical
+software. Print output can also be useful for debugging,</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-quick-example">Quick example</h7>
+<div class="paragraph">
+<p>This example serves only to give a quick taste of what print output
+declarations look like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;out.txt&quot;;
+
+print x for e;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This example prints the value of variable <code>x</code> to a file <code>out.txt</code> each
+time after a transition for event <code>e</code> is taken.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-documentation">Documentation</h7>
+<div class="paragraph">
+<p>The tutorials introduce print declarations and text formatting, they explain
+the general idea behind them, and they show how to use them, all by means of
+examples. The tutorials are focused on practical use, and do not cover all uses
+and other details.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-tut-print">Print output tutorial</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-tut-fmt">Text formatting tutorial</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The reference documentation discusses all details related to text output and
+text formatting. It is much more technical than the tutorials.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-printdecl">Print declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-printfile">Print file declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-sim">Simulation with print output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-fmt">Text formatting details</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-tut-print">Print output tutorial</h7>
+<div class="paragraph">
+<p>
+
+
+This tutorial explains print output by means of examples. It does not explain
+all uses of print output, and all details related to print output. For those
+details, see the reference documentation instead.</p>
+</div>
+<div class="paragraph">
+<p>In this tutorial, when printed console output is shown, all output that the
+simulator can generate other than output for print declarations, is omitted.</p>
+</div>
+<div class="paragraph">
+<p>Before we start with the examples, the
+<a href="#tools-cifsim-output-print-tut-print-model-trace">Example model and simulation trace</a> section introduces the
+example model and simulation trace on which the examples are based. Then, the
+following examples are explained in detail:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex1">Example 1: Printing the buffer count for all states</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex2">Example 2: Printing to a file</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex3">Example 3: Printing the odd/even status for all states</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex4">Example 4: Printing only for odd states</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex5">Example 5: Printing the result of adding an item</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex6">Example 6: Printing addition/removal results</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex7">Example 7: Printing value changes</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex8">Example 8: Printing headers and footers</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex9">Example 9: Printing the new time after time passes</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex10">Example 10: Printing all unique time values</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-tut-print-ex11">Example 11: Printing transitions to/from a location</a></p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-model-trace">Example model and simulation trace</h8>
+<div class="paragraph">
+<p>The examples of print output in this tutorial all make use of the same CIF
+model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton buffer:
+  event add, remove;
+  disc int cnt = 5;
+
+  location:
+    initial;
+    edge add    when cnt &lt; 10 do cnt := cnt + 1;
+    edge remove when cnt &gt;  0 do cnt := cnt - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>buffer</code> initially contains five items (<code>cnt = 5</code>). As long as there
+is room in the buffer (<code>cnt &lt; 10</code>), an item can be added (event <code>add</code>) to
+the buffer. As long as the buffer is not empty (<code>cnt &gt; 0</code>), an item can be
+removed (event <code>remove</code>) from the buffer. During simulation, it is possible
+to <a href="#tools-cifsim-input-chapter-index">choose</a> between adding an item to the
+buffer, and removing an item from the buffer. The following is a potential
+simulation trace:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/print/trace_normal.png" alt="trace normal">
+</div>
+</div>
+<div class="paragraph">
+<p>In the initial state (S1), variable <code>cnt</code> has value <code>5</code>. An item is then
+added (transition for the event <code>add</code>), resulting in a new state (S2), where
+<code>cnt</code> has value <code>6</code>. After that, another item is added, leading to state
+S3, where <code>cnt</code> has value <code>7</code>. Finally, an item is removed by means of a
+transition for event <code>remove</code>, leading to state S4, where <code>cnt</code> has value
+<code>6</code> again.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex1">Example 1: Printing the buffer count for all states</h8>
+<div class="paragraph">
+<p>If we want to print for every state (S1 through S4), the number of items in the
+buffer, we could add the following print declaration to automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, as a result of this print declaration, the following text is printed to
+the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">5
+6
+7
+6</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That is, for every state (S1 through S4), the value of variable <code>cnt</code> is
+printed, on a new line.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex2">Example 2: Printing to a file</h8>
+<div class="paragraph">
+<p>Consider the following print declarations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt     file &quot;a.txt&quot;;
+print cnt * 2 file &quot;b.txt&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first print declaration results in the number of items in the buffer being
+printed for every state of the simulation trace, to a file named <code>a.txt</code>. The
+second print declaration prints the number of items in the buffer multiplied by
+two, to a file named <code>b.txt</code>. These declarations use local file declarations
+to specify the file to which output is to be written. It is also possible to
+use global print file declarations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;ab.txt&quot;;
+print cnt;
+print cnt * 2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The print file declaration declares that output of this scope is to be printed
+to a file named <code>ab.txt</code>. The two print declarations don&#8217;t specify a local
+file declaration, and thus use the default file for their scope, in this case
+file <code>ab.txt</code>. Alternating lines with the number of items in the buffer and
+twice that amount are thus printed to that file.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex3">Example 3: Printing the odd/even status for all states</h8>
+<div class="paragraph">
+<p>If we want to print for every state, whether the buffer contains an odd or even
+number of items, we could add the following print declaration to automaton
+<code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print if cnt mod 2 = 0: &quot;even&quot; else &quot;odd&quot; end;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, as a result of this print declaration, the following text is printed to
+the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">odd
+even
+odd
+even</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex4">Example 4: Printing only for odd states</h8>
+<div class="paragraph">
+<p>If we want to print the number of items in the buffer, but only for states
+where the number of items is odd, we could add the following print declaration
+to automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt when cnt mod 2 = 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, as a result of this print declaration, the following text is printed to
+the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">5
+7</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex5">Example 5: Printing the result of adding an item</h8>
+<div class="paragraph">
+<p>If we want to print the result of adding an item, that is the new buffer count
+after a transition for the <code>add</code> event, we could add the following print
+declaration to automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt for add;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, as a result of this print declaration, the following text is printed to
+the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">6
+7</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Since an item is added to the buffer twice, two lines of text are printed.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex6">Example 6: Printing addition/removal results</h8>
+<div class="paragraph">
+<p>If we want to print the resulting buffer count after every change to the buffer
+(addition or removal), we could add the following print declaration to
+automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt for add, remove;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, as a result of this print declaration, the following text is printed to
+the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">6
+7
+6</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two items are added to the buffer, and one item is removed from the buffer,
+leading to three lines of text being printed.</p>
+</div>
+<div class="paragraph">
+<p>Since the <code>add</code> and <code>remove</code> events are the only events in the system, and
+no edges exist without an event (which would implicitly use the <code>tau</code> event),
+the print declaration can also be specified as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt for event;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That is, the value of variable <code>cnt</code> is printed after each event transition.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex7">Example 7: Printing value changes</h8>
+<div class="paragraph">
+<p>If we want to print the buffer count before and after removal of an item from
+the buffer, we could add the following print declaration to automaton
+<code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print pre cnt post cnt for remove;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As a result of this print declaration, the following text is printed to the
+console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">7
+6</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As only one item is removed for our example trace, two lines of text are
+printed, one with the buffer count before the removal (due to <code>pre cnt</code>),
+and one with the buffer count after the removal (due to <code>post cnt</code>).</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex8">Example 8: Printing headers and footers</h8>
+<div class="paragraph">
+<p>If we want to print for every state (S1 through S4), the number of items in the
+buffer, we could add the following print declaration to automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print cnt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If we want to print some text before this, as a header, and some text after
+this, as a footer, we could add the following print declaration to the top
+level scope of the specification, or to automaton <code>buffer</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print &quot;header&quot; for initial;
+print &quot;footer&quot; for final;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As a result of the original print declaration, and these two new print
+declarations, the following text is printed to the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">header
+5
+6
+7
+6
+footer</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex9">Example 9: Printing the new time after time passes</h8>
+<div class="paragraph">
+<p>In the example simulation trace given at the top of this page, no passage of
+time is included. If however a trace includes time passage, it is possible to
+filter printing to only time transitions. For instance, if we want to print the
+new time after time passes, we could use the following print declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print time for time;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This prints the value of variable <code>time</code>, every time after a time transition.
+The first <code>time</code> in the print declaration denotes that the value of variable
+<code>time</code> should be printed, and the second <code>time</code> denotes that it should be
+printed only after passage of time (after time transitions). As an example,
+the following could be printed to the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">0.005
+0.75
+3.1
+7.9</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex10">Example 10: Printing all unique time values</h8>
+<div class="paragraph">
+<p>In the <a href="#tools-cifsim-output-print-tut-print-ex9">ninth example</a>, we
+printed the new time value after each time transition. However, initially time
+is zero. Since the initial state is not reached via a time transition, time
+zero is not printed. We could adapt the print declaration to the following, to
+print all unique values of variable <code>time</code>, for all states of the simulation
+trace:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print time for initial, time;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This initially prints the value of variable <code>time</code>, and also prints it after
+every time transition. As an example, the following could be printed to the
+console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">0.0
+0.005
+0.75
+3.1
+7.9</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-tut-print-ex11">Example 11: Printing transitions to/from a location</h8>
+<div class="paragraph">
+<p>In the example model given at the top of this page, automaton <code>buffer</code> has
+only one location. If however an automaton has multiple locations, it may be
+useful to print the effect of transitions ending in a certain location, or the
+state of the system for transitions starting in a certain location. Consider
+the following print declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print x for event when aut.loc;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This prints the value of variable <code>x</code> after event transitions leading to a
+state where location <code>loc</code> is the current location of automaton <code>aut</code>.
+That is, whenever an event transition leads to entering that location, the
+value of variable <code>x</code> after that transition is printed. Since self loops have
+the same source and target location, this includes self loops. To exclude self
+loops, use the following print declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print x for event when pre not aut.loc post aut.loc;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This print declaration prints the same text, but only prints it after event
+transitions from a state where location <code>loc</code> is not the current location
+of automaton <code>aut</code> to a state where location <code>loc</code> is the current location
+of automaton <code>aut</code>.</p>
+</div>
+<div class="paragraph">
+<p>So far in this example, we printed text for transitions ending in a location.
+To print text for transitions starting in a location, consider the following
+print declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print pre y for event when pre aut.loc post not aut.loc;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This print declaration prints the value of variable <code>y</code> in the state that is
+exited by the transition, for all event transitions that start in location
+<code>loc</code> of automaton <code>aut</code>, but do end in that same location.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-tut-fmt">Text formatting tutorial</h7>
+<div class="paragraph">
+<p>
+
+
+
+This tutorial explains text formatting by means of examples. It does not
+explain all uses of text formatting, and all details related to text
+formatting. For those details, see the
+<a href="#tools-cifsim-output-print-chapter-ref-fmt">Text formatting details</a> page instead.</p>
+</div>
+<div class="paragraph">
+<p>In this tutorial, when printed console output is shown, all output that the
+simulator can generate other than output for print declarations, is omitted.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-introduction">Introduction</h8>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print &quot;Time=&quot; + &lt;string&gt;time;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When simulated, it could give the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>Time=0.0
+Time=3.333333333333336
+Time=5.000000000000001
+Time=10.0</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, due to rounding and simulation imprecision, the length of the
+textual representations of the values of <code>time</code> can vary wildly during
+simulation. Furthermore, the explicit casts (conversions) from real to string
+(<code>&lt;string&gt;</code>) and string concatenation (the <code>+</code> operator) can quickly
+become cluttered, and hard to read.</p>
+</div>
+<div class="paragraph">
+<p>To improve readability of the print declaration, we could adapt the CIF
+specification to the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;Time=%s&quot;, time);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, manual text construction has been replaced by the use of the <code>fmt</code>
+standard library function. The first argument is a <em>format pattern</em>, and the
+remaining arguments are the values that are to be included in the text, in
+this case the value of variable <code>time</code>. The <code>fmt</code> function ensures that we
+no longer have to use casts. We also no longer have to create pieces of text
+and concatenate them (using the <code>+</code> operator).</p>
+</div>
+<div class="paragraph">
+<p>This is a typical use of a format pattern. The print declaration prints the
+value that results from text formatting. The value that is used is the value of
+variable <code>time</code>. The value of this variable is not used 'as is', but is
+instead converted to a textual representation using the format pattern. This
+format pattern specifies that the resulting text should start with <code>Time=</code>.
+It also specifies that the value (of variable <code>time</code>) should be included at
+the end of the textual representation. The <code>%s</code> part of the format pattern is
+a <em>format specifier</em>. The <code>%s</code> specifier is the generic specifier that can
+convert any type of value to a textual representation.</p>
+</div>
+<div class="paragraph">
+<p>When simulated, this new specification gives the exact same output as the
+previous version.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-real-value-formatting">Real value formatting</h8>
+<div class="paragraph">
+<p>As we saw in the previous section, due to rounding and simulation imprecision,
+the length of the generic textual representations of the values of variable
+<code>time</code> can vary wildly during simulation. This reduces readability of the
+results, as a lot of irrelevant digits are included. Consider the following
+alternative CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;Time=%.2f&quot;, time);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, instead of a <code>%s</code> specifier, a <code>%f</code> specifier is used. This specifier
+can only be used for <code>real</code> numbers, and indicates that the number should be
+formatted as a floating point number in decimal representation. The <code>.2</code> part
+specifies the precision, and indicates that the floating point number in
+decimal notation should have exactly two digits after the decimal point. When
+simulated, this could give the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>Time=0.00
+Time=3.33
+Time=5.00
+Time=10.00</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-putting-values-in-columns">Putting values in columns</h8>
+<div class="paragraph">
+<p>In the examples above, we included a single value in the output. Now consider
+the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%.2f %.2f %.2f&quot;, x, y, z);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the values of variables <code>x</code>, <code>y</code>, and <code>z</code> are included in the
+formatted result. The format pattern includes each of the values (the first
+<code>%.2f</code> includes the value of variable <code>x</code>, the second <code>%.2f</code> includes the
+value of variable <code>y</code>, etc). The format pattern includes spaces between the
+format specifiers (between the <code>%.2f</code> parts), and thus the formatted values
+include spaces between them as well. When simulated, this could give the
+following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>1.50 0.00 -3.57
+2.34 3.75 5.78
+4.71 12345.34 -3.12
+-3.25 1.25 99.20</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Due to some larger values being mixed with shorter values, as well as due to
+having both positive and negative values, the output is not so easy to read.
+This can be solved by using the following CIF specification instead:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%10.2f %10.2f %10.2f&quot;, x, y, z);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By including a <em>width</em> of <code>10</code>, the text is now nicely formatted into columns
+of ten characters wide:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>---------- ---------- ----------
+      1.50       0.00      -3.57
+      2.34       3.75       5.78
+      4.71   12345.34      -3.12
+     -3.25       1.25      99.20</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first line is not actual output, but is included to make it easier to see
+the columns. Not only is the output now nicely put in columns, but due to the
+exactly two digits after the dot (<code>.</code>), the dots are now also nicely aligned.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-large-numbers">Large numbers</h8>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%.2f&quot;, time);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When simulated, this could give the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>0.00
+1.34
+5000.23
+2147185402.17</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As the values of variable <code>time</code> get larger and larger, their textual
+representations become longer and longer, and it becomes more and more
+difficult to see exactly how large the values are. The following alternative
+CIF specification solves this problem:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%,.2f&quot;, time);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The addition of the comma (<code>,</code>) <em>flag</em> ensures that we get the following
+output instead:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>0.00
+1.34
+5,000.23
+2,147,185,402.17</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That is, a comma is used in the result as <em>thousand separator</em>, making it
+easier to see that the value of variable <code>time</code> is just over two billion,
+rather than for instance just over 200 million.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-left-alignment">Left alignment</h8>
+<div class="paragraph">
+<p>Earlier, we put values in columns. By default, if a <em>width</em> is used, text is
+right-justified (aligned to the right). We can also justify it to the left,
+as in this CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%-10.2d %-10.2d %-10.2d&quot;, g, h, i);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here the <code>%d</code> specifier is used instead of the <code>%f</code> specifier. The <code>%d</code>
+specifier can only be used for integer values, while the <code>%f</code> specifier can
+only be used for real values. Besides a different specifier, the minus (<code>-</code>)
+flag is added, and different variables are used as values. After the changes,
+the CIF specification could result in the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>---------- ---------- ----------
+184        3675       2
+19350      29         -2956
+-17        -964563    235
+2946       567        -25072563</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Once again, the first line is not actual output, but is included to make it
+easier to see the columns. Observe how the addition of the <code>-</code> flag resulted
+in the right-justified output being changed to left-justified (aligned to the
+left) output. The presence of negative numbers makes that the left-most digits
+of the columns are not nicely aligned. The following CIF specification solves
+this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%-+10.2d %-+10.2d %-+10.2d&quot;, x, y, z);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The addition of the plus (<code>+</code>) flag means that for non-negative numbers, a
+plus (<code>+</code>) character is always included:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>---------- ---------- ----------
++184       +3675      +2
++19350     +29        -2956
+-17        -964563    +235
++2946      +567       -25072563</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If preferred, a space can be used instead of a plus, resulting in the following
+CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print fmt(&quot;%- 10.2d %- 10.2d %- 10.2d&quot;, x, y, z);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>and the following output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>---------- ---------- ----------
+ 184        3675       2
+ 19350      29        -2956
+-17        -964563     235
+ 2946       567       -25072563</code></pre>
+</div>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-more-formatting">More formatting</h8>
+<div class="paragraph">
+<p>In this short tutorial, we&#8217;ve seen a few forms of text formatting using the
+<code>fmt</code> function. However, CIF supports various other specifiers, besides the
+<code>%s</code>, <code>%f</code>, and <code>%d</code> specifiers that were used in this tutorial. All
+those specifiers support various flags, widths, and precisions, and allow them
+to be combined in various ways. For the complete details of text formatting,
+see the <a href="#tools-cifsim-output-print-chapter-ref-fmt">Text formatting details</a> page.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-ref-printdecl">Print declaration</h7>
+<div class="paragraph">
+<p>
+
+
+
+The core concept of print output is the <em>print declaration</em>. The print
+declarations allow specifying what to print. They also optionally allow
+specifying when to print it, how to print it, and to where to print it.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-transition-centric-view">Transition centric view</h8>
+<div class="paragraph">
+<p>Unlike many programming languages that have print statements, CIF has print
+declarations. Print declarations are
+<a href="http://en.wikipedia.org/wiki/Declarative_programming">declarative</a>,
+rather than
+<a href="http://en.wikipedia.org/wiki/Imperative_programming">imperative</a>.
+Print
+declarations center on transitions. The following is a schematic overview of
+a transition:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/print/transition.png" alt="transition">
+</div>
+</div>
+<div class="paragraph">
+<p>The transition is graphically depicted as an arrow, with a label. The label
+denotes the event that occurred, or <code>time</code> for time transitions. Every
+transition has a <em>pre</em> or <em>source</em> <a href="#tools-cifsim-traces-state">state</a>,
+and a <em>post</em> or <em>target</em> state. The states are graphically depicted as circles,
+with a name above them. These names are only used so that they can be referred
+to from the text.</p>
+</div>
+<div class="paragraph">
+<p>The figure thus contains the transition and its immediate environment (its
+source and target states). Print declarations allow specifying what, how, and
+when to print, for transitions. Since the transition is the central part, we
+call this the <em>transition centric view</em>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-extended-trace">Extended trace</h8>
+<div class="paragraph">
+<p>Simulation using the CIF simulator results in a
+<a href="#tools-cifsim-traces-traces">trace</a>. A trace consists of the
+<a href="#tools-cifsim-traces-state">states</a> that are encountered and the
+transitions that are taken, during the simulation. For instance, consider the
+following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton buffer:
+  event add, remove;
+  disc int cnt = 5;
+
+  location:
+    initial;
+    edge add    when cnt &lt; 10 do cnt := cnt + 1;
+    edge remove when cnt &gt;  0 do cnt := cnt - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>buffer</code> initially contains five items (<code>cnt = 5</code>). As long as there
+is room in the buffer (<code>cnt &lt; 10</code>), an item can be added (event <code>add</code>) to
+the buffer. As long as the buffer is not empty (<code>cnt &gt; 0</code>), an item can be
+removed (event <code>remove</code>) from the buffer. The following is a potential
+simulation trace:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/print/trace_normal.png" alt="trace normal">
+</div>
+</div>
+<div class="paragraph">
+<p>In the initial state (S1), variable <code>cnt</code> has value <code>5</code>. An item is then
+added (transition for the event <code>add</code>), resulting in a new state (S2), where
+<code>cnt</code> has value <code>6</code>. After that, another item is added, leading to state
+S3, where <code>cnt</code> has value <code>7</code>. Finally, an item is removed by means of a
+transition for event <code>remove</code>, leading to state S4, where <code>cnt</code> has value
+<code>6</code> again.</p>
+</div>
+<div class="paragraph">
+<p>As can be seen in the figure, the initial state (S1) has no incoming
+transition. Furthermore, the last/final state (S4) has no outgoing
+transition. As we&#8217;ll see later, that poses some difficulties in applying the
+transition centric view. To get around these limitations, the trace is extended
+as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/print/trace_extended.png" alt="trace extended">
+</div>
+</div>
+<div class="paragraph">
+<p>A transition with the <em>initial</em> label is added before the initial state, and a
+transition with the <em>final</em> label is added after the final state. This ensures
+that all states have an incoming and outgoing transition. These two added
+transitions are <em>virtual</em>, they don&#8217;t actually exist. They are added only for
+the benefit of print output. That is, they don&#8217;t affect the simulation behavior
+of the model, and are thus not part of the 'real' trace.</p>
+</div>
+<div class="paragraph">
+<p>The added 'initial' virtual transition has no source state, and the added
+'final' virtual transition has no target state. Since in the transition centric
+view every transition should have a source and a target state, we add the
+initial state (S1) as source state (S0) for the 'initial' transition, and the
+final state (S4) as target state (S5) for the 'final' transition. This way,
+every transition (whether virtual or real) has a source and target state, and
+fits the transition centric view. For the 'initial' and 'final' virtual
+transitions, the source and target states are thus the same (S0 = S1, S4 = S5).</p>
+</div>
+<div class="paragraph">
+<p>The trace with added virtual 'initial' and 'final' transitions, and with the
+duplicates (S0 and S5) of the source and final states, is called the
+<em>extended trace</em>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-specifying-the-text-to-print">Specifying the text to print</h8>
+<div class="paragraph">
+<p>Every print declaration must specify <em>what</em> to print, using CIF expressions.
+These CIF expressions can for instance refer to variables from the CIF model.
+Since variables can change values, it is important to know in which state the
+expression is evaluated. In the transition centric view, we have two states to
+choose from, the pre/source state and the post/target state. The following
+variants are supported to specify what to print:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print EXPR;
+print pre EXPR;
+print post EXPR;
+print pre EXPR post EXPR;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first variant has only one expression, which is printed in the post/target
+state. The third variant is identical, but explicitly indicates that the
+post/target state is used. The second variant also has a single expression, but
+is evaluated in the pre/source state. The fourth variant has two expression,
+one of which is evaluated in the pre/source state, and one of which is
+evaluated in the post/target state. The first three variants only print one
+piece of text per transition, while the fourth variant prints two pieces of
+text per transition.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print &quot;a&quot;;
+print pre x post x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first example prints <code>a</code> after each transition. The second example prints
+the value of variable <code>x</code> as it was before the transition, as well as the
+value of variable <code>x</code> as it is after the transition, for each transition.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-quoting-and-escaping">Quoting and escaping</h8>
+<div class="paragraph">
+<p>The expressions that indicate what text to print may be of any type, and the
+result of evaluating the expression is converted to a textual representation
+that closely resembles the textual syntax of CIF. For string literals this
+means that the text is escaped, and double quotes are added. If however the
+result of the expression is a <code>string</code> typed value, then that string is used
+'as is' (without quoting, and without escaping). Thus, consider the following
+example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print [&quot;a\&quot;b&quot;];
+print &quot;a\&quot;b&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first print declaration prints a list that contains a single string value,
+while the second print declaration prints the single string value directly.
+This results in the following printed output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">[&quot;a\&quot;b&quot;]
+a&quot;b</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That is, in general string values are quoted and escaped, as is the case for
+the first example, where the result is a list. However, if the entire result
+is a string, as is the case with the second example, the string value is used
+'as is', without quoting and without escaping.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-transition-filtering">Transition filtering</h8>
+<div class="paragraph">
+<p>It is possible to filter the transitions to which print declarations apply, by
+looking at the kind of the transitions (their labels). The following transition
+filters are available:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 14.2857%;">
+<col style="width: 28.5714%;">
+<col style="width: 57.1429%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Filter</th>
+<th class="tableblock halign-left valign-top">Matches</th>
+<th class="tableblock halign-left valign-top">Does not match</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>event</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All event transitions, including those for the <code>tau</code> event.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All time and virtual transitions.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>time</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All time transitions.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All event and virtual transitions.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">e</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All transitions for event <code>e</code>.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All time and virtual transitions, as well as all transitions for
+'other' events (including those for the <code>tau</code> event).</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>initial</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The single virtual <em>initial</em> transition.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All event and time transitions, as well as the single virtual <em>final</em> transition.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>final</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The single virtual <em>final</em> transition.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">All event and time transitions, as well as the single virtual <em>initial</em> transition.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Transition filters may be combined, leading to a combined transition filter
+that matches if any of the individual transition filters matches. The
+individual filters must be separated by commas.</p>
+</div>
+<div class="paragraph">
+<p>Transition filtering is optional. If no transition filter is supplied, the
+default transition filter is used, which is <code>initial, event, time</code>. That is,
+by default output is printed for all transitions, except for the <em>final</em>
+virtual transition.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print EXPR for e;
+print EXPR for time, event;
+print EXPR for initial, final;
+print EXPR for machine1.start, machine2.start;
+print EXPR;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first example prints only for transitions for event <code>e</code>. That is, time
+transitions and virtual transitions, as well as transitions for all other
+events, are filtered out. The second example prints only for event and time
+transitions, and thus filters out the virtual transitions. The third example
+prints only for the virtual transitions, and thus filters out all 'real'
+transitions (the event and time transitions). The fourth example prints only
+for transitions for the <code>start</code> events declared in <code>machine1</code> and
+<code>machine2</code> (which could for instance be automata), and filters out time
+transitions, virtual transitions, and transitions for all other events. The
+fifth example does not specify a filter, and thus prints for the <em>initial</em>
+virtual transition, as well as all event and time transitions, but excludes
+the <em>final</em> virtual transition.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-state-filtering">State filtering</h8>
+<div class="paragraph">
+<p>It is possible to filter the transitions to which print declarations apply,
+by looking at the pre/source and post/target states of the transitions.
+The following variants are supported for state filtering:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print EXPR when PRED;
+print EXPR when pre PRED;
+print EXPR when post PRED;
+print EXPR when pre PRED post PRED;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first variant has only one predicate, which is evaluated in the post/target
+state. The third variant is identical, but explicitly indicates that the
+post/target state is used. For both these variants, text is only printed if the
+post/target state satisfies the given predicate. That is, if the predicate
+evaluated in the post/target state of the transition results in value <code>true</code>,
+text may be printed. Otherwise, no text is printed for that transition.</p>
+</div>
+<div class="paragraph">
+<p>The second variant also has a single predicate, but is evaluated in the
+pre/source state. Text is thus only printed if the pre/source state satisfies
+the given predicate.</p>
+</div>
+<div class="paragraph">
+<p>The fourth variant has two predicates, one of which is evaluated in the
+pre/source state, and one of which is evaluated in the post/target state. Text
+is only printed if the pre/source state satisfies the first predicate, and the
+post/target state satisfies the second predicate. If either of the states does
+not satisfy its corresponding predicate, no text is printed for that
+transition.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print &quot;a&quot;;
+print &quot;b&quot; when aut.loc;
+print &quot;c&quot; when pre aut.loc;
+print &quot;d&quot; when pre x mod 2 = 0 post x mod 2 = 1;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first example prints <code>a</code> after each transition, and does not restrict the
+pre/source or post/target states. The second example only prints <code>b</code> for
+transitions that end in location <code>loc</code> of automaton <code>aut</code>. The third
+example only prints <code>c</code> for transitions that start in location <code>loc</code> of
+automaton <code>aut</code>. The fourth example only prints <code>d</code> for transitions where
+the value of variable <code>x</code> is even before the transition, and odd after the
+transition.</p>
+</div>
+<div class="paragraph">
+<p>State filtering is thus optional. If no pre/source state predicate is
+specified, the default is <code>true</code>. Similarly, if no post/target state
+predicate is specified, the default is <code>true</code> as well.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-combining-filters">Combining filters</h8>
+<div class="paragraph">
+<p>The transition and state filters are all optional. If however both a transition
+filter and a state filter are specified, they must both match in order for text
+to be printed. Consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print time for time when time &gt; 3;
+print x for e when pre x &lt; 3 post x &gt; 5;
+print pre y post y when pre y = 5;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the first example, the value of variable <code>time</code> is printed after time
+transitions, if after those time transitions the value of variable <code>time</code> is
+strictly larger than three. For the second example, the value of variable <code>x</code>
+is printed after transitions for event <code>e</code> if before such transitions the
+value of variable <code>x</code> is strictly less than three, and after such transitions
+the value of variable <code>x</code> is strictly larger than <code>5</code>. For the third
+example, the value of variable <code>y</code> is printed twice for all 'default'
+transitions, once in the pre/source state, and once in the post/target state,
+but only if the value of variable <code>y</code> before the transition is exactly five.
+So if the condition over the pre/source state does not hold, the value of
+variable <code>y</code> is not printed, not for the pre/source state, and also not for
+the post/target state.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-printdecl-file">Output file/target</h8>
+<div class="paragraph">
+<p>By default text is printed to the console, to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard output stream</a>,
+usually called 'stdout'. It
+is however possible to explicitly specify the file or special target to which
+the output is to be printed. Consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print ... file &quot;txt_files/some_file.txt&quot;;
+print ... file &quot;../files/some_file.txt&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the first print declaration, the simulator will look for a <code>txt_files</code>
+directory in the same directory as the CIF file, and print text to a file named
+<code>some_file.txt</code> in that directory. For the second print declaration, the
+simulator will look for a <code>files</code> directory in the parent directory of the
+directory that contains the CIF file, and print text to a file named
+<code>some_file.txt</code> in that <code>files</code> directory.</p>
+</div>
+<div class="paragraph">
+<p>Files and directories are separated using slashes (<code>/</code>), regardless of the
+used operating system. It is also allowed to use backslashes (<code>\</code>), which are
+more common on Microsoft Windows operating systems, but they need to be escaped
+as <code>\\</code> for this to work, making it easier to use slashes (<code>/</code>) instead.</p>
+</div>
+<div class="paragraph">
+<p>The following special non-file targets are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>":stdout"</code>: prints to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard output stream</a>.
+In Eclipse, the text ends up on the console, as black text.</p>
+</li>
+<li>
+<p><code>":stderr"</code>: prints to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard error stream</a>.
+In Eclipse, the text ends up on the console, as red text.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Besides these local file indications, CIF also supports global
+<a href="#tools-cifsim-output-print-chapter-ref-printfile">print file declarations</a>,
+which influence the default, in case no local file or special target is
+specified.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-scoping">Scoping</h8>
+<div class="paragraph">
+<p>Print file declarations can be specified in all components. That is, they can
+be specified in the top level scope of the specification, in groups and group
+definitions, as well as in automata and automaton definitions.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-ref-printfile">Print file declaration</h7>
+<div class="paragraph">
+<p>
+
+
+
+<a href="#tools-cifsim-output-print-chapter-ref-printdecl">Print declarations</a> can
+<a href="#tools-cifsim-output-print-ref-printdecl-file">specify</a> the file or
+special target to which text is to printed. If they don&#8217;t specify anything,
+the default is to print to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard output stream</a>,
+usually called 'stdout'.
+This default can be influenced by means of <em>print file declarations</em>, which act
+as a sort of global declaration of the file or special target. A typical print
+file declaration looks like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;some_file.txt&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-paths">Paths</h8>
+<div class="paragraph">
+<p>It is possible to use relative (or absolute) paths for the files. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;txt_files/some_file.txt&quot;;
+printfile &quot;../files/some_file.txt&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the first print file declaration, the simulator will look for a
+<code>txt_files</code> directory in the same directory as the CIF file, and print text
+to a file named <code>some_file.txt</code> in that directory. For the second print file
+declaration, the simulator will look for a <code>files</code> directory in the parent
+directory of the directory that contains the CIF file, and print text to a file
+named <code>some_file.txt</code> in that <code>files</code> directory.</p>
+</div>
+<div class="paragraph">
+<p>Files and directories are separated using slashes (<code>/</code>), regardless of the
+used operating system. It is also allowed to use backslashes (<code>\</code>), which are
+more common on Microsoft Windows operating systems, but they need to be escaped
+as <code>\\</code> for this to work, making it easier to use slashes (<code>/</code>) instead.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-special-targets">Special targets</h8>
+<div class="paragraph">
+<p>The following special non-file targets are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>":stdout"</code>: prints to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard output stream</a>.
+In Eclipse, the text ends up on the console, as black text.</p>
+</li>
+<li>
+<p><code>":stderr"</code>: prints to the
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard error stream</a>.
+In Eclipse, the text ends up on the console, as red text.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-scoping-2">Scoping</h8>
+<div class="paragraph">
+<p>Print file declarations can (just as print declarations) be specified in all
+components. That is, they can be specified in the top level scope of the
+specification, in groups and group definitions, as well as in automata and
+automaton definitions. A print file declaration that is specified in a certain
+scope applies to that scope, as well as all child scopes that don&#8217;t have a
+print file declaration of their own. Additionally, print file declarations
+apply to all print declarations without local file declarations, in scopes to
+which the print file declarations apply.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;file1.txt&quot;;
+
+print 5;
+print 6 file &quot;file2.txt&quot;;
+
+group g:
+  printfile &quot;file3.txt&quot;;
+
+  print 7;
+  print 8;
+  print 9 file &quot;file4.txt&quot;;
+
+  group h:
+    printfile &quot;file5.txt&quot;;
+  end
+
+  group i:
+    print 10;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The print declaration that prints <code>5</code> is declared in the top level scope of
+the specification, and does not have a local file declaration. As such, the
+print file declaration from the top level scope (<code>file1.txt</code>) applies to it.
+The print declaration that prints <code>6</code> is declared in the same scope, but has
+a local print file declaration (<code>file2.txt</code>). The local print file
+declaration (<code>file2.txt</code>) overrides the print file declaration from the top
+level scope (<code>file1.txt</code>).</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g</code> also has a print file declaration (<code>file3.txt</code>). This overrides
+the print file declaration from the top level scope (<code>file1.txt</code>). The print
+file declaration from group <code>g</code> (<code>file3.txt</code>) thus applies to the print
+declarations that print <code>7</code> and <code>8</code>, as they are declared in the same
+scope, and don&#8217;t have local print file declarations. The print declaration that
+prints <code>9</code> has a local print file declaration (<code>file4.txt</code>), and as such
+the print file declaration from group <code>g</code> (<code>file3.txt</code>) does not apply to
+it.</p>
+</div>
+<div class="paragraph">
+<p>The print file declaration (<code>file5.txt</code>) from group <code>g.h</code> does not apply to
+any print declarations. The simulator will open the file for writing, but no
+text will be printed to the file. A warning is printed to the console, to
+indicate the potential problem. However, no such warnings are ever printed for
+special target 'stdout'.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g.i</code> does not have a print file declaration, so the print file
+declaration (<code>file3.txt</code>) from group <code>g</code> (the parent scope of group
+<code>g.i</code>) applies to the print declaration that prints <code>10</code>.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#tools-cif2cif-chapter-print-file-into-decls">Push print file declarations into print declarations</a> CIF to CIF
+transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-uniqueness-2">Uniqueness</h8>
+<div class="paragraph">
+<p>In every scope (or component), in principle at most one print file declaration
+may be specified. The exception is that for a single scope, specified in
+multiple CIF files (when imports are used), if the print file declarations
+refer to the same target, they are merged. If however the two CIF files refer
+to different targets, this is still considered an error. It is also considered
+an error if two print file declarations are present in a single scope, in a
+single file, regardless of whether they refer to the same target or not. In
+the end, after processing imports, for every scope there must be a unique print
+file declaration, if one is declared at all.</p>
+</div>
+<div class="paragraph">
+<p>If the same file or special target is used/specified multiple times, in
+different print file declarations or locally in print declarations, this is
+detected by the simulator. The simulator only opens a stream to the file or
+special target once, and prints to it all the output of all print declarations
+that apply to that file or special target. For instance, consider the following
+CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print 5 file &quot;some_file.txt&quot;;
+print 6 file &quot;some_file.txt&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Even though both print declarations specify a file locally, they use the same
+file. The output of both print declarations is thus printed to the same file.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-ref-sim">Simulation with print output</h7>
+<div class="paragraph">
+<p>
+Once a CIF specification with print declarations is available, the simulator
+can be used to generate textual output. This page discusses the following
+simulation related topics:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-ref-sim-overwrite">Overwriting files</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-ref-sim-line-based">Line-based output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-ref-sim-order">Output order</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-ref-sim-enable-disable">Enabling/disabling print output</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-sim-overwrite">Overwriting files</h8>
+<div class="paragraph">
+<p>If output is printed to files, those files are always overwritten for each
+simulation. That is, at the start of the simulation, the output file is removed
+if present. A new empty file is then created, to which the output is printed
+during the simulation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-sim-line-based">Line-based output</h8>
+<div class="paragraph">
+<p>Output is printed in a line-based fashion. That is, every time text is printed
+for a <a href="#tools-cifsim-output-print-chapter-ref-printdecl">print declaration</a>, the
+text is printed on a new line. If a single print declaration has two texts, one
+for the pre/source state and one for the post/target state, both texts are
+printed on new lines.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-sim-order">Output order</h8>
+<div class="paragraph">
+<p>The simulator guarantees that once text is printed for a certain state, no text
+shall ever be printed during that same simulation, for previous states. That
+is, output text is ordered by 'increasing' states. This guarantee holds for
+file output. For the special targets
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard output stream</a>
+(stdout) and
+<a href="http://en.wikipedia.org/wiki/Standard_streams">standard error stream</a>
+(stderr), the output may get mixed, for instance on the Eclipse console.</p>
+</div>
+<div class="paragraph">
+<p>The order in which text is printed for different print declarations that print
+text for the same state, is determined by the order in which the print
+declarations are specified in the CIF specification, from top to bottom. The
+order is determined per file or special target, after elimination of imports,
+component definition/instantiation, etc. A depth-first traversal of the
+component hierarchy is used, where the print declarations of components are
+considered before the print declarations of their children.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-sim-enable-disable">Enabling/disabling print output</h8>
+<div class="paragraph">
+<p>Print output is enabled by default. It can be disabled by reducing the
+types of <a href="#tools-cifsim-output-chapter-normal">normal console output</a> using the
+<b class="menuref">Normal output</b>
+option (<b class="menuref">Output</b>
+category). Using that
+option it is also possible to disable all other forms of normal output, to be
+able to see only the print output on the console. Print output can also be
+disabled by changing the <a href="#tools-cifsim-output-mode">output mode</a> to
+<em>Error</em> or to <em>Warning</em>, instead of <em>Normal</em>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-undoreset-2">Undo/reset</h8>
+<div class="paragraph">
+<p>By <a href="#tools-cifsim-input-history-reset-undo">undoing</a> one or more transitions,
+or by <a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation, the
+state may change. However, only previously taken transitions are undone. No new
+transitions are taken by undoing transitions, or by resetting the simulation.
+As such, no new print output is generated.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-print-chapter-ref-fmt">Text formatting details</h7>
+<div class="paragraph">
+<p>
+
+
+For text formatting, CIF features the <code>fmt</code> standard library function. This
+page describes all the details of using that function. For more introductory
+information and examples of the use of the <code>fmt</code> function for print output,
+see the <a href="#tools-cifsim-output-print-chapter-tut-fmt">Text formatting tutorial</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-pattern">Format patterns</h8>
+<div class="paragraph">
+<p>The <code>fmt</code> function requires at least one argument, the <em>format pattern</em>. The
+remaining arguments of the function are the <em>values</em> that can be inserted into
+the format pattern, to allow variable output. For instance, consider:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%s %s&quot;, x, y)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, <code>"%s %s"</code> is the format pattern, <code>x</code> is the first value, and <code>y</code> is
+the second value.</p>
+</div>
+<div class="paragraph">
+<p>The first argument, the format pattern, must be a string literal. That is, it
+must be text between double quotes (<code>"</code>).</p>
+</div>
+<div class="paragraph">
+<p>The real usefulness of format patterns comes from the inclusion of the values
+into the format pattern. The values can be included by inserting format
+specifiers (e.g. <code>%s</code>) into the format pattern. Multiple values may be used
+by including multiple format specifiers. The first format specifier includes
+the first value, the second format specifier includes the second value, etc.</p>
+</div>
+<div class="paragraph">
+<p>The result of <code>fmt</code> applied to it arguments is the text of the format
+pattern, with the format specifiers replaced by their corresponding values.</p>
+</div>
+<div class="paragraph">
+<p>Format specifiers can be customized to influence how their corresponding values
+are to be inserted. For instance, consider:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%s %.2e&quot;, x, y)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Then, assuming variable <code>x</code> has value <code>3</code> and variable <code>y</code> has value
+<code>5.6</code>, the result of the <code>fmt</code> function is <code>3 5.60e+00</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-specifiers">Specifiers</h8>
+<div class="paragraph">
+<p>Format patterns support various types of format specifiers, each performing a
+different kind of conversion on its corresponding value. The following table
+lists the available conversions, the types of values that they support, and a
+short description of the output of the conversion:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Conversion</th>
+<th class="tableblock halign-left valign-top">Supported types</th>
+<th class="tableblock halign-left valign-top">Output</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-b">%b</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Either <code>true</code> or <code>false</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-b">%B</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Same as <code>%b</code>, but in upper case.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-d">%d</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Decimal integer notation.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-x">%x</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Hexadecimal integer notation, using <code>0-9</code> and <code>a-f</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-x">%X</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Hexadecimal integer notation, using <code>0-9</code> and <code>A-F</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-e">%e</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Computerized scientific notation, using <code>e</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-e">%E</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Computerized scientific notation, using <code>E</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-f">%f</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Decimal number notation.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-g">%g</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">General scientific notation, using <code>e</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-g">%G</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">General scientific notation, using <code>E</code>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-s">%s</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">any type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">General textual representation.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-output-print-ref-fmt-s">%S</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">any type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">General textual representation, in upper case.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>For the <code>%d</code>, <code>%x</code>, and <code>%X</code> specifiers, <code>int</code> typed values are
+supported, as are integer types with ranges (e.g. <code>int[0..5]</code>). The <code>%s</code>
+and <code>%S</code> specifiers support values of any type.</p>
+</div>
+<div class="paragraph">
+<p>The output of the <code>%B</code> specifier is identical to the output of the <code>%b</code>
+specifier, where all letters in the output are converted to upper case letters.
+This duality (lower case specifier conversion versus upper case specifier
+conversion) is present in all conversions that can have letters in their
+output.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-syntax">Specifier syntax</h8>
+<div class="paragraph">
+<p>Specifiers can be customized to influence the conversion of their corresponding
+values to text. The general syntax of specifiers is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>%[value_index$][flags][width][.precision]conversion</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>All specifiers start with a percentage character (<code>%</code>).</p>
+</div>
+<div class="paragraph">
+<p>They are optionally followed by a value index. If the value index is specified,
+it must be followed by a dollar sign (<code>$</code>). The value index is a positive
+decimal integer indicating the position of the value in the value list. The
+first value is referenced by <code>1$</code>, the second by <code>2$</code>, etc. Index zero and
+indices starting with zero are not allowed.</p>
+</div>
+<div class="paragraph">
+<p>The index is followed by optional flags. Flags are characters that modify the
+output, and may be specified in any order. Each flag may only be specified once
+per specifier. The set of valid flags depends on the conversion.</p>
+</div>
+<div class="paragraph">
+<p>After the flags, an optional width may be specified. The width is a
+non-negative decimal integer indicating the minimum number of characters that
+should be included in the result, for that specific specifier.</p>
+</div>
+<div class="paragraph">
+<p>After the width, a precision may optionally be specified. A precision is always
+preceded by a dot (<code>.</code>). The precision is a non-negative decimal integer used
+to restrict the number of characters. The specific behavior depends on the
+conversion.</p>
+</div>
+<div class="paragraph">
+<p>Specifiers always end with the character indicating the conversion to perform.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-indexing">Implicit and explicit indexing</h8>
+<div class="paragraph">
+<p>By default, format specifiers are processed in order. The first specifier then
+implicitly uses the first value, the second specifier implicitly uses the
+second value, etc. However, if an explicit value index is given, that explicit
+index indicates the value to use, and the specifier with the explicit index
+does not influence subsequent implicit indexing. That is, consider the
+following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%s %1$s %3$f %d %f %1$s&quot;, 1, 2, 3.0);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first specifier (<code>%s</code>) does not specify an explicit index, and thus
+implicitly uses the first value. The second specifier (<code>%1$s</code>) explicitly
+specifies index <code>1</code> and thus uses the first value. The third specifier
+(<code>%3$f</code>) explicitly specifies index <code>3</code> and thus uses the third value. The
+fourth specifier (<code>%d</code>) is the second specifier to not explicitly specify an
+index, and thus implicitly uses the second value. The fifth specifier (<code>%f</code>)
+is the third specifier to not explicitly specify an index, and thus implicitly
+uses the third value. Finally, the sixth specifier (<code>%1$s</code>) explicitly
+specifies index <code>1</code>, and thus uses the first value. The result of the
+formatting is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>1 1 3.000000 2 3.000000 1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-flags">Flags</h8>
+<div class="paragraph">
+<p>The following flags are available:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 7.1428%;">
+<col style="width: 42.8576%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Flag</th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-b">b/B</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-d">d</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-x">x/X</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-e">e/E</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-f">f</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-g">g/G</a></th>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-output-print-ref-fmt-s">s/S</a></th>
+<th class="tableblock halign-left valign-top">Effect</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result will be left-justified.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>+</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result will always include a sign.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">(space)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result will include a leading space for non-negative values.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result will be zero-padded.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>,</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The result will include commas (<code>,</code>) as grouping separator.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The first column shows the available flags, the minus (<code>-</code>), the plus
+(<code>+</code>), the space, the zero (<code>0</code>), and the comma (<code>,</code>). The middle columns
+indicate for each of the different conversions, whether the flags are
+supported. The last column gives short descriptions of the effects of the
+flags.</p>
+</div>
+<div class="paragraph">
+<p>The <code>-</code> flag can be used to left-justify the text in case a
+<a href="#tools-cifsim-output-print-ref-fmt-width">width</a> is used, as the default
+is to right-justify. It is supported by all format specifiers. The <code>-</code> flag
+requires the use of a width, and can not be combined with the <code>0</code> flag.</p>
+</div>
+<div class="paragraph">
+<p>The <code>+</code> flag can be used to always include a sign. It only applies to certain
+numeric format specifiers. That is, by default non-negative numbers don&#8217;t have
+a sign, and negative numbers start with a <code>-</code> character. By including the
+<code>+</code> flag, non-negative numbers start with a <code>+</code> character, and negative
+numbers still start with a <code>-</code> character. The <code>+</code> and space flags can not
+be combined.</p>
+</div>
+<div class="paragraph">
+<p>The space flag can be used force a leading space to be included for
+non-negative values. It only applies to certain numeric format specifiers. That
+is, by default non-negative numbers don&#8217;t have a sign, and negative numbers
+start with a <code>-</code> character. By including the space flag, non-negative numbers
+start with a space character, and negative numbers still start with a <code>-</code>
+character. The <code>+</code> and space flags can not be combined.</p>
+</div>
+<div class="paragraph">
+<p>The <code>0</code> flag can be used to zero pad numbers, in case a
+<a href="#tools-cifsim-output-print-ref-fmt-width">width</a> is used, the text is
+right-justified, and the text is shorter than the width. It only applies to
+certain numeric format specifiers. The <code>0</code> flag requires the use of a width,
+and can not be combined with left-justification (the <code>-</code> flag).</p>
+</div>
+<div class="paragraph">
+<p>The <code>,</code> flag can be used to include commas (<code>,</code>) as grouping separators.
+It only applies to certain numeric format specifiers. That is, by default
+numbers are just a sequence of digits. By using the <code>,</code> flag, longer numbers
+are placed in groups of thousands and the 'thousands separator' (the <code>,</code>
+character) occurs every three digits. For instance, <code>12345678</code> would then
+become <code>12,345,678</code>.</p>
+</div>
+<div class="paragraph">
+<p>Further details on the effects of flags are given in the sections describing
+the individual conversions.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-width">Width</h8>
+<div class="paragraph">
+<p>The width is a non-negative decimal integer indicating the minimum number of
+characters that should be included in the result, for that specific specifier.
+If no width is given, there is no minimum number of characters.</p>
+</div>
+<div class="paragraph">
+<p>If the textual representation of the value is shorter than the width, the
+text is right-justified. That is, the text will be padded by spaces to the
+left of the text until the total number of characters equals the width. To
+left-justify the text, use the <code>-</code> flag in combination with a width. This
+results in padding with spaces to the right of the text.</p>
+</div>
+<div class="paragraph">
+<p>If the <code>0</code> flag is specified, and the textual representation of the value is
+shorter than the width, <code>0</code> padding is used (to the left, as the <code>-</code> flag
+may not be used when the <code>0</code> flag is used). See the sections describing the
+individual number related specifiers for further details.</p>
+</div>
+<div class="paragraph">
+<p>If the text is longer than the width, the whole text is included in the result
+(it is not truncated), and the width essentially has no effect.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-b"><code>%b</code> and <code>%B</code> specifiers</h8>
+<div class="paragraph">
+<p>The <code>%b</code> and <code>%B</code> specifiers convert boolean values to text. The specifiers
+only support boolean values. The specifiers support explicit indices, widths,
+and the <code>-</code> flag. They don&#8217;t supports any of the other flags, and precisions.</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Value <code>true</code> results in the text <code>true</code>, and value <code>false</code> results
+in the text <code>false</code>.</p>
+</li>
+<li>
+<p>For the <code>%B</code> specifier, the text is converted to upper case, i.e.
+<code>TRUE</code> and <code>FALSE</code> respectively.</p>
+</li>
+<li>
+<p>If a width is specified, and the resulting text so far is shorter than that
+width, spaces are added until the given width is reached. If the <code>-</code> flag
+is given, spaces are added to the right, otherwise spaces are added to the
+left.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>b</code> has value <code>true</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%b&quot;, b);       // true
+fmt(&quot;%B&quot;, b);       // TRUE
+fmt(&quot;_%10b_&quot;, b);   // _      true_
+fmt(&quot;_%-10b_&quot;, b);  // _true      _</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-d"><code>%d</code> specifier</h8>
+<div class="paragraph">
+<p>The <code>%d</code> specifier converts integer numbers to text, using decimal
+representations of integers. The specifier only support integer values
+(<code>int</code> typed values, and values of integer types with ranges, such as
+<code>int[0..5]</code>). The specifier supports explicit indices, widths, and all flags.
+It doesn&#8217;t support precisions.</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The resulting text is initialized to the decimal representation of the
+absolute value of the integer number. It thus consists of only the digits
+<code>0</code> through <code>9</code>.</p>
+</li>
+<li>
+<p>If the <code>,</code> flag is given, thousand separators (<code>,</code> characters) are
+inserted as needed, for longer numbers.</p>
+</li>
+<li>
+<p>If the number is negative, it is prefixed with a <code>-</code> character.</p>
+</li>
+<li>
+<p>If the number is non-negative, and the space flag is given, a space is added
+before the text.</p>
+</li>
+<li>
+<p>If the number is non-negative, and the <code>+</code> flag is given, a <code>+</code> character
+is added before the text.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>0</code>
+flag is given, then <code>0</code> characters are added before the other digits, and
+after any non-digit characters, until the desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>-</code>
+flag is given, then space characters are added before the result, until the
+desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and neither
+the <code>0</code> flag nor the <code>-</code> flag is given, then space characters are added
+after the result, until the desired width is reached.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>x</code> has value <code>12345</code> and <code>y</code> has value
+<code>-2345</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%d&quot;, x);           // 12345
+fmt(&quot;%,d&quot;, x);          // 12,345
+fmt(&quot;_%10d_&quot;, x);       // _     12345_
+fmt(&quot;_%-10d_&quot;, x);      // _12345     _
+fmt(&quot;_%0,10d_&quot;, x);     // _000012,345_
+fmt(&quot;_%- 10d_&quot;, x);     // _ 12345    _
+fmt(&quot;_%- 10d_&quot;, y);     // _-2345     _
+fmt(&quot;_%-+10d_&quot;, x);     // _+12345    _
+fmt(&quot;_%-+10d_&quot;, y);     // _-2345     _
+fmt(&quot;_%3d_&quot;, x);        // _12345_</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-x"><code>%x</code> and <code>%X</code> specifiers</h8>
+<div class="paragraph">
+<p>The <code>%x</code> and <code>%X</code> specifiers convert integer numbers to text, using
+hexadecimal representations of integers. The specifiers only support integer
+values (<code>int</code> typed values, and values of integer types with ranges, such as
+<code>int[0..5]</code>). The specifiers supports explicit indices, widths, and the <code>-</code>
+and <code>0</code> flags. They don&#8217;t supports any of the other flags, and precisions.</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The signed integer number in range [-2,147,483,648 .. 2,147,483,647] is
+first converted to an unsigned integer number in range [0 .. 4,294,967,295].
+That is, for negative numbers, 2<sup>32</sup> is added.</p>
+</li>
+<li>
+<p>The resulting text is initialized to the hexadecimal representation of the
+unsigned integer number. It thus consists the digits <code>0</code> through <code>9</code> and
+letters <code>a</code> through <code>f</code>.</p>
+</li>
+<li>
+<p>For the <code>%X</code> specifier, the text is converted to upper case, i.e. letters
+<code>a</code> through <code>f</code> are converted to letters <code>A</code> through <code>F</code>.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>0</code>
+flag is given, then <code>0</code> characters are added before the result, until the
+desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>-</code>
+flag is given, then space characters are added before the result, until the
+desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and neither
+the <code>0</code> flag nor the <code>-</code> flag is given, then space characters are added
+after the result, until the desired width is reached.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>a</code> has value <code>5543</code> and <code>b</code> has value
+<code>-1</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%x&quot;, a);           // 15a7
+fmt(&quot;0x%x&quot;, a);         // 0x15a7
+fmt(&quot;0x%X&quot;, a);         // 0x15A7
+fmt(&quot;0x%X&quot;, b);         // 0xFFFFFFFF
+fmt(&quot;_%10x_&quot;, a);       // _      15a7_
+fmt(&quot;_%-10x_&quot;, a);      // _15a7      _
+fmt(&quot;_%3x_&quot;, a);        // _15a7_</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-e"><code>%e</code> and <code>%E</code> specifiers</h8>
+<div class="paragraph">
+<p>The <code>%e</code> and <code>%E</code> specifiers convert real numbers to text, using
+computerized scientific notation. The specifiers only support real
+values. The specifiers supports explicit indices, widths, the <code>-</code>, <code>+</code>,
+space, and <code>0</code> flags, and precisions. They don&#8217;t supports any of the other
+flags.</p>
+</div>
+<div class="paragraph">
+<p>Real numbers include a <em>decimal mark</em>, a symbol used to separate the integer
+part from the fractional part of number, when written in decimal form. This
+decimal mark is denoted by a dot (<code>.</code>).</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The decimal mark of the real number is shifted to ensure that at most one
+non-zero digit occurs to the left of it. That is, for real numbers <code>0.012</code>,
+<code>0.12</code>, <code>1.2</code>, <code>12.0</code>, and <code>120.0</code>, the decimal mark is shifted
+-2, -1, 0, 1, and 2 digits to the left, respectively. This results in the
+following real numbers: <code>1.2</code>, <code>1.2</code>, <code>1.2</code>, <code>1.2</code>, and <code>1.2</code>.
+For zero, the decimal mark is not shifted.</p>
+</li>
+<li>
+<p>The single decimal digit before the decimal mark is included in the result.
+If there is no digit before the decimal mark (in case the real number is
+zero), a single <code>0</code> digit is included in the result.</p>
+</li>
+<li>
+<p>If the precision is specified and is not zero, or if the default precision
+is used, a dot (<code>.</code>) is added after the single digit.</p>
+</li>
+<li>
+<p>The digits after the decimal mark are added after the dot. Exactly
+'precision' digits will be added. If no precision is specified, it defaults
+to <code>6</code> digits after the dot. If not enough digits are available after the
+dot, additional <code>0</code> characters are added after them, to reach the desired
+precision. If too many digits are available after the dot, digits are removed
+from the right until the desired precision is reached. Rounding using the
+'half up' algorithm is used to ensure correct results in case digits are
+removed.</p>
+</li>
+<li>
+<p>If the <code>%e</code> specifier is used, an <code>e</code> character is added to the end.
+If the <code>%E</code> specifier is used, an <code>E</code> character is added to the end.</p>
+</li>
+<li>
+<p>A sign character is added after that. That is, if the decimal mark was
+shifted a negative number of digits to the left, a <code>-</code> character is added,
+otherwise a <code>+</code> character is added.</p>
+</li>
+<li>
+<p>The number of digits that was shifted is added as a decimal number, at the
+end. At least two decimal digits are added, so if the number of digits that
+was shifted can be represented using a single decimal digit, a <code>0</code> is added
+between the <code>e</code> or <code>E</code> character and the number of digits that was
+shifted.</p>
+</li>
+<li>
+<p>If the real number is negative, the text is prefixed with a <code>-</code> character.</p>
+</li>
+<li>
+<p>If the real number is non-negative, and the space flag is given, a space is
+added before the text.</p>
+</li>
+<li>
+<p>If the real number is non-negative, and the <code>+</code> flag is given, a <code>+</code>
+character is added before the text.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>0</code>
+flag is given, then <code>0</code> characters are added before the other digits, and
+after any non-digit characters, until the desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>-</code>
+flag is given, then space characters are added before the result, until the
+desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and neither
+the <code>0</code> flag nor the <code>-</code> flag is given, then space characters are added
+after the result, until the desired width is reached.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>a</code> has value <code>12345.6789</code> and <code>b</code> has
+value <code>-0.00002345678</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%e&quot;, a);           // 1.234568e+04
+fmt(&quot;%E&quot;, a);           // 1.234568E+04
+fmt(&quot;%.3e&quot;, a);         // 1.235e+04
+fmt(&quot;%.3e&quot;, b);         // -2.346e-05
+fmt(&quot;_%20e_&quot;, a);       // _        1.234568e+04_
+fmt(&quot;_%-20e_&quot;, a);      // _1.234568e+04        _
+fmt(&quot;_%5e_&quot;, a);        // _1.234568e+04_
+fmt(&quot;_%020e_&quot;, a);      // _000000001.234568e+04_
+fmt(&quot;_%-+20e_&quot;, a);     // _+1.234568e+04       _
+fmt(&quot;_%-+20e_&quot;, b);     // _-2.345678e-05       _
+fmt(&quot;_%- 20e_&quot;, a);     // _ 1.234568e+04       _
+fmt(&quot;_%- 20e_&quot;, b);     // _-2.345678e-05       _</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-f"><code>%f</code> specifier</h8>
+<div class="paragraph">
+<p>The <code>%f</code> specifier converts real numbers to text, using a decimal number
+notation. The specifier only supports real values. The specifier supports
+explicit indices, widths, all flags, and precisions. That is, all features of
+format specifiers are supported.</p>
+</div>
+<div class="paragraph">
+<p>Real numbers include a <em>decimal mark</em>, a symbol used to separate the integer
+part from the fractional part of number, when written in decimal form. This
+decimal mark is denoted by a dot (<code>.</code>).</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The decimal digits before the decimal mark are included in the result.
+If there are no digits before the decimal mark, a single <code>0</code> digit is
+included in the result.</p>
+</li>
+<li>
+<p>If the <code>,</code> flag is given, thousand separators (<code>,</code> characters) are
+inserted as needed, for longer numbers.</p>
+</li>
+<li>
+<p>If the precision is specified and is not zero, or if the default precision
+is used, a dot (<code>.</code>) is added after the digits.</p>
+</li>
+<li>
+<p>The digits after the decimal mark are added after the dot. Exactly
+'precision' digits will be added. If no precision is specified, it defaults
+to <code>6</code> digits after the dot. If not enough digits are available after the
+dot, additional <code>0</code> characters are added after them, to reach the desired
+precision. If too many digits are available after the dot, digits are removed
+from the right until the desired precision is reached. Rounding using the
+'half up' algorithm is used to ensure correct results in case digits are
+removed.</p>
+</li>
+<li>
+<p>If the real number is negative, the text is prefixed with a <code>-</code> character.</p>
+</li>
+<li>
+<p>If the real number is non-negative, and the space flag is given, a space is
+added before the text.</p>
+</li>
+<li>
+<p>If the real number is non-negative, and the <code>+</code> flag is given, a <code>+</code>
+character is added before the text.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>0</code>
+flag is given, then <code>0</code> characters are added before the other digits, and
+after any non-digit characters, until the desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and the <code>-</code>
+flag is given, then space characters are added before the result, until the
+desired width is reached.</p>
+</li>
+<li>
+<p>If a width is given, the text so far is shorter than the width, and neither
+the <code>0</code> flag nor the <code>-</code> flag is given, then space characters are added
+after the result, until the desired width is reached.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>a</code> has value <code>12345.6789</code> and <code>b</code> has
+value <code>-0.00002345678</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%f&quot;, a);           // 12345.678900
+fmt(&quot;%f&quot;, b);           // -0.000023
+fmt(&quot;%.3f&quot;, a);         // 12345.679
+fmt(&quot;_%20f_&quot;, a);       // _        12345.678900_
+fmt(&quot;_%-20f_&quot;, a);      // _12345.678900        _
+fmt(&quot;_%-,20f_&quot;, a);     // _12,345.678900       _
+fmt(&quot;_%5f_&quot;, a);        // _12345.678900_
+fmt(&quot;_%020f_&quot;, a);      // _0000000012345.678900_
+fmt(&quot;_%-+20f_&quot;, a);     // _+12345.678900       _
+fmt(&quot;_%-+20f_&quot;, b);     // _-0.000023           _
+fmt(&quot;_%- 20f_&quot;, a);     // _ 12345.678900       _
+fmt(&quot;_%- 20f_&quot;, b);     // _-0.000023           _</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-g"><code>%g</code> and <code>%G</code> specifiers</h8>
+<div class="paragraph">
+<p>The <code>%g</code> and <code>%G</code> specifiers convert real numbers to text, using general
+scientific notation. The specifiers only support real values. The specifiers
+supports explicit indices, widths, all flags, and precisions. That is, all
+features of format specifiers are supported.</p>
+</div>
+<div class="paragraph">
+<p>Real numbers include a <em>decimal mark</em>, a symbol used to separate the integer
+part from the fractional part of number, when written in decimal form. This
+decimal mark is denoted by a dot (<code>.</code>).</p>
+</div>
+<div class="paragraph">
+<p>If the real number is is greater than or equal to 10<sup>-4</sup> but
+less than 10<sup>precision</sup>, the result is as <code>%f</code>. Otherwise, the
+result is as <code>%e</code> and <code>%E</code>, for <code>%g</code> and <code>%G</code> respectively. However,
+the total number of
+<a href="http://en.wikipedia.org/wiki/Significant_figures">significant digits</a>
+of the
+result is equal to the precision of the <code>%g</code> or <code>%G</code> specifier, and
+defaults to <code>6</code> if not specified. If the specified precision is <code>0</code>, it is
+taken to be <code>1</code> instead.</p>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>a</code> has value <code>12345.6789</code> and <code>b</code> has
+value <code>-0.00002345678</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%g&quot;, a);           // 12345.7
+fmt(&quot;%g&quot;, b);           // -2.34568e-05
+fmt(&quot;%G&quot;, b);           // -2.34568E-05
+fmt(&quot;%.3g&quot;, a);         // 1.23e+04
+fmt(&quot;_%20g_&quot;, a);       // _             12345.7_
+fmt(&quot;_%-20g_&quot;, a);      // _12345.7             _
+fmt(&quot;_%-,20g_&quot;, a);     // _12,345.7            _
+fmt(&quot;_%5g_&quot;, a);        // _12345.7_
+fmt(&quot;_%020g_&quot;, a);      // _000000000000012345.7_
+fmt(&quot;_%-+20g_&quot;, a);     // _+12345.7            _
+fmt(&quot;_%-+20g_&quot;, b);     // _-2.34568e-05        _
+fmt(&quot;_%- 20g_&quot;, a);     // _ 12345.7            _
+fmt(&quot;_%- 20g_&quot;, b);     // _-2.34568e-05        _</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-s"><code>%s</code> and <code>%S</code> specifiers</h8>
+<div class="paragraph">
+<p>The <code>%s</code> and <code>%S</code> specifiers convert any value to text. The specifiers
+support values of any type. The specifiers supports explicit indices, widths,
+and the <code>-</code> flag. They don&#8217;t supports any of the other flags, and precisions.</p>
+</div>
+<div class="paragraph">
+<p>The resulting text is constructed as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the value has a <code>string</code> type, the value of that string is used as is,
+without escaping and double quoting. Otherwise, the value is converted to
+a textual representation closely resembling the CIF textual syntax (ASCII
+syntax), with string values surrounded by double quotes, and with special
+characters (tabs, new lines, double quotes, and backslashes) escaped.</p>
+</li>
+<li>
+<p>For the <code>%S</code> specifier, the text is converted to upper case, i.e. letters
+<code>a</code> through <code>z</code> are converted to letters <code>A</code> through <code>Z</code>.</p>
+</li>
+<li>
+<p>If a width is specified, and the resulting text so far is shorter than that
+width, spaces are added until the given width is reached. If the <code>-</code> flag
+is given, spaces are added to the right, otherwise spaces are added to the
+left.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Here are some examples, assuming <code>x</code> has value <code>"aBcD"</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;%s&quot;, x);       // aBcD
+fmt(&quot;%S&quot;, x);       // ABCD
+fmt(&quot;_%10s_&quot;, x);   // _      aBcD_
+fmt(&quot;_%-10s_&quot;, x);  // _aBcD      _</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As indicated above, <code>string</code> typed values are of special interest. For
+instance, consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;a %s b&quot;, (&quot;some \\ text&quot;, 6));     // a (&quot;some \\ text&quot;, 6) b
+fmt(&quot;a %s b&quot;, &quot;some \\ text&quot;);          // c some \ text d</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first example has a tuple as value, with a string and an integer number.
+The output of this example is <code>a ("some \\ text", 6) b</code>. Note how the string
+in the tuple is included in the output with double quotes around it, and how
+the escaped backslash is also escaped in the resulting text.</p>
+</div>
+<div class="paragraph">
+<p>The second example has a value that is a string directly (e.g. not contained in
+a tuple or some other container). This mapping results in <code>c some \ text d</code>.
+Note how the string is included in the output 'as is', i.e. it is not
+surrounded by double quotes, and the backslash is not escaped.</p>
+</div>
+<div class="paragraph">
+<p>In general, when using a <code>%s</code> specifier, string values are double quoted and
+escaped. If however the entire value is a string, then that string is used
+'as is' (without quoting, and without escaping).</p>
+</div>
+<div class="paragraph">
+<p>Also of special interest are real values. The number of digits after the
+decimal point can vary. For instance, consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">fmt(&quot;a %s b&quot;, 1 / 3);       // a 0.3333333333333333 b
+fmt(&quot;c %s d&quot;, 1 / 2);       // c 0.5 d</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For more control over the number of digits after the decimal point, use one of
+the floating point number format specifiers:
+<a href="#tools-cifsim-output-print-ref-fmt-e">%e</a>,
+<a href="#tools-cifsim-output-print-ref-fmt-e">%E</a>,
+<a href="#tools-cifsim-output-print-ref-fmt-f">%f</a>,
+<a href="#tools-cifsim-output-print-ref-fmt-g">%g</a>, or
+<a href="#tools-cifsim-output-print-ref-fmt-g">%G</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-print-ref-fmt-escaping">Escaping and quoting</h8>
+<div class="paragraph">
+<p>Double quote terminate string literals, and thus also a format pattern, as
+format patterns are string literals. It is therefore not possible to include
+a double quote in the text of a format pattern without escaping it. That is,
+use <code>\"</code> inside a format pattern to include a single double quote. There are
+other escape sequences as well. Use <code>\\</code> to include a single backslash
+(<code>\</code>), <code>\n</code> to include a single new line (to continue on a new line), and
+<code>\t</code> to include a tab character (for alignment).</p>
+</div>
+<div class="paragraph">
+<p>Format specifiers start with a percentage character (<code>%</code>). If a percentage
+character is to be included as a percentage character instead of being
+interpreted as a format specifier, it needs to be escaped as well. That is,
+to include a percentage character as a percentage character, use <code>%%</code> in
+the format pattern.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the format pattern <code>"a\"b\nc\td\\e%%f"</code> results in the
+following text:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>a&quot;b
+c       d\e%f</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-unused-values">Unused values</h8>
+<div class="paragraph">
+<p>The format pattern is automatically checked for unused values. That is, if a
+value is not used in the format pattern, there is no use in specifying it, and
+a warning will indicate this.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-svgviz-chapter-index">SVG visualizer</h6>
+<div class="paragraph">
+<p>
+
+
+
+The CIF simulator supports several forms of <a href="#tools-cifsim-output-chapter-index">output</a>.
+By default, simulation results, such as the
+current <a href="#tools-cifsim-traces-state">state</a>, are printed to the console.
+While this provides useful information, it is not easy to decipher the precise
+state of a (sub-)system. Also, it does not give a graphical overview of the
+current state of the system.</p>
+</div>
+<div class="paragraph">
+<p>The simulator however, also supports <em>SVG visualization</em>, which allows the user
+to make an image of the system, and have that image be updated by the simulator
+during simulation, based on the current state of the system. This allows the
+user to see changes in the state of the system, in a graphical representation
+of that system. This makes it much easier to get a global overview of the
+system during simulation. Since the user makes the image, the representation
+directly corresponds to the way the user sees the system.</p>
+</div>
+<div class="paragraph">
+<p><strong>Documentation</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-first-example">First example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svg">Scalable Vector Graphics (SVG)</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-simulation">Simulation of SVG visualizations</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-debugging">Debugging SVG visualizations</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-viewer">SVG viewer and visualizer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-svgviz-examples" class="paragraph">
+<p><strong>Examples</strong></p>
+</div>
+<div class="paragraph">
+<p>Below is a list of available examples of SVG visualizations, which show some
+often used SVG attributes, as well as some tips and tricks on how to handle
+common challenges. The following examples are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-sun-moon">Sun/moon example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-walk">Walk example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-rate">Rate example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-workstation">Workstation example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-tank">Tank example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-lamps">Lamps example</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-example-buffers-products">Buffers/products example</a></p>
+</li>
+</ul>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-first-example">First example</h7>
+<div class="paragraph">
+<p>
+Before we go into any details about SVG visualization, let&#8217;s first look at an
+example. Here, we use a trivial example, which nonetheless serves several
+purposes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>It gives a quick overview of what the idea of SVG visualization is all about,
+and what it looks like.</p>
+</li>
+<li>
+<p>It shows how to use SVG visualization with the CIF simulator.</p>
+</li>
+<li>
+<p>It shows the two alternatives to simulation: via the options dialog, and by
+using a ToolDef <a href="#tools-scripting-chapter-intro">script</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Note that it is not necessary to fully understand what exactly is going on, or
+how it works. Those details should become clear after reading the remaining
+pages of the documentation.</p>
+</div>
+<div class="sect7">
+<h8 id="tools-creating-the-cif-model">Creating the CIF model</h8>
+<div class="paragraph">
+<p>In an Eclipse project or directory, create a new CIF file named <code>lamp.cif</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;lamp.svg&quot;;
+
+automaton lamp:
+  cont t der 1.0;
+
+  location Off:
+    initial;
+    edge when t &gt;= 1.0 do t := 0.0 goto On;
+
+  location On:
+    edge when t &gt;= 2.0 do t := 0.0 goto Off;
+
+  svgout id &quot;lamp&quot; attr &quot;fill&quot; value if Off: &quot;gray&quot; else &quot;yellow&quot; end;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This file describes not only the behavior of the lamp using a CIF automaton,
+but also contains a <a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declaration</a>, which specifies the connection between
+the behavioral CIF specification and the SVG image.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-creating-the-svg-image">Creating the SVG image</h8>
+<div class="paragraph">
+<p>Next, we&#8217;ll create an <a href="#tools-cifsim-output-svgviz-chapter-svg">SVG</a> image.
+Start
+<a href="http://inkscape.org/">Inkscape</a>,
+Select
+<b class="menuref">Document Properties&#8230;&#8203;</b>
+from the
+<b class="menuref">File</b>
+menu, to open the
+<b class="menuref">Document Properties</b>
+window. On the
+<b class="menuref">Page</b>
+tab, set the
+<b class="menuref">Units</b>
+to
+<b class="menuref">px</b>,
+the
+<b class="menuref">Width</b>
+to <code>75.00</code>, and
+the height to <code>100.00</code>. It is recommended to always
+<a href="#tools-cifsim-output-svgviz-inkscape-size">set the size</a> of the image,
+before adding any shapes or text labels.</p>
+</div>
+<div class="paragraph">
+<p>Next, select the circle tool, by clicking on the circle in the <em>Toolbox</em> on the
+left side of the application. Draw a circle on the canvas. It should look
+something like this:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/lamp/lamp_inkscape.png" alt="lamp inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>Right click the circle and choose
+<b class="menuref">Object Properties</b>.
+The
+<b class="menuref">Object Properties</b>
+window will appear. Change the
+<b class="menuref">Id</b>
+of
+the circle to <code>lamp</code> and click the
+<b class="button">Set</b>
+button. Save the image
+as <code>lamp.svg</code>, in the same directory as the <code>lamp.cif</code> file.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-simulation-and-the-options-dialog">Simulation and the options dialog</h8>
+<div class="paragraph">
+<p>Right click the <code>lamp.cif</code> file and choose
+<b class="menuref">Simulate CIF specification&#8230;&#8203;</b>
+to start the CIF simulator. An
+options dialog appears. In this case the defaults suffice, so click
+<b class="button">OK</b>
+to start the simulation. Initially, the visualization looks as
+follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/lamp/lamp_sim_off.png" alt="lamp sim off">
+</div>
+</div>
+<div class="paragraph">
+<p>Using the
+<b class="menuref">GUI input</b>,
+click the button for
+<b class="button">time delay</b>
+and then the button for
+<b class="button">tau</b>.
+After performing these two
+transitions, the visualization should look as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/lamp/lamp_sim_on.png" alt="lamp sim on">
+</div>
+</div>
+<div class="paragraph">
+<p>As you can see, the lamp is gray while it is off, and yellow while it is on.
+Close the
+<b class="menuref">GUI input</b>
+to terminate the simulator. You may also close
+the visualization window.</p>
+</div>
+<div class="paragraph">
+<p>Now restart the simulator. In the
+<b class="menuref">Simulator</b>
+category, set the
+<a href="#tools-cifsim-solver-chapter-endtime-maxdelay">Simulation end time</a> option to
+<b class="menuref">Finite end time</b>.
+You can leave the default value for
+<b class="menuref">End time</b>.
+In the
+<b class="menuref">Input</b>
+category, set the
+<a href="#tools-cifsim-input-chapter-index">Input mode</a> option to
+<b class="menuref">Automatic input mode</b>.
+In the
+<b class="menuref">Output</b>
+category, enable
+the <a href="#tools-cifsim-output-realtime-framerate">Frame rate</a> option and
+keep the default frame rate value. Click
+<b class="menuref">OK</b>
+to start the simulation
+again. This time, the simulator automatically chooses transitions. Furthermore,
+<a href="#tools-cifsim-output-chapter-realtime">real-time simulation</a> is enabled, where
+the model time is interpreted in seconds, and the visualization is regularly
+updated. Using these options, SVG visualization essentially turns into an
+SVG movie of the simulation of a flashing lamp. Simulation will automatically
+stop after ten seconds, the default simulation end time. Once simulation
+terminates, you may close the visualization window.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-simulation-using-tooldef">Simulation using ToolDef</h8>
+<div class="paragraph">
+<p>While the option dialog is useful for configuring simulation options, it is
+often easier to use a <em>ToolDef</em> file to
+<a href="#tools-scripting-chapter-intro">script</a> the execution of the CIF simulator.
+Create a new file named <code>lamp.tooldef</code>, in the same directory as the other
+files, and give it the following content:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(
+    &quot;lamp.cif&quot;,
+    &quot;-t 10&quot;,
+    &quot;-i auto&quot;,
+    &quot;--frame-rate=20&quot;,
+);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Don&#8217;t forget to save the file. Right-click the <code>lamp.tooldef</code> file and
+choose
+<b class="menuref">Execute ToolDef</b>
+to execute the ToolDef script. This script
+uses the exact same options as we manually configured in the option dialog, in
+the previous section.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-svg">Scalable Vector Graphics (SVG)</h7>
+<div class="paragraph">
+<p>
+
+
+The SVG visualization feature uses Scalable Vector Graphics (SVG) images.
+<a href="http://www.w3.org/TR/SVG11/">SVG</a>
+is a widely-deployed royalty-free standard
+for two-dimensional vector graphics, developed by the
+<a href="http://www.w3.org/">World Wide Web Consortium</a>
+(W3C). SVG images consist of
+three types of objects: vector graphic shapes (rectangles, circles, etc.),
+raster images, and text. The benefit of vector images formats over raster image
+formats, is that raster images are created with a fixed size, while vector
+images contain a description of the image and can be rendered at any size
+without loss of quality.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-svgviz-svg-svg11" class="paragraph">
+<p>Multiple versions of the SVG standard exist. The CIF simulator uses the
+free and open source
+<a href="http://xmlgraphics.apache.org/batik/">Apache Batik SVG Toolkit</a>
+to render SVG images. Batik supports
+version 1.1 of the SVG specification.</p>
+</div>
+<div class="paragraph">
+<p>
+SVG image files are stored in an
+<a href="http://en.wikipedia.org/wiki/XML">XML</a>-based file format. This means that
+they can be edited with any text editor. However, it is often more convenient
+to edit them with a drawing program that supports vector graphics, such as
+<a href="http://www.adobe.com/products/illustrator.html">Adobe Illustrator</a>
+or
+<a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a>. Most modern web
+browsers also support SVG images.</p>
+</div>
+<div class="paragraph">
+<p>Since SVG images are essentially XML files, we get all the benefits of XML
+for free. One of those benefits is that XML files represent tree structures,
+which can be easily manipulated by applications. This is essential for the CIF
+simulator. During initialization, the CIF simulator loads the SVG image
+file that the user provided, and subsequently has access to the XML tree.
+It then uses the aforementioned Batik toolkit to draw the SVG image
+represented by the XML tree. Once the simulator starts taking transitions and
+updates its <a href="#tools-cifsim-traces-state">state</a>, it can use the
+information from the state to modify the XML tree. Changes to the XML tree then
+result in an updated SVG image, the next time the image is rendered again.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-svgviz-svg-id" class="paragraph">
+<p>In order to be able to modify particular objects (shapes, text labels, etc.) of
+the SVG image, the simulator should be able to identify the objects that make
+up the image. Here we once again reap the benefits of XML. All nodes (called
+elements) in the XML tree can have an <code>id</code> attribute that specifies the
+id (also called name or identity) of the element. As such, all SVG objects can
+be identified using their unique id. The
+<a href="#tools-cifsim-output-svgviz-svgout-id">SVG element id</a> section of the
+<a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a> page further explains the
+use of SVG element ids.</p>
+</div>
+<div class="paragraph">
+<p>
+
+The website of Jakob Jenkov has a very nice
+<a href="http://tutorials.jenkov.com/svg">SVG Tutorial</a>.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</h7>
+<div class="paragraph">
+<p>
+
+SVG images can best be edited with a drawing program that supports vector
+graphics. One such program is
+<a href="http://inkscape.org/">Inkscape</a>,
+a free and
+open source vector graphics editor that uses SVG as its native file format, and
+is available for many platforms, including Microsoft Windows, Mac OS X, and
+Linux. In this documentation, we&#8217;ll use Inkscape to create and edit SVG images.</p>
+</div>
+<div class="paragraph">
+<p>It is beyond the scope of this document to explain how Inkscape works. For
+that, see the
+<a href="http://inkscape.org/">Inkscape website</a>.
+Here is a screenshot of the Inkscape interface:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/inkscape/inkscape.png" alt="inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-changing-ids">Changing ids</h8>
+<div class="paragraph">
+<p>As described on the <a href="#tools-cifsim-output-svgviz-chapter-svg">page about SVG</a>,
+every SVG object has an id. To change the id of an object in Inkscape, right
+click on the object, and choose
+<b class="menuref">Object Properties</b>.
+The
+<b class="menuref">Object Properties</b>
+window will appear, which looks like this:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/inkscape/inkscape_props_xml.png" alt="inkscape props xml">
+</div>
+</div>
+<div class="paragraph">
+<p>In this window, you can change the object&#8217;s id, by entering a new id in the
+<b class="menuref">Id</b>
+field, and clicking the
+<b class="button">Set</b>
+button.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-xml-editor">XML editor</h8>
+<div class="paragraph">
+<p>Inkscape also features an XML editor, that can be used to view and edit the
+underlying XML representation of the SVG image. The screenshot above also shows
+Inkscape&#8217;s
+<b class="menuref">XML Editor</b>
+window, which can be opened via the
+<b class="menuref">XML Editor&#8230;&#8203;</b>
+item in the
+<b class="menuref">Edit</b>
+menu. The XML editor
+can be useful to find out the exact structure of the XML tree, and to see the
+precise definitions that were used to represent the objects that you created
+on Inkscape&#8217;s canvas.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-inkscape-size">Document size</h8>
+<div class="paragraph">
+<p>It is recommended to always set the correct size of the image, before adding
+any shapes or text labels. To do this, select
+<b class="menuref">Document Properties&#8230;&#8203;</b>
+from the
+<b class="menuref">File</b>
+menu, to open the
+<b class="menuref">Document Properties</b>
+window. On the
+<b class="menuref">Page</b>
+tab, we
+recommend to set the
+<b class="menuref">Units</b>
+to
+<b class="menuref">px</b>.
+You can then enter
+the
+<b class="menuref">Width</b>
+and
+<b class="menuref">Height</b>
+of the image.</p>
+</div>
+<div class="paragraph">
+<p>By default, Inkscape always adds a layer to new images. When changing the size
+of the image as described above, this layer gets a <code>transform</code> attribute
+that can cause all kinds of trouble later on. There are several ways to get
+rid of this <code>transform</code> attribute of the layer:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Select
+<b class="menuref">Layers&#8230;&#8203;</b>
+from the
+<b class="menuref">Layer</b>
+menu to show the
+<b class="menuref">Layers</b>
+panel. In that panel, select
+<b class="menuref">Layer 1</b>
+by
+clicking on it. Then click the
+<b class="menuref">Delete the current layer</b>
+button
+to remove the selected layer.</p>
+</li>
+<li>
+<p>Use the
+<b class="menuref">XML Editor</b>
+to select the layer
+(<code>&lt;svg:g id="layer1"</code>&#8230;&#8203; node). Then click the
+<b class="menuref">Delete node</b>
+button at the top of the
+<b class="menuref">XML Editor</b>
+window to remove the layer.
+Alternatively, after selecting the layer, press the <kbd>Delete</kbd> key on the
+keyboard to delete the selected layer.</p>
+</li>
+<li>
+<p>Use the
+<b class="menuref">XML Editor</b>
+to select the layer
+(<code>&lt;svg:g id="layer1"</code>&#8230;&#8203; node). Then, on the right, select the
+<code>transform</code> attribute by clicking on it. Then click the
+<b class="menuref">Delete attribute</b>
+button at the top of the
+<b class="menuref">XML Editor</b>
+window to remove the attribute.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The first two approaches remove the layer, the third approach keeps the layer
+and only removes the <code>transform</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, there is also a way to avoid the <code>transform</code> attribute from
+being added in the first place. Instead of using the
+<b class="menuref">Document Properties</b>
+window to change the size of the image, do
+the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Use the
+<b class="menuref">XML Editor</b>
+to select the entire image
+(<code>&lt;svg:svg</code>&#8230;&#8203; node).</p>
+</li>
+<li>
+<p>Select the <code>width</code> attribute on the right, by clicking on it.</p>
+</li>
+<li>
+<p>Change the value in the text area at the lower right corner of the window.</p>
+</li>
+<li>
+<p>Click the
+<b class="menuref">Set</b>
+button to save the new width value. Alternatively,
+after typing the new value, press <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>ENTER</kbd></span> to save the
+new width value.</p>
+</li>
+<li>
+<p>Repeat for the <code>height</code> attribute.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-coordinate-systems">Coordinate systems</h8>
+<div class="paragraph">
+<p>The coordinate system used by Inkscape uses the lower left
+corner of the canvas as origin, while the underlying SVG representation uses
+the upper left corner of the canvas as origin. Also, Inkscape uses x and y
+coordinates of objects relative to the outside of their border (called <em>stroke</em>
+in Inkscape), while SVG uses x and y coordinates of objects relative to the
+middle of their border. These are two most commonly encountered differences
+between Inkscape and SVG. See the <a href="#tools-cifsim-output-svgviz-chapter-example-tank">tank example</a>
+for some tips and tricks regarding the difference in coordinate systems.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-inkscape-textarea">Text areas</h8>
+<div class="paragraph">
+<p>When using the Inkscape text tool, select the tool, and left click once on the
+canvas to add a text label. Once you added it, start typing text.</p>
+</div>
+<div class="paragraph">
+<p>Inkscape also allows you to select the text tool, left click anywhere on the
+canvas, drag the mouse pointer to another position, and only then release the
+left mouse button. This creates a text area, where text is automatically
+wrapped to multiple lines, so that it stays within the bounds of the text area.
+This feature uses SVG <code>flowRoot</code> elements. These elements are defined in
+version 1.2 of the SVG standard, which is currently still a working draft.
+These elements are <em>not</em> supported by the CIF simulator, which only supports
+version 1.1 of the SVG standard.</p>
+</div>
+<div class="paragraph">
+<p>Using an SVG image with a <code>flowRoot</code> or other unsupported SVG feature,
+results in the following error when the SVG file is
+<a href="#tools-cifsim-output-svgviz-chapter-viewer">opened</a> in Eclipse:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">ERROR: SVG image file &quot;some_image.svg&quot; is not an SVG file, is an invalid SVG file, or contains unsupported SVG features.
+CAUSE: invalid.element</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</h7>
+<div class="paragraph">
+<p>
+
+
+
+The connection between the <a href="#tools-cifsim-traces-state">state</a> of the CIF
+specification and the SVG image can be specified by using CIF/SVG declarations
+(sometimes also called SVG declarations, for simplicity). Such declarations can
+be specified directly in the CIF specification. CIF/SVG declarations are an
+extension to the CIF language, and can only be used to couple the model to the
+image. They don&#8217;t influence the behavior of the model itself.</p>
+</div>
+<div class="paragraph">
+<p>The CIF <a href="#tools-chapter-text-editor">text editor</a> provides full integration for
+the CIF/SVG declarations extension, complete with syntax highlighting,
+background validation, etc.</p>
+</div>
+<div class="sect7">
+<h8 id="tools-declarations">Declarations</h8>
+<div class="paragraph">
+<p>The following types of CIF/SVG declarations are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declarations</a>:
+Specifies which SVG image file to use.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declaration</a>:
+Specifies that a part of the SVG image should be copied.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declaration</a>:
+Specifies that a part of the SVG image should be moved.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a>:
+Specifies how to update a certain property of an element of the SVG image.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-svg-chapter-svgin">CIF/SVG input mappings</a>:
+Specifies how interaction with the SVG image affects simulation.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-svgfile">SVG file declarations</h7>
+<div class="paragraph">
+<p>
+
+
+Before any other CIF/SVG declarations can be specified, you need to indicate to
+which SVG image (file) they apply, using an SVG file declaration. A typical SVG
+file declaration looks like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;some_file.svg&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The SVG files are declared based on their file names. If possible, it is
+recommended to use the same file name for the CIF specification and for the
+SVG image, only with different file extensions. This way, it is easy to see
+which images goes with which CIF specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-paths-2">Paths</h8>
+<div class="paragraph">
+<p>It is possible to use relative (or absolute) paths for the SVG files. For
+instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;svg_files/some_file.svg&quot;;
+svgfile &quot;../images/some_file.svg&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For the first SVG file declaration, the tools will look for an <code>svg_files</code>
+directory in the same directory as the CIF file, and for a <code>some_file.svg</code>
+file in that <code>svg_files</code> directory. For the second SVG file declaration, the
+tools will look for an <code>images</code> directory in the parent directory of the
+directory that contains the CIF file, and for a <code>some_file.svg</code> file in that
+<code>images</code> directory.</p>
+</div>
+<div class="paragraph">
+<p>Files and directories are separated using slashes (<code>/</code>), regardless of the
+used operating system. It is also allowed to use backslashes (<code>\</code>), which are
+more common on Microsoft Windows operating systems, but they need to be escaped
+as <code>\\</code> for this to work, making it easier to use slashes (<code>/</code>) instead.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-scoping-3">Scoping</h8>
+<div class="paragraph">
+<p>CIF/SVG file declarations (and all 'other' CIF/SVG declarations) can be
+specified in all components. That is, they can be specified in the top level
+scope of the specification, in groups and group definitions, as well as in
+automata and automaton definitions. An SVG file declaration that is specified
+in a certain scope applies to that scope, as well as all child scopes that
+don&#8217;t have an SVG file declaration of their own. Additionally, all 'other'
+CIF/SVG declarations (such as
+<a href="#tools-cifsim-output-svgviz-chapter-svgout">SVG output mappings</a>) may include
+a local SVG file declaration, that only applies to that specific CIF/SVG
+declaration.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;file1.svg&quot;;
+
+svgout id &quot;a&quot; attr &quot;b&quot; value 5;
+
+svgout id &quot;c&quot; attr &quot;d&quot; value 6 file &quot;file2.svg&quot;;
+
+group g:
+  svgfile &quot;file3.svg&quot;;
+
+  svgout id &quot;e&quot; attr &quot;f&quot; value 7;
+
+  svgout id &quot;g&quot; attr &quot;h&quot; value 8;
+
+  svgout id &quot;i&quot; attr &quot;j&quot; value 9 file &quot;file4.svg&quot;;
+
+  group h:
+    svgfile &quot;file5.svg&quot;;
+  end
+
+  group i:
+    svgout id &quot;k&quot; attr &quot;l&quot; value 10;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The mapping for the SVG element with id <code>a</code> is declared in the top level
+scope of the specification, and does not have a local SVG file declaration.
+As such, the SVG file declaration from the top level scope (<code>file1.svg</code>)
+applies to it. The mapping for the SVG element with id <code>b</code> is declared in
+the same scope, but has a local SVG file declaration (<code>file2.svg</code>). The local
+SVG file declaration (<code>file2.svg</code>) overrides the SVG file declaration from
+the top level scope (<code>file1.svg</code>).</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g</code> also has an SVG file declaration (<code>file3.svg</code>). This overrides
+the SVG file declaration from the top level scope (<code>file1.svg</code>). The SVG
+file declaration from group <code>g</code> (<code>file3.svg</code>) thus applies to the
+mappings for ids <code>e</code> and <code>g</code>, as they are declared in the same scope, and
+don&#8217;t have local SVG file declarations. The mapping for SVG element id <code>i</code>
+has a local SVG file declaration (<code>file4.svg</code>), and as such the SVG file
+declaration from group <code>g</code> (<code>file3.svg</code>) does not apply to it.</p>
+</div>
+<div class="paragraph">
+<p>The SVG file declaration (<code>file5.svg</code>) from group <code>g.h</code> does not apply to
+any mappings. The simulator will show the image, but the image will not change
+during simulation. A warning is printed to the console, to indicate the
+potential problem.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g.i</code> does not have an SVG file declaration, so the SVG file
+declaration (<code>file3.svg</code>) from group <code>g</code> (the parent scope of group
+<code>g.i</code>) applies to the mapping for SVG element id <code>k</code>.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#tools-cif2cif-chapter-svg-file-into-decls">Push SVG file declarations into other CIF/SVG declarations</a> CIF to CIF
+transformation.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-completeness-and-uniqueness">Completeness and uniqueness</h8>
+<div class="paragraph">
+<p>Every CIF/SVG declaration that is not itself an SVG file declaration, requires
+an SVG file declaration, in its scope, in one of its ancestor scopes, or
+locally in that CIF/SVG declaration itself.</p>
+</div>
+<div class="paragraph">
+<p>In each scope, there may be at most one SVG file declaration.</p>
+</div>
+<div class="paragraph">
+<p>In every scope (or component), in principle at most one SVG file declaration
+may be specified. The exception is that for a single scope, specified in
+multiple CIF files (when imports are used), if the SVG file declarations
+refer to the same image file, they are merged. If however the two CIF files
+refer to different image files, this is still considered an error. It is also
+considered an error if two SVG file declarations are present in a single scope,
+in a single file, regardless of whether they refer to the same image file or
+not. In the end, after processing imports, for every scope there must be a
+unique SVG file declaration, if one is declared at all.</p>
+</div>
+<div class="paragraph">
+<p>If the same SVG image file is specified multiple times, in different SVG file
+declarations, this is detected by the simulator, and the image will only be
+shown once. For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &quot;...&quot; attr &quot;...&quot; value 5 file &quot;some_file.svg&quot;;
+
+svgout id &quot;...&quot; attr &quot;...&quot; value 6 file &quot;some_file.svg&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Even though both output mappings specify an SVG file locally, they use the same
+file. The SVG image will thus only be shown once, and both mappings apply to
+the same image.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+For each update of a single attribute of an element in the SVG image, an
+<em>output mapping</em> is needed. An output mapping essentially defines a connection
+between the CIF specification and the SVG image, for updating that specific
+attribute of that specific element.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-simple">A simple output mapping</h8>
+<div class="paragraph">
+<p>Assume we have the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont pos der 1.0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Where variable <code>pos</code> is the position of some object, say a box. Then the
+following output mapping:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &quot;box&quot; attr &quot;x&quot; value pos;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Keeps the value of the <code>x</code> attribute of the SVG element with id <code>box</code> equal
+to the value of continuous variable <code>pos</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-syntax">Syntax</h8>
+<div class="paragraph">
+<p>The general syntax of CIF/SVG output mappings is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &lt;id&gt; attr &lt;attr&gt; value &lt;value&gt;;
+svgout id &lt;id&gt; attr &lt;attr&gt; value &lt;value&gt; file &lt;file&gt;;
+svgout id &lt;id&gt; text        value &lt;value&gt;;
+svgout id &lt;id&gt; text        value &lt;value&gt; file &lt;file&gt;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>svgout</code> keyword is followed by a specification of an SVG element
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a>. Every output mapping must
+<a href="#tools-cifsim-output-svgviz-svgout-id">specify the id</a> of an SVG
+element, and an SVG element with that id must exist in the SVG image. The
+<code>id</code> indicates the element for which an attribute or text is to be updated.</p>
+</div>
+<div class="paragraph">
+<p>The <code>id</code> is followed by a specification of what part of the SVG element is to
+updated. That is, either an
+<a href="#tools-cifsim-output-svgviz-svgout-attr">attribute</a> or
+<a href="#tools-cifsim-output-svgviz-svgout-text">text</a> (label) is updated.</p>
+</div>
+<div class="paragraph">
+<p>After that, the <a href="#tools-cifsim-output-svgviz-svgout-value">value</a> of the
+attribute or text (label) is specified.</p>
+</div>
+<div class="paragraph">
+<p>In the syntax examples above, we see that it is also allowed to declare an
+optional local
+<a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declaration</a>, that only
+applies to that specific output declaration.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-id">SVG element id</h8>
+<div class="paragraph">
+<p>Every output mapping needs to specify the
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a> of the SVG element to update.
+The id is checked, to make sure an SVG element with that id actually exists in
+the SVG image.</p>
+</div>
+<div class="paragraph">
+<p>Only valid SVG names may be used as ids. Valid SVG names start with a letter
+(<code>a</code> to <code>z</code>, <code>A</code> to <code>Z</code>), an underscore (<code>_</code>), or a colon (<code>:</code>),
+and may be followed by more of the same characters, as well as dashes (<code>-</code>),
+dots (<code>.</code>), and numbers (<code>0</code> to <code>9</code>).</p>
+</div>
+<div class="paragraph">
+<p>Ids must be put between double quotes. For instance, to use <code>some-name</code> as
+id, it must be written as <code>"some-name"</code>.</p>
+</div>
+<div class="paragraph">
+<p>Instead of using a hard coded SVG element id, it is also allowed to use an
+expression that when evaluated results in the SVG element id. Such an
+expression must evaluate to a <code>string</code> typed value, and must be statically
+evaluable (must not refer to variables that can change value during simulation,
+etc). For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Hard coded SVG element id.
+svgout id &quot;box&quot; attr &quot;width&quot; value ...;
+
+// Computed SVG element id.
+const string c = &quot;bo&quot;;
+svgout id c + &quot;x&quot; attr &quot;width&quot; value ...;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first output mapping applies to the SVG element with the id <code>box</code>. The
+<code>box</code> id is hard coded into the output mapping. The second
+output mapping uses the expression <code>c + "x"</code> to specify the SVG element id.
+Once the expression is evaluated (its value is computed), this results in the
+<code>string</code> typed value <code>"box"</code>. As such, the second mapping applies to the
+SVG element with id <code>box</code> as well.</p>
+</div>
+<div class="paragraph">
+<p>The expressions may also refer to for instance algebraic parameters of
+automaton definitions. Since different values can be given to the parameters
+for each instantiation, this allows the SVG element id to vary for the
+different instantiations of the automaton definition. This particular usage
+allows for reuse and scalable solutions. The
+<a href="#tools-cifsim-output-svgviz-chapter-example-lamps">lamps example</a> and
+<a href="#tools-cifsim-output-svgviz-chapter-example-workstation">workstation example</a>
+are good examples of this usage. This usage is often combined with
+<a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declarations</a> and
+<a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declarations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-attr">SVG attribute name</h8>
+<div class="paragraph">
+<p>Every output mapping needs to specify the name of the attribute of the SVG
+element to update (or <code>text</code>, see the
+<a href="#tools-cifsim-output-svgviz-svgout-text">Text labels</a> section).
+Similarly to specifying ids, attribute names must be valid SVG names. They also
+need to be put between double quotes. Unlike SVG element ids, it is not
+possible to use expressions to specify attribute names. That is, only hard
+coded names can be used to specify attribute names.</p>
+</div>
+<div class="paragraph">
+<p>It is not allowed to change the ids of SVG elements, as it could lead to
+duplicate or missing ids. As such, output mappings for the <code>id</code> attribute
+(in any casing) are explicitly not supported. Similarly, changing the <code>style</code>
+attribute (in any casing) using an output mapping is explicitly not supported,
+to avoid conflicting style changes. See also the
+<a href="#tools-cifsim-output-svgviz-svgout-svgcss">SVG presentation attributes vs CSS style attributes</a> section for more
+information about the <code>style</code> attribute.</p>
+</div>
+<div class="paragraph">
+<p>The supported attributes for an SVG element depend on what kind of element it
+is. For instance, a <code>rect</code> element can have an <code>x</code> and <code>y</code> position, a
+<code>width</code> and <code>height</code>, a <code>fill</code> color, etc. A <code>g</code> element (a group)
+however, does not support those position attributes. It is beyond the scope of
+this document to go into more detail. The software however, will warn about
+using attribute names that are not supported according to the SVG standard (to
+catch simple spelling mistakes), and specifying attributes on elements that
+don&#8217;t support them. Consult the official
+<a href="http://www.w3.org/TR/SVG11/">SVG specification</a>
+for further details. The
+<a href="#tools-cifsim-output-svgviz-examples">examples</a> showcase several
+commonly used attributes as well.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-svgcss">SVG presentation attributes vs CSS style attributes</h8>
+<div class="paragraph">
+<p>SVG uses two kinds of attributes: SVG presentation attributes, and CSS style
+attributes. For instance, in the following partial SVG image:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;rect fill=&quot;red&quot;        id=&quot;rect1&quot; width=&quot;25&quot; height=&quot;25&quot; x=&quot;65&quot; y=&quot;5&quot;/&gt;
+&lt;rect style=&quot;fill:red;&quot; id=&quot;rect2&quot; width=&quot;25&quot; height=&quot;25&quot; x=&quot;15&quot; y=&quot;5&quot;/&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Rectangle <code>rect1</code> uses the SVG presentation attribute <code>fill</code> to specify the
+fill color the rectangle. Rectangle <code>rect2</code> uses the CSS style attribute
+<code>fill</code> to specify the fill color the rectangle. The SVG presentation
+attributes are all direct attributes of the SVG element. CSS style attributes
+on the other hand, are always part of the SVG presentation attribute <code>style</code>.</p>
+</div>
+<div class="paragraph">
+<p><a href="https://en.wikipedia.org/wiki/Cascading_Style_Sheets">CSS</a>
+stands for
+<em>Cascading Style Sheets</em>, and it is a style sheet language used
+for describing the look and formatting of a document. It&#8217;s best known for its
+use in styling web pages written in
+<a href="https://en.wikipedia.org/wiki/HTML">HTML</a>.
+Like SVG, CSS is an international
+standard developed and maintained by the
+<a href="http://www.w3.org/">World Wide Web Consortium</a>
+(W3C). SVG reuses the CSS standard for its CSS style
+attributes. The most commonly used attributes for certain elements are also
+available in the SVG standard as SVG presentation attributes. Furthermore, SVG
+adds additional presentation attributes not found in CSS.</p>
+</div>
+<div class="paragraph">
+<p>If an attribute is specified on an element using both an SVG presentation
+attribute, and a CSS style attribute, the CSS style attribute usually takes
+precedence. The output mappings handle all of this automatically and
+transparently. That is, you just specify the attribute name in the header of
+the output mapping, and the simulator makes sure the proper attribute is
+update, regardless of whether it is an SVG presentation attribute, or a CSS
+style attribute. It is explicitly not supported to change the <code>style</code>
+attribute directly (using an output mapping), in order to avoid conflicting
+style changes when other output mappings update CSS style attributes that are
+part of that same <code>style</code> SVG presentation attribute.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-text">Text labels</h8>
+<div class="paragraph">
+<p>Changing the text of text labels is a special case, as text is not stored in
+attributes. Consider the following partial SVG image, which contains a text
+label (created using <a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a>,
+and with some of the irrelevant details omitted):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;text x=&quot;5&quot; y=&quot;5&quot; id=&quot;text1&quot; style=&quot;font-size:16px;&quot;&gt;
+  &lt;tspan x=&quot;5&quot; y=&quot;5&quot; id=&quot;tspan2&quot;&gt;
+    The actual text.
+  &lt;/tspan&gt;
+&lt;/text&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here we see a <code>text</code> element with id <code>text1</code>, which contains a <code>tspan</code>
+element with id <code>tspan2</code>. The <code>tspan</code> element contains some text. To change
+the text of this text label, use one of the following mappings:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &quot;text1&quot; text value ...;
+
+svgout id &quot;tspan2&quot; text value ...;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, instead of the <code>attr</code> keyword followed by the name of the attribute, we
+simply specify the <code>text</code> keyword. We can either use the id of the <code>text</code>
+element, or the id of the <code>tspan</code> element. More precisely, we can use the id
+of an element that contains text (such as the <code>tspan</code> element in our
+example), or an element (such as the <code>text</code> element in our example) that has
+a single child, which contains text, or an element that has a single child,
+which has an single child, which contains text, etc.</p>
+</div>
+<div class="paragraph">
+<p>In practice, it is usually the easiest to use the
+<b class="menuref">Object Properties</b>
+dialog of <a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a>, to get the
+properties of the text label. The
+<b class="menuref">Id</b>
+that is then shown, is the id of the <code>text</code> element.</p>
+</div>
+<div class="paragraph">
+<p>Note that Inkscape can create
+<a href="#tools-cifsim-output-svgviz-inkscape-textarea">text areas</a> (SVG <code>flowRoot</code> elements),
+which are not supported by the CIF tooling.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-value">Output mapping value</h8>
+<div class="paragraph">
+<p>In order for an output mapping to be able to update attributes or text labels,
+it needs a value. The
+<a href="#tools-cifsim-output-svgviz-svgout-simple">simple output mapping</a> example
+already showed how
+a value can be specified. This section further explains the details of the
+specification of such values.</p>
+</div>
+<div class="paragraph">
+<p>The <code>value</code> keyword is followed by an expression. This expression may
+for instance be a literal value, such as <code>1</code>, <code>true</code>, <code>1.0</code>,
+<code>"some text"</code>, or <code>[1, 2]</code>. At first, it might not seem useful to use a
+literal as a value for an output mapping, since the mapping will then produce
+the same value every time it is applied. However, the
+<a href="#tools-cifsim-output-svgviz-chapter-example-rate">rate example</a> shows why this can in fact be
+very useful.</p>
+</div>
+<div class="paragraph">
+<p>The expressions however, may also contain references to variables (discrete,
+continuous, or algebraic), functions, constants, locations, etc. For instance,
+we could use the value of a continuous variable and multiply it by two, by
+using <code>x * 2</code> as expression, assuming that the continuous variable is named
+<code>x</code>. Since we may refer to the <a href="#tools-cifsim-traces-state">state</a> of
+the CIF specification, the value of the expression can change as the simulation
+continues, resulting in different values being mapped to the image.</p>
+</div>
+<div class="paragraph">
+<p>The expressions can also include <code>if</code> expressions, which are particularly
+powerful in this context. Using <code>if</code> expressions, a different value can be
+used for several different conditions. See the
+<a href="#tools-cifsim-output-svgviz-chapter-example-workstation">workstation example</a> for an example of using
+<code>if</code> expressions in an output mapping.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-quote-escape">Quoting and escaping</h8>
+<div class="paragraph">
+<p>The value expression of an output mapping may be of any type. The result of
+evaluating the expression is converted to a textual representation that closely
+resembles the textual syntax of CIF, before using it to set the value of an
+attribute, or the text of a text label. For string literals this means that the
+text is escaped, and double quotes are added. If however the result of the
+expression is a <code>string</code> typed value, then that string is used 'as is'
+(without quoting, and without escaping). Thus, consider the following examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &quot;...&quot; attr &quot;...&quot; value [&quot;a\&quot;b&quot;];
+svgout id &quot;...&quot; attr &quot;...&quot; value &quot;a\&quot;b&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The value of the first output mapping is a list that contains a single string
+value, while the value of the second output mapping is a string value directly.
+This results in the following texts being used as values of the attributes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">[&quot;a\&quot;b&quot;]
+a&quot;b</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That is, in general string values are quoted and escaped, as is the case for
+the first example, where the result is a list. However, if the entire result
+is a string, as is the case with the second example, the string value is used
+'as is', without quoting and without escaping.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-whitespace">Whitespace handling</h8>
+<div class="paragraph">
+<p>If the textual result of an output mapping contains a new line character (for
+instance due to including <code>\n</code> in a string literal or
+<a href="#tools-cifsim-output-print-ref-fmt-pattern">format pattern</a>), the new
+line character is ignored by SVG. Furthermore, tabs (<code>\t</code>) are replaced by a
+single space character. Finally,
+<a href="http://www.w3.org/TR/SVG/text.html#WhiteSpace">by default</a>
+consecutive
+spaces (including tabs) are merged together into a single space, and spaces at
+the beginning and end of the output of a mapping are discarded by SVG.</p>
+</div>
+<div class="paragraph">
+<p>This essentially renders <code>\n</code> and <code>\t</code> useless, as the first is ignored,
+and for the second spaces can be used instead.</p>
+</div>
+<div class="paragraph">
+<p>This also means that it is not possible to set multiple lines of text using a
+single output mapping. This is a fundamental restriction of SVG, not of CIF/SVG
+output mappings. In order to set multiple lines of text, multiple output
+mappings are needed, where each mapping sets a different text label (a
+different line).</p>
+</div>
+<div class="paragraph">
+<p>Note that if you enter multiple lines of text in
+<a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a>, this results in a
+single <code>text</code> element, with multiple <code>tspan</code> child elements. The actual
+text of such <code>tspan</code> elements can then be updated using an output mapping
+for each <code>tspan</code> element. The benefit over multiple text labels (multiple
+<code>text</code> elements with a single <code>tspan</code> child element each) is that the one
+<code>text</code> element can be moved, making all the <code>tspan</code> child elements
+automatically move with it. That is, the lines of text are kept together by
+Inkscape.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-unique">Uniqueness of output mappings</h8>
+<div class="paragraph">
+<p>All output mappings must be unique, per SVG image. That is, no two mappings may
+use the exact same SVG element id and attribute name. Similarly, no two
+mappings may update the same text. That is, for the example above, it is not
+allowed to specify two mappings for the text of the SVG element with id
+<code>text1</code>. However, since both elements <code>text1</code> and <code>tspan1</code> have the same
+text, it is also not allowed to specify output mappings for the text of those
+two elements.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-svgout-appl">Application</h8>
+<div class="paragraph">
+<p>SVG output mappings are applied for <a href="#tools-cifsim-traces-state">states</a>
+<a href="#tools-cifsim-output-realtime-frames">frames</a>, throughout simulation.
+Their first application is after
+<a href="#tools-cifsim-output-svgviz-chapter-svgcopy">copy declarations</a> and
+<a href="#tools-cifsim-output-svgviz-chapter-svgmove">move declarations</a> declarations
+have been applied. For more information, see the
+<a href="#tools-cifsim-output-svgviz-simulation-order">Application order</a> section.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declaration</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+A CIF/SVG copy declaration can be used to create copies of existing graphical
+elements of an SVG image. This page explains the technical details of such
+copy declarations. For concrete examples, see the
+<a href="#tools-cifsim-output-svgviz-chapter-example-lamps">lamps example</a> or the
+<a href="#tools-cifsim-output-svgviz-chapter-example-buffers-products">buffers/products example</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-example-2">Example</h8>
+<div class="paragraph">
+<p>Consider the following SVG file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;rect style=&quot;fill:red;&quot;   id=&quot;rect&quot;  width=&quot;100&quot; height=&quot;100&quot; x=&quot;20&quot; y=&quot;20&quot;/&gt;
+  &lt;g id=&quot;grp&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect2&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;rect style=&quot;fill:blue;&quot;  id=&quot;rect3&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;80&quot; y=&quot;80&quot;/&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It features three rectangles, with ids <code>rect</code>, <code>rect2</code>, and <code>rect3</code>, each
+with the same size. They have different <code>fill</code> colors and positions. The
+second rectangle is enclosed in a group with id <code>grp</code>. Also consider the
+following CIF file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;svgcopy.svg&quot;;
+
+svgcopy id &quot;rect&quot; pre &quot;a&quot;;
+svgcopy id &quot;grp&quot; post &quot;b&quot;;
+svgcopy id &quot;rect3&quot; pre &quot;_&quot; post &quot;x&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The effect of the copy declarations on the SVG image is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;rect style=&quot;fill:red;&quot;   id=&quot;arect&quot;   width=&quot;100&quot; height=&quot;100&quot; x=&quot;20&quot; y=&quot;20&quot;/&gt;
+  &lt;rect style=&quot;fill:red;&quot;   id=&quot;rect&quot;    width=&quot;100&quot; height=&quot;100&quot; x=&quot;20&quot; y=&quot;20&quot;/&gt;
+  &lt;g id=&quot;grpb&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect2b&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;grp&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect2&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;rect style=&quot;fill:blue;&quot;  id=&quot;_rect3x&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;80&quot; y=&quot;80&quot;/&gt;
+  &lt;rect style=&quot;fill:blue;&quot;  id=&quot;rect3&quot;   width=&quot;100&quot; height=&quot;100&quot; x=&quot;80&quot; y=&quot;80&quot;/&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-syntax">Syntax</h8>
+<div class="paragraph">
+<p>The general syntax of CIF/SVG copy declarations is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgcopy id &lt;orig-elem-id&gt; pre &lt;prefix&gt;;
+
+svgcopy id &lt;orig-elem-id&gt; post &lt;postfix&gt;;
+
+svgcopy id &lt;orig-elem-id&gt; pre &lt;prefix&gt; post &lt;postfix&gt;;
+
+svgcopy id &lt;orig-elem-id&gt; pre &lt;prefix&gt; file &quot;...&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>svgcopy</code> keyword is followed by a specification of an SVG element
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a>. Every copy declaration must
+<a href="#tools-cifsim-output-svgviz-svgout-id">specify the id</a> of an SVG
+element, and an SVG element with that id must exist in the original SVG image,
+or must exist after applying one of the other copy declarations of the same
+CIF specification. The <code>id</code> indicates the element that is to be copied.</p>
+</div>
+<div class="paragraph">
+<p>The prefix and postfix are both optional, but at least one of them must be
+specified. The prefix and postfix are used to generate unique ids for the
+copied elements. The prefix (if any) is prepended to the ids of the copied
+elements, while the postfix (if any) is appended to the ids of the copied
+elements. Prefixes (if specified) must be valid SVG name prefixes, which means
+they must be valid SVG names, just as
+<a href="#tools-cifsim-output-svgviz-svgout-id">SVG element ids</a>.
+Similarly, postfixes (if specified) must be valid SVG name postfixes, which
+means they must be valid SVG names, but may start with dashes (<code>-</code>), dots
+(<code>.</code>), and numbers (<code>0</code> to <code>9</code>). Similar to
+<a href="#tools-cifsim-output-svgviz-svgout-id">ids</a>, expressions may be
+used for both prefixes and postfixes, as long as they result in a <code>string</code>
+typed value when they&#8217;re evaluated.</p>
+</div>
+<div class="paragraph">
+<p>If we look at the rectangles example above, we see that the <code>rect</code> element is
+copied, and that the <code>id</code> of the copied element is prefixed with <code>a</code>,
+resulting in <code>arect</code> as <code>id</code> of the copy. Similarly, <code>rect3</code> is prefixed
+with <code>_</code> and postfixed with <code>x</code> resulting in <code>_rect3x</code> as <code>id</code> of the
+copy.</p>
+</div>
+<div class="paragraph">
+<p>The <code>grp</code> element is copied as well, with a <code>b</code> postfix. This results in
+a copied group with <code>grpb</code> as its <code>id</code>. Group <code>grp</code> also contains the
+rectangle with id <code>rect2</code>. When an element is copied, all its contents are
+copied as well. That is, the copy is recursive. This means that the <code>rect2</code>
+element is copied as well, and that copy is also given a <code>b</code> postfix,
+resulting in <code>rect2b</code> as its <code>id</code>.</p>
+</div>
+<div class="paragraph">
+<p>In the syntax examples above, we see that it is also allowed to declare a
+local <a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declaration</a>, that
+only applies to that specific copy declaration.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-placement">Placement</h8>
+<div class="paragraph">
+<p>The copies are added to the SVG image, as siblings of their originals. That is,
+the copies are added just before their originals. In the rectangles example
+above, this means that the <code>arect</code> copy is added just before the <code>rect</code>
+original, and the <code>grpb</code> copy is added just before the <code>grp</code> original.</p>
+</div>
+<div class="paragraph">
+<p>The order of the <code>rect</code>, <code>rect2</code>, and <code>rect3</code> rectangles is important,
+in that it determines their <em>rendering order</em>. Elements that are listed first,
+get <em>rendered</em> or <em>painted</em> first. Subsequent elements are painted on top of
+previously painted elements. Thus, the red <code>rect</code> rectangle is painted first,
+and is partially covered by the green <code>rect2</code> rectangle, which is painted
+second and is partially covered by the blue <code>rect3</code> rectangle, which is
+painted third.</p>
+</div>
+<div class="paragraph">
+<p>By including copies near their originals (as siblings), the copies get a
+similar rendering order.</p>
+</div>
+<div class="paragraph">
+<p>It is not allowed to copy the root element (the element with id <code>root</code> in the
+rectangles example above), as that would result in two root elements, which is
+not allowed by the SVG standard.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-uniqueness-3">Uniqueness</h8>
+<div class="paragraph">
+<p>All copied elements (the element that is copied, its children, the children of
+its children, etc) have their ids pre- and postfixed to create their new ids.
+These ids must be unique in the SVG image. That is, the new ids must not yet
+exist in the original SVG image, or have been used for previously copied
+elements. The unique ids are requires to ensure that we can still uniquely
+identify all elements by their ids, and we can thus use the ids to uniquely
+indicate to which elements other CIF/SVG declarations apply.</p>
+</div>
+<div class="paragraph">
+<p>Consider once again the rectangles example above:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;rect style=&quot;fill:red;&quot;   id=&quot;rect&quot;  width=&quot;100&quot; height=&quot;100&quot; x=&quot;20&quot; y=&quot;20&quot;/&gt;
+  &lt;g id=&quot;grp&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect2&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;rect style=&quot;fill:blue;&quot;  id=&quot;rect3&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;80&quot; y=&quot;80&quot;/&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We add the following copy declaration:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgcopy id &quot;rect&quot; post &quot;2&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This would result in the <code>rect</code> element being copied, and the copy being
+given a <code>rect2</code> id. However, there is already an element with that id. As
+such, the copy declaration is illegal.</p>
+</div>
+<div class="paragraph">
+<p>At least a prefix or a postfix is required for every copy declaration, as
+otherwise the new ids would be identical to the original ids.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-overlap">Overlap</h8>
+<div class="paragraph">
+<p>Consider the following SVG file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;g&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;r&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We use the following copy declarations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgcopy id &quot;g&quot; post &quot;a&quot;;
+svgcopy id &quot;r&quot; post &quot;b&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Both the <code>g</code> element and the <code>r</code> element are copied. However, the <code>r</code>
+element is a part of the <code>g</code> element. Therefore, the <code>r</code> element is copied
+twice, once for the copy of that element itself, and once for the copy of its
+parent (<code>g</code>). This leads to the following SVG image:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;ga&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;ra&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;g&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rb&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;r&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>However, if we switch the order of the copies, we get:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;ga&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rba&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;ra&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;g&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rb&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;r&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Copying an element twice by copying the element itself (e.g. <code>g</code>), but also
+copying an element that it contains (e.g. <code>r</code>) is not recommended. As seen
+above, the outcome depends on the order, and can be very confusing. CIF gives
+a warning in case such overlapping copies are used. Generally, instead of
+copying the element twice, what is really wanted, is to copy the copied
+element. This can be done as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgcopy id &quot;g&quot; post &quot;a&quot;;
+svgcopy id &quot;ra&quot; post &quot;b&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>And this results in the following SVG file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;250&quot; height=&quot;250&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;ga&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rab&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;ra&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;g&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;r&quot; width=&quot;100&quot; height=&quot;100&quot; x=&quot;50&quot; y=&quot;50&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>See the <a href="#tools-cifsim-output-svgviz-chapter-example-buffers-products">buffers/products example</a> for a
+more concrete example of the usefulness of copying copied elements.</p>
+</div>
+<div class="paragraph">
+<p>Not that overlap is only detected for copying an element and an element that
+it contains. Copying the same element multiple times is perfectly valid and
+useful, and does not result in warnings.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-application">Application</h8>
+<div class="paragraph">
+<p>Copy declarations are only applied once, at the beginning of the simulation,
+before any of the other CIF/SVG declarations have been applied. For more
+information, see the <a href="#tools-cifsim-output-svgviz-simulation-order">Application order</a>
+section.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declaration</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+A CIF/SVG move declaration can be used to move parts of an SVG image to a
+certain position, regardless of transformations applied to the elements that
+are moved, or any surrounding groups and layers, etc. This page explains the
+technical details of such move declarations. For a concrete example, see the
+<a href="#tools-cifsim-output-svgviz-chapter-example-lamps">lamps example</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-example-3">Example</h8>
+<div class="paragraph">
+<p>Consider the following SVG file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;400&quot; height=&quot;400&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;grp1&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect1&quot; width=&quot;20&quot; height=&quot;20&quot; x=&quot;5&quot; y=&quot;10&quot;
+          transform=&quot;translate(15, 20)&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;grp2&quot; transform=&quot;scale(5, 2)&quot;&gt;
+    &lt;rect style=&quot;fill:blue;&quot; id=&quot;rect2&quot; width=&quot;20&quot; height=&quot;20&quot; x=&quot;5&quot; y=&quot;10&quot;
+          transform=&quot;translate(15, 20)&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/svgmove/svgmove.png" alt="svgmove">
+</div>
+</div>
+<div class="paragraph">
+<p>It features a group <code>grp1</code>, with a green rectangle <code>rect1</code>. It is 20 by 20
+pixels in size. Its position is 20 pixels from the left (<code>x</code> is 5, but the
+horizontal translation is 15 pixels) and 30 pixels from the top (<code>y</code> is 10,
+but the vertical translation is 20 pixels).</p>
+</div>
+<div class="paragraph">
+<p>Group <code>grp2</code> and rectangle <code>rect2</code> are similar. Rectangle <code>rect2</code> is
+blue, and group <code>grp2</code> is scaled 5 times horizontally, and 2 times
+vertically. This means that rectangle <code>rect2</code> is 100 by 40 pixels in size
+(5 times 20, and 2 times 20). It also means that the position of <code>rect2</code>
+is 100 pixels from the left (5 times 20) and 60 pixels from the top (2 times
+30).</p>
+</div>
+<div class="paragraph">
+<p>Also consider the following CIF file:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;svgmove.svg&quot;;
+
+svgmove id &quot;rect1&quot; to 10, 10;
+svgmove id &quot;rect2&quot; to 10, 50;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The upper left corner of the bounding box of rectangle <code>rect1</code> is moved to
+10 pixels from the left side, and 10 pixels from the top. The upper left corner
+of the bounding box of rectangle <code>rect2</code> is moved to 10 pixels from the left
+side, and 50 pixels from the top. The effect of the move declarations on the
+SVG image is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;400&quot; height=&quot;400&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;grp1&quot;&gt;
+    &lt;rect style=&quot;fill:green;&quot; id=&quot;rect1&quot; width=&quot;20&quot; height=&quot;20&quot; x=&quot;5&quot; y=&quot;10&quot;
+          transform=&quot;translate(15, 20) translate(-10.000000,-20.000000)&quot;/&gt;
+  &lt;/g&gt;
+  &lt;g id=&quot;grp2&quot; transform=&quot;scale(5, 2)&quot;&gt;
+    &lt;rect style=&quot;fill:blue;&quot; id=&quot;rect2&quot; width=&quot;20&quot; height=&quot;20&quot; x=&quot;5&quot; y=&quot;10&quot;
+          transform=&quot;translate(15, 20) translate(-18.000000,-5.000000)&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/svgmove/svgmove.out.png" alt="svgmove.out">
+</div>
+</div>
+<div class="paragraph">
+<p>Note the translations that have been added to the <code>transform</code> attributes of
+the rectangles. The additional translation for rectangle <code>rect1</code> is -10 in
+the x direction and -20 in the y direction, as the rectangle has been moved
+from position (20, 30) to position (10, 10).</p>
+</div>
+<div class="paragraph">
+<p>Rectangle <code>rect2</code> has been moved from position (100, 60) to position
+(10, 50). You might have expected a horizontal translation of -90 and a
+vertical translation of -10. However, its added translation is for -18 pixels
+horizontally, and -5 pixels vertically. This is because the scaling applies to
+this translation as well, and 5 * 18 = 90, and 2 * 5 = 10.</p>
+</div>
+<div class="paragraph">
+<p>The scaling of the surrounding group complicates the calculations for the
+transformations of its children (<code>rect2</code> in this case). Moving elements to
+certain positions becomes more and more complicated when the elements
+themselves have transformations, their parents have transformations, the
+parents of their parents have transformations, etc. This especially holds for
+non-translation transformations, such as <code>scale</code>, <code>rotate</code>, etc. The
+CIF/SVG move declarations make moving easy, by allowing you to specify the
+target position, regardless of the existence of such transformations.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-syntax-2">Syntax</h8>
+<div class="paragraph">
+<p>The general syntax of CIF/SVG move declarations is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgmove id &lt;id&gt; to &lt;x&gt;, &lt;y&gt;;
+
+svgmove id &lt;id&gt; to &lt;x&gt;, &lt;y&gt; file &quot;...&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>svgmove</code> keyword is followed by a specification of an SVG element
+<a href="#tools-cifsim-output-svgviz-svg-id">id</a>. Every move declaration must
+<a href="#tools-cifsim-output-svgviz-svgout-id">specify the id</a> of an SVG
+element, and an SVG element with that id must exist in the SVG image. The
+<code>id</code> indicates the element that is to be moved.</p>
+</div>
+<div class="paragraph">
+<p>The x and y target coordinates are both mandatory, and indicate the coordinates
+of the upper left corner of the bounding box of element that is being moved,
+relative to the upper left corner of the canvas, after the move is completed.
+Similar to <a href="#tools-cifsim-output-svgviz-svgout-id">ids</a>,
+expressions may be used for both the x and y coordinates, as long as they
+result in a <code>int</code> or <code>real</code> typed value when they&#8217;re evaluated. That is,
+the x and y coordinates must be numeric.</p>
+</div>
+<div class="paragraph">
+<p>In the syntax examples above, we see that it is also allowed to declare a
+local <a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declaration</a>, that
+only applies to that specific move declaration.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-moving-graphical-elements">Moving graphical elements</h8>
+<div class="paragraph">
+<p>In order for an element to be moved, it must have a graphical representation.
+Elements that have a graphical representation include rectangles, paths, text
+labels, groups, etc. However, certain elements don&#8217;t have a graphical
+representation, and thus can not be moved. An example of elements that can not
+be moved are the <code>tspan</code> sub-elements of <code>text</code> elements. The <code>tspan</code>
+sub-elements don&#8217;t have graphical representations of their own, they are part
+of the text labels, and only the <code>text</code> elements have graphical
+representations.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-conflicting-transformations">Conflicting transformations</h8>
+<div class="paragraph">
+<p>The SVG standard allows for powerful
+<a href="http://www.w3.org/TR/SVG11/coords.html#TransformAttribute">transformations</a>,
+including the <code>scale</code> and <code>matrix</code> transformations. Now assume we use a
+<code>scale(0, 0)</code> transformation. Then all coordinates are multiplied by zero,
+always resulting in zero. As such, the entire image is scaled into zero by
+zero pixels. In such cases, there is no translation that can be added to an
+element, that after application of the scaling transformation, moves it to a
+certain position. Thus, if such conflicting transformations are present, the
+move can not be accomplished, and the CIF/SVG move declaration is considered
+illegal. It should be noted however, that such conflicting transformations are
+rare, and usually indicate an error has been made in those transformations.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-application-2">Application</h8>
+<div class="paragraph">
+<p>Move declarations are only applied once, at the beginning of the simulation,
+after the <a href="#tools-cifsim-output-svgviz-chapter-svgcopy">copy declarations</a> have
+been applied. For more information, see the
+<a href="#tools-cifsim-output-svgviz-simulation-order">Application order</a> section.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-simulation">Simulation of SVG visualizations</h7>
+<div class="paragraph">
+<p>
+Once a CIF specification with CIF/SVG declarations, and the SVG image or images
+are available, it is time to start simulating the CIF specification with SVG
+visualization. This page discusses the following simulation related topics:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-simulation-order">Application order</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-simulation-option">SVG visualization option</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-simulation-demos">Demonstrations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-simulation-order">Application order</h8>
+<div class="paragraph">
+<p>When the simulator is started, the SVG image is loaded. First, the
+<a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declarations</a> are
+applied, to ensure all elements exist. For copies of copied elements, the
+former are applied after the latter, to ensure the elements that need to be
+copied actually exist. Besides that, the copy declarations from a CIF file
+are applied in the order in which they are specified (after
+<a href="#tools-cif2cif-chapter-elim-comp-def-inst">elimination of component definition/instantiation</a>).
+The copy declarations are only applied once.</p>
+</div>
+<div class="paragraph">
+<p>After the copy declarations, the
+<a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declarations</a>
+are applied. The move declarations from a CIF file are applied in the order in
+which they are specified (after
+<a href="#tools-cif2cif-chapter-elim-comp-def-inst">elimination of component definition/instantiation</a>).
+The move declarations are only applied once.</p>
+</div>
+<div class="paragraph">
+<p>The <a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a> are
+applied after that, for the initial <a href="#tools-cifsim-traces-state">state</a>.
+After the output mappings have been applied, the resulting SVG image is shown
+by the simulator. The output mappings are applied again and again, as the state
+of the CIF model changes.</p>
+</div>
+<div class="paragraph">
+<p>The output mappings from a CIF file are applied in the order in
+which they are specified (after
+<a href="#tools-cif2cif-chapter-elim-comp-def-inst">elimination of component definition/instantiation</a>).
+Note however, that the order does not matter, as all output mappings are
+<a href="#tools-cifsim-output-svgviz-svgout-unique">unique</a> and independent of each
+other.</p>
+</div>
+<div class="paragraph">
+<p>Each mapping that is applied, results in an update of an attribute or text
+label. Either the new value is different from the previous value, or the value
+is updated to the value that was already there. The results of the mappings
+are cumulative. That is, the first mapping is applied to the original SVG
+image, the second mapping is applied to the image that resulted from applying
+the first mapping, the third mapping is applied to the image that resulted
+from applying the second mapping, etc.</p>
+</div>
+<div class="paragraph">
+<p>During simulation, the simulator provides states to the SVG visualizer, which
+applies the mappings to each of those states, in order to generate
+<a href="#tools-cifsim-output-realtime-frames">frames</a>. Whenever the
+mappings are applied, they are all applied, one after the other. Between the
+application of the individual output mappings, the display is never updated.
+That is, only after all mappings are applied, is the visualization updated.
+This assures that the images are in a consistent state when they are rendered.</p>
+</div>
+<div class="paragraph">
+<p>By changing the <code>width</code> and <code>height</code> attributes of the root <code>svg</code> element
+of an SVG image, it is possible to change the size of the image, and thus the
+canvas on which it is displayed during simulation. Changes to these attributes
+currently only have effect for the initial state. If the size of the image is
+changed during simulation, such changes are ignored.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-simulation-option">SVG visualization option</h8>
+<div class="paragraph">
+<p>The
+<b class="menuref">SVG visualization</b>
+option
+(<b class="menuref">Output: SVG visualization</b>
+category) can be used to disable SVG
+visualization. By default, the option is enabled, and SVG visualization is used
+if the CIF file being simulated declares any CIF/SVG declarations. By disabling
+the option, SVG visualization is disabled, regardless of whether the CIF
+specification has any CIF/SVG declarations.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-simulation-demos">Demonstrations</h8>
+<div class="paragraph">
+<p>For demonstrations and presentations, it may be useful to record a movie of a
+simulation with SVG visualization. This way, during the demonstration, there is
+no need to manually control the simulation input. Furthermore, a prerecorded
+movie can&#8217;t fail to execute, which may be a problem for live demonstrations.
+Finally, a prerecorded movie doesn&#8217;t change, and is not influenced by the
+<a href="#tools-cifsim-chapter-performance">performance</a> of the computer on which the
+demonstration is given.</p>
+</div>
+<div class="paragraph">
+<p>To record a movie of the SVG visualization, screen recording or screen
+capturing software can be used. For instance:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://camstudio.org/">CamStudio</a>
+for Microsoft Windows.</p>
+</li>
+<li>
+<p><a href="http://recordmydesktop.sourceforge.net/about.php">recordMyDesktop</a>
+for Linux.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Both these screen recording applications are free and open source.</p>
+</div>
+<div class="paragraph">
+<p>Ideally a capturing software supports capturing a region of the screen, so
+that it is for instance possible to only capture the visualization.
+Furthermore, it may be beneficial to be able to capture the mouse pointer, so
+that it is clear where interaction takes place, etc.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-undoreset-3">Undo/reset</h8>
+<div class="paragraph">
+<p>By <a href="#tools-cifsim-input-history-reset-undo">undoing</a> one or more transitions,
+or by <a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation, the
+state may change. The SVG visualizer is automatically updated to reflect such
+changes.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-debugging">Debugging SVG visualizations</h7>
+<div class="paragraph">
+<p>
+
+If an SVG visualization does not behave as you would expect it to behave, there
+are several ways to debug such problems. The following approaches are
+available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-debugging-console">Console debugging</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-debugging-saveas">Save as SVG</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-debugging-stacktrace">Stack traces</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-debugging-console">Console debugging</h8>
+<div class="paragraph">
+<p>Console debugging for CIF/SVG declarations can be enabled or disabled by using
+the
+<b class="menuref">Debug output</b>
+option (<b class="menuref">Output</b>
+category). It is
+disabled by default. If enabled, it produces debug output to the console,
+whenever CIF/SVG declarations are applied. Here is an example of what such
+output looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">SVG output (&quot;some_file.svg&quot;) id &quot;a&quot; text: &quot;10.00&quot;
+SVG output (&quot;some_file.svg&quot;) id &quot;b&quot; text: &quot;0.0&quot;
+SVG output (&quot;some_file.svg&quot;) id &quot;c&quot; text: &quot;3.16&quot;
+SVG output (&quot;some_file.svg&quot;) id &quot;n&quot; attr &quot;fill&quot; (CSS attr): &quot;#ff0000&quot;
+SVG output (&quot;some_file.svg&quot;) id &quot;water&quot; attr &quot;height&quot; (SVG attr): &quot;75.0&quot;
+SVG output (&quot;some_file.svg&quot;) id &quot;water&quot; attr &quot;y&quot; (SVG attr): &quot;104.5&quot;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Each of the output mappings that is applied, results in a line of debugging
+output. For output mappings that update the value of an attribute, the output
+indicates whether the attribute is handled as an
+<a href="#tools-cifsim-output-svgviz-svgout-svgcss">SVG presentation attribute</a> or as a
+<a href="#tools-cifsim-output-svgviz-svgout-svgcss">CSS style attribute</a>.</p>
+</div>
+<div class="paragraph">
+<p>The textual representations of the values that are set, are put between double
+quotes, and their content is not escaped in any way.</p>
+</div>
+<div class="paragraph">
+<p>
+Due to the asynchronous nature of the SVG visualizer, the simulator will
+continue to calculate the next states that are to become a frame, while the SVG
+visualizer is still applying mappings for previous frames. As such, the debug
+output and other simulation output are likely to be out of sync and
+interleaved. To ease debugging, you can enable the
+<a href="#tools-cifsim-chapter-test-mode">test mode option</a>, which ensures synchronous
+execution, and thus synchronous output.</p>
+</div>
+<div class="paragraph">
+<p>For the input mappings, whenever an interactive SVG element is clicked, and
+the corresponding mapping is used to determine the event to take, a line of
+debug output is produced. Here is an example of what such output looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">SVG input (&quot;some_file.svg&quot;) id &quot;button&quot;: event &quot;button.u_pushed&quot;
+Transition: event button.u_pushed</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>From the line of debugging output, it can be seen that the SVG element with id
+<code>button</code> was clicked, and this resulted in the execution of event
+<code>button.u_pushed</code>.</p>
+</div>
+<div class="paragraph">
+<p>Similar debug output is available for the other CIF/SVG declarations:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">SVG copy (&quot;some_file.svg&quot;) id &quot;button&quot; post &quot;1&quot;.
+SVG copy (&quot;some_file.svg&quot;) id &quot;button&quot; post &quot;2&quot;.
+
+SVG move (&quot;some_file.svg&quot;) id &quot;button1&quot; to 10.0, 10.0.
+SVG move (&quot;some_file.svg&quot;) id &quot;button2&quot; to 30.0, 10.0.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-debugging-saveas">Save as SVG</h8>
+<div class="paragraph">
+<p>During simulation, the SVG visualizer can be used to
+<a href="#tools-cifsim-output-svgviz-viewer-saveas">save</a> the currently visible image as
+an SVG image file. This way, the actual XML representation of the SVG image as
+it is displayed at that time, can be inspected in an XML editor or text editor.
+This may give insight in the actual effect of the CIF/SVG declarations applied
+until that moment.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-debugging-stacktrace">Stack traces</h8>
+<div class="paragraph">
+<p>If the application of a CIF/SVG declaration results in a runtime error, a stack
+trace is printed to the console. This stack trace makes it possible to track
+the exact origin of the error. Here is an example of such a stack trace for an
+output mapping:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">ERROR: Simulation resulted in a runtime error.
+CAUSE: Evaluation of the SVG output mapping (&quot;some_file.svg&quot;) for the text of the SVG element with id &quot;txt1&quot; failed for state: time=0.0, x=-1.5265566588595902e-16.
+CAUSE: Evaluation of SVG output mapping value &quot;sqrt(x)&quot; failed.
+CAUSE: Invalid operation: sqrt(-1.5265566588595902e-16).</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, we see that simulation resulted in a runtime error. The cause is that
+the SVG output mapping for the text of the SVG element with id <code>txt1</code> failed.
+This points to the exact CIF/SVG mapping that failed, and includes the file
+name of the SVG image file, as the same id may exist in multiple images. It
+also includes the state at which the error occurred. The stack trace further
+indicates that evaluation of the value expression failed, and the actual
+failure was the evaluation of the <code>sqrt</code> standard library function, with a
+negative argument.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-viewer">SVG viewer and visualizer</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+Our software comes with an SVG viewer for Eclipse. SVG image files can now be
+opened for viewing within Eclipse. This same viewer is used as a basis for the
+SVG visualizer used by the CIF simulator.</p>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-viewer">SVG viewer</h8>
+<div class="paragraph">
+<p>Opening SVG files in Eclipse results in them being opened by the SVG viewer.
+The SVG viewer can be used to preview SVG images from within Eclipse.</p>
+</div>
+<div class="paragraph">
+<p>If the SVG viewer can not open an SVG image, for instance because it contains
+<a href="#tools-cifsim-output-svgviz-svg-svg11">unsupported features</a> such
+as <a href="#tools-cifsim-output-svgviz-inkscape-textarea">text areas</a>, the SVG
+viewer will indicate this. Therefore, opening an SVG image in Eclipse can be
+used to verify that the SVG image can be used for SVG visualization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-refresh">Refresh</h8>
+<div class="paragraph">
+<p>The SVG viewer does <em>not</em> refresh its display if the image file is changed. To
+refresh the image, close the image, and open it again.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cifsim-output-svgviz-viewer-saveas">Save as</h8>
+<div class="paragraph">
+<p>The SVG viewer and SVG visualizer can export the currently visible image to
+several different image formats. To export the image, first make sure that
+the SVG viewer or SVG visualizer has the focus. Then select
+<span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Save As&#8230;&#8203;</b></span> to open the
+<b class="menuref">Save SVG as</b>
+dialog. Alternatively, right click the SVG image itself, and choose
+<b class="menuref">Save As&#8230;&#8203;</b>
+from the popup menu, to open the
+<b class="menuref">Save SVG as</b>
+dialog. In the dialog, specify the file name of the
+exported image. Click
+<b class="button">OK</b>
+to confirm and to actually export the
+image.</p>
+</div>
+<div class="paragraph">
+<p>The following
+<a href="http://en.wikipedia.org/wiki/Raster_graphics">raster image</a>
+formats are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics">Portable Network Graphics</a>
+(<code>*.png</code>)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/JPEG">JPEG</a>
+(<code>*.jpg</code>)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Graphics_Interchange_Format">Graphics Interchange Format</a>
+(<code>*.gif</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following
+<a href="http://en.wikipedia.org/wiki/Vector_graphics">vector image</a>
+formats are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics">Scalable Vector Graphics</a>
+(<code>*.svg</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The image format that is used to export the image, is derived from the file
+extension that is used. For each of the supported file formats, the allowed
+file names (with file extensions) are indicated above (between parentheses).</p>
+</div>
+<div class="paragraph">
+<p>After the image is exported, the workspace is refreshed to show that new image
+file, if the image was saved in a project that is visible in the
+'Project Explorer' tab or 'Package Explorer' tab.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-sun-moon">Sun/moon example</h7>
+<div class="paragraph">
+<p>
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Grouping of SVG objects.</p>
+</li>
+<li>
+<p>Controlling the visibility of objects based on the current locations of
+automata.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image">SVG image</h8>
+<div class="paragraph">
+<p>The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/sun_moon/sun_moon_inkscape.png" alt="sun moon inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The image features a sun and a moon. The sun consists of a circle and several
+lines. They are grouped together, using the
+<b class="menuref">Group</b>
+command from
+Inkscape&#8217;s
+<b class="menuref">Object</b>
+menu. The group can also be seen in the XML
+representation, as an <code>svg:g</code> element, with the actual shapes (paths in this
+case) as children. We assigned the <code>sun</code> id to the <code>svg:g</code> element, as it
+represents the entire sun. For clarity we gave the sub-elements ids as well,
+although that was not necessary, as we won&#8217;t directly reference them in the
+CIF/SVG declarations.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification">CIF specification</h8>
+<div class="paragraph">
+<p>The following CIF specification models the sun/moon example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;sun_moon.svg&quot;;
+
+automaton sun_moon:
+  cont t der 1.0;
+
+  location Day:
+    initial;
+    edge when t &gt;= 12.0 do t := 0.0 goto Night;
+
+  location Night:
+    edge when t &gt;= 12.0 do t := 0.0 goto Day;
+
+  svgout id &quot;sun&quot; attr &quot;visibility&quot;
+    value if Day: &quot;visible&quot; else &quot;hidden&quot; end;
+
+  svgout id &quot;moon&quot; attr &quot;visibility&quot;
+    value switch self:
+      case Day:   &quot;hidden&quot;
+      case Night: &quot;visible&quot;
+    end;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Initially, it is day (location <code>Day</code>). It is day for 12 hours, after which it
+becomes night (location <code>Night</code>). After 12 hours, it becomes day again, etc.</p>
+</div>
+<div class="paragraph">
+<p>There is one mapping to control the visibility of the sun, and one to control
+the visibility of the moon. Changing the visibility of the <code>svg:g</code> group
+element with id <code>sun</code> influences the visibility of all its children. This
+saves us from having to control the visibility of all the individual shapes
+that together represent the sun.</p>
+</div>
+<div class="paragraph">
+<p>Both mappings map the current location of automaton <code>sun_moon</code> to either
+<code>"visible"</code> or <code>"hidden"</code>, although they do it in a different methods. The
+mapping for the sun uses an <code>if</code> expression, which is shorter in syntax, and
+especially suited for automata with only two locations. The mapping for the
+moon uses a <code>switch</code> expression over <code>self</code>, which is a way to refer to
+automaton <code>sun_moon</code>, from inside that automaton itself. The cases list all
+the possible locations, and map them to the corresponding visibility values.
+The <code>switch</code> method is a bit more explicit, and becomes more elegant as the
+automaton has more locations.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-walk">Walk example</h7>
+<div class="paragraph">
+<p>
+
+
+
+The first part of this example shows a person walking on a floor, and features:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Grouping of SVG objects.</p>
+</li>
+<li>
+<p>The position of grouped objects in SVG.</p>
+</li>
+<li>
+<p>Changing the position of grouped objects using an output mapping.</p>
+</li>
+<li>
+<p>Using the <code>scale</code> standard library function.</p>
+</li>
+<li>
+<p>Using <a href="#tools-cifsim-output-print-chapter-tut-fmt">text formatting</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The second part of this example shows a person walking around in a room, and
+features:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Using multiple values in an output mapping.</p>
+</li>
+<li>
+<p>Using multiple format specifiers in a format pattern.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-walking-on-floor">SVG image (walking on floor)</h8>
+<div class="paragraph">
+<p>The following SVG image is used for the example of a person walking on a floor:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/walk_floor/walk_floor_orig_inkscape.png" alt="walk floor orig inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The image features a floor (gray bar), a person, and a text label. The
+person consists of some lines and a circle. These shapes are grouped together,
+using the
+<b class="menuref">Group</b>
+command from Inkscape&#8217;s
+<b class="menuref">Object</b>
+menu.
+The group can also be seen in the XML representation, as an <code>svg:g</code> element,
+with the actual shapes (paths in this case) as children. We assigned the
+<code>person</code> id to the <code>svg:g</code> element, as it represents the entire person. For
+clarity we gave the sub-elements ids as well, although that was not necessary,
+as we won&#8217;t directly reference them in the CIF/SVG declarations.</p>
+</div>
+<div class="paragraph">
+<p>Note that we moved the person as a whole, to the start of the floor. Since
+<code>svg:g</code> elements don&#8217;t have an <code>x</code> and <code>y</code> attribute in SVG, Inkscape
+applies a translation to move the group. This is reflected in the XML as a
+<code>transform</code> attribute, with the <code>translate(-290,-467)</code> value. This
+indicates that the person was moved 290 pixels to the left, and 467 pixels to
+the top (as SVG has its origin in the upper left corner of the canvas).</p>
+</div>
+<div class="paragraph">
+<p>To get rid of this, once the person is at the correct initial position, we
+can ungroup the <code>person</code> group (
+<b class="menuref">Ungroup</b>
+command from Inkscape&#8217;s
+<b class="menuref">Object</b>
+menu), and regroup it. By ungrouping the group, the
+transformation is pushed to the individual elements of the group. The regroup
+simply adds a new group around the elements, without a translation
+transformation. The new group is given an automatically generated name, so we
+need to rename it to <code>person</code>. This ungroup/group trick is often very useful.
+After this trick, the image looks as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/walk_floor/walk_floor_inkscape.png" alt="walk floor inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The text label is to be used to show the position of the person, as a
+percentage. The left position is represented as 0%, and the right position is
+represented as 100%. The id of the text label is <code>pos_txt</code>.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-walking-on-floor">CIF specification (walking on floor)</h8>
+<div class="paragraph">
+<p>The following CIF specification models a person walking on a floor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Behavior.
+automaton person:
+  cont pos = 0.0;
+
+  location forward:
+    initial;
+    equation pos' =  1.0;
+    edge when pos &gt;= 5.0 goto backward;
+
+  location backward:
+    equation pos' = -1.0;
+    edge when pos &lt;= 0.0 goto forward;
+end
+
+// Visualization.
+svgfile &quot;walk_floor.svg&quot;;
+
+// width of the floor - width of the person = movement
+// 180px              - 19px                = 161px
+svgout id &quot;person&quot; attr &quot;transform&quot;
+  value fmt(&quot;translate(%s,0)&quot;, scale(person.pos, 0, 5, 0, 161));
+
+svgout id &quot;pos_txt&quot; text
+  value fmt(&quot;%.1f%%&quot;, scale(person.pos, 0, 5, 0, 100));</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A person starts at position (variable <code>person.pos</code>) zero (value <code>0.0</code>), and
+initially moves <code>forward</code>. After (s)he has reached position <code>5.0</code>, the
+movement is reversed. Once the person is back at the start position, the
+movement repeats itself.</p>
+</div>
+<div class="paragraph">
+<p>There are two mappings, one that controls the horizontal position of the
+<code>person</code>, and another that controls the text of the text label.</p>
+</div>
+<div class="paragraph">
+<p>As stated above, the values of variable <code>person.pos</code> are in the range
+[0 .. 5]. As can be seen from the comments of the CIF model, the width of the
+floor and person are 180 pixels and 19 pixels respectively. The person can
+thus move 161 pixels to the right. The output interval of the <code>scale</code>
+standard library function is thus [0 .. 161]. As the vertical position is
+fixed, no vertical translation is required. The
+<a href="#tools-cifsim-output-print-ref-fmt-pattern">format pattern</a>
+<code>"translate(%s,0)"</code> inserts the scaled value into the horizontal amount of
+the translation. The formatted output updates the <code>transform</code> attribute,
+making the person move horizontally.</p>
+</div>
+<div class="paragraph">
+<p>The text of the text label with id <code>pos_txt</code> is updated using a second
+mapping. The value of variable <code>person.pos</code> is once again scaled using the
+<code>scale</code> standard library function. This time the output range is [0 .. 100],
+to get a percentage. Format pattern <code>"%.1f%%"</code> uses a <code>%.1f</code> format
+specifier to convert that percentage to a textual value, with a single digit
+after the decimal point. After the value of the percentage, a percentage
+character is included in escaped form (<code>%%</code>), to ensure it is not interpreted
+as a format specifier.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-walking-in-room">SVG image (walking in room)</h8>
+<div class="paragraph">
+<p>The following SVG image is used for the example of a person walking around in
+a room:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/walk_room/walk_room_inkscape.png" alt="walk room inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The image features a room (black rectangle) and a person. The person is the
+same group of elements as in the example of a person walking on a floor. The
+same group/ungroup trick is used here as well, to make sure the group has no
+translation transformation.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-walking-in-room">CIF specification (walking in room)</h8>
+<div class="paragraph">
+<p>The following CIF specification models a person walking around in a room:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Behavior.
+automaton person:
+  cont x = 0.0;
+  cont y = 0.0;
+
+  location right:
+    initial;
+    equation x' =  1.0;
+    equation y' =  0.0;
+    edge when x &gt;= 5.0 goto down;
+
+  location down:
+    equation x' =  0.0;
+    equation y' =  1.0;
+    edge when y &gt;= 5.0 goto left;
+
+  location left:
+    equation x' = -1.0;
+    equation y' =  0.0;
+    edge when x &lt;= 0.0 goto up;
+
+  location up:
+    equation x' =  0.0;
+    equation y' = -1.0;
+    edge when y &lt;= 0.0 goto right;
+end
+
+// Visualization.
+svgfile &quot;walk_room.svg&quot;;
+
+// width of the room - width of the person = horizontal movement
+// 180px             - 19px                = 161px
+//
+// height of the room - height of the person = vertical movement
+// 180px              - 40x                  = 140px
+svgout id &quot;person&quot; attr &quot;transform&quot;
+  value fmt(&quot;translate(%s,%s)&quot;, scale(person.x, 0, 5, 0, 161),
+                                scale(person.y, 0, 5, 0, 140));</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A person starts at the top left position, and initially moves to the <code>right</code>.
+Once (s)he reaches the right side, (s)he start to move <code>down</code>, followed by
+a <code>left</code> and <code>up</code> movement. After the <code>up</code> movement, the person is once
+again at the top left position, start another walk around the room, etc.</p>
+</div>
+<div class="paragraph">
+<p>There is only one mapping, which controls both the horizontal and vertical
+position of the <code>person</code>. The mapping is similar to the example of a person
+walking on a floor, except that now both the horizontal and vertical movements
+are included. The mapping uses two scaled values, one for the horizontal
+movement, and one for the vertical movement. The format pattern includes both
+values in the output. The first scaled value controls the horizontal movement,
+while the second scaled value controls the vertical movement.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-rate">Rate example</h7>
+<div class="paragraph">
+<p>
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The use of literal values in output mappings.</p>
+</li>
+<li>
+<p>How it is best to use simple solutions to solve visualization problems.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-2">SVG image</h8>
+<div class="paragraph">
+<p>The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/rate/rate_inkscape.png" alt="rate inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The SVG image visualizes a machine as a circle. The rate of the machine is
+visualized as the background of the circle. The higher the rate, the more the
+circle is filled.</p>
+</div>
+<div class="paragraph">
+<p>Instead of working with complicated clippings or linear gradients, we use a
+more simple solution here. The black circle has a transparent background
+(<code>fill</code> attribute set to <code>none</code>). This is the SVG element with id
+<code>circle</code>. Behind it is the same circle (id <code>circle_bg</code>), but without a
+border (<code>stroke</code> attribute set to <code>none</code>), and with a green fill color.
+Between those two circles, is a rectangle (id <code>circle_bg_rect</code>), that at the
+top is aligned to the top of the circle. By changing the height of the circle,
+we can now control what part of the green background circle is obscured by the
+rectangle.</p>
+</div>
+<div class="paragraph">
+<p>During the actual visualization, we&#8217;ll use a white fill color for the
+rectangle. Since the background is also white, this 'hides' the rectangle, and
+makes for a partial green background of the circle. Because a white rectangle
+can not be distinguished from the background, we used a cyan fill color for the
+rectangle. This makes that we can easily edit the rectangle, and see whether it
+has the correct initial position, size, etc.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-2">CIF specification</h8>
+<div class="paragraph">
+<p>The following CIF specification models the rate example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Behavior.
+const real MARGIN = 0.01;
+
+automaton machine:
+  cont rate der if rate &lt; target_rate:  1.0
+                else                   -1.0
+                end;
+  disc real target_rate = 0.5;
+  disc dist real rate_sampler = uniform(0.0, 1.0);
+
+  location:
+    initial;
+    edge when rate - MARGIN &lt;= target_rate and target_rate &lt;= rate + MARGIN
+         do (target_rate, rate_sampler) := sample rate_sampler;
+end
+
+// Visualization.
+svgfile &quot;rate.svg&quot;;
+
+svgout id &quot;circle_bg_rect&quot; attr &quot;height&quot;
+  value scale(machine.rate, 0, 1, 58, 0);
+
+svgout id &quot;circle_bg_rect&quot; attr &quot;fill&quot; value &quot;white&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This rather artificial machine has a <code>rate</code> at which it produces. The rate
+is a value in the interval [0 .. 1]. A target rate (variable <code>target_rate</code>)
+is randomly chosen in the same interval. The rate is automatically adapted to
+get closer to the target rate. As soon as the rate is close enough to the
+target rate, a new target rate is randomly selected, using the
+<code>rate_sampler</code>, which is a continuous uniform stochastic distribution.</p>
+</div>
+<div class="paragraph">
+<p>The first mapping controls the <code>height</code> of the rectangle. The value of
+variable <code>machine.rate</code> has a value in the interval [0 .. 1]. This interval
+is mapped to the [58 .. 0] pixels interval. That is, if the rate is 0, the
+height of the rectangle is 58 pixels, and it completely covers the background
+of the circle. The circle then appears with a completely white background. If
+the rate is 1, the height of the rectangle is 0, and a completely green
+background is shown. For rates in between 0 and 1, the lower part of the
+background of the circle is green, and the upper part is white.</p>
+</div>
+<div class="paragraph">
+<p>The second mapping sets the <code>fill</code> color of the rectangle to <code>white</code>.</p>
+</div>
+<div class="paragraph">
+<p>The following image shows an example of the visualization of a partial rate:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/rate/rate_partial.png" alt="rate partial">
+</div>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-workstation">Workstation example</h7>
+<div class="paragraph">
+<p>
+
+
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Basing the width of an object on the value of a clock in one location, and
+setting it to a fixed value in another location.</p>
+</li>
+<li>
+<p>Changing the fill color of a rectangle based on the current location of an
+automaton.</p>
+</li>
+<li>
+<p>Updating multiple attributes of an SVG element, using multiple output
+mappings.</p>
+</li>
+<li>
+<p>Specifying colors in SVG.</p>
+</li>
+<li>
+<p>Improving scalability by making use of the reuse of mappings.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-3">SVG image</h8>
+<div class="paragraph">
+<p>The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/workstation/workstation_inkscape.png" alt="workstation inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>In the image, two machines are clearly visible. Each machine has a bar that
+shows the progress of the machine. Looking at the
+<b class="menuref">XML Editor</b>
+window, we can see the bar has a background (box), and a foreground (front)
+rectangle. The <code>width</code> and <code>fill</code> color of the latter will be updated to
+reflect the machine&#8217;s status.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-3">CIF specification</h8>
+<div class="paragraph">
+<p>The following CIF specification models the workstation example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;workstation.svg&quot;;
+
+event generate, transfer, exit;
+
+m1: Machine(1, 1.0, generate, transfer);
+m2: Machine(2, 2.5, transfer, exit);
+
+automaton def Machine(alg int nr; alg real ptime; event start, done):
+  cont t der 1.0;
+
+  location idle:
+    initial;
+    edge start do t := 0.0 goto processing;
+
+  location processing:
+    edge when t &gt;= ptime goto completed;
+
+  location completed:
+    edge done goto idle;
+
+  svgout id &quot;m&quot; + &lt;string&gt;nr + &quot;_bar_front&quot; attr &quot;width&quot;
+    value scale(if processing: t else ptime end, 0, ptime, 0, 130);
+
+  svgout id &quot;m&quot; + &lt;string&gt;nr + &quot;_bar_front&quot; attr &quot;fill&quot;
+    value if idle : &quot;gray&quot; else &quot;dodgerblue&quot; end;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The example models a workstation with two machines. The first machine has a
+processing time of <code>1.0</code> time units and the second machine has a processing
+time of <code>2.5</code> time units. Each machine gets products to <code>start</code> processing,
+processes them, and sends them out as it is <code>done</code>. The first machine gets
+its input from an infinite generator (event <code>generate</code>). The second machine
+sends its finished products to an infinite exit buffer (event <code>exit</code>).
+Products are transported from the first machine to the second machine via a
+transport system (event <code>transfer</code>). Note that the <code>Machine</code> automaton
+definition has three locations. In location <code>idle</code> it is waiting for a
+product to enter the machine (event <code>start</code>). In location <code>processing</code> it
+processes the product, which takes <code>ptime</code> time units. Finally, in location
+<code>completed</code> it has completed processing the product, and waits until it can
+send it as output. After that, the machine is back in the <code>idle</code> location,
+where it waits for the next product.</p>
+</div>
+<div class="paragraph">
+<p>Both machines (<code>m1</code> and <code>m2</code>) are instantiations of the same automaton
+definition (<code>Machine</code>). The definition/instantiation mechanism allows us to
+specify the behavior of a machine only once, and still have multiple machines.
+This reuse improves scalability, as well as maintainability. The reuse of the
+behavior applies to the visualization as well. By declaring the output mappings
+in the automaton definition, we get mappings for each instantiation of an
+actual machine.</p>
+</div>
+<div class="paragraph">
+<p>Since each machine has its own graphical representation in the SVG image, the
+graphical elements for the different machines have different ids as well.
+However, they only differ in the number that is used. For instance, there is
+an <code>m1_bar_front</code> rectangle for the first machine, and an <code>m2_bar_front</code>
+rectangle for the second machine. In order to make sure each machine gets the
+correct mappings that apply to their own ids, we added an algebraic parameter
+<code>nr</code> to the definition of <code>Machine</code>, that indicates to the machine which
+machine it is. We can then use that <code>nr</code> to compute the id. For machine
+<code>m1</code>, the <code>Machine</code> automaton definition is instantiated with value <code>1</code>
+for the <code>nr</code> parameter. The <code>"m" + &lt;string&gt;nr + "_bar_front"</code> id expression
+then evaluates to <code>"m1_bar_front"</code>, and <code>m1_bar_front</code> is used as the id
+for the output mapping.</p>
+</div>
+<div class="paragraph">
+<p>The first mapping updates the width of the <code>m*_bar_front</code> rectangles to show
+the progress of the machines. If a machine is actually <code>processing</code>, the
+value of clock <code>t</code> is used, as that clock indicates how much of the
+processing has been completed.</p>
+</div>
+<div class="paragraph">
+<p>When a machine is <code>idle</code> (and waiting for a product) or has <code>completed</code>
+processing (but can not yet push the processed product out of the machine),
+the progress is either nothing, or everything. In both cases, we choose the
+full processing time (variable <code>ptime</code>) as the value. The reason to choose
+this value for the <code>idle</code> location, becomes clear in the next output mapping.</p>
+</div>
+<div class="paragraph">
+<p>The <code>ptime</code> value is chosen for the <code>completed</code> location to ensure that
+the rectangle does not get wider than the box (rectangle <code>m*_bar_back</code>). If
+we would have used the value of clock <code>t</code> in this location as well, then
+since the value of the clock keeps increasing in that location, the value
+becomes larger than <code>ptime</code>, and thus the progress bar would be partly
+outside the box (rectangle <code>m*_bar_back</code>).</p>
+</div>
+<div class="paragraph">
+<p>The value that is selected for this first mapping, is transformed using the
+<code>scale</code> standard library function. The function is used to scale the
+processing time interval [0 .. <code>ptime</code>] to the [0 .. 130] interval, which
+represents the <code>width</code> of the rectangle in pixels. The upper bound of 130
+pixels matches the <code>width</code> of the box (rectangle <code>m*_bar_back</code>).</p>
+</div>
+<div class="paragraph">
+<p>The second mapping updates the <code>fill</code> color (foreground color) of the same
+SVG element. In the <code>idle</code> location, the color is <code>gray</code>. Since we used the
+full width in that location (value <code>ptime</code> in the [0 .. <code>ptime</code>] interval),
+the entire box is then filled by a gray rectangle, indicating that the machine
+is idle.</p>
+</div>
+<div class="paragraph">
+<p>For the other locations, the <code>fill</code> color is set to <code>dodgerblue</code>. Since the
+width in pixels is a value in the interval [0 .. 30], part of the box will be
+blue, and part will be the background color of the box, which is white. In the
+<code>completed</code> location, the full width is used as well, resulting in a
+completely blue box, indicating that the machine has a completely processed
+product, waiting to be released as output.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-colors-in-svg">Colors in SVG</h8>
+<div class="paragraph">
+<p>In the mappings, as described above, we used names to identify colors. SVG
+however, provides several ways to specify
+<a href="http://www.w3.org/TR/SVG11/types.html#DataTypeColor">colors</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://www.w3.org/TR/SVG11/types.html#ColorKeywords">Named colors</a>,
+such as <code>red</code>, <code>yellow</code>, <code>lightblue</code> or <code>burlywood</code>.</p>
+</li>
+<li>
+<p>Decimal RGB (red-green-blue) colors, such as <code>rgb(255,0,0)</code> for <code>red</code>, or
+<code>rgb(255,255,0)</code> for <code>yellow</code>.</p>
+</li>
+<li>
+<p>Hexadecimal RGB (red-green-blue) colors, such as <code>#f00</code> or <code>#ff0000</code> for
+<code>red</code>, or <code>#ff0</code> or <code>#ffff00</code> for <code>yellow</code>.</p>
+</li>
+<li>
+<p>RGB (red-green-blue) colors in percentages, such as <code>rgb(100%,0%,0%)</code> for
+<code>red</code>, or <code>rgb(100%,100%,0%)</code> for <code>yellow</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Every color can be specified by one of the three RGB color variants. The colors
+that have a predefined color name, can be specified in four different ways.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-tank">Tank example</h7>
+<div class="paragraph">
+<p>
+
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Use of the <code>scale</code> standard library function.</p>
+</li>
+<li>
+<p>The difference between the coordinate systems of <a href="#tools-cifsim-output-svgviz-chapter-inkscape">Inkscape</a>
+and <a href="#tools-cifsim-output-svgviz-chapter-svg">SVG</a>.</p>
+</li>
+<li>
+<p>How inverting the y-axis can reduce the number of output mappings.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-4">SVG image</h8>
+<div class="paragraph">
+<p>The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/tank/tank_inkscape.png" alt="tank inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The image features a tank (black lines) and the water in the tank (blue
+rectangle). The water rectangle is selected. At the top of the screenshot, you
+see the object&#8217;s position as Inkscape represents it. It shows <code>15</code> for the
+<code>x</code> position, and <code>10</code> for the <code>y</code> position. These values are relative to
+the lower left corner of the canvas. In the
+<b class="menuref">XML Editor</b>
+window, you
+see the position as SVG represents it. It shows <code>15</code> for the <code>x</code> position
+as well, but <code>30</code> for the <code>y</code> position. These values are relative to the
+upper left corner of the canvas. Inkscape and SVG use different coordinate
+systems, where the <code>y</code>-axis is reversed. The CIF/SVG declarations works on
+SVG images, and thus uses the coordinate system of SVG.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-4">CIF specification</h8>
+<div class="paragraph">
+<p>The following CIF specification models the tank example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Behavior.
+const real CAPACITY   = 10.0;
+const real MAX_LEVEL  =  8.0;
+const real INIT_LEVEL =  5.0;
+const real MIN_LEVEL  =  2.0;
+
+automaton tank:
+  cont level = INIT_LEVEL;
+
+  location open:
+    initial;
+    equation level' =  1.0;
+    edge when level &gt;= MAX_LEVEL goto closed;
+
+  location closed:
+    equation level' = -1.0;
+    edge when level &lt;= MIN_LEVEL goto open;
+end
+
+// Visualization.
+svgfile &quot;tank.svg&quot;;
+
+svgout id &quot;water&quot; attr &quot;height&quot; value scale(tank.level, 0, CAPACITY, 0, 80);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this specification, we have a tank filled with water. Initially, the
+<code>level</code> (height) of the water is <code>5.0</code>, and the valve is <code>open</code>. The
+level linearly increases with a rate of <code>1.0</code> per time unit. Once the level
+is <code>MAX_LEVEL</code>, we close the valve, and go to the <code>closed</code> location. Here
+the level linearly decreases until we reach the minimum level (<code>MIN_LEVEL</code>),
+after which we open the valve again. The level controller keeps the level
+between the minimum and maximum allowed levels.</p>
+</div>
+<div class="paragraph">
+<p>There is only one mapping, and it controls the height of the <code>water</code>
+rectangle. The water level in the model stays between zero and <code>CAPACITY</code>, by
+definition (as a higher level would overflow). This results in an input
+interval of [0 .. <code>CAPACITY</code>]. The height of the tank in the SVG image is
+<code>80</code> pixels. The output interval thus becomes [0 .. 80].</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-simulation-2">Simulation</h8>
+<div class="paragraph">
+<p>When we simulate the tank example using the CIF specification and SVG image
+as specified above, we immediately observe a problem:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/tank/tank_problem.png" alt="tank problem">
+</div>
+</div>
+<div class="paragraph">
+<p>In SVG the origin is in the upper left corner of the canvas. Changing the
+height of an object results in the top of the object being fixed, and the
+bottom of the object being closer to or farther away from that top. What we
+want in this case, is to have the bottom of the object fixed, and the top of
+the object being closer to or farther away from the top, depending on the
+height of the object.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-revisited">SVG image (revisited)</h8>
+<div class="paragraph">
+<p>A naive solution would be to add a second output mapping, to correct the
+vertical position (<code>y</code> attribute) of the <code>water</code> rectangle. This is a valid
+solution, and it works. There is however a simpler and more elegant solution.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following, updated SVG image:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/tank/tank2_inkscape.png" alt="tank2 inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>This SVG image is the same as the original SVG image for this example, but with
+an inverted <code>y</code>-axis, for the <code>water</code> rectangle. The <code>y</code>-axis was
+inverted by using the
+<b class="menuref">Flip Vertical</b>
+command from Inkscape&#8217;s
+<b class="menuref">Object</b>
+menu, while the <code>water</code> rectangle was selected. As can be
+seen in the screenshot, Inkscape corrects for the applied transformation, and
+still indicates the same <code>x</code> and <code>y</code> coordinates (at the top of the
+screenshot). In SVG (and thus the
+<b class="menuref">XML Editor</b>
+window), we see a new
+<code>transform</code> attribute, <code>scale(1,-1)</code> as value, which represents the
+inversion of the <code>y</code>-axis. Also, the bottom of the water (the inverted top of
+the water) is now <code>90</code> pixels (the inverted <code>-90</code> value of the <code>y</code>
+attribute) from the top of the image. Using this vertical flip, we now fixated
+the 'bottom' of the water, and we can thus change the height of the water
+without having to correct its position. The mappings for this modified SVG
+image are the same as the original mappings.</p>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-lamps">Lamps example</h7>
+<div class="paragraph">
+<p>
+
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Scalability of CIF models and SVG visualizations.</p>
+</li>
+<li>
+<p>The use of <a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declarations</a>.</p>
+</li>
+<li>
+<p>The use of <a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declarations</a>.</p>
+</li>
+</ul>
+</div>
+<div class="sect7">
+<h8 id="tools-introducing-the-lamps-example">Introducing the lamps example</h8>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">// Behavior.
+automaton def Lamp():
+  event toggle;
+  disc bool on = false;
+
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+
+lamp1: Lamp();
+lamp2: Lamp();
+
+// Visualization.
+svgfile &quot;lamps2.svg&quot;;
+
+svgout id &quot;lamp1&quot; attr &quot;fill&quot; value if lamp1.on: &quot;yellow&quot; else &quot;silver&quot; end;
+svgout id &quot;lamp2&quot; attr &quot;fill&quot; value if lamp2.on: &quot;yellow&quot; else &quot;silver&quot; end;
+
+svgout id &quot;lamp1&quot; attr &quot;stroke-width&quot; value if lamp1.on: 5 else 2 end;
+svgout id &quot;lamp2&quot; attr &quot;stroke-width&quot; value if lamp2.on: 5 else 2 end;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification has two lamps, <code>lamp1</code> and <code>lamp2</code>. Both lamps have
+identical behavior, and therefore the behavior is only specified once, using
+automaton definition <code>Lamp</code>. This definition is instantiated two times, once
+for each of the lamps. A lamp is initially off, can go on, go off again, go on
+again, etc. The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/lamps/lamps2_inkscape.png" alt="lamps2 inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The visualization shows the two lamps. The first lamp is off, and has a silver
+background color. The second lamp is on and has a yellow background color. The
+lamp that is off has a thin border and the lamp that is on has a thicker
+border. The CIF specification also contains four
+<a href="#tools-cifsim-output-svgviz-chapter-svgout">CIF/SVG output mappings</a>, two for
+the background colors of the circles and two for the thickness of the borders
+(strokes) of the circles.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-visualization-scalability-issues">SVG visualization scalability issues</h8>
+<div class="paragraph">
+<p>The use of the automaton definition allows us to add another lamp by simply
+adding the following line to the CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">lamp3: Lamp();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This single line ensures that we have a third lamp, with the corresponding
+behavior. However, we also need to adapt the SVG image, by adding another
+circle, and we need to add two more output mappings to the CIF model. In this
+case, the additional amount of work is manageable. If however our lamp would
+have been represented in the image by many different graphical elements,
+adding another lamp would require copying all those graphical elements, and
+might also lead to adding many more output mappings per lamp.</p>
+</div>
+<div class="paragraph">
+<p>Furthermore, if we were to decide to change the graphical representation of
+lamps from a circle to a square, we would have to change the graphical
+representation of each of the lamps in the image.</p>
+</div>
+<div class="paragraph">
+<p>It should be clear that this approach does not scale very well. Ideally, we
+would add another lamp by just adding another instantiation of the <code>Lamp</code>
+definition as we did above, and automatically get another circle in the image,
+and two more output mappings in the CIF model.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-a-scalable-solution">A scalable solution</h8>
+<div class="paragraph">
+<p>For the behavior of the lamp, we already had a scalable solution, by using the
+component definition/instantiation mechanism. That same mechanism can be used
+to make the image and mappings scalable. First, we&#8217;ll change the SVG image:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/lamps/lamps3_inkscape.png" alt="lamps3 inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The second lamp has been removed from the image. We only keep one lamp, as a
+sort of template for all the lamps. Since we want to use the same graphical
+representation for all lamps, we only want to include it once in the SVG image.
+This allows us to change the graphical representation of the template, to have
+all the lamps change appearance at once. The lamp has been moved outside of the
+visible part of the canvas, and its <code>id</code> has been changed from <code>lamp1</code> to
+<code>lamp</code>. The reason for these last two changes will become clear once we look
+at the new CIF model, and especially the new output mappings:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;lamps3.svg&quot;;
+
+automaton def Lamp(alg int nr):
+  // Behavior.
+  event toggle;
+  disc bool on = false;
+
+  location:
+    initial;
+    edge toggle do on := not on;
+
+  // Visualization.
+  svgcopy id &quot;lamp&quot; post &lt;string&gt;nr;
+
+  svgmove id &quot;lamp&quot; + &lt;string&gt;nr to 20 + (nr - 1) * 100, 20;
+
+  svgout id &quot;lamp&quot; + &lt;string&gt;nr attr &quot;fill&quot;
+    value if on: &quot;yellow&quot; else &quot;silver&quot; end;
+
+  svgout id &quot;lamp&quot; + &lt;string&gt;nr attr &quot;stroke-width&quot;
+    value if on: 5 else 2 end;
+end
+
+lamp1: Lamp(1);
+lamp2: Lamp(2);
+lamp3: Lamp(3);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first change is that the <code>Lamp</code> automaton definition now has a <code>nr</code>
+parameter, that indicates which lamp it is. Each lamp is given a different
+number when instantiated. This allows the lamp automata to know their own
+identity, and use that for the SVG visualization.</p>
+</div>
+<div class="paragraph">
+<p>We also put the CIF/SVG declarations for the visualization inside the automaton
+definition. By doing this, we ensure that each instantiation (each lamp) gets
+their own version of these declarations.</p>
+</div>
+<div class="paragraph">
+<p>The CIF/SVG declarations have changed as well. A
+<a href="#tools-cifsim-output-svgviz-chapter-svgcopy">CIF/SVG copy declaration</a> has been added. The copy
+declaration states that the SVG element with id <code>lamp</code> (the circle) should
+be copied. It also states that the copy should be postfixed with
+<code>&lt;string&gt;nr</code>. That is, for automaton <code>lamp1</code>, the value of the <code>nr</code>
+parameter is <code>1</code>, and the id is thus postfixed with <code>"1"</code>. In other words,
+circle <code>lamp</code> is copied, and the copy is given name <code>lamp1</code> (composed
+from <code>lamp</code> and <code>1</code>). For <code>lamp2</code>, the id of the copied circle is
+<code>lamp2</code>, etc. For each of the lamps, the copy gets a different name, that is
+unique within the SVG image. This single copy declaration takes care of the
+scalability of the SVG image, by ensuring we have exactly as many circles as we
+have lamps (not counting the template circle <code>lamp</code>).</p>
+</div>
+<div class="paragraph">
+<p>The copies of the template circle all get exactly the same attributes as the
+template (except for their <code>id</code> attribute). As such, they are all positioned
+outside the visible part of the canvas. The easiest way to put them at the
+correct positions, is to use a
+<a href="#tools-cifsim-output-svgviz-chapter-svgmove">CIF/SVG move declaration</a>, which
+is also new compared to the previous CIF model. The move declarations use the
+ids of the copied circles, so that each move declaration moves the circle for
+that specific lamp. They are all moved to 20 pixels from the top of the canvas,
+and '20 + (<code>nr</code> - 1) * 100' pixels from the left side of the canvas. So, the
+first lamp (<code>nr</code> 1) is moved to (20, 20), the second lamp (<code>nr</code> 2) is moved
+to (120, 20), and the third lamp (<code>nr</code> 3) is moved to (220, 20). This single
+move declaration takes care of the scalability of the positions of the lamps,
+by ensuring we have exactly as many movements as we have lamps. By using the
+<code>nr</code> parameter, each lamp can easily be moved to their own unique position.</p>
+</div>
+<div class="paragraph">
+<p>The output mappings for the background color of the circles and thickness of
+the borders of the circles, are very similar to the output mappings of the
+first version of the CIF model, though there are a few changes. The mappings
+use the same method as the move declaration, to construct the ids. Since the
+mappings are now defined within the automaton definition, they can directly
+refer to the <code>on</code> variable. This ensures that for each different lamp, the
+mappings refer to the <code>on</code> variable of that specific lamp. We now have only
+one output mapping for the background color, and also only one output mapping
+for the thickness of the border.</p>
+</div>
+<div class="paragraph">
+<p>By putting the CIF/SVG declarations inside the automaton definition, and by
+using the copy and move declarations, we now have a scalable solution. We only
+have one lamp in our SVG image, only one behavioral specification in the CIF
+model, and only one output mapping per attribute that we want to couple. No
+matter how many instantiations of the <code>Lamp</code> automaton definition we add, we
+don&#8217;t have to manually change the SVG image or the visualization coupling.</p>
+</div>
+<div class="paragraph">
+<p>For completeness, take a look at this CIF model after the
+<a href="#tools-cif2cif-chapter-elim-comp-def-inst">elimination of component definition/instantiation</a>, the
+<a href="#tools-cif2cif-chapter-elim-alg-vars">elimination of algebraic variables</a>, and
+the <a href="#tools-cif2cif-chapter-simplify-values">simplification of values</a>.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton lamp1:
+  event toggle;
+  disc bool on = false;
+  svgcopy id &quot;lamp&quot; post &quot;1&quot;;
+  svgmove id &quot;lamp1&quot; to 20, 20;
+  svgout id &quot;lamp1&quot; attr &quot;fill&quot; value if on: &quot;yellow&quot; else &quot;silver&quot; end;
+  svgout id &quot;lamp1&quot; attr &quot;stroke-width&quot; value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+automaton lamp2:
+  event toggle;
+  disc bool on = false;
+  svgcopy id &quot;lamp&quot; post &quot;2&quot;;
+  svgmove id &quot;lamp2&quot; to 120, 20;
+  svgout id &quot;lamp2&quot; attr &quot;fill&quot; value if on: &quot;yellow&quot; else &quot;silver&quot; end;
+  svgout id &quot;lamp2&quot; attr &quot;stroke-width&quot; value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+automaton lamp3:
+  event toggle;
+  disc bool on = false;
+  svgcopy id &quot;lamp&quot; post &quot;3&quot;;
+  svgmove id &quot;lamp3&quot; to 220, 20;
+  svgout id &quot;lamp3&quot; attr &quot;fill&quot; value if on: &quot;yellow&quot; else &quot;silver&quot; end;
+  svgout id &quot;lamp3&quot; attr &quot;stroke-width&quot; value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+svgfile &quot;lamps3.svg&quot;;</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-svgviz-chapter-example-buffers-products">Buffers/products example</h7>
+<div class="paragraph">
+<p>
+
+
+This example shows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Improving hierarchical scalability by making use of the reuse of mappings.</p>
+</li>
+<li>
+<p>Improving hierarchical scalability by making copies of copied elements.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>It is assumed the reader is already familiar with the
+<a href="#tools-cifsim-output-svgviz-chapter-example-workstation">workstation example</a>.</p>
+</div>
+<div class="sect7">
+<h8 id="tools-svg-image-5">SVG image</h8>
+<div class="paragraph">
+<p>The following SVG image is used for this example:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/buffers_products/buffers_products_inkscape.png" alt="buffers products inkscape">
+</div>
+</div>
+<div class="paragraph">
+<p>The SVG image contains a single template for a buffer (large rectangle), with
+one product (small rectangle). The template is moved outside of the canvas to
+ensure the template itself is not shown.</p>
+</div>
+<div class="paragraph">
+<p>The SVG file has the following XML content:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="svg">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;
+     xmlns:svg=&quot;http://www.w3.org/2000/svg&quot;
+     width=&quot;220&quot; height=&quot;70&quot; id=&quot;root&quot; version=&quot;1.1&quot;&gt;
+  &lt;g id=&quot;buffer&quot;&gt;
+    &lt;rect width=&quot;100&quot; height=&quot;50&quot; x=&quot;-120&quot; y=&quot;10&quot; id=&quot;background&quot; style=&quot;fill:#ff0000&quot;/&gt;
+    &lt;rect width=&quot;10&quot;  height=&quot;30&quot; x=&quot;-110&quot; y=&quot;20&quot; id=&quot;product&quot;    style=&quot;fill:#8b0000;visibility:hidden;&quot;/&gt;
+  &lt;/g&gt;
+&lt;/svg&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We&#8217;ll use CIF to turn this into two buffers with three products each, in a
+scalable manner. That is, to add a single buffer, we only need one more
+instantiation, and also to put an additional product in each buffer, we also
+only need one more instantiation.</p>
+</div>
+</div>
+<div class="sect7">
+<h8 id="tools-cif-specification-5">CIF specification</h8>
+<div class="paragraph">
+<p>The following CIF specification models the buffers/products example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;buffers_products.svg&quot;;
+
+buffer0: Buffer(0);
+buffer1: Buffer(1);
+
+group def Buffer(alg int nr):
+  svgcopy id &quot;buffer&quot; post &lt;string&gt;nr;
+
+  svgmove id &quot;buffer&quot; + &lt;string&gt;nr to 10 + nr * 110, 10;
+
+  product0: Product(nr, 0);
+  product1: Product(nr, 1);
+  product2: Product(nr, 2);
+end
+
+group def Product(alg int bufferNr, productNr):
+  svgcopy id &quot;product&quot; + &lt;string&gt;bufferNr post &quot;_&quot; + &lt;string&gt;productNr;
+
+  svgout id fmt(&quot;product%d_%d&quot;, bufferNr, productNr)
+         attr &quot;transform&quot;
+         value fmt(&quot;translate(%d,0)&quot;, productNr * 20);
+
+  svgout id fmt(&quot;product%d_%d&quot;, bufferNr, productNr)
+         attr &quot;visibility&quot;
+         value &quot;visible&quot;;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two buffers are present (<code>buffer0</code> and <code>buffer1</code>). Both are instances of
+the <code>Buffer</code> definition, and are provided with their own identity (parameter
+<code>nr</code>). For each buffer, the <code>buffer</code> element of the image is copied, and
+the copy is given a unique number. For instance, for instantiation <code>buffer0</code>,
+<code>nr</code> is <code>0</code>, and thus <code>buffer</code> is copied to <code>buffer0</code>, <code>background</code>
+is copied to <code>background0</code> and <code>product</code> is copied to <code>product0</code>.</p>
+</div>
+<div class="paragraph">
+<p>Each buffer is also moved. The first buffer (<code>nr</code> <code>0</code>) gets moved to
+position (10, 10), while the second (<code>nr</code> <code>1</code>) gets moved to position
+(120, 10).</p>
+</div>
+<div class="paragraph">
+<p>Each buffer contains three products, as the <code>Product</code> definition is
+instantiated three times. The number of the buffer is passed along, as is a
+unique product number. For the copy of the products, the copy of the product
+in the copied buffer is copied, and given a unique name using the product
+number. For <code>buffer0</code>, the copy of the <code>product</code> was already named
+<code>product0</code>. This already copied element is copied another three times, to
+<code>product0_0</code> (by the copy declaration in CIF group <code>buffer0.product0</code>),
+<code>product0_1</code> (by the copy declaration in CIF group <code>buffer0.product1</code>),
+and <code>product0_2</code> (by the copy declaration in CIF group <code>buffer0.product2</code>).
+Similarly, three copies are made for <code>buffer1</code>.</p>
+</div>
+<div class="paragraph">
+<p>Unlike the buffers, which are moved to an absolute position using an
+<code>svgmove</code>, the products are moved relatively, using an <code>svgout</code> for their
+<code>transform</code> attribute. The first product (<code>product0_0</code>) is not moved, the
+second product (<code>product0_1</code>) is moved <code>20</code> pixels, etc.</p>
+</div>
+<div class="paragraph">
+<p>The buffer template was put outside of the canvas to show only the copies and
+not the template. For the products, which are contained in the buffers, this
+trick is not possible. So, instead the <code>visibility</code> of the template
+<code>product</code> was set to <code>hidden</code> in the original SVG image. To show the actual
+(copied) products, an <code>svgout</code> is used to set the <code>visibility</code> attribute
+to <code>visible</code>. The template <code>product</code> is not changed, so it remains hidden.</p>
+</div>
+<div class="paragraph">
+<p>The result of all this hierarchical 2-level structure is the following SVG
+image:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/svgviz/buffers_products/buffers_products.png" alt="buffers products">
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-trajdata">Trajectory data output</h6>
+<div class="paragraph">
+<p>
+
+
+The trajectory data (values of the variables as time progresses), calculated
+by the <a href="#tools-cifsim-solver-chapter-index">ode solver</a>, can be written to a
+file, using the trajectory data output component.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="tools-cifsim-output-trajdata-option" class="paragraph">
+<p>Enable the
+<b class="menuref">Trajectory data</b>
+option (<b class="menuref">Output: Trajectory data</b>
+category) to enable writing the trajectory data to a file.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-trajdata-file" class="paragraph">
+<p>By default, the file to which to write the trajectory data, is the name of the
+input specification file, with <code>.trajdata</code> added to it. Using the
+<b class="menuref">Trajectory data file</b>
+option (<b class="menuref">Output: Trajectory data</b>
+category), a different file can be specified. The value of the option is the
+absolute or relative local file system path to use for the trajectory data
+file.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-filtering">Filtering</h7>
+<div class="paragraph">
+<p>Variable <code>time</code> is always included in the trajectory data file. The following
+additional variables (officially 'state objects') are included by default:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The state variables, which includes the discrete variables and the continuous
+variables.</p>
+</li>
+<li>
+<p>The derivatives of the continuous variables. This does not include the
+derivative of variable <code>time</code>.</p>
+</li>
+<li>
+<p>The algebraic variables.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only variables of type <code>bool</code>, <code>int</code> (with or without ranges), or <code>real</code>
+are included.</p>
+</div>
+<div id="tools-cifsim-output-trajdata-filters" class="paragraph">
+<p>Using the
+<b class="menuref">Trajectory data filters</b>
+option
+(<b class="menuref">Output: Trajectory data</b>
+category), the state objects can be
+filtered. The
+<b class="menuref">Trajectory data filters</b>
+option only has effect
+if trajectory data output is enabled, using the
+<b class="menuref">Trajectory data</b>
+option.</p>
+</div>
+<div class="paragraph">
+<p>As value for the option, comma separated <em>filters</em> should be supplied. Each
+filter specifies one or more state objects. The absolute names of the objects
+are used. That is, for an automaton <code>a</code>, with a variable <code>x</code>, the absolute
+name of the variable object is <code>a.x</code>. If CIF textual syntax keyword are
+used as names for events (such as <code>plant</code>), then they must be escaped in
+<code>.cif</code> files (<code>$plant</code>). For filters however, all escape characters (<code>$</code>)
+in the names are ignored. The <code>*</code> character can be used as wildcard, to
+indicate zero or more characters. If a filter doesn&#8217;t match any of the state
+objects of the CIF model (after filtering them for supported types etc), a
+warning is printed to the console. A warning is also printed if the entire
+state is filtered out.</p>
+</div>
+<div class="paragraph">
+<p>By default, filters include matching state objects. Filters may however be
+preceded by a <code>-</code> character, turning them into exclusion filters, which
+exclude matching states objects rather than including them. Filters are
+processed in the order they are specified, allowing for alternating additions
+and removals. If a filter does not result in the addition/removal of any state
+objects to/from the filter result, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>a.*,-a.b*,a.bc*</code> consists of three filters:
+<code>a.*</code>, <code>-a.b*</code>, and <code>a.bc*</code>. The first filter indicates that state
+objects whose absolute names start with <code>a.</code> are to be included. The second
+filter indicates that from those matching state objects, the state objects
+whose absolute names start with <code>a.b*</code> are to be excluded. To that result,
+the third filter adds those state objects whose absolute names start with
+<code>a.bc*</code>. For instance, if a specification contains state objects <code>time</code>,
+<code>a.a</code>, <code>a.b</code> <code>a.bb</code>, <code>a.bc</code>, <code>a.b.c</code>, <code>a.bc</code>, <code>a.bcc</code>, and
+<code>a.bcd</code>, the result of the three filters is that the following state objects
+are displayed: <code>a.a</code>, <code>a.bc</code>, <code>a.bc</code>, <code>a.bcc</code>, and <code>a.bcd</code>.</p>
+</div>
+<div class="paragraph">
+<p>The default option value (filter) is <code>*</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-output">Output</h7>
+<div class="paragraph">
+<p>
+The variables are sorted alphabetically, based on their absolute names. The
+only exception is variable <code>time</code>, which is always listed first.</p>
+</div>
+<div class="paragraph">
+<p>For variables with a boolean type, value <code>false</code> is represented by <code>0</code>, and
+value <code>true</code> is represented by <code>1</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+For each time transition, the trajectories of the variables are printed to the
+trajectory data file. The first line is a comment, and contains the names of
+the variables. Each of the subsequent lines contain the values of the variables
+for a specific value of variable <code>time</code>. The exact times for which the
+values are printed to the trajectory data file, is determined by the
+<a href="#tools-cifsim-solver-chapter-basics-int">ODE solver integrator</a>, and can be
+influenced using the <a href="#tools-cifsim-solver-chapter-options">integration options</a>,
+as well as the <a href="#tools-cifsim-solver-chapter-options-outstep">fixed output step size</a> option.</p>
+</div>
+<div class="paragraph">
+<p>An example of a trajectory data file, for a single time transition:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code># time controller.n tank.V tank.V' tank.Qi tank.Qo
+0.0 0 10.0 -3.1622776601683795 0.0 3.1622776601683795
+0.08763429266802605 0 9.7247959763441 -3.1184605138343664 0.0 3.1184605138343664
+0.587634292668026 0 8.228065719426915 -2.868460513834366 0.0 2.868460513834366
+1.087634292668026 0 6.8563354625097315 -2.618460513834366 0.0 2.618460513834366
+1.587634292668026 0 5.609605205592543 -2.3684605138343646 0.0 2.3684605138343646
+2.0876342926680262 0 4.487874948675351 -2.1184605138343624 0.0 2.1184605138343624
+2.5876342926680262 0 3.491144691758149 -1.8684605138343569 0.0 1.8684605138343569
+3.0876342926680262 0 2.619414434840913 -1.618460513834339 0.0 1.618460513834339
+3.496128195593086 0 1.9999999999999958 -1.4142135623730936 0.0 1.4142135623730936</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-trajdata-prettify">Prettifying</h7>
+<div class="paragraph">
+<p>To make the output in the trajectory data file easier to read, the output
+can be <em>prettified</em>. If prettifying is enabled, then after the simulation ends,
+the trajectory data file is read, prettified, and rewritten. A fixed width is
+then used for each column (each variable), with a fixed column separation.
+After prettification, the above trajectory data file looks like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code># time                controller.n   tank.V               tank.V'               tank.Qi   tank.Qo
+0.0                   0              10.0                 -3.1622776601683795   0.0       3.1622776601683795
+0.08763429266802605   0              9.7247959763441      -3.1184605138343664   0.0       3.1184605138343664
+0.587634292668026     0              8.228065719426915    -2.868460513834366    0.0       2.868460513834366
+1.087634292668026     0              6.8563354625097315   -2.618460513834366    0.0       2.618460513834366
+1.587634292668026     0              5.609605205592543    -2.3684605138343646   0.0       2.3684605138343646
+2.0876342926680262    0              4.487874948675351    -2.1184605138343624   0.0       2.1184605138343624
+2.5876342926680262    0              3.491144691758149    -1.8684605138343569   0.0       1.8684605138343569
+3.0876342926680262    0              2.619414434840913    -1.618460513834339    0.0       1.618460513834339
+3.496128195593086     0              1.9999999999999958   -1.4142135623730936   0.0       1.4142135623730936</code></pre>
+</div>
+</div>
+<div id="tools-cifsim-output-trajdata-sep" class="paragraph">
+<p>By default, the trajectory data output is prettified using a column separation
+of three spaces. This can be changed using the
+<b class="menuref">Trajectory data separation amount</b>
+option
+(<b class="menuref">Output: Trajectory data</b>
+category). Using this option,
+prettification can be disabled, or a different number of spaces can be used
+between the columns.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-undoreset-4">Undo/reset</h7>
+<div class="paragraph">
+<p>It is possible to go back in time, by
+<a href="#tools-cifsim-input-history-reset-undo">undoing</a> one or more transitions, or
+by <a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation.
+However, once a time transition is taken, trajectory data is written to the
+output file. The simulator does not remove data for time points that are then
+suddenly in the future. If simulation continues after the undo or reset, new
+data may be written at the end of the trajectory, for the same time points that
+were already present earlier in the data file. As such, the data contained in
+the trajectory data file, may no longer be useful after an undo or reset, if
+simulation continues afterwards.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-plotviz">Plot visualizer</h6>
+<div class="paragraph">
+<p>
+
+
+For models with variables, especially continuous ones, it may be useful to be
+able to observe how their values change, as time progresses during simulation.
+The <em>plot visualizer</em> can be used for that exact purpose. The plot visualizer
+can create graphical plots, where the x-axis represents the values of variable
+<code>time</code>, and the y-axis represents values of the variables being plotted. Here
+is an example screenshot of the visualizer:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/plotviz_sshot.png" alt="plotviz sshot">
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="tools-cifsim-output-plotviz-option" class="paragraph">
+<p>Plot visualization is disabled by default. It can be enabled using the
+<b class="menuref">Plot visualization</b>
+option (<b class="menuref">Output: Plot visualization</b>
+category).</p>
+</div>
+<div class="sect6">
+<h7 id="tools-variables">Variables</h7>
+<div class="paragraph">
+<p>The plot visualizer can plot the values of the following variables (officially
+'state objects'):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The state variables, which includes the discrete variables and the continuous
+variables.</p>
+</li>
+<li>
+<p>The derivatives of the continuous variables. This does not include the
+derivative of variable <code>time</code>.</p>
+</li>
+<li>
+<p>The algebraic variables.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Only variables of type <code>bool</code>, <code>int</code> (with or without ranges), or <code>real</code>
+can be plotted. For variables with a boolean type, value <code>false</code> is
+represented by <code>0</code>, and value <code>true</code> is represented by <code>1</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-filtering">Filtering</h7>
+<div class="paragraph">
+<p>By default, if plot visualization is enabled, all variables (officially
+'state objects') that can be plotted are plotted. The one exception is variable
+<code>time</code>, which is excluded by default, as it already represents the x-axis.
+That is, variables are plotted against time. Using the
+<b class="menuref">Plot visualization filters</b>
+option
+(<b class="menuref">Output: Plot visualization</b>
+category), the state objects can
+be filtered. The
+<b class="menuref">Plot visualization filters</b>
+option only has effect
+if plot visualization is enabled, using the
+<b class="menuref">Plot visualization</b>
+option.</p>
+</div>
+<div class="paragraph">
+<p>As value for the option, comma separated <em>filters</em> should be supplied. Each
+filter specifies one or more state objects. The absolute names of the objects
+are used. That is, for an automaton <code>a</code>, with a variable <code>x</code>, the absolute
+name of the variable object is <code>a.x</code>. If CIF textual syntax keyword are
+used as names for events (such as <code>plant</code>), then they must be escaped in
+<code>.cif</code> files (<code>$plant</code>). For filters however, all escape characters (<code>$</code>)
+in the names are ignored. The <code>*</code> character can be used as wildcard, to
+indicate zero or more characters. If a filter doesn&#8217;t match any of the state
+objects of the CIF model, a warning is printed to the console. A warning is
+also printed if the entire state is filtered out.</p>
+</div>
+<div class="paragraph">
+<p>By default, filters include matching state objects. Filters may however be
+preceded by a <code>-</code> character, turning them into exclusion filters, which
+exclude matching states objects rather than including them. Filters are
+processed in the order they are specified, allowing for alternating additions
+and removals. If a filter does not result in the addition/removal of any state
+objects to/from the filter result, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>a.*,-a.b*,a.bc*</code> consists of three filters:
+<code>a.*</code>, <code>-a.b*</code>, and <code>a.bc*</code>. The first filter indicates that state
+objects whose absolute names start with <code>a.</code> are to be included. The second
+filter indicates that from those matching state objects, the state objects
+whose absolute names start with <code>a.b*</code> are to be excluded. To that result,
+the third filter adds those state objects whose absolute names start with
+<code>a.bc*</code>. For instance, if a specification contains state objects <code>time</code>,
+<code>a.a</code>, <code>a.b</code> <code>a.bb</code>, <code>a.bc</code>, <code>a.b.c</code>, <code>a.bc</code>, <code>a.bcc</code>, and
+<code>a.bcd</code>, the result of the three filters is that the following state objects
+are displayed: <code>a.a</code>, <code>a.bc</code>, <code>a.bc</code>, <code>a.bcc</code>, and <code>a.bcd</code>.</p>
+</div>
+<div class="paragraph">
+<p>The default option value (filter) is <code>*,-time</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-multiple-plot-visualizers">Multiple plot visualizers</h7>
+<div class="paragraph">
+<p>By default, only one visualizer is shown. However, using the
+<b class="menuref">Plot visualization filters</b>
+option
+(<b class="menuref">Output: Plot visualization</b>
+category), it is possible to specify
+that multiple visualizers should be used. The option allows for filtering of
+the state objects, as described above. However, such filters can be separated
+by semicolons, to specify the filters per visualizer.</p>
+</div>
+<div class="paragraph">
+<p>As an example, consider option value <code>time,a.x;b.y</code>. This results in two
+plot visualizers. The first one displays state objects <code>time</code> and <code>a.x</code>,
+while the second one displays state object <code>b.y</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-mode">Plot visualization modes</h7>
+<div class="paragraph">
+<p>There are two plot visualization modes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Live plotting. In this mode, the plots are shown at the start of the
+simulation, and are continuously updated as new data becomes available during
+simulation.</p>
+</li>
+<li>
+<p>Postponed plotting. In this mode, the plots are shown after the simulation
+has <a href="#tools-cifsim-chapter-termination">ended</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Which plot visualization mode to use, can be configured using the
+<b class="menuref">Plot visualization mode</b>
+option
+(<b class="menuref">Output: Plot visualization</b>
+category). Using that option it is
+possible to explicitly choose one of the modes. By default, an automatic mode
+is used, which chooses between live and postponed mode, as follows:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 33.3333%;">
+<col style="width: 33.3334%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top"><a href="#tools-cifsim-input-chapter-index">Input mode</a> vs <a href="#tools-cifsim-output-chapter-realtime">real-time simulation</a></th>
+<th class="tableblock halign-left valign-top">Real-time enabled</th>
+<th class="tableblock halign-left valign-top">Real-time disabled</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-console">Interactive console input mode</a> (pure interactive)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-console">Interactive console input mode</a> (<a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">postponed</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-gui">Interactive GUI input mode</a> (pure interactive)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-gui">Interactive GUI input mode</a> (<a href="#tools-cifsim-input-chapter-semi-automatic">semi-automatic</a>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">postponed</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-automatic">Automatic input mode</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">postponed</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-chapter-trace">Trace input mode</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">postponed</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-input-svg-chapter-index">SVG input mode</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">live</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">postponed</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>When doing a non real-time simulation, using a non-interactive input mode leads
+to as fast as possible simulation, where a lot of data points are calculated in
+a short amount of time. If live plotting mode is then enabled, this floods the
+visualizer with so much data that it can&#8217;t keep up. The effect is a
+non-responsive user interface. While the automatic default can thus be
+overridden using the option, it is generally not recommended.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-range">Plot visualization range</h7>
+<div class="paragraph">
+<p>For simulations that span longer periods of (model) time, there may be too
+much data to display, for the limited width of the time axis (x-axis). To keep
+the plot useful, the range of time values to display on the x-axis can be
+configured using the
+<b class="menuref">Plot visualization range</b>
+option
+(<b class="menuref">Output: Plot visualization</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p>By default, only the <code>50</code> most recent time units are displayed. That is, if
+the current model time is <code>120</code>, then the plot only shows the values of the
+variables from time <code>70</code> to time <code>120</code>. Using the option, the length of the
+range can configured to any other positive value. The option can also be used
+to set the range to infinite, to display the values of the variables during
+the entire simulation, from time <code>0</code> to the current model time.</p>
+</div>
+<div class="paragraph">
+<p>For long running simulations, with lots variables, using an infinite range can
+lead to large numbers of data points, which can have a significant effect on
+performance. This applies especially for live plotting mode.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-data">Data points</h7>
+<div class="paragraph">
+<p>This section describes which data points are visualized. For most users, this
+will be of little interest, as it essentially works as you would expect.</p>
+</div>
+<div class="paragraph">
+<p>The plot visualizer adds data points (a <code>time</code> value and a value of a
+variable at that time) for all variables, for the following
+<a href="#tools-cifsim-traces-state">states</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The initial state of the simulation.</p>
+</li>
+<li>
+<p>The start state of every time transition.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-realtime-frames">Intermediate states</a> of time
+transitions, only if real-time simulation is enabled.</p>
+</li>
+<li>
+<p>Trajectory data points of time transitions, only if real-time simulation is
+disabled.</p>
+</li>
+<li>
+<p>The end state of every time transition.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For real-time simulation, the amount of model time between two intermediate
+states is the <a href="#tools-cifsim-output-realtime-delta">model time delta</a>,
+and can be influenced using the
+<a href="#tools-cifsim-output-realtime-framerate">frame rate</a> and
+<a href="#tools-cifsim-output-realtime-simspeed">simulation speed</a>.</p>
+</div>
+<div class="paragraph">
+<p>For non real-time simulation, the trajectory data points are determined by the
+<a href="#tools-cifsim-solver-chapter-basics-int">ODE solver integrator</a>, and can be
+influenced using the <a href="#tools-cifsim-solver-chapter-options">integration options</a>,
+as well as the <a href="#tools-cifsim-solver-chapter-options-outstep">fixed output step size</a> option.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-trajdata-relation">Relation to trajectory data output</h7>
+<div class="paragraph">
+<p>The plot visualizer can be used for simple plotting. It can be customized a bit
+through options, as described above. However, the level of customization is
+somewhat limited. For instance, the appearance can not be customized. This is
+intentional.</p>
+</div>
+<div class="paragraph">
+<p>If further customization is required, use the
+<a href="#tools-cifsim-output-chapter-trajdata">trajectory data output component</a>
+instead. It allows saving the data to a file, for further processing with
+external tools, such as
+<a href="http://www.r-project.org/">R</a>.</p>
+</div>
+<div class="paragraph">
+<p>Such post processing is then performed after the simulation has
+<a href="#tools-cifsim-chapter-termination">ended</a>. A benefit of the plot visualizer, is
+that it allows live plotting mode, without the need of post processing, and
+which can be enabled with little effort. The plot visualizer is meant to be
+used only to get a basic understanding of how values of variables change as
+time progresses.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-plotviz-trajdata-save">Saving a plot image</h7>
+<div class="paragraph">
+<p>The plot visualizer can export the currently visible plot to several different
+image formats. To export the image, first make sure that the plot visualizer
+has the focus. Then select <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Save As&#8230;&#8203;</b></span> to open the
+<b class="menuref">Save plot as</b>
+dialog. Alternatively, right click the plot itself,
+and choose
+<b class="menuref">Save As&#8230;&#8203;</b>
+from the popup menu, to open the
+<b class="menuref">Save plot as</b>
+dialog. In the dialog, specify the file name of the
+exported image. Click
+<b class="button">OK</b>
+to confirm and continue.</p>
+</div>
+<div class="paragraph">
+<p>A second dialog appears, in which the size of the exported image can be
+specified. By default, the current size of the visualizer is used. A custom
+size can be entered. The width and height need to specified in pixels,
+separated by a <code>x</code> character. For instance, for a width of <code>640</code> pixels and
+a height of <code>480</code> pixels, enter <code>640x480</code> into the dialog. Click <code>OK</code> to
+confirm and to actually export the image.</p>
+</div>
+<div class="paragraph">
+<p>The following
+<a href="http://en.wikipedia.org/wiki/Raster_graphics">raster image</a>
+formats are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics">Portable Network Graphics</a>
+(<code>*.png</code>)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/JPEG">JPEG</a>
+(<code>*.jpg</code>)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Graphics_Interchange_Format">Graphics Interchange Format</a>
+(<code>*.gif</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The image format that is used to export the image, is derived from the file
+extension that is used. For each of the supported file formats, the allowed
+file names (with file extensions) are indicated above (between parentheses).</p>
+</div>
+<div class="paragraph">
+<p>After the image is exported, the workspace is refreshed to show that new image
+file, if the image was saved in a project that is visible in the
+'Project Explorer' tab or 'Package Explorer' tab.</p>
+</div>
+<div class="paragraph">
+<p>In order for the export to succeed, data points must be available for at least
+two time values.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-undoreset-5">Undo/reset</h7>
+<div class="paragraph">
+<p>It is possible to go back in time, by
+<a href="#tools-cifsim-input-history-reset-undo">undoing</a> one or more transitions, or
+by <a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation.</p>
+</div>
+<div class="paragraph">
+<p>If one or more transitions are undone, data for all time points that are then
+suddenly in the future, are removed. More precisely, all data for time points
+added for time transitions that have been undone, are removed.</p>
+</div>
+<div class="paragraph">
+<p>If the simulation is reset, the entire plot is cleared.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-stateviz">State visualizer</h6>
+<div class="paragraph">
+<p>
+
+
+The <a href="#tools-cifsim-output-chapter-normal">normal console output</a>, which may
+include the <a href="#tools-cifsim-traces-state">state</a> of the specification,
+is printed to the console. The entire state is then printed as a single line
+of text, which can be hard to read as the specification grows, and the state
+contains more and more variables. The <em>state visualizer</em> can be used as an
+alternative. It shows the same information, but in a table in a separate
+window. Here is an example screenshot of the visualizer:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/output/stateviz_sshot.png" alt="stateviz sshot">
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="tools-cifsim-output-stateviz-option" class="paragraph">
+<p>Unlike <a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualization</a>, which
+requires that the user makes an image of the system and couples the image to
+the specification, the state visualizer can be used directly, without any
+additional effort. All that is required to use it, is to enable it. The state
+visualizer is disabled by default, and can be enabled using the
+<b class="menuref">State visualization</b>
+option (<b class="menuref">Output: State visualization</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-contents">Contents</h7>
+<div class="paragraph">
+<p>The state visualizer shows all the discrete, continuous, and algebraic
+variables of the specification, as well as their values. It also shows the
+derivatives of the continuous variables, and their values. This includes
+variable <code>time</code>, but not its derivative. It also shows the automata, with
+their current locations. The variables and automata are listed in alphabetical
+order, except for variable <code>time</code>, which is always shown at the top.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-icons-and-legend">Icons and legend</h7>
+<div class="paragraph">
+<p>The icons on the left indicate the kind of object that is shown in a particular
+row of the table:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cifsim/output/stateviz_aut.png" alt="stateviz aut"></span>
+An automaton, with its current location.</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cifsim/output/stateviz_discvar.png" alt="stateviz discvar"></span>
+A discrete variable, with its current value.</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cifsim/output/stateviz_contvar.png" alt="stateviz contvar"></span>
+A continuous variable (includes variable <code>time</code>),
+with its current value.</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cifsim/output/stateviz_deriv.png" alt="stateviz deriv"></span>
+A derivative of a continuous variable (excludes variable
+<code>time</code>), with its current value.</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cifsim/output/stateviz_algvar.png" alt="stateviz algvar"></span>
+An algebraic variable, with its current value.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+The values are updated for the initial state, states reached after transitions
+(event transitions and time transitions), as well as for
+<a href="#tools-cifsim-output-realtime-frames">frames</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-stateviz-filtering">Filtering</h7>
+<div class="paragraph">
+<p>By default, all state objects are displayed by the state visualizer. Using
+the
+<b class="menuref">State visualization filters</b>
+option
+(<b class="menuref">Output: State visualization</b>
+category), the state objects can
+be filtered. The
+<b class="menuref">State visualization filters</b>
+option only has effect
+if state visualization is enabled, using the
+<b class="menuref">State visualization</b>
+option.</p>
+</div>
+<div class="paragraph">
+<p>As value for the option, comma separated <em>filters</em> should be supplied. Each
+filter specifies one or more state objects. The absolute names of the objects
+are used. That is, for an automaton <code>a</code>, with a variable <code>x</code>, the absolute
+name of the variable object is <code>a.x</code>. If CIF textual syntax keyword are
+used as names for events (such as <code>plant</code>), then they must be escaped in
+<code>.cif</code> files (<code>$plant</code>). For filters however, all escape characters (<code>$</code>)
+in the names are ignored. The <code>*</code> character can be used as wildcard, to
+indicate zero or more characters. If a filter doesn&#8217;t match any of the state
+objects of the CIF model, a warning is printed to the console. A warning is
+also printed if the entire state is filtered out.</p>
+</div>
+<div class="paragraph">
+<p>By default, filters include matching state objects. Filters may however be
+preceded by a <code>-</code> character, turning them into exclusion filters, which
+exclude matching states objects rather than including them. Filters are
+processed in the order they are specified, allowing for alternating additions
+and removals. If a filter does not result in the addition/removal of any state
+objects to/from the filter result, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>As an example, option value <code>a.*,-a.b*,a.bc*</code> consists of three filters:
+<code>a.*</code>, <code>-a.b*</code>, and <code>a.bc*</code>. The first filter indicates that state
+objects whose absolute names start with <code>a.</code> are to be included. The second
+filter indicates that from those matching state objects, the state objects
+whose absolute names start with <code>a.b*</code> are to be excluded. To that result,
+the third filter adds those state objects whose absolute names start with
+<code>a.bc*</code>. For instance, if a specification contains state objects <code>time</code>,
+<code>a.a</code>, <code>a.b</code> <code>a.bb</code>, <code>a.bc</code>, <code>a.b.c</code>, <code>a.bc</code>, <code>a.bcc</code>, and
+<code>a.bcd</code>, the result of the three filters is that the following state objects
+are displayed: <code>a.a</code>, <code>a.bc</code>, <code>a.bc</code>, <code>a.bcc</code>, and <code>a.bcd</code>.</p>
+</div>
+<div class="paragraph">
+<p>The default option value (filter) is <code>*</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-multiple-state-visualizers">Multiple state visualizers</h7>
+<div class="paragraph">
+<p>By default, only one visualizer is shown. However, using the
+<b class="menuref">State visualization filters</b>
+option
+(<b class="menuref">Output: State visualization</b>
+category), it is possible to specify
+that multiple visualizers should be used. The option allows for filtering of
+the state objects, as described above. However, such filters can be separated
+by semicolons, to specify the filters per visualizer.</p>
+</div>
+<div class="paragraph">
+<p>As an example, consider option value <code>time,a.x;b.y</code>. This results in two
+state visualizers. The first one displays state objects <code>time</code> and <code>a.x</code>,
+while the second one displays state object <code>b.y</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-undoreset-6">Undo/reset</h7>
+<div class="paragraph">
+<p>By <a href="#tools-cifsim-input-history-reset-undo">undoing</a> one or more transitions,
+or by <a href="#tools-cifsim-input-history-reset-undo">resetting</a> the simulation, the
+state may change. The state visualizer is automatically updated to reflect such
+changes.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-output-chapter-realtime">Real-time simulation</h6>
+<div class="paragraph">
+<p>
+
+
+The CIF simulator allows for a form of real-time simulation. By enabling
+real-time simulation, the simulator interprets the model time (the value of
+variable <code>time</code>) in seconds. The simulator attempts to ensure that the actual
+simulation time is equal to the model time. This feature is very useful for
+visualizers, which then visualize their output at a steady rate. Without
+real-time simulation, the rate at which such visualizers would visualize their
+output, would primarily be determined by the amount of time it takes for the
+simulator to compute the output, leading to abrupt slow downs and sudden speed
+increases.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-realtime-frames">Frames</h7>
+<div class="paragraph">
+<p>If real-time simulation is disabled, visualizations are only updated for the
+<a href="#tools-cifsim-traces-state">states</a> that are reached. That is, the
+visualizations are updated for the initial state, and each new state that is
+reached after taking a transition. The visual representations of the
+visualizations resulting from these states are called <em>frames</em>.</p>
+</div>
+<div class="paragraph">
+<p>As time progresses, the values of continuous variables (and algebraic variables
+for which the value is directly or indirectly derived from a continuous
+variable, etc) change. If the visualization is only updated before and after
+time transitions, as is done when real-time simulation is disabled, this leads
+to 'jumps' in the visualization. For real-time simulation, the simulator
+calculates states that are evenly spaced over time. This ensures that we get
+regular updates of the visualizations, as time progresses, and the
+visualizations thus become 'smooth' or 'fluent'. If enough states are
+visualized per second, a visualization essentially becomes a <em>movie</em>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+The states that result from transitions are always calculated. For real-time
+simulation, the simulator calculates additional states for the purpose
+of visualization, as mentioned above. These additional states are called
+<em>intermediate states</em>, and the corresponding visual representations of the
+visualizations to which they lead are called <em>intermediate frames</em>.</p>
+</div>
+<div class="paragraph">
+<p>For real-time simulation, the simulator thus uses intermediate frames that are
+evenly spaced over time, for smooth visualizations. A consequence of this, is
+that state changes between those intermediate frames are lost. If the effect is
+still visible in the next intermediate state, this is not a problem. If however
+the effect is temporary, and does not last until the next intermediate state,
+the effect is thus not visualized.</p>
+</div>
+<div class="paragraph">
+<p>For real-time simulation combined with an interactive
+<a href="#tools-cifsim-input-chapter-index">input mode</a>, the
+simulator uses both the state frames and the intermediate frames. This ensures
+that at the moment an interactive choice has to be made about which
+transition to take, the visualization reflects the current state of the system.
+Semi-automatic mode is not taken into account.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-realtime-framerate">Frame rate</h7>
+<div class="paragraph">
+<p>Using the
+<b class="menuref">Frame rate</b>
+option (<b class="menuref">Output</b>
+category), it is
+possible to specify how often per second of real time, visualizations should
+be updated. A higher frame rate leads to more updates per second, and thus to
+a more fluent visualization. However, since a higher frame rate also leads to
+more frequent updates, the amount of CPU power it takes to perform these
+updates increases as well. If the computer can not update the visualization in
+time for the next update to take place, the visualization may start to
+'stutter'.</p>
+</div>
+<div class="paragraph">
+<p>
+The frame rate will thus always be a compromise between fluency and
+performance. Choosing an appropriate frame rate depends not only on the
+complexity of the specification being simulated and the visualization that is
+being shown, but also on the computer on which the simulation is run.
+Furthermore, it may depend on the other tasks the computer is performing while
+the simulation is being run.</p>
+</div>
+<div class="paragraph">
+<p>Frame rates are always positive, and may be fractional. For instance, a frame
+rate of <code>7.5</code> is valid, and will update the visualization 7.5 times per
+second.</p>
+</div>
+<div class="paragraph">
+<p>A low frame rate (typically less than 10 frames per second) can have a
+devastating effect on the
+<a href="#tools-cifsim-input-svg-simulation-responsiveness">responsiveness of SVG input</a>.
+Similarly, it can hinder
+<a href="#tools-cifsim-chapter-termination">termination</a> of the simulation, as the red
+<em>Terminate</em> button has no effect between intermediate frames. That is, the
+effect of clicking the button is postponed until the next frame, or until the
+time transition ends.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-realtime-simspeed">Simulation speed</h7>
+<div class="paragraph">
+<p>If real-time simulation is enabled, the simulator by default interprets the
+model time (the value of variable <code>time</code>) in seconds. However, this can be
+changed using the
+<b class="menuref">Simulation speed</b>
+option (<b class="menuref">Output</b>
+category). This option specifies a scaling factor. A scaling factor of <code>1.0</code>
+interprets model time as seconds, <code>2.0</code> is twice as fast (1 unit of model
+time takes 0.5 seconds), etc. The simulation speed must always be positive,
+and may be fractional. For instance, a simulation speed of <code>0.5</code> is valid,
+and will interpret model time as twice as slow (1 unit of model time takes 2
+seconds).</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-enabling-real-time-simulation">Enabling real-time simulation</h7>
+<div class="paragraph">
+<p>By default, real-time simulation is disabled, and the simulator will try to
+simulate as fast as possible (infinite speed, taking time transitions takes no
+time). By setting a frame rate and/or a simulation speed, real-time simulation
+can be enabled. If only one of the options is specified, the other gets a
+default value. The default frame rate for real-time simulation is <code>20.0</code>
+frames per second. The default simulation speed is <code>1.0</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div id="tools-cifsim-output-realtime-outcomp" class="paragraph">
+<p>Enabling real-time simulation requires a real-time output component
+(visualizer). Currently, the following real-time output components are
+available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualizer</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If real-time simulation is enabled without using a real-time output component,
+simulation can&#8217;t be started. Closing the visualizer of a real-time simulation
+during the simulation, if it is the last remaining real-time output component,
+leads to the simulation being <a href="#tools-cifsim-chapter-termination">stopped</a>.</p>
+</div>
+<div class="paragraph">
+<p>All real-time output components can also be used when real-time simulation is
+disabled, but obviously without any real-time effects.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-output-realtime-delta">Model time delta</h7>
+<div class="paragraph">
+<p>The simulation speed does not influence the frame rate. That is, both options
+can be specified orthogonally. The two options together however, do influence
+the model time delta, the amount of model time between two consecutive updates
+of the visualizations, i.e. the amount of model time between two consecutive
+intermediate frames. The model time delta is calculated using the following
+formula (where <code>r</code> is the frame rate, and <code>s</code> is the simulation speed):
+1 / (<code>r</code> / <code>s</code>). Doubling the frame rate results in half the model time
+delta, while doubling the simulation speed results in double the model time
+delta.</p>
+</div>
+<div class="paragraph">
+<p>If the model time delta becomes to big, this may lead to 'jumps' in the
+visualization. In such cases, increasing the frame rate, or reducing the
+simulation speed causes a smaller model time delta, leading to a more fluent
+visualization.</p>
+</div>
+<div class="paragraph">
+<p>The model time delta (and thus the frame rate and simulation speed) also
+affects the <a href="#tools-cifsim-solver-chapter-options-outstep">ODE solver fixed output step size</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-test-mode">Test mode</h7>
+<div class="paragraph">
+<p><a href="#tools-cifsim-chapter-test-mode">Test mode</a> disables all real-time delays of
+the real-time simulation mode, but still updates the visualizations for the
+intermediate frames. With test mode enabled, it is also allowed to perform a
+real-time simulation without real-time output component.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-simulation-advanced-topics">Simulation advanced topics</h4>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-options">Simulator options</h5>
+<div class="paragraph">
+<p>
+The CIF simulator can be configured via various options. The available
+options are listed below, per category.</p>
+</div>
+<div class="paragraph">
+<p><strong>General</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Help</em>: Prints the help text of the application to the console.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-mode">Output mode</a></p>
+</li>
+<li>
+<p><em>License</em>: Prints the license text of the application to the console.</p>
+</li>
+<li>
+<p><em>Developer mode</em>: Option to control whether exceptional situations return
+limited and user-friendly information (the default), or extended developer
+oriented information. This option is primarily intended for the developers of
+the CIF simulator, and should not be used by end users.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Simulation</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>CIF specification</em>: The absolute or relative local file system path to the
+CIF specification (<code>.cif</code> file) to simulate. May also be a
+<a href="#tools-cifsim-chapter-repeated-simulation">compiled code file</a> (<code>.cifcode</code>
+file).</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-init">CIF specification initialization</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-termination-endtime">Simulation end time</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-endtime-maxdelay">Maximum delay</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-distr-seeds">Initial seed for stochastic distributions</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-complete-mode">Complete mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-extfuncs-async">External functions asynchronous execution</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-profiling">Profiling</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-termination-confirm">Ask to confirm simulator termination</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-max-time-point-tol">Maximum time point tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-debug-gen-code">Load debug code</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Compiler</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-repeated-sim-compile-once">Compile only</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-repeated-sim-compile-once">Compiled code file</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-java-compiler">Java compiler</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Input</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-input-chapter-index">Input mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-automatic-trans">Automatic mode choice algorithm</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-automatic-time">Automatic mode time transition duration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-trace-file">Trace input file</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-chapter-semi-automatic">Interactive mode automatic transition choice</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-env-events">Environment events</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-history-enable">History</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-input-history-size">History size</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Output</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-chapter-normal">Normal output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-normal-state-filter">Normal output state filters</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-debug">Debug output</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-realtime-framerate">Frame rate</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-realtime-simspeed">Simulation speed</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-test-mode">Test mode</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Output: SVG visualization</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-simulation-option">SVG visualization</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Output: Trajectory data</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-trajdata-option">Trajectory data</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-trajdata-file">Trajectory data file</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-trajdata-filters">Trajectory data filters</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-trajdata-sep">Trajectory data separation amount</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Output: Plot visualization</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-plotviz-option">Plot visualization</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-plotviz-mode">Plot visualization mode</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-plotviz-filtering">Plot visualization filters</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-plotviz-range">Plot visualization range</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Output: State visualization</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-stateviz-option">State visualization</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-stateviz-filtering">State visualization filters</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>ODE solver</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-options-outstep">ODE solver fixed output step size</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>ODE solver: ODE integrator</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-algo">ODE solver integrator algorithm</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-tol">ODE solver integrator absolute tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-tol">ODE solver integrator relative tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-step">ODE solver integrator minimum step size</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-step">ODE solver integrator maximum step size</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-int-numstep">ODE solver integrator number of steps</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>ODE solver: ODE root finder</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-solver-options-root-maxcheck">ODE solver root finder maximum check interval</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-root-algo">ODE solver root finding algorithm</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-root-tol">ODE solver root finder absolute tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-root-tol">ODE solver root finder relative tolerance</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-options-root-maxiter">ODE solver root finder maximum iterations</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-performance">Simulation performance</h5>
+<div class="paragraph">
+<p>
+
+General performance information about Java or Eclipse typically applies to the
+CIF simulator as well. This page provides additional information specific to
+the CIF simulator.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-closing-the-simulator">Closing the simulator</h6>
+<div class="paragraph">
+<p>Closing the simulator ensures that all its resources are freed, and become
+available for other applications.
+The CIF simulator however, may ask you to press <kbd>ENTER</kbd> to
+<a href="#tools-cifsim-termination-confirm">confirm termination</a> of the
+simulator. If asked, as long as you haven&#8217;t pressed <kbd>ENTER</kbd> yet, the
+status of the console will still show it&#8217;s running, and the application can&#8217;t
+release its resources.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-slow-starting-of-the-simulator">Slow starting of the simulator</h6>
+<div class="paragraph">
+<p>If simulation is slow to start, you can try a different
+<a href="#tools-cifsim-chapter-java-compiler">Java compiler</a>. You can also try to
+<a href="#tools-cifsim-repeated-sim-compile-once">compile the model once</a>,
+reducing the start time of the simulator for
+<a href="#tools-cifsim-chapter-repeated-simulation">repeated simulations</a>.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-slow-termination-of-the-simulator">Slow termination of the simulator</h6>
+<div class="paragraph">
+<p>If termination of the simulator is slow, this may be related to
+the <a href="#tools-cifsim-output-chapter-trajdata">trajectory data output component</a>.
+If its <a href="#tools-cifsim-output-trajdata-prettify">prettifying</a> option is
+enabled, it will read the trajectory data file after the simulation terminates,
+and write the whole file again in a prettier from. This may take some time,
+especially on slow remote/network file systems or storage devices. Disabling
+the option or the trajectory data output may solve this problem, as may
+switching to a faster file system or storage device.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-value-simplification">Value simplification</h6>
+<div class="paragraph">
+<p>By applying the <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> CIF to CIF transformation
+before simulation, you may be able to simplify the specification, and thus
+improve the performance of both starting up the simulator, as well as the
+actual simulation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-simulation-options">Simulation options</h6>
+<div class="paragraph">
+<p>Various simulation options can be tweaked to increase the simulation
+performance:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-console">Console output</a></p>
+<div class="paragraph">
+<p>Reducing the amount of console output significantly improves simulation
+performance.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-components">Output components</a></p>
+<div class="paragraph">
+<p>By disabling certain output components, the simulator needs to do less work,
+and this may improve the performance of the simulation.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-chapter-realtime">Real-time simulation</a></p>
+<div class="paragraph">
+<p>The performance and perceived 'smoothness' or 'fluency' of visualizations can
+be influenced via the
+<a href="#tools-cifsim-output-realtime-framerate">frame rate</a> and
+<a href="#tools-cifsim-output-realtime-simspeed">simulation speed</a>.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-endtime-maxdelay">Maximum delay</a></p>
+<div class="paragraph">
+<p>By decreasing the maximum allowed length of a single time transition, shorter
+time transitions are calculated, which takes less time. After the shorter
+time delay, the simulator will calculate the remainder of the time
+transition. Essentially, the time transitions are cut into parts, which are
+calculated separately, over time. As such, the calculation time is spread
+out over time as well. This can make
+<a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualizations</a> feel more fluent. However, each time
+transition calculation has a certain amount of overhead, so reducing the
+maximum delay too much is not a good idea.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-chapter-complete-mode">Complete mode</a></p>
+<div class="paragraph">
+<p>By disabling the complete mode, the simulator has to perform less work to
+calculate the possible transitions, improving the simulation performance.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-index">Solver</a></p>
+<div class="paragraph">
+<p>The ODE solver options can be used to make the ODE solver faster, usually at
+the expense of accuracy. For instance, increasing the various tolerances
+reduces the number of calculations needed by the ODE solver, but makes the
+calculated trajectories less accurate. Switching algorithms may also improve
+the performance, as may increasing the maximum check interval.</p>
+</div>
+</li>
+<li>
+<p><a href="#tools-cifsim-extfuncs-async">External functions synchronous execution</a></p>
+<div class="paragraph">
+<p>Using synchronous execution for external user-defined functions reduces
+their execution overhead.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-solver-chapter-index">ODE solver</h5>
+<div class="paragraph">
+<p>
+
+
+
+During time transitions, the values of the continuous variables and their
+derivatives change. These changes are calculated using an
+<a href="http://en.wikipedia.org/wiki/Ordinary_differential_equation">ODE</a>
+<a href="http://en.wikipedia.org/wiki/Numerical_ordinary_differential_equations">integrator</a>.
+As soon as a guard for an event becomes enabled, time should no longer
+progress. To calculate whether (and when) guards change value, a
+<a href="http://en.wikipedia.org/wiki/Root-finding_algorithm">root finding algorithm</a>
+is used.
+Software to solve ODEs, through integration and root finding, are often called
+ODE solvers. The CIF simulator uses the
+<a href="http://commons.apache.org/proper/commons-math/">The Apache Commons Mathematics Library</a>.
+This library
+contains ODE solvers, with several different integrators and root finding
+algorithms.</p>
+</div>
+<div class="paragraph">
+<p>Debug information about what the ODE solver calculates, and for what time
+points, can be enabled using the <em>Debug output</em> option. See the
+<a href="#tools-cifsim-output-chapter-debug">Debug console output</a> page for more information.</p>
+</div>
+<div class="paragraph">
+<p><strong>Basic topics</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-basics-int">The basics of numeric integration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-basics-root">The basics of numeric root finding</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-root-problems">Problems with root finding</a> (and missed guards/events)</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-options-outstep">Fixed output step size</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><strong>Advanced topics</strong></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-endtime-maxdelay">Simulation end time and maximum delay</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-options">ODE solver integrator options</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-solver-chapter-options-root">ODE solver root finder options</a></p>
+</li>
+</ul>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-basics-int">The basics of numeric integration</h6>
+<div class="paragraph">
+<p>
+
+
+
+During time transitions, the values of the continuous variables and their
+derivatives change. The derivatives have explicit equations, the continuous
+variables change according to the value of their derivatives. Using the
+equations for the derivatives as a system of
+<a href="http://en.wikipedia.org/wiki/Ordinary_differential_equation">ordinary differential equations</a>
+(ODEs),
+together with the initial values of the continuous variables as the <em>initial
+conditions</em>, this essentially comes down to solving an
+<a href="http://en.wikipedia.org/wiki/Initial_value_problem">initial value problem</a>
+(IVP).</p>
+</div>
+<div class="paragraph">
+<p>Such problems can be solved through
+<a href="http://en.wikipedia.org/wiki/Integral">integration</a>.
+For some problems it is possible to do this
+<a href="http://en.wikipedia.org/wiki/Symbolic_integration">symbolically</a>.
+For more complex systems of ODEs however,
+<a href="http://en.wikipedia.org/wiki/Numerical_ordinary_differential_equations">numerical methods</a>
+are used. The CIF simulator uses
+<a href="http://commons.apache.org/proper/commons-math/">The Apache Commons Mathematics Library</a>,
+which contains several numerical integrators.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-linear-ode">Linear ODE</h7>
+<div class="paragraph">
+<p>Consider the following CIF specification, with a linear ODE:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont x = 0.0;
+equation x' = 1.0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The solution to this IVP, is the values of continuous variable <code>x</code> and its
+derivative <code>x'</code>, as function of variable <code>time</code>:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/integr_linear.png" alt="integr linear">
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the numerical integrator start with the initial value of continuous
+variable <code>x</code>, which is <code>0.0</code>. For the initial value of variable <code>time</code>,
+which is also <code>0.0</code>, it computes <code>x'</code>, which is <code>1.0</code>. It then slightly
+increases the value of variable <code>time</code> to say <code>1e-6</code>. Assuming a linear
+continuous variable <code>x</code>, the value of variable <code>x</code> at that time is <code>1e-6</code>
+as well.</p>
+</div>
+<div class="paragraph">
+<p>The numerical integrator tries to predict the values of the derivative as time
+progresses. It gradually increases the value of variable <code>time</code>, predicting
+the value of the derivative at the next time point. If the next prediction
+closely matches the actual calculated value, the integrator moves on to the
+next time point. If the next prediction is not close enough to the actual
+calculated value of the derivative for that time point, more intermediate
+values are calculated. That is, the integrator tries to approximate the
+derivative as time progresses, while increasing the time between two
+consecutive time points. As long as the predictions match the actual
+calculated value of the derivative at the next time point, it keeps increasing
+the step size even further. If the predictions are not good enough (the
+difference with the actual calculated value is above a certain tolerance), more
+intermediate time points are investigated. The values calculated for those
+time points can then be used to come up with a better approximation, that
+better predicts the value of the derivative at future time points.</p>
+</div>
+<div class="paragraph">
+<p>For the linear ODE given above, the <a href="#tools-cifsim-output-chapter-trajdata">trajectory data</a>
+calculated by the integrator is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code># time                 x                       x'
+0.0                    0.0                     1.0
+9.999999999999999e-5   1.0000000000000003e-4   1.0
+0.0011                 0.0011000000000000005   1.0
+0.0111                 0.011100000000000006    1.0
+0.1                    0.10000000000000006     1.0</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that the time points for which the values were calculated, are indicated
+in the figure above by small plus signs (<code>+</code>).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-nonlinear-ode">Nonlinear ODE</h7>
+<div class="paragraph">
+<p>The approximations of the integrator don&#8217;t need to be linear. Some integrators
+for instance support
+<a href="http://en.wikipedia.org/wiki/Nonlinear#Nonlinear_differential_equations">nonlinear differential equations</a>.
+Consider the following CIF specification, with such a nonlinear ODE:</p>
+</div>
+<div class="paragraph">
+<p>The solution calculated by the numerical integrator is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont x = 0.0;
+equation x' = (x * x) - x - 2;</code></pre>
+</div>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/integr_nonlinear.png" alt="integr nonlinear">
+</div>
+</div>
+<div class="paragraph">
+<p>Here, we see how the step size is increased initially, as the linear
+approximation is good enough. As soon as we get to the bend, the step size is
+reduced to better approximate the actual values. After the bend, the step size
+is slowly increased again. The integrator internally uses a polynomial of a
+higher degree to approximate this differential equation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-discontinuities">Discontinuities</h7>
+<div class="paragraph">
+<p>If the derivative has a
+<a href="http://en.wikipedia.org/wiki/Discontinuity_%28mathematics%29">discontinuity</a>,
+such as in the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">cont x = 1.0;
+equation x' = if x &lt; 2: 1.0
+              else      3.0
+              end;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The integrator will try to figure out the time point at which the discontinuity
+occurs, by decreasing the step size as it nears the discontinuity. After the
+discontinuity, the step size is gradually increased, as integration continues:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/integr_discont.png" alt="integr discont">
+</div>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-basics-root">The basics of numeric root finding</h6>
+<div class="paragraph">
+<p>
+
+During time transitions, the values of the continuous variables and their
+derivatives change. If continuous variables or their derivatives are (directly
+or indirectly) used in guards of edges, changes in their values may result in
+the guard becoming enabled, as time progresses. To detect such changes during
+<a href="#tools-cifsim-solver-chapter-basics-int">integration</a>, a
+<a href="http://en.wikipedia.org/wiki/Root-finding_algorithm">root finding algorithm</a>
+can be used.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  cont x = 0.0;
+  equation x' = 0.5;
+
+  location:
+    initial;
+    edge when x &gt;= 1.5 do x := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the value of continuous variable <code>x</code> increases with <code>0.5</code> every time
+unit. Once the value of <code>1.5</code> is reached, the variable is reset to <code>0.0</code>.
+This process is repeated:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_simple.png" alt="root simple">
+</div>
+</div>
+<div class="paragraph">
+<p>If we look at the data calculated by the numerical integrator, to solve the ODE
+problem:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_simple2.png" alt="root simple2">
+</div>
+</div>
+<div class="paragraph">
+<p>we see that values are calculated for time points <code>1.1111</code> and <code>5.0</code>. If we
+then also look at the value of the guard, where we use value <code>-1</code> for
+<code>false</code> and <code>+1</code> for <code>true</code>:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_simple_guard.png" alt="root simple guard">
+</div>
+</div>
+<div class="paragraph">
+<p>we see that at time <code>1.1111</code>, the value of the guard is <code>-1</code> (<code>false</code>).
+At time <code>5.0</code> it is <code>+1</code> (<code>true</code>). That is, the guard changed value
+between two time points calculated by the integrator. If this is the case, the
+ODE solver tries to calculate the exact time point at which the guard changes
+its value. That is, it calculates the exact time point at which the guard
+function crosses the time axis, and thus has a
+<a href="http://en.wikipedia.org/wiki/Zero_of_a_function">root</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+One of the simplest root finding algorithms, is the
+<a href="http://en.wikipedia.org/wiki/Bisection_method">bisection method</a>.
+This algorithm starts with
+the two time points where the guard has opposite
+<a href="http://en.wikipedia.org/wiki/Sign_%28mathematics%29">signs</a>.
+This is the interval
+where the guard sign change occurs (it contains the root). The bisection method
+tries to reduce the size of the interval, by calculating the value of the guard
+in the middle of the interval. Depending on the sign of the value of the guard
+at this middle point, this middle point replaces either the lower bound or the
+upper bound of the interval. This is done in such a way that the values of the
+guard at the lower and upper bound of the interval have opposite signs, and the
+interval thus <em>brackets</em> the root.</p>
+</div>
+<div class="paragraph">
+<p>For the example above, the root is calculated as follows:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_root.png" alt="root root">
+</div>
+</div>
+<div class="paragraph">
+<p>We start with the interval <code>[1.1111 .. 5.0]</code>. The middle point is <code>3.0555</code> at which
+the guard holds, just like the upper bound (at <code>5.0</code>). Thus <code>5.0</code> is replaced by
+<code>3.0555</code>. The middle point of <code>1.1111</code> and <code>3.0555</code> is <code>1.5972</code>. Since the guard holds
+for time <code>1.5972</code>, upper bound <code>3.0555</code> is replaced by <code>1.5972</code>. The middle point
+of <code>1.1111</code> and <code>1.5972</code> is <code>1.3542</code>. The guard does not hold at time <code>1.3542</code>, so the
+lower bound of <code>1.1111</code> (at which the guard does not hold) is replaced by <code>1.3542</code>.
+This process continues until the interval is smaller than a certain tolerance
+value. Once we have that interval, we can choose a value from the interval as
+the computed root.</p>
+</div>
+<div class="paragraph">
+<p>While the bisection method is relatively simple, the root finding algorithms
+used by the CIF simulator work using the same principles. However, they
+converge much faster. That is, they requires much less iterations of updating
+the bounds, to get to a satisfactory answer.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-root-problems">Problems with root finding</h6>
+<div class="paragraph">
+<p>
+With <a href="#tools-cifsim-solver-chapter-basics-root">numeric root finding</a>, there is
+the risk of missing guard changes, which means there is the risk of missing
+event transitions.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-the-problem">The problem</h7>
+<div class="paragraph">
+<p>To illustrate the problem, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  cont x = 0.0;
+  equation x' = 1.0;
+
+  location:
+    initial;
+    edge when x &gt;= 2.33 and x &lt;= 2.34 do x := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification, when simulated using the CIF simulator, using default
+settings, results in:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_problem.png" alt="root problem">
+</div>
+</div>
+<div class="paragraph">
+<p>From the image, where the values calculated by the integrator are indicated
+using small plus signs (<code>+</code>), we can see that for times <code>2.1111</code> and
+<code>2.6111</code>, the integrator calculated points. Since the function is linear
+between those two time points, no additional intermediate time points were
+investigated. Since the guard becomes <code>true</code> after time point <code>2.1111</code> (at
+time point <code>2.33</code>) and also becomes <code>false</code> again before time point
+<code>2.61111</code> (at time point <code>2.34</code>), the integrator misses the guard change.
+That is, for every time point that the guard is evaluated, it is <code>false</code>, and
+the change in guard value is thus not detected. We miss the guard, and thus
+the event that resets variable <code>x</code> to <code>0.0</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-solution-1-maximum-check-interval">Solution 1: maximum check interval</h7>
+<div class="paragraph">
+<p>The first solution is to use the
+<b class="menuref">ODE solver root finder maximum check interval</b>
+option (<b class="menuref">ODE solver: ODE root finder</b>
+category). This
+option can be used to set the maximum time interval between two consecutive
+checks of the sign of the guard. By default, this is <code>0.5</code> time units. If we
+set this value to <code>0.001</code>, then we ensure that at least once every <code>0.001</code>
+time units, the guard sign is checked. This means that between time points
+<code>2.1111</code> and <code>2.61111</code>, the guard will be checked approximately 500 times.
+This also means that between time points <code>2.33</code> and <code>2.34</code>, the guard will
+be checked approximately 10 times. Therefore, this ensures that we check a time
+point just before time <code>2.33</code>, and one just after it, which means we can&#8217;t
+miss the guard change.</p>
+</div>
+<div class="paragraph">
+<p>In the above example, <code>x'</code> is <code>1.0</code>. If however <code>x'</code> would be <code>2.0</code>,
+then the time interval where the guard is enabled reduces from <code>0.01</code> time
+units to <code>0.005</code> time units. Using a maximum check interval of <code>0.001</code>
+would then still suffice, as the guard would be checked approximately 5 times
+in that time interval. If however <code>x'</code> is <code>100</code>, then the time interval
+would become <code>0.0001</code>, which is smaller than the maximum check interval of
+<code>0.001</code>. That is, the derivatives of the values occurring in guards influence
+the value that should be chosen for the maximum delay interval.</p>
+</div>
+<div class="paragraph">
+<p>In general, to choose an appropriate value for the maximum check interval, not
+only the the ranges of values of the variables where the guard is enabled
+should be taken into account, but the steepness of their derivatives as well.
+That is, the value of the maximum check interval should be based on the time
+interval where the guard is enabled. Choosing half the duration of the smallest
+of such time intervals, for all guards, is generally a good choice.</p>
+</div>
+<div class="paragraph">
+<p>
+Note that choosing a smaller interval results in more guard change checks, and
+thus negatively impacts the performance of the simulation. Therefore, choosing
+a maximum check interval that is unnecessarily small also unnecessarily
+reduces performance of the simulation.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-solution-2-splitting-the-guard">Solution 2: splitting the guard</h7>
+<div class="paragraph">
+<p>We can reformulate the original CIF specification, by splitting the guard:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  cont x = 0.0;
+  equation x' = 1.0;
+
+  location:
+    initial;
+    edge when x &gt;= 2.33, x &lt;= 2.34 do x := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification, when simulated using the CIF simulator, using default
+settings, results in:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/cifsim/solver/root_problem2.png" alt="root problem2">
+</div>
+</div>
+<div class="paragraph">
+<p>The difference with the original specification is the guard of the edge. In the
+original specification, the <code>and</code> binary operator is used, making it a single
+guard. In the new specification, a comma (<code>,</code>) is used, which constructs two
+separate guards. Both guards can be individually checked by the root finding
+algorithm. As shown in the image, each of the guards changes value only once.</p>
+</div>
+<div class="paragraph">
+<p>The comma between guards means that both guards have to hold, in order for the
+edge to be enabled. This is similar, but not identical, to the <code>and</code> binary
+operator. For the <code>and</code> binary operator, the left hand side must be evaluated
+before the right hand side, and the right hand side may only be evaluated if
+the left hand side evaluates to <code>true</code>. This is called
+<a href="http://en.wikipedia.org/wiki/Short-circuit_evaluation">short-circuit evaluation</a>.
+For guards separated by commas, no such relation may be assumed. That is, even if
+the first guard evaluates to false, can the second guard still be evaluated by
+the root finding algorithm, for guard changes. It can even be the case that the
+second guard is evaluated before the first guard. These differences not only
+influence root finding, but are also of particular interest when the right hand
+side can result in a runtime evaluation failure. For instance, the following
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  cont x der 1.0;
+  location:
+    initial;
+    edge when x &gt; 0, 1 / x &lt; 0.5 do x := 0.0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>results in a runtime error. The second guard (<code>1 / x &lt; 0.5</code>) is evaluated
+even if the first guard (<code>x &gt; 0</code>) does not hold. Initially, the first guard
+does not hold, and the second guard results in division by zero. Changing the
+comma between the guards to an <code>and</code> operator, makes it possible to simulate
+this specification.</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-debug-information">Debug information</h7>
+<div class="paragraph">
+<p>Debug information about what the ODE solver calculates, and for what time
+points, can be enabled using the <em>Debug output</em> option. This may be useful in
+figuring out why the guard was missed, and what settings need to be changed.
+See the <a href="#tools-cifsim-output-chapter-debug">Debug console output</a> page for more information.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-options-outstep">Fixed output step size</h6>
+<div class="paragraph">
+<p>
+
+
+The <a href="#tools-cifsim-solver-chapter-basics-int">integrator</a> determines the time
+points for which values are calculated. By default, those points are included
+in the trajectories. This means that they are also the output of the
+<a href="#tools-cifsim-output-chapter-trajdata">trajectory data output component</a>.
+The integrator determines the time points for which to calculate values, based
+on the complexity of the ODEs. The integrator can be influenced using
+the <a href="#tools-cifsim-solver-chapter-options">integrator options</a>.</p>
+</div>
+<div class="paragraph">
+<p>Sometimes however, it may be more convenient to have the integration output
+at more regular intervals. Using the
+<b class="menuref">ODE solver fixed output step size</b>
+option (<b class="menuref">ODE solver</b>
+category), a fixed output step size can be
+configured. This value must be an integer or real number larger than zero.</p>
+</div>
+<div class="paragraph">
+<p>This option does not influence the actual time points for which the integrator
+calculates the values. Instead, it influences how these results are put in the
+trajectories, that are subsequently used by the simulator.</p>
+</div>
+<div class="paragraph">
+<p>Setting a fixed output step size, ensures that the trajectories contain output
+for all multiples of the given step size. They will however also contain output
+for the start and end of each time transition, which may not be at multiples
+of the step size, due to guards becoming enabled or disabled at other times.</p>
+</div>
+<div class="paragraph">
+<p>
+
+If <a href="#tools-cifsim-output-chapter-realtime">real-time</a> simulation is enabled, the
+default is changed to automatically use the
+<a href="#tools-cifsim-output-realtime-delta">model time delta</a> that is used for
+real-time simulation, as the fixed output step size. This way, the trajectories
+contain the time points for which intermediate
+<a href="#tools-cifsim-output-realtime-frames">frames</a> are generated. If
+real-time simulation is enabled, setting a custom fixed output step size is
+not supported.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-endtime-maxdelay">Simulation end time and maximum delay</h6>
+<div class="paragraph">
+<p>
+
+
+The maximum length of a time transition is determined by several factors:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The current simulation time.</p>
+</li>
+<li>
+<p>The simulation <a href="#tools-cifsim-termination-endtime">end time</a>.</p>
+</li>
+<li>
+<p>The maximum allowed delay amount.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The current simulation time is the value of variable <code>time</code>. Each time
+transition starts at the current time.</p>
+</div>
+<div class="paragraph">
+<p>Using the
+<b class="menuref">Simulation end time</b>
+option (<b class="menuref">Simulator</b>
+category), the <a href="#tools-cifsim-termination-endtime">end time</a> of the
+simulation can be configured. By setting a simulation end time, you ensure that
+when the value of variable <code>time</code> reaches that value, the simulation
+<a href="#tools-cifsim-chapter-termination">terminates</a>. Settings a simulation end time
+also limits the maximum length of a time transition, since from the current
+time, a limited amount of time can pass before the end time is reached. By
+default the simulation end time is set to 'infinite', which means that
+simulation termination, and the maximum length of a time transition, are not
+limited by a simulation end time.</p>
+</div>
+<div class="paragraph">
+<p>
+Using the
+<b class="menuref">Maximum delay</b>
+option (<b class="menuref">Simulator</b>
+category),
+the maximum delay amount for a single time transition can be set. If set, no
+time transitions longer than the specified value may be calculated. This limits
+the maximum length of time transitions to that value. Essentially, this cuts
+time transitions into parts with a maximum length specified by this option. By
+default, the maximum delay is set to 'infinite', which means that the maximum
+length of a time transition is not limited by this option. Restricting the
+maximum delay amount for a time transition should generally be avoided.
+For debugging purposes however, it may be useful to disable passage of time
+altogether. This can be achieved by using a maximum delay of <code>0</code>.</p>
+</div>
+<div class="paragraph">
+<p>If both a simulation end time and a maximum allowed delay amount are specified,
+the most restrictive of them determines the maximum length of the time
+transition. If neither is specified, the simulator will attempt to calculate a
+time transition of length <code>100.0</code>.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-options">ODE solver integrator options</h6>
+<div class="paragraph">
+<p>
+
+The <a href="#tools-cifsim-solver-chapter-basics-int">integrator</a> used by the ODE solver
+of the CIF simulator, can be configured using several options.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-int-algo">Integration algorithm</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver integrator algorithm</b>
+option
+(<b class="menuref">ODE solver: ODE integrator</b>
+category) can be used to configure the
+integrator algorithm to use. The following algorithms are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Higham and Hall 5(4)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Dormand-Prince">Dormand-Prince 5(4)</a></p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Dormand-Prince">Dormand-Prince 8(5,3)</a>
+(default)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Bulirsch-Stoer_algorithm">Gragg-Bulirsch-Stoer</a></p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Adams_method">Adams-Bashforth</a>
+(experimental)</p>
+</li>
+<li>
+<p><a href="http://en.wikipedia.org/wiki/Adams_method">Adams-Moulton</a>
+(experimental)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The algorithms differ in the complexity of the systems of ODEs that they can
+handle, their performance, the precision of their results, etc. All these
+algorithms use an
+<a href="http://en.wikipedia.org/wiki/Adaptive_stepsize">adaptive step size</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-int-tol">Absolute and relative tolerance</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver integrator absolute tolerance</b>
+option
+(<b class="menuref">ODE solver: ODE integrator</b>
+category) and the
+<b class="menuref">ODE solver integrator relative tolerance</b>
+option
+(<b class="menuref">ODE solver: ODE integrator</b>
+category), can be used to configure how
+precise the results of the integrator should be. The lower the tolerance (or
+error), the higher the precision of the results, but also the more computing
+time it costs to get to that precision. The absolute precision is the
+difference between the prediction and the actual value, while the relative
+precision is that same difference, as a fraction of the actual value. In the
+latter case, precision reduces with increasing values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-int-step">Minimum and maximum step size</h7>
+<div class="paragraph">
+<p>The interval between two consecutive time points calculated by the integrator
+can be configured using the
+<b class="menuref">ODE solver integrator minimum step size</b>
+option (<b class="menuref">ODE solver: ODE integrator</b>
+category) and the
+<b class="menuref">ODE solver integrator maximum step size</b>
+option
+(<b class="menuref">ODE solver: ODE integrator</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p>The default minimum step size is <code>1e-15</code> and the default maximum step size is
+<code>0.5</code>. Note however that the last step can be smaller than the value
+specified for the minimum step size option.</p>
+</div>
+<div class="paragraph">
+<p>
+Increasing the maximum default step size may lead to better performance, but
+can also lead to less precision, and <a href="#tools-cifsim-solver-chapter-root-problems">root finding problems</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-int-numstep">Number of steps</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver integrator number of steps</b>
+option
+(<b class="menuref">ODE solver: ODE integrator</b>
+category) can be used to configure the
+number of steps to use for the experimental
+<a href="http://en.wikipedia.org/wiki/Adams_method">Adams-Bashforth</a>
+and
+<a href="http://en.wikipedia.org/wiki/Adams_method">Adams-Moulton</a>
+integrators. The number of steps must be greater or equal to two.</p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-solver-chapter-options-root">ODE solver root finder options</h6>
+<div class="paragraph">
+<p>
+
+The <a href="#tools-cifsim-solver-chapter-basics-root">root finder</a> used by the ODE
+solver of the CIF simulator, can be configured using several options.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-root-maxcheck">Maximum check interval</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver root finder maximum check interval</b>
+option
+(<b class="menuref">ODE solver: ODE root finder</b>
+category) is explained on a separate
+page. See <a href="#tools-cifsim-solver-chapter-root-problems">Problems with root finding</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-root-algo">Root finding algorithm</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver root finding algorithm</b>
+option
+(<b class="menuref">ODE solver: ODE root finder</b>
+category) can be used to configure the
+root finding algorithm to use. The following algorithms are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Regula Falsi
+(<a href="http://en.wikipedia.org/wiki/False_position_method">False position</a>)
+method</p>
+</li>
+<li>
+<p>Illinois method</p>
+</li>
+<li>
+<p>Pegasus method (default)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The <em>Illinois</em> and <em>Pegasus</em> methods are modified <em>Regula Falsi</em> methods. The
+algorithms differ only in how they choose the middle point of the interval.
+This influences their convergence speed. The <em>Regula Falsi</em> method in
+particular should be avoided in practice.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-root-tol">Absolute and relative tolerance</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver root finder absolute tolerance</b>
+option
+(<b class="menuref">ODE solver: ODE root finder</b>
+category) and the
+<b class="menuref">ODE solver root finder relative tolerance</b>
+option
+(<b class="menuref">ODE solver: ODE root finder</b>
+category), can be used to
+configure how precise the results of the root finder should be. The lower the
+tolerance (or error), the higher the precision of the results, but also the
+more computing time it costs to get to that precision. The absolute precision
+is the difference between the prediction and the actual value, while the
+relative precision is that same difference, as a fraction of the actual value.
+In the latter case, precision reduces with increasing values.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-cifsim-solver-options-root-maxiter">Maximum iterations</h7>
+<div class="paragraph">
+<p>The
+<b class="menuref">ODE solver root finder maximum iterations</b>
+option
+(<b class="menuref">ODE solver: ODE root finder</b>
+category) can be used to set the
+maximum number of iterations to use for root finding. This value must be at
+least one. If the root interval is larger than the tolerances allow, after the
+maximum number of iterations, root finding fails.</p>
+</div>
+<div class="paragraph">
+<p>If it fails for your CIF specification, increase the value of this option. If
+that does not help, your specification is most likely too complex (by nature),
+or has a modeling error that causes the specification to become too complex
+for the root finding algorithm to handle. The problem however, may also be in
+one of the other root finder options, or in one of the
+<a href="#tools-cifsim-solver-chapter-options">integrator options</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-java-compiler">Java compiler</h5>
+<div class="paragraph">
+<p>
+
+The simulator internally generates
+<a href="http://oracle.com/java">Java</a>
+code from
+the CIF model. This code is compiled using a Java compiler and executed. Code
+generation and compilation result in faster simulation. However, compilation
+itself also takes time. The time it takes to compile is different for different
+Java compilers.</p>
+</div>
+<div class="paragraph">
+<p>Using the <em>Java Compiler</em> option (<em>Compiler</em> category), the Java compiler
+implementation to use, can be configured. We currently provide two different
+Java compilers:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Java compiler from the Java Development Kit (<code>jdk</code>)</p>
+<div class="paragraph">
+<p>The Java Development Kit (JDK) that is required to use our tooling
+includes a Java compiler. This compiler has the advantage that is has a bit
+less overhead of accessing the file system, while it has as disadvantage that
+it is a slower in actually compiling the Java code.</p>
+</div>
+</li>
+<li>
+<p>Eclipse Compiler for Java (<code>eclipse</code>)</p>
+<div class="paragraph">
+<p>The Eclipse Compiler for Java (ecj) is part of the Eclipse Java Development
+Tools (JDT), and is provided with our tooling. This compiler has the
+advantage that is is a faster in actually compiling the Java code, while it
+has as disadvantage that it has a bit more overhead of accessing the file
+system.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The names given above, in parentheses, indicate the command line option values
+to use for selecting the different compilers.</p>
+</div>
+<div class="paragraph">
+<p>In general, the JDK compiler is faster for small CIF models, while the Eclipse
+compiler is faster for larger CIF models. By default, the JDK compiler is
+used.</p>
+</div>
+<div class="paragraph">
+<p>The <em>Java Compiler</em> option has no effect when simulating using a
+<a href="#tools-cifsim-chapter-repeated-simulation">compiled code file</a> (e.g. a
+<code>.cifcode</code> file) for repeated simulations, or when
+<a href="#tools-cifsim-chapter-debug-gen-code">debugging generated code</a> by enabling
+the <em>Load debug code</em> option (<em>Simulator</em> category).</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-simulation-miscellaneous-topics">Simulation miscellaneous topics</h4>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-complete-mode">Complete mode</h5>
+<div class="paragraph">
+<p>
+The CIF simulator calculates for each <a href="#tools-cifsim-traces-state">state</a>
+the set of transitions that are possible from
+that state. It is up to the <a href="#tools-cifsim-input-chapter-index">input component</a>
+to choose one of those transitions, as the transition to take. Using the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input mode</a>, it is possible to
+always choose the first transition that is possible.</p>
+</div>
+<div class="paragraph">
+<p>In that situation, it is then a waste of resources to calculate the other
+possible transitions. Using the
+<b class="menuref">Complete mode</b>
+option (<b class="menuref">Simulator</b>)
+category), it is possible to enable complete mode. If
+complete mode is enabled, the calculation of the possible transitions stops as
+soon as one possible transition is found.</p>
+</div>
+<div class="paragraph">
+<p>The following values are available for the complete mode option:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Auto: disable if possible, enable otherwise</em></p>
+<div class="paragraph">
+<p>Automatically chooses whether to enable or disable complete mode. If it is
+allowed to disable complete mode, it will be disabled. Otherwise, complete
+mode will be enabled.</p>
+</div>
+</li>
+<li>
+<p><em>On: forced enabled</em></p>
+<div class="paragraph">
+<p>Enables complete mode. All possible transitions will be calculated.</p>
+</div>
+</li>
+<li>
+<p><em>Off: forced disabled</em></p>
+<div class="paragraph">
+<p>Disables complete mode. Only the first possible transitions will be
+calculated.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Currently, it is only allowed to disable complete mode, if the
+<a href="#tools-cifsim-input-chapter-automatic">automatic input mode</a> or
+<a href="#tools-cifsim-input-svg-chapter-index">SVG input mode</a> is used, together with
+always choosing the first possible transition.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-extfuncs">External user-defined functions</h5>
+<div class="paragraph">
+<p>
+
+The CIF simulator supports external user-defined functions. Currently, the
+following external languages are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-chapter-extfuncs-java">Java</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-extfuncs-async">Asynchronous execution</h6>
+<div class="paragraph">
+<p>By default, external user-defined functions are executed asynchronously. This
+ensures that the simulation can be <a href="#tools-cifsim-chapter-termination">terminated</a>
+during the execution of such a function. This is
+useful if such functions take a long time to execute. It is also particularly
+useful for external functions that never terminate, for instance because they
+get stuck in a loop, often due to a bug.</p>
+</div>
+<div class="paragraph">
+<p>
+This asynchronous execution however, does lead to a performance penalty. To
+get rid of this performance penalty, disable asynchronous execution, leading
+to synchronous execution. Asynchronous execution can be disabled using the
+<b class="menuref">External functions asynchronous execution</b>
+option
+(<b class="menuref">Simulator</b>
+category).</p>
+</div>
+<div class="paragraph">
+<p>By disabling the asynchronous execution, the simulator can no longer be
+terminated if it gets stuck executing an external user-defined function. If the
+functions runs for a long time, the termination is postponed until the external
+function finishes its execution.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cifsim-extfuncs-side-effects">Side effects</h6>
+<div class="paragraph">
+<p>All user-defined functions in CIF are pure mathematical functions. They must
+therefore be deterministic, and may not have side effects. For internal
+user-defined functions, this is enforced. For external user-defined functions,
+it is mostly impossible to check this constraint in an implementation, and the
+responsibility for checking this is therefore delegated to the end user.
+Practically, this means that for instance logging statements in functions,
+while essentially side effects, may be permitted, as long as the function
+returns the same value, if given the same arguments. This is essential for
+correct simulation results, as the results of function calls may for instance
+be cached by the simulator.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-value-semantics">Value semantics</h6>
+<div class="paragraph">
+<p>The CIF simulator uses value semantics for the parameters and return values
+of functions. That is, changes to the parameters of functions in external
+user-defined functions are <em>not</em> reflected back to the CIF specification.
+Furthermore, changes to the return values in the CIF simulator have no effect
+on subsequent calls to external user-defined functions.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-extfuncs-java">External user-defined Java functions</h5>
+<div class="paragraph">
+<p>
+External user-defined Java functions allow the use of static Java methods from
+CIF specifications. This page explains how to use such Java methods, how the
+simulator loads and invokes them, what is allowed, etc. It explicitly does not
+explain how to write or compile Java code.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-external-implementation-reference">External implementation reference</h6>
+<div class="paragraph">
+<p>Consider the following examples of external user-defined Java function:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func real f1(real x): &quot;java:java.lang.Math.expm1&quot;;
+
+func int f2(bool x): &quot;java:pkg.Cls.method|../some.jar;bin&quot;;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two external user-defined functions are given as examples. Both have a string
+literal as external implementation reference. For Java functions, the string
+literal must start with <code>java:</code>. Then the absolute name of the Java method
+that is to be invoked is given. That is, the package name, class name, and
+method name are given, separated by dots (<code>.</code>).</p>
+</div>
+<div class="paragraph">
+<p>Optionally, a Java class path may be given at the end, preceded by a bar
+(<code>|</code>) character. The class path entries must be separated by semicolons
+(<code>;</code>) regardless of the operating system. The class path entries are absolute
+or relative local file system paths to Jar files or directories with Java class
+files. Relative paths are resolved against the directory that contains the
+CIF specification in which the external user-defined function is declared. Both
+Linux/Mac path separators (<code>/</code>) and Windows path separators (<code>\</code>) may be
+used in class path entries. However, <code>\</code> must be escaped as <code>\\</code> in CIF
+string literals, and thus it is recommended to always use <code>/</code> as path
+separator. A discussion of the Java class path concept is beyond the scope of
+this documentation.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-types-and-values">Supported types and values</h6>
+<div class="paragraph">
+<p>Not all CIF data types are supported for the parameters and return values of
+external user-defined Java functions. The following table lists the allowed
+CIF types, and their corresponding Java types.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF type</th>
+<th class="tableblock halign-left valign-top">Java type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.Boolean</code> / <code>boolean</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.Integer</code> / <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int[a..b]</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.Integer</code> / <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.Double</code> / <code>double</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>string</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.String</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;t&gt;</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>set t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;t&gt;</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>dict(k: v)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.Map&lt;k, v&gt;</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(t1, t2, ..., tn)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;java.lang.Object&gt;</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Unless otherwise specified, the primitive Java types (<code>boolean</code>, <code>int</code>,
+and <code>double</code>) can be used interchangeably with their class variants
+(<code>java.lang.Boolean</code>, <code>java.lang.Integer</code>, and <code>java.lang.Double</code>).
+For lists and sets, the element type recursively affects the type parameters of
+the Java types. Similarly, for dictionaries, the key and value types affect
+the type parameters of the Java <code>Map</code> type. Since Java doesn&#8217;t have tuples,
+and there is no way in Java to define a type with a variable number of type
+parameters, CIF tuples are passed to Java as a list of objects. It may be
+assumed that such lists have the same number of elements as there are fields in
+the original tuple, and that the elements have types that correspond to the
+types of the field of the tuple. The following table shows a few examples:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF type</th>
+<th class="tableblock halign-left valign-top">Java type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;java.lang.Integer&gt;</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>set tuple(int a, b)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.Set&lt;java.util.List&lt;java.lang.Object&gt;&gt;</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>For parameters, no <code>null</code> values are ever passed, not even as elements of
+lists, etc. Furthermore, for <code>real</code> typed values, <code>NaN</code>, positive infinity,
+and negative infinity are never passed along.</p>
+</div>
+<div class="paragraph">
+<p>For return values, <code>null</code> values, as well as <code>NaN</code>, positive infinity, and
+negative infinity are considered runtime errors. Furthermore, integer values
+outside their CIF integer type range bounds are considered runtime errors as
+well.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-method-resolution">Method resolution</h6>
+<div class="paragraph">
+<p>The class as specified in the external implementation reference is loaded using
+a Java class loader. By default, the system class loader is used. If additional
+class path entries are specified in the external implementation reference, an
+extended class loader is used that searches in the additional class path
+entries before deferring to the system class loader. The class is loaded using
+the
+<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#name">binary name</a>
+of the class.</p>
+</div>
+<div class="paragraph">
+<p>The method that is resolved must be a static method. The access modifier of the
+static method is irrelevant. That is, it doesn&#8217;t matter whether the method is
+<code>private</code>, <code>protected</code>, <code>public</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>The method is resolved in the Java Virtual Machine (JVM) that runs the
+simulator. The method is resolved by name, and parameter types. The parameter
+types only include the top level type. That is, for CIF type <code>list int</code>, the
+Java type <code>java.util.List</code> is used as the type of the parameter. If more than
+one method with the same parameter types is declared in the class, and one of
+these methods has a return type that is more specific than any of the others,
+that method is used. Otherwise one of the methods is chosen arbitrarily.</p>
+</div>
+<div class="paragraph">
+<p>For parameters that have primitive Java types as their type, the primitive
+types are used to resolve the method instead of their classes. In other words,
+when resolving the method, or the proper overload of the method, <code>int</code> and
+<code>java.lang.Integer</code> are considered incompatible.</p>
+</div>
+<div class="paragraph">
+<p>The CIF simulator employs lazy loading. That is, if the external Java
+function is never called, it is also never loaded.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-method-invocation">Method invocation</h6>
+<div class="paragraph">
+<p>The method is invoked in the Java Virtual Machine (JVM) that runs the
+simulator, using reflection. By default, it is invoked
+<a href="#tools-cifsim-extfuncs-async">asynchronously</a>.</p>
+</div>
+<div class="paragraph">
+<p>Since the parameter types are not checked recursively when the method is
+resolved, methods may fail to execute properly if the type signatures don&#8217;t
+match exactly. Similarly, for the return type only the top level type is
+checked. If a return value does not match the CIF type (wrong element type,
+wrong tuple length, etc), simulation will fail with a runtime error.</p>
+</div>
+<div class="paragraph">
+<p>Any exceptions that occur during execution of the Java method are caught by
+the simulator. When the simulator catches such an exception, it will print the
+Java stack trace of the exception to the console, and simulation will be
+<a href="#tools-cifsim-chapter-termination">terminated</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-side-effects">Side effects</h6>
+<div class="paragraph">
+<p>As all functions in CIF, external user-defined Java functions should not have
+any <a href="#tools-cifsim-extfuncs-side-effects">side effects</a>. That is, if
+called with the same arguments, it should return the same value each time.
+More concretely, maintaining state information should be avoided, as should
+file I/O, and reading from stdin.</p>
+</div>
+<div class="paragraph">
+<p>Writing to stdout and stderr should not affect the result of the method. It
+should however be avoided as well, as such writes are associated with the
+streams of the Java Virtual Machine (JVM), and not the simulator. The output
+will not end up on the Eclipse console of the simulator.</p>
+</div>
+<div class="paragraph">
+<p>By default, the Java methods are invoked <a href="#tools-cifsim-extfuncs-async">asynchronously</a>,
+on a freshly created thread. That is, there
+is no guarantee that an invocation uses the same thread as the previous
+invocation. If static fields (class variables) are used to maintain state, this
+may cause problems if thread safety is not ensured by the Java method. If
+synchronous execution is used, all external function calls are invoked from the
+simulation thread, and such thread safety issues should not be a problem.</p>
+</div>
+<div class="paragraph">
+<p>You should assume that each external function is loaded using a different
+class loader. As such, multiple Java methods from the same class, from the
+same external library, may be loaded using different class loaders as
+well. As such, shared static fields (class variables) of those classes can in
+general not be shared by different external functions.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-profiling">Profiling</h5>
+<div class="paragraph">
+<p>
+
+
+The CIF simulator has a
+<b class="menuref">Profiling</b>
+option (<b class="menuref">Simulator</b>
+category). If the option is enabled, information about the number of
+transitions taken per second, is printed to the console. Enabling profiling
+disables most other types of console
+<a href="#tools-cifsim-output-chapter-index">output</a>. By default, profiling is disabled.</p>
+</div>
+<div class="paragraph">
+<p>The profiling output looks somewhat like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">750431.42 transitions/second
+640589.87 transitions/second
+890939.01 transitions/second
+887228.57 transitions/second
+890143.25 transitions/second
+893674.44 transitions/second
+891812.69 transitions/second</code></pre>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-distr-seeds">Stochastic distributions and seeds</h5>
+<div class="paragraph">
+<p>
+
+<a href="#tut-stochastics-chapter-intro">Stochastics</a> can be used to model
+randomness in CIF models. The CIF simulator exhibits
+<a href="#tut-stochastics-chapter-pseudo-randomness">pseudo-randomness</a>. This page
+explains how to influence that pseudo-randomness.</p>
+</div>
+<div class="paragraph">
+<p>The randomness of the stochastic distributions is implemented in the CIF
+simulator using
+<a href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator">pseudorandom number generators</a>
+(PRNGs). The PRNG used is the
+<a href="http://en.wikipedia.org/wiki/Mersenne_twister">Mersenne Twister</a>.
+The sequences of
+random numbers that are generated by the MT are not truly random. They are
+pseudorandom, as they start to repeat after some time. The Mersenne Twister
+however, has a very long <em>period</em> of 2<sup>19937</sup> - 1 numbers.</p>
+</div>
+<div class="paragraph">
+<p>Since the sequence of generated random numbers is always the same, the only
+way to vary it, is to use a different starting place. The starting place is
+determined by the initial
+<a href="http://en.wikipedia.org/wiki/Random_seed">seed</a>,
+which can be configured through the
+<b class="menuref">Initial seed for stochastic distributions</b>
+option (<b class="menuref">Simulator</b>
+category). If specified, it must
+be a value in the range [1 .. 2<sup>30</sup>]. If it is not specified, a random
+initial seed in that range is chosen by the simulator. If a random initial seed
+is chosen, and it is used, it is <a href="#tools-cifsim-output-normal-seeds">printed</a> to the console.</p>
+</div>
+<div class="paragraph">
+<p>The initial seed as provided by the option, is used for the first stochastic
+distribution that is created. Each subsequent distribution uses the next
+available seed. That is, if you specify an initial seed of 5, then the first
+distribution is created with an initial seed of 5, the next one uses 6, the
+third one uses 7, etc. The initial seeds are kept in the range
+[1 .. 2<sup>30</sup>]. After seed 2<sup>30</sup>, 1 is used as seed, then 2 is used as seed, etc.</p>
+</div>
+<div class="paragraph">
+<p>Simulating the same specification multiple times, using the same initial seed,
+results in the same samples. Therefore, using a fixed seed can make your
+simulation deterministic, even though you use stochastic distributions to
+introduce randomness into your specification.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-simulation-developer-topics">Simulation developer topics</h4>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-max-time-point-tol">Maximum time point tolerance</h5>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+This page is primarily intended for the developers of the CIF simulator,
+and not its end users.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The CIF simulator internally often queries the trajectories computed by the
+<a href="#tools-cifsim-solver-chapter-index">ODE solver</a>. Due to the limited precision
+of binary floating point number representations, requests of time points for
+which no exact match is present in the trajectories, but for which a very close
+match is present, are allowed. The simulator compensates for these small
+deviations, to avoid accumulation of such deviations.</p>
+</div>
+<div class="paragraph">
+<p>
+The simulator uses the value of the
+<b class="menuref">Maximum time point tolerance</b>
+option (<b class="menuref">Simulation</b>
+category) to determine whether two time points
+are close enough to each other to constitute a match. The tolerance is given in
+<a href="http://en.wikipedia.org/wiki/Unit_in_the_last_place">ulps</a>
+(<em>units in the
+last place</em>, or <em>units of least precision</em>). One ulp is the difference
+between two subsequent floating point numbers, for the limited precision
+binary floating point number representation used by the simulator. That is, two
+floating point numbers are one ulp away from each other, if there is no other
+floating point number between them, that can be represented using the floating
+point number representation used by the simulator. Since an ulp increases as
+the floating point numbers increase, the tolerance is thus relative to the
+values of the time points.</p>
+</div>
+<div class="paragraph">
+<p>The tolerance values chosen using the option must be in the range
+[1 .. 2<sup>30</sup>]. The default tolerance is 2<sup>10</sup> (= 1024) ulps. The default
+tolerance should suffice, but if it doesn&#8217;t, you may
+be presented with an error like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">ERROR: Simulation resulted in a runtime error, for state: time=0.0, x=1.0.
+CAUSE: Requested time point &quot;1.6000000000000005&quot; is &quot;2.0&quot; ulps (1 ulp = 2.220446049250313e-16) away from the closest time point in the trajectories &quot;1.6&quot;, which is farther away than the maximum tolerance of &quot;1&quot; ulps. You can try increasing the value of the maximum time point tolerance option. Please also contact the development team.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you get such an error, you can try to increase the tolerance using the
+<b class="menuref">Maximum time point tolerance</b>
+option, in order to be able to
+continue your simulation. However, as this shouldn&#8217;t actually happen, you
+should also contact the development team, who will then figure out why the
+default tolerance doesn&#8217;t suffice for your model.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-debug-gen-code">Debugging generated code</h5>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+This page is primarily intended for the developers of the CIF simulator, and not its end users.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The CIF simulator generates highly optimized code for the specification, to
+speed up the simulation. By enabling the
+<b class="menuref">Debug the generated code (by writing it to disk)</b>
+<a href="#tools-cifsim-output-chapter-debug">debugging output</a>,
+the generated code can be written to disk, for further debugging.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-output-directory">Output directory</h6>
+<div class="paragraph">
+<p>If the simulation is performed from within Eclipse, and a project named
+<code>org.eclipse.escet.cif.simulator.debug</code> exists, is not closed, and has a <code>src</code>
+directory, the generated code will be written to that <code>src</code> directory.
+Otherwise, the generated code will be written to the directory containing the
+input specification file.</p>
+</div>
+<div class="paragraph">
+<p>Regardless, the code is also always written to a <code>cifcode</code>
+sub-directory. If this sub-directory does not yet exist, it is created. If it
+already exists, all existing <code>.java</code> files are removed from the
+sub-directory first, before the newly generated code is written.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-written-files">Written files</h6>
+<div class="paragraph">
+<p>The generated code consists of Java files only. This results in several
+<code>.java</code> files being written to the <code>cifcode</code> directory.</p>
+</div>
+<div class="paragraph">
+<p>Additionally, an Eclipse launch configuration file (<code>_cifsim_debug.launch</code>)
+is written. This launch configuration can be used to reproduce the simulation
+implemented by the generated code. The launch configuration
+reproduces the simulation options that were used, and always shows the option
+dialog. The working directory for the simulation performed via the generated
+launch configuration is the same working directory as the original simulation.
+This allows additional files, such as configuration files, to be found.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-how-to-use">How to use</h6>
+<div class="paragraph">
+<p>To use this feature, follow these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Import all CIF related source projects into your Eclipse workspace.</p>
+</li>
+<li>
+<p>Make sure your workspace is automatically rebuilt, by enabling the
+<b class="menuref">Build Automatically</b>
+option in the
+<b class="menuref">Project</b>
+menu.</p>
+</li>
+<li>
+<p>Start a sub-Eclipse application, by right clicking on any plug-in project in
+the workspace, and choosing <span class="menuseq"><b class="menu">Run as</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Eclipse Application</b></span>
+or <span class="menuseq"><b class="menu">Debug as</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Eclipse Application</b></span>.</p>
+</li>
+<li>
+<p>In the sub-Eclipse that opens, make sure the CIF specification (the <code>.cif</code>
+file) that you like to simulate is available in the workspace.</p>
+</li>
+<li>
+<p>In the sub-Eclipse, import the <code>org.eclipse.escet.cif.simulator.debug</code> source
+project.</p>
+</li>
+<li>
+<p>Simulate the CIF specification, and make sure you enable the
+<b class="menuref">Debug the generated code</b>
+option.</p>
+</li>
+<li>
+<p>Continue simulation, if desired.</p>
+</li>
+<li>
+<p>Once the simulation has terminated, switch back to the main Eclipse.</p>
+</li>
+<li>
+<p>Refresh the <code>org.eclipse.escet.cif.simulator.debug</code> project.</p>
+</li>
+<li>
+<p>Set breakpoints in the generated Java code, or in the simulator code, as
+desired.</p>
+</li>
+<li>
+<p>Right click the launch configuration in the <code>src/cifcode</code> directory, and
+choose <span class="menuseq"><b class="menu">Debug as</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">_cifsim_debug</b></span>.</p>
+</li>
+<li>
+<p>Debug the simulation, with the generated code, as you would any Java program.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-starting-the-simulator-with-generated-code">Starting the simulator with generated code</h6>
+<div class="paragraph">
+<p>The launch configuration that is written to disk with the generated code, uses
+the
+<b class="menuref">Load debug code</b>
+option (<b class="menuref">Simulator</b> category). Using
+this option, the classpath (directory) where the already generated code is
+located, is specified. By specifying it, the simulator knows from where to load
+it.</p>
+</div>
+<div class="paragraph">
+<p>Simulations not started from the generated launch configuration, generally
+don&#8217;t use this option. They load the input specification, validate it, generate
+fresh code, and compile the code in-memory, or use
+<a href="#tools-cifsim-repeated-sim-compile-once">compiled code files</a></p>
+</div>
+<div class="paragraph">
+<p>Simulations using the generated code ignore all options related to
+<a href="#tools-cifsim-chapter-repeated-simulation">repeated simulations</a>. That is, the
+<em>Load debug code</em> option takes priority over the <em>Compile only</em> option
+(<em>Compiler</em> category), and simulating with
+<a href="#tools-cifsim-repeated-sim-compile-once">compiled code files</a>.</p>
+</div>
+<div class="paragraph">
+<p>A warning is printed to the console if the generated code was generated with
+a different version of the simulator than the one used to simulate it. Ignoring
+the warning may lead to unexpected simulation results, or even simulator
+crashes.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cifsim-chapter-test-mode">Test mode</h5>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+This page is primarily intended for the developers of the CIF simulator,
+and not its end users.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>In order to be able to perform automated testing, the
+<b class="menuref">Test mode</b>
+option (<b class="menuref">Output</b>
+category) can be used. This option has the following
+effect:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The visual interfaces for all
+<a href="#tools-cifsim-output-chapter-index">output components</a> (such as visualizers)
+are disabled.</p>
+</li>
+<li>
+<p>The user is no longer asked to
+<a href="#tools-cifsim-termination-confirm">confirm termination</a> of the
+simulator, if the the
+<b class="menuref">Ask to confirm simulator termination</b>
+option (<b class="menuref">Simulator</b>
+category) is configured to let the simulator
+decide whether to ask the user for confirmation or terminate automatically.
+By not asking for user input at the console, the automated test set can be
+fully automatically executed.</p>
+</li>
+<li>
+<p>It is allowed to perform <a href="#tools-cifsim-output-chapter-realtime">real-time</a>
+simulation without using any
+<a href="#tools-cifsim-output-realtime-outcomp">real-time output components</a>,
+allowing testing of the real-time functionality in the automated test set.</p>
+</li>
+<li>
+<p>All <a href="#tools-cifsim-output-chapter-realtime">real-time delays</a> are skipped. By
+not performing unnecessary real-time delays, the automated test set executes
+as fast as possible.</p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-index">SVG visualization</a> operates in
+synchronous mode, rather than asynchronous mode. This ensures that debug
+output becomes synchronous as well, and we thus get consistent output for our
+test cases. This is not only useful for automated testing, but also for
+debugging.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-verification-tools">Verification tools</h3>
+<div class="sect3">
+<h4 id="tools-chapter-cif2mcrl2">CIF to mCRL2 transformer</h4>
+<div class="paragraph">
+<p>
+
+
+The CIF to mCRL2 transformer is used to convert a CIF specification to a
+mCRL2 specification.
+<a href="http://www.mcrl2.org/">mCRL2</a>
+is a tool for verifying properties of the model.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-4">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF verification tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to mCRL2&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF verification tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to mCRL2&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cif2mcrl2</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2mcrl2</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2mcrl2-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative file system path to the input
+CIF specification.</p>
+</li>
+<li>
+<p><em>Instance tree definition</em>: mCRL2 uses a tree of processes which you can
+specify manually here. If not specified, it takes the default solution,
+which first merges all CIF automata (one at a time), and on top of that, the
+variable processes of the shared variables (also one at a time).
+How to define your own tree is explained in the
+<a href="#tools-cif2mcrl2-instancetree-syntax">instantiation tree syntax</a> Section.</p>
+</li>
+<li>
+<p><em>Enable debug output</em>: The transformer derives information about used and
+available variables in the instantiation tree, and uses that information to
+generate the mCRL2 action operations at every level. By enabling this
+option, this information is also written to an output file for further
+external analysis. By default, the information is written in a file with the
+same name as the input file, except first the <code>.cif</code> extension is removed
+(if present), and a <code>_dbg.txt</code> extension is appended. The name of the
+output file can be changed with the <em>Debug output file path</em> option. Setting
+the latter option enables this option.</p>
+</li>
+<li>
+<p><em>Debug output file path</em>: The absolute or relative file system path to use
+for writing derived information about used and available variables at every
+level in the instantiation tree. Setting this option changes the debug
+output file path to the given path. It also enables the <em>Enable debug
+output</em> option.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative file system path for writing
+the generated mCRL2 output file. By default, the output file path is the
+same as the input file path, but with the <code>.cif</code> extension removed (if it
+exists), and the <code>.mcrl2</code> extension added. By setting this option, the
+default is overridden by the given value.</p>
+</li>
+<li>
+<p><em>Generate 'value' actions</em>: To query the value of variable <code>x</code>,
+a <code>value_x</code> action can be used. By default, such actions are generated for
+every variable in the system. Using this option, you can define precisely
+which variables should have such an action. See the
+<a href="#cif2mcrl2-value-select">Generation of 'value' actions</a> Section for more details.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-4">Supported specifications</h5>
+<div class="paragraph">
+<p>The CIF to mCRL2 transformer supports a subset of CIF specifications. The
+following restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The transformer ignores the supervisory kind of the automata.</p>
+</li>
+<li>
+<p>Algebraic variables are not supported.</p>
+</li>
+<li>
+<p>Continuous variables are not supported.</p>
+</li>
+<li>
+<p>Equations are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates are not supported, except for initialization
+predicates in a location.</p>
+</li>
+<li>
+<p>Invariants are not supported.</p>
+</li>
+<li>
+<p>Marker predicates are ignored.</p>
+</li>
+<li>
+<p>Discrete variables must have type <code>bool</code> or <code>int</code>. The latter may have
+a range.</p>
+</li>
+<li>
+<p>Multiple potential initial values are not supported.</p>
+</li>
+<li>
+<p>Initial value must be a constant.</p>
+</li>
+<li>
+<p>There must be at least one automaton.</p>
+</li>
+<li>
+<p>The transformation translates the range of integer variables if used, but it
+does not enforce the maximum and minimum integer value of CIF.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In automata, there are a number of extra conditions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>initial</code> expression in locations must be constant.</p>
+</li>
+<li>
+<p>There must be a single initial location in each automaton.</p>
+</li>
+<li>
+<p>Conditional updates are not supported, only assignment updates are allowed.</p>
+</li>
+<li>
+<p>Multi-assignments are not supported.</p>
+</li>
+<li>
+<p>Channels are not supported.</p>
+</li>
+<li>
+<p>The <code>tau</code> event is not supported.</p>
+</li>
+<li>
+<p>Urgency of locations and edges is ignored.</p>
+</li>
+<li>
+<p>Location references are not supported.</p>
+</li>
+<li>
+<p>All expressions and sub-expressions must be of type <code>bool</code> or <code>int</code>. The
+latter may have a range.</p>
+</li>
+<li>
+<p>Boolean constants, discrete variables, and operators <code>and</code>, <code>or</code>,
+<code>==</code>, <code>&gt;=</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&lt;</code>, <code>!=</code>, and <code>not</code> are allowed.</p>
+</li>
+<li>
+<p>Integer constants, discrete variables, binary operators <code>+</code>, <code>*</code>, <code>-</code>,
+and unary operators <code>-</code> and <code>+</code> are allowed.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>However, some of these limitations are resolved by preprocessing of the
+specification, as explained in the next section.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-4">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-alg-vars">Eliminate algebraic variables</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-consts">Eliminate constants</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-monitors">Eliminate monitors</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="cif2mcrl2-value-select">Generation of 'value' actions</h5>
+<div class="paragraph">
+<p>The CIF to mCRL2 transformer generates a <code>value</code> action for each variable by
+default. In some cases, this may not be wanted. Variables that never have to
+be queried for their value do not need such an action. Having such an action
+available anyway increases the amount of work that has to be done by the mCRL2
+tool. To eliminate these unneeded <code>value</code> actions, the CIF to mCRL2
+transformer has the <em>Generate 'value' actions</em> option.</p>
+</div>
+<div class="paragraph">
+<p>The option takes a comma separated list of variable patterns. Each pattern
+can add or remove variables. If the pattern starts with a <code>+</code> character,
+variables are added. If the pattern starts with a <code>-</code> character, variables
+are removed. If the pattern start neither with a <code>+</code> nor with a <code>-</code>
+character, variables are added. The main part of each pattern is the name of
+the variable to add or remove. In addition, you can use the <code>*</code> character
+as a shorthand for 'zero or more arbitrary characters', allowing you to write
+abbreviations, and match several variables at the same time.</p>
+</div>
+<div class="paragraph">
+<p>For example, assume existence of the following variables in a CIF model:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>A.p12 A.q2 A.z B.x B.y1 B.y2 B.z C.q</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Below a number of example option values, and what variables they select from
+the above list.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The option value <code>B.x,+A.z</code> selects variables <code>B.x</code> and <code>A.z</code>.</p>
+</li>
+<li>
+<p>The option value <code>+*1</code> matches all variables that end with a <code>1</code>, which
+is variable <code>B.y1</code> only (Variable <code>A.p12</code> does have a <code>1</code> in it, but
+not at the end.)</p>
+</li>
+<li>
+<p>The option value <code>+*1*</code> matches all variables with a <code>1</code> at any
+position. This matches both <code>A.p12</code> and <code>B.y1</code>.</p>
+</li>
+<li>
+<p>The option value <code>+*,-B.*</code> selects all variables, except those in
+automaton <code>B</code>. (<code>*</code> adds all variables, then <code>-B.*</code> removes all
+variables that start with <code>B.</code>, that is all variables in automaton <code>B</code>.)</p>
+</li>
+<li>
+<p>The option value <code>-*</code> removes all <code>value</code> actions, since the pattern
+removes all variables.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2mcrl2-instancetree-syntax">Syntax of the instance tree</h5>
+<div class="paragraph">
+<p>In mCRL2, a behavior process is required for every automaton in the input, and
+a variable process is needed for every variable used (read or written) by two
+or more automata. In addition, it is allowed to have a variable process for
+variables that are used in one automaton only (that is, a local variable of
+the automaton).</p>
+</div>
+<div class="paragraph">
+<p>All these processes must be instantiated using the parallel composition
+operator. For larger specifications, the naive solution of instantiating all
+processes together in one level fails due to having too many allowed
+combinations of actions for the mCRL2 tool to handle.</p>
+</div>
+<div class="paragraph">
+<p>A different solution is to instantiate smaller groups of processes at a time,
+and then use these groups again in other instantiations. Instantiation happens
+in multiple levels in this case, leading to a tree of process instantiations.
+At each level, the set of allowed actions is restricted by adding action
+operators. This results in a large reduction of the number of possible
+combinations of actions that need to be explored by the mCRL2 tool. Fewer
+combinations of actions in turn leads to enabling larger specifications to be
+verified.</p>
+</div>
+<div class="paragraph">
+<p>Which processes and groups are taken together at each level in the tree has a
+large impact on feasibility. The CIF to mCRL2 transformer has a default
+scheme, where pairs of one group and one behavior process are taken together
+at each level (except at the bottom, where two behavior processes are merged
+instead). On top of that tree, pairs of a group and a variable process are
+taken together.</p>
+</div>
+<div class="paragraph">
+<p>The CIF to mCRL2 transformer does not perform analysis to decide how processes
+and variables should combined. In many cases this provides a working solution.
+For some specifications however, you may want to have more influence in the
+order of grouping. For this reason, the <em>Instance tree definition</em> option
+exists. It allows you to define which processes should be taken together at
+each level in the instantiation tree.</p>
+</div>
+<div class="paragraph">
+<p>The current implementation has limits with respect to ordering. Automata
+processes must be merged first (but the number of levels and the order of
+combining is free), and then variables must be added one at a time (but which
+variable to use at each level is free).</p>
+</div>
+<div class="paragraph">
+<p>The option expects absolute names of all automata in the specification and
+absolute names of all discrete variables used in two more automata, separated
+by white space or commas. In addition you may add the absolute names of
+variables used in only one automaton. For each element mentioned, a process is
+created in mCRL2. Variables used in one automaton that are not mentioned,
+become local variables of the behavior process of the automaton that uses the
+variable.</p>
+</div>
+<div class="paragraph">
+<p>Processes for the mentioned CIF elements are instantiated. Sub-groups of
+processes are written by surrounding them with parentheses. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>( ( A B C ) A.x ) B.y</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>takes automata <code>A</code>, <code>B</code>, <code>C</code> together. One level higher, variable
+<code>A.x</code> is added, and finally variable <code>B.y</code> is added at the highest level.
+Another order is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>( ( ( A B ) C ) B.y ) A.x</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>First processes <code>A</code> and <code>B</code> are combined, then process <code>C</code> is added, and
+finally variables <code>B.y</code> and <code>A.x</code> at the top-most two levels.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-debug-output">Debug output</h5>
+<div class="paragraph">
+<p>The transformer analyzes use of the variables by each automaton, and computes
+variable usage and availability of the variables at each level in the
+instantiation tree. This information is written to a file with debug output by
+enabling the <em>Enable debug output</em> option. As an example, consider the
+following artificial CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event a, b, c;
+
+automaton P:
+  disc int[0..10] x = 0;
+  disc int[-5..5] zero = 0;
+
+  location p1:
+    initial;
+    edge a do x := x + 1 goto p2;
+
+  location p2:
+    edge c when Q.y != 0 goto p1;
+    edge a do x := 1 goto p1;
+end
+
+automaton Q:
+  disc int[0..1] y = 1;
+
+  location q1:
+    initial;
+    edge a when y = 1 goto q2;
+
+  location q2:
+    edge b when y = 1 and P.x &lt; 8 and P.zero = 0 goto q1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specification has two automata <code>P</code> and <code>Q</code>, and two shared variables
+<code>P.x</code> and <code>Q.y</code>. The ranges of the variables are important, mCRL2
+considers the integer type unbounded, depending on your CIF file, without
+giving upper and lower bounds for the variables, you may end up in the
+situation that mCRL2 tries every single value of its infinite integer type,
+which takes a very long time!</p>
+</div>
+<div class="paragraph">
+<p>Variable <code>zero</code> is not shared, only automaton <code>Q</code> uses it. The transformer
+moves it to the <code>Q</code> process. Normally however, you would use a constant
+instead of a variable.</p>
+</div>
+<div class="paragraph">
+<p>The instance tree used in the transformation is <code>( ( P Q ) P.x ) Q.y</code>. The
+debug output for <code>P</code> is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1.1.1.1
+
+Variable use by behavior processes ordered by event:
+    a:
+        P.x  read:SOMETIMES  write:ALWAYS
+    c:
+        Q.y  read:ALWAYS  write:NEVER</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Automaton <code>P</code> has one <code>c</code> edge, which checks the value of <code>Q.y</code> but it
+does not change its value. It has two <code>a</code> edges, only the <code>a</code> edge in
+location <code>p1</code> reads <code>P.x</code> (to compute <code>x + 1</code>). Both edges assign a new
+value to <code>P.x</code>.</p>
+</div>
+<div class="paragraph">
+<p>In a similar way, the node information for automaton <code>Q</code> is computed. The
+result is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1.1.1.2
+
+Variable use by behavior processes ordered by event:
+    a:
+        Q.y  read:ALWAYS  write:NEVER
+    b:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:ALWAYS  write:NEVER</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The automaton only checks values rather than writing them. As you can see,
+variable <code>P.x</code> is not mentioned with event <code>a</code>, since there is no edge in
+the automaton with event <code>a</code> that accesses variable <code>P.x</code>.</p>
+</div>
+<div class="paragraph">
+<p>The node that merges both automata, i.e. <code>( P Q )</code>, has the following
+formation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1.1.1
+
+Variable use by behavior processes ordered by event:
+    a:
+        P.x  read:SOMETIMES  write:ALWAYS
+        Q.y  read:ALWAYS     write:NEVER
+    c:
+        Q.y  read:ALWAYS  write:NEVER
+    b:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:ALWAYS  write:NEVER
+
+Children:
+    node 1.1.1.1
+    node 1.1.1.2</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Variable use by each event is simply merged. In this example there is no
+overlap, but that works as you would expect, <code>SOMETIMES</code> overrides
+<code>NEVER</code>, and <code>ALWAYS</code> overrides <code>SOMETIMES</code>.</p>
+</div>
+<div class="paragraph">
+<p>The node for variable process for <code>P.x</code> only provides a variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1.1.2
+
+Available variable processes:
+    P.x</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The output states that variable <code>P.x</code> is available here.</p>
+</div>
+<div class="paragraph">
+<p>At <code>( P Q ) P.x</code> node, the merge of the variable <code>P.x</code> with the two
+automata, this results in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1.1
+
+Available variable processes:
+    P.x
+
+Variable use by behavior processes ordered by event:
+    a:
+        P.x  read:SOMETIMES  write:ALWAYS
+        Q.y  read:ALWAYS     write:NEVER
+    c:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:NEVER   write:NEVER
+    b:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:ALWAYS  write:NEVER
+
+Children:
+    node 1.1.1
+    node 1.1.2</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this node, variable <code>P.x</code> is also available. The variable process does
+not perform events, so the event variable table of node <code>1.1.1</code> is copied.
+The only exception is the additional line <code>P.x</code> for event <code>c</code>. The reason
+for this line is that while <code>( P Q )</code> may not use <code>P.x</code> in combination
+with event <code>c</code>, other automata higher up in the tree may still need that
+variable. (In a future version of the transformer tool, it may be detected
+that such use never happens, and there is no need to add the line here.)</p>
+</div>
+<div class="paragraph">
+<p>Node <code>1.2</code> is the variable process of <code>Q.y</code>. It looks the same as node
+<code>1.1.2</code>, except for the name of the variable.</p>
+</div>
+<div class="paragraph">
+<p>Finally the top-node that merges <code>( P Q ) P.x</code> with <code>Q.y</code>, bringing
+everything together, looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>===============================================================
+Node 1
+
+Available variable processes:
+    P.x
+    Q.y
+
+Variable use by behavior processes ordered by event:
+    a:
+        P.x  read:SOMETIMES  write:ALWAYS
+        Q.y  read:ALWAYS     write:NEVER
+    c:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:NEVER   write:NEVER
+    b:
+        Q.y  read:ALWAYS  write:NEVER
+        P.x  read:ALWAYS  write:NEVER
+
+Children:
+    node 1.1
+    node 1.2</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>Q.y</code> variable is now also available. The event variable table is again
+copied. Since all events already used variable <code>Q.y</code> no additional lines
+were added.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-output-of-the-transformation">Output of the transformation</h5>
+<div class="paragraph">
+<p>A variable process in mCRL2 handles shared access to a variable. For variable
+<code>P.x</code> in the above example it looks like:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>act value_x, vread_x, vwrite_x, sync_x, aread_x, awrite_x : Int;
+
+proc VarProc_x(v:Int) =
+  value_x(v) . VarProc_x(v) +
+  vread_x(v) . VarProc_x(v) +
+  sum m:Int . ((m &gt;= 0) &amp;&amp; (m &lt;= 10)) -&gt; vwrite_x(m) . VarProc_x(m) +
+  sum m:Int . ((m &gt;= 0) &amp;&amp; (m &lt;= 10)) -&gt; vread_x(v) | vwrite_x(m) . VarProc_x(m);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The name of the actions all end with the name of the variable. If the CIF
+specification has two or more variables with the same name, a number gets
+appended to make each variable unique in mCRL2.</p>
+</div>
+<div class="paragraph">
+<p>A behavior process is generated for each automaton instance. Like the
+variables, the name of the automaton is used in the output. If there are
+name conflicts, a number is appended to make it unique. The process is
+the same list of edges of the original CIF automaton, with added read and
+write actions for synchronizing with the variable processes:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>sort LocSort_P = struct loc_P_p1 | loc_P_p2;
+
+proc BehProc_P(Locvar_P : LocSort_P) =
+  sum x : Int . ((x &gt;= 0) &amp;&amp; (x &lt;= 10) &amp;&amp; (Locvar_P == loc_P_p1)) -&gt; a | aread_x(x) | awrite_x((x + 1)) . BehProc_P(loc_P_p2) +
+  sum y : Int . ((y &gt;= 0) &amp;&amp; (y &lt;= 1) &amp;&amp; (Locvar_P == loc_P_p2) &amp;&amp; (y != 0)) -&gt; c | aread_y(y) . BehProc_P(loc_P_p1) +
+  (Locvar_P == loc_P_p2) -&gt; a | awrite_x(1) . BehProc_P(loc_P_p1);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Locations are encoded in a <code>struct</code> and variable read and write actions are
+added as needed.</p>
+</div>
+<div class="paragraph">
+<p>The instantiation tree is dominated by the action operators needed for
+synchronizing and restricting actions. The <code>value_...</code> actions are allowed
+up the to top level node, to give access to variable values in the
+verification. This leads to:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>act a, renamed_a, c, renamed_c, b, renamed_b;
+
+init block({aread_y, awrite_y, vread_y, vwrite_y},
+     hide({sync_y},
+     comm({aread_y | vread_y -&gt; sync_y,
+           awrite_y | vwrite_y -&gt; sync_y},
+     (
+       block({aread_x, awrite_x, vread_x, vwrite_x},
+       hide({sync_x},
+       comm({aread_x | vread_x -&gt; sync_x,
+             awrite_x | vwrite_x -&gt; sync_x},
+       (
+         allow({value_zero,
+            a | awrite_x | aread_y,
+                a | awrite_x | aread_x | aread_y,
+                c | aread_y,
+                b | aread_y | aread_x},
+         rename({renamed_a -&gt; a},
+         block({a},
+         comm({a | a -&gt; renamed_a},
+         (
+           BehProc_P(loc_P_p1)
+         ||
+           BehProc_Q(loc_Q_q1, 0)
+         )))))
+       ||
+         VarProc_x(0)
+       ))))
+     ||
+       VarProc_y(1)
+     ))));</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-cif2uppaal">CIF to UPPAAL transformer</h4>
+<div class="paragraph">
+<p>
+
+
+The CIF to UPPAAL transformer can be used to transform CIF specifications
+to UPPAAL systems (<code>*.xml</code> files).
+<a href="http://www.uppaal.org/">UPPAAL</a>
+is a tool modeling, validation, and verification of networks of timed automata with
+variables. The transformer only transforms untimed CIF specifications.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-5">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF verification tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to UPPAAL&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF verification tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Convert CIF to UPPAAL&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cif2uppaal</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2uppaal</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-options-14">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative local file system path to the
+output UPPAAL file. If not specified, defaults to the input file path, where
+the <code>.cif</code> file extension is removed (if present), and a <code>.xml</code> file
+extension is added.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-5">Supported specifications</h5>
+<div class="paragraph">
+<p>The CIF to UPPAAL transformer supports a subset of CIF specifications. The
+following restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Specifications without automata are not supported.</p>
+</li>
+<li>
+<p>Channels (events with data types) are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in components are not supported.</p>
+</li>
+<li>
+<p>Automata that do not have exactly one initial location are not supported.</p>
+</li>
+<li>
+<p>Locations with initialization predicates that are too complex to evaluate
+statically, are not supported. That is, those predicates must essentially be
+be constant. For instance, <code>true</code> and <code>true or false</code> are supported, as
+is <code>c</code> if <code>c</code> is a constant. However, <code>v =&gt; c</code> with <code>v</code> a discrete
+variable that can initially have several different values, is not supported.</p>
+</li>
+<li>
+<p>Discrete variables with multiple potential initial values are not supported.</p>
+</li>
+<li>
+<p>Discrete variables with initial values that are too complex to evaluate
+statically, are not supported. That is, their initial values must essentially
+be constant. For instance, <code>1 + 1</code> and <code>2 * 5</code> are supported, as is
+<code>c + 1</code> if <code>c</code> is a constant. However, <code>v * 2</code> with <code>v</code> a discrete
+variable that can initially have several different values, is not supported.</p>
+</li>
+<li>
+<p>Enumerations are not supported.</p>
+</li>
+<li>
+<p>Continuous variables are not supported.</p>
+</li>
+<li>
+<p>Algebraic variables are not supported.</p>
+</li>
+<li>
+<p>Input variables are not supported.</p>
+</li>
+<li>
+<p>User-defined functions are not supported.</p>
+</li>
+<li>
+<p>Urgent edges are not supported.</p>
+</li>
+<li>
+<p>Multi-assignments on edges (such as <code>do (x, y) := (1, 2)</code>) are not
+supported. However, it is allowed to use multiple assignments on an edge
+(such as <code>do x := 1, y := 2</code>).</p>
+</li>
+<li>
+<p>Partial variable assignments (such as <code>do x[0] := 5</code>) are not supported.</p>
+</li>
+<li>
+<p>Conditional updates (<code>if</code> updates) on edges (such as
+<code>do if b: x := 5 end</code>) are not supported.</p>
+</li>
+<li>
+<p>Only the following data types are supported: boolean types and integer (both
+with a range and without a range).</p>
+</li>
+<li>
+<p>Only the following expressions are supported: boolean literal values
+(<code>true</code> and <code>false</code>), integer literal values, binary expressions
+(partially, see below), unary expressions (partially, see below), casts that
+don&#8217;t change the type, <code>if</code> expressions, and references to constants,
+discrete variables, and locations.</p>
+</li>
+<li>
+<p>Only the following binary operators are supported: logical equivalence
+(<code>&lt;=&gt;</code>), logical implication (<code>=&gt;</code>), logical conjunction (<code>and</code> on
+boolean operands), logical disjunction (<code>or</code> on boolean operands), addition
+(<code>+</code>) on integer operands, subtraction (<code>-</code>) on integer operands,
+multiplication (<code>*</code>) on integer operands, integer division (<code>div</code>),
+integer modulus (<code>mod</code>), equality (<code>=</code>) on integer operands, inequality
+(<code>!=</code>) on integer operands, less than (<code>&lt;</code>) on integer operands, less
+than or equal to (<code>&lt;=</code>) on integer operands, greater than (<code>&gt;</code>) on
+integer operands, and greater than or equal to (<code>&gt;=</code>) on integer operands.</p>
+</li>
+<li>
+<p>Only the following unary operators are supported: logical inverse (<code>not</code>),
+negation (<code>-</code>) on an integer operand, and plus (<code>+</code>) on an integer
+operand.</p>
+</li>
+<li>
+<p>Only state invariants are supported. State/event exclusion invariants are
+not supported. To allow state/event exclusion invariants to be used in the
+input, manually eliminate them first using the
+<a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a> CIF to CIF transformation.</p>
+</li>
+<li>
+<p>The controllability of events is ignored.</p>
+</li>
+<li>
+<p>The supervisory kinds of automata are ignored.</p>
+</li>
+<li>
+<p>The supervisory kinds of invariants are ignored.</p>
+</li>
+<li>
+<p>Marker predicates are ignored.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-5">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-tau-event">Eliminate <code>tau</code> event</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-monitors">Eliminate monitors</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-transformation-result-2">Transformation result</h5>
+<div class="paragraph">
+<p>CIF features synchronizing events, while UPPAAL only supports channels. A
+<code>SendAut</code> automaton/template is added to the UPPAAL system to ensure proper
+event synchronization. The UPPAAL template has a single location, and self
+loops for every event in the CIF specification. The guards of the self loops
+express the conditions under which the events are globally enabled (guard wise)
+in the CIF specification. Every CIF event is a broadcast channel in UPPAAL. If
+the self loop is enabled (guard wise), the <code>SendAut</code> template broadcasts over
+the channel. All the other templates (for the CIF automata) receive the event.
+They can actually receive, as the guard of the self loop ensures that. Together
+the <code>SendAut</code> self loops and the receive edges form the synchronization.</p>
+</div>
+<div class="paragraph">
+<p>As the <code>SendAut</code> template needs to refer to locations of the other templates,
+location pointer variables are added for all the other templates. For every
+CIF automaton <code>some.aut</code>, a location pointer variable <code>LP_some_aut</code> is
+added. The location pointers are integer variables with range <code>[0,n-1]</code>, for
+an automaton with <code>n</code> locations. Updates are added to the edges to ensure the
+location pointer variables have the proper values. The location pointers are
+similar to those created by the CIF to CIF transformation that
+<a href="#tools-cif2cif-chapter-elim-locs-in-exprs">eliminates the use of locations in expressions</a>.</p>
+</div>
+<div class="paragraph">
+<p>In CIF, assignments interpret the right hand side of the assignment (the new
+value of the variable) in the source state of the transition. In UPPAAL,
+assignments have order, and the right hand sides are interpreted over the
+current state, after any preceding assignments. Furthermore, the order in which
+the assignments of the edges of different participating templates are executed
+is not defined. To ensure the proper CIF semantics, 'old' versions of all
+variables (including the location pointer variables) are added. For a variable
+<code>x</code>, <code>OLD_x</code> is added. The <code>SendAut</code> automaton assigns the current values
+of all variables to their 'old' counterparts. The assignments on the edges of
+the other automata then use the 'old' variables to compute the new values of
+the variables. As the values of the 'old' variables are only used during the
+transitions, the 'old' variables are <em>meta</em> variables in the UPPAAL system.</p>
+</div>
+<div class="paragraph">
+<p>The invariants from CIF components are added to the location of the <code>SendAut</code>
+template.</p>
+</div>
+<div class="paragraph">
+<p>For CIF variables with an <code>int</code> type, the UPPAAL type is
+<code>int[-2147483648,2147483647]</code>.</p>
+</div>
+<div class="paragraph">
+<p>The names of templates, variables, etc in UPPAAL are based on the absolute
+names of their CIF counterparts. For a variable <code>a.b.c</code> in CIF, the UPPAAL
+name is <code>a_b_c</code>. If there are conflicts between the UPPAAL names, or if one
+of the UPPAAL names conflicts with a UPPAAL keyword, renaming is performed, and
+a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>No geometry is generated. When the generated UPPAAL file is opened in UPPAAL,
+UPPAAL will perform some layouting.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-real-time-testing-code-generation-and-implementation-tools">Real-time testing, code generation, and implementation tools</h3>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="tools-codegen-chapter-index">CIF code generator</h4>
+<div class="paragraph">
+<p>The CIF code generator can be used to generate implementation code for
+various languages/platforms. The generated code is complete, and can be used as
+is, without any CIF related library or runtime.</p>
+</div>
+<div class="paragraph">
+<p>The remainder of this page explains general information about the tool, that
+applies to all target languages/platforms. Specific information is available
+for each of the target languages/platforms, on separate pages:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-codegen-chapter-c89">C89</a> (if there is no <code>C99</code> compiler)</p>
+</li>
+<li>
+<p><a href="#tools-codegen-chapter-c99">C99</a></p>
+</li>
+<li>
+<p><a href="#tools-codegen-chapter-java">Java</a></p>
+</li>
+<li>
+<p><a href="#tools-codegen-chapter-simulink">Simulink</a>, with an example of
+<a href="#tools-codegen-chapter-simulink-example">controlling a tank</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-generator">Starting the generator</h5>
+<div class="paragraph">
+<p>The generator can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the <b class="menuref">Project Explorer</b>
+or <b class="menuref">Package Explorer</b> and choose
+<span class="menuseq"><b class="menu">CIF implementation tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Generate code for CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF implementation tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Generate code for CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifcodegen</code> tool in a ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifcodegen</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options that apply to all target languages/platforms:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output directory</em>: The absolute or relative local file system path to the
+output directory. This is the directory to which the generated code files
+will be written. If the directory does not yet exist, it is automatically
+created. By default, the current directory is used.</p>
+</li>
+<li>
+<p><em>Target language</em>: Specifies the target language/platform for which to
+generate code. By default, C99 code is generated. The following
+languages/platforms are supported:</p>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Target language/platform</th>
+<th class="tableblock halign-left valign-top">Command line value</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-codegen-chapter-c89">C89</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>c89</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-codegen-chapter-c99">C99</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>c99</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-codegen-chapter-java">Java</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-codegen-chapter-simulink">Simulink</a></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>simulink</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The first column indicates the target language/platform, and is linked to a
+page with more information for that specific language/platform. The second
+column indicates the command line value to use for the option, to select that
+target language/platform.</p>
+</div>
+</li>
+<li>
+<p><em>Code prefix</em>: The code prefix, used to prefix file names, identifiers in
+the code, etc. If no prefix is given, the prefix is derived from the input
+filename, by removing the <code>.cif</code> file extension, if present. This is also
+the default. The prefix must be a valid CIF identifier, i.e. consist of only
+letters (<code>a</code> to <code>z</code>, <code>A</code> to <code>Z</code>), numbers (<code>0</code> to <code>9</code>), and
+underscores (<code>_</code>), and not start with a number.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-supported">Supported specifications</h5>
+<div class="paragraph">
+<p>The CIF code generator supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Specifications without automata are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in components are not supported, except if it
+can be determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>State invariants in components are not supported, except if it can be
+determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>State/event exclusion invariants (in components as well as locations) are not
+supported. To allow state/event exclusion invariants to be used in the input,
+manually eliminate them first using the
+<a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">CIF to CIF transformation</a>.</p>
+</li>
+<li>
+<p>Discrete variables with multiple initial values (including <code>any</code>) are not
+supported.</p>
+</li>
+<li>
+<p>External user-defined functions are not supported.</p>
+</li>
+<li>
+<p>Urgent locations are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in locations that can not be statically evaluated
+are not supported.</p>
+</li>
+<li>
+<p>State invariants in locations are not supported, except if it can be
+determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>Automata that do not have exactly one initial location are not supported.</p>
+</li>
+<li>
+<p>Urgent edges are not supported.</p>
+</li>
+<li>
+<p>Data types other than <code>bool</code>, <code>int</code> (with or without range), <code>real</code>,
+<code>string</code>, enumerations, tuples, and arrays, are not supported. This applies
+to the data types of variables, parameters of functions, return types of
+functions, etc.</p>
+</li>
+<li>
+<p>Sampling of distributions is not supported.</p>
+</li>
+<li>
+<p>The use of the conjunction and disjunction binary operators on anything other
+than boolean values is not supported.</p>
+</li>
+<li>
+<p>The use of the equality and inequality binary operators on anything other
+than boolean, integer, real, string, or enumeration values is not supported.</p>
+</li>
+<li>
+<p>The use of the addition binary operators on anything other than numeric or
+string values is not supported.</p>
+</li>
+<li>
+<p>The use of the subtraction binary operators on anything other than numeric
+values is not supported.</p>
+</li>
+<li>
+<p>The use of the element test and subset binary operators is not supported.</p>
+</li>
+<li>
+<p>Projection on anything other than tuples, arrays, and strings is not
+supported. This applies to expressions as well as addressables (the left hand
+sides of assignments). For arrays, both 0-based indices (counting from the
+left) as well as negative indices (counting from the right) are supported.</p>
+</li>
+<li>
+<p>Slicing is not supported.</p>
+</li>
+<li>
+<p>Function calls on anything other than standard library functions and internal
+user-defined functions is not supported.</p>
+</li>
+<li>
+<p>The <code>del</code>, <code>pop</code>, <code>acosh</code>, <code>asinh</code>, <code>atanh</code>, <code>cosh</code>, <code>sinh</code>,
+and <code>tanh</code> standard library functions are not supported.</p>
+</li>
+<li>
+<p>The <code>empty</code> standard library function on anything other than arrays is not
+supported.</p>
+</li>
+<li>
+<p>The <code>size</code> standard library function on anything other than strings and
+arrays is not supported.</p>
+</li>
+<li>
+<p>The distribution standard library functions are not supported.</p>
+</li>
+<li>
+<p>Lists (except for arrays), sets, and dictionaries are not supported.</p>
+</li>
+<li>
+<p>The use of functions as values is not supported. That is, functions may only
+be used in function calls, and may for instance not be stored in variables,
+or passed to other functions.</p>
+</li>
+<li>
+<p>Print declarations with pre/source state text and post/target state filtering
+(<code>when</code>) are not supported.</p>
+</li>
+<li>
+<p>Print declarations with post/target state text and pre/source state filtering
+(<code>when</code>) are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-6">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-cif-svg-decls">Remove CIF/SVG declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-others">Simplify others</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>After these preprocessing steps, the generator checks whether the specification
+is supported. It then applies the following additional
+<a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-linearize-merge">Linearize (merge)</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-generated-code">Generated code</h5>
+<div class="paragraph">
+<p>This section explains the basics behind the generated code, as they apply to
+all target languages. The specific pages that explain the code generated for
+specific target languages provide further details.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-code-overview">Code overview</h6>
+<div class="paragraph">
+<p>The code that executes the edges of the CIF model is called the <em>event loop</em>
+code. The event loop is not the only code that is executed. Before the loop,
+the values of the input variables are obtained from the environment, the
+initial state is initialized (for the first execution only), and the values of
+the continuous variables are updated to account for the amount of time that has
+passed (for all but the first execution). Then the event loop is executed.
+Finally, output values may be supplied to the environment.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-repeated-execution">Repeated execution</h6>
+<div class="paragraph">
+<p>During the execution of the code, variable <code>time</code> from the CIF model is
+not updated. Execution of the code takes time. After the code is executed,
+potentially more time passes. Then, the code can be executed again. The time
+(in seconds) between the first execution and the current execution is the
+total time that has passed since execution started, and this becomes the new
+value of variable <code>time</code>.</p>
+</div>
+<div class="paragraph">
+<p>How often the code is executed, and whether this is done with a fixed cycle
+time (periodic task scheduling) or with a variable cycle times (non-periodic
+tasks) can be influenced by the end user. The details differ per target
+language, and can be found on their respective pages.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-event-loop">Event loop</h6>
+<div class="paragraph">
+<p>The CIF model is first <a href="#tools-cif2cif-chapter-linearize-merge">linearized</a> to
+eliminate parallel composition. The result is self loop edges with guards and
+updates. The main part of the generated code essentially consists of update
+code that is conditionally executed. This code executes edges. This is done
+repeatedly, until no more events are enabled. The loop in the generated code
+that repeatedly executes event code until no more events are possible, is
+called the <em>event loop</em>. Once no more events are enabled, the event loop
+terminates.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-event-order">Event order</h6>
+<div class="paragraph">
+<p>The order in which the code is generated for the different edges (in the
+<em>event loop</em>), is done in such a way that it matches the order in which
+transitions are chosen by the simulator. Assuming the simulator is used to
+simulate by always automatically choosing the
+<a href="#tools-cifsim-input-chapter-automatic">first transition</a> that is enabled, the
+generated code will choose that same transition. That is, for each iteration of
+the event loop, the code is executed for the first event with an enabled guard.
+Then, a new iteration of the loop is started, from the top, to ensure that the
+first enabled event is always executed, similar to simulation. If during an
+iteration of the loop none of the events is enabled, the event loop terminates.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-termination-2">Termination</h6>
+<div class="paragraph">
+<p>If in the CIF model always at least one event is enabled, the generated code
+will run forever, and will never terminate. Time will not pass. Code generation
+should be avoided for such models. It is the responsibility of the modeler to
+ensure this is taken into account.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-predictability-of-execution-time">Predictability of execution time</h6>
+<div class="paragraph">
+<p>If at least one event is enabled, the event loop is executed again. If during
+an iteration of the loop none of the edges is enabled, the loop terminates.
+This approach generally does not result in predictable execution times of the
+program body. That is, if a certain edge keeps being enabled, the loop is
+executed over an over again. In that case, the execution time of the body
+may exceed the fixed cycle time, and the controller is no longer guaranteed to
+work correctly. Even if the loop is only executed a finite number of times,
+the execution time of the body may exceed the fixed cycle time. One may
+consider monitoring the execution times to detect such issues. All
+implementations provide a way to obtain execution time statistics. The details
+differ per target language, and can be found on their respective pages.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optional-execution-feedback">Optional execution feedback</h6>
+<div class="paragraph">
+<p>Several implementations provide additional information during simulation, such as
+which events have been executed, timing information, and what new print output
+has been generated. Such information can generally be enabled and disabled in
+the implementations. The details differ per target language, and can be found
+on their respective pages.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-correct-handling-of-io">Correct handling of I/O</h6>
+<div class="paragraph">
+<p>The generated code cannot guarantee its correct behavior if the inputs from the
+external I/O change more rapidly than the generated code is executed. That is,
+if an input changes during a single execution of the code, the change is not
+noticed until the next execution. If an input changes during an execution and
+changes back during that same execution, the change is not noticed at all.
+Therefore, executing the code often enough per second, is essential. In other
+words, choosing an appropriate cycle time is essential for the correct
+functioning of the generated code.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-codegen-accuracy-over-time">Accuracy over time</h6>
+<div class="paragraph">
+<p>The generated C89, C99 and Java code maintains the running time in seconds.
+Due to the finite
+representation of numeric values, this results in numeric overflow after
+execution for a long time. Running the code continuously for longer than 100
+years should be avoided.</p>
+</div>
+<div class="paragraph">
+<p>The continuous variables from the CIF specification in the generated code
+are updated each execution
+using the <a href="http://en.wikipedia.org/wiki/Euler_method">Euler method</a> for
+integration. That is, each execution the time that has elapsed since the
+previous execution is multiplied by the derivative of the continuous variable
+in the state of the previous execution. This value is added to the value of the
+continuous variable. Essentially, a linear approximation of the derivative is
+used, calculated using the state of the previous execution.</p>
+</div>
+<div class="paragraph">
+<p>The Euler method can be
+<a href="http://en.wikipedia.org/wiki/Numerical_stability">numerically unstable</a>, it
+can suffer from rounding
+errors due to the use finite binary representations of real values, and has
+some other issues as well. The effects are likely to be limited if linear
+continuous variable (continuous variables with constant derivatives) are used.
+Especially clocks (derivative +1 or -1) generally don&#8217;t suffer too much from
+these issues. However, even clocks may suffer from loss of accuracy over time.
+As such, clocks should not be used to measure over long periods of time.
+Instead they should be reset, rendering the past loss of accuracy irrelevant
+for any future measurements.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-enumerations">Enumerations</h6>
+<div class="paragraph">
+<p>The <a href="#tools-cif2cif-chapter-linearize-merge">linearization</a> that is used as
+preprocessing, also <a href="#tools-cif2cif-chapter-merge-enums">merges all enumerations</a>
+into a single enumeration. This is done in such a way that the behavior of the
+original CIF model is left intact. However, it is up to the implementer that
+connects the inputs from the environment to the generated code, to ensure that
+only valid enumeration literals are assigned to the input variables of the
+generated code.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-chapter-c89">C89 code generation</h5>
+<div class="paragraph">
+<p>
+
+The <a href="#tools-codegen-chapter-index">CIF code generator</a> can generate C89 code from a CIF
+specification. It is assumed the reader of this page is familiar with the
+general information of the CIF code generator tool. This page describes
+specific information applicable only to C89 code generation.</p>
+</div>
+<div class="paragraph">
+<p>In general, use of the <a href="#tools-codegen-chapter-c99">C99</a> code generator is
+preferred, as the language contains a decade longer development. However, in
+the case there is no <code>c99</code> compiler available, the <code>c89</code> code generation
+might be a useful fallback option to convert a CIF program for controlling a
+real time system. The conversion uses a simple integrator
+intended for updating running clocks (derivative should not change during
+a time step for best results). Also, it does not compute length of the next
+time step, but instead assumes being called regularly to update
+internal state and perform discrete steps if possible.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-6">Supported specifications</h6>
+<div class="paragraph">
+<p>The CIF code generator supports a subset of CIF specifications. Generation
+of C89 code does not impose additional restrictions. See the
+<a href="#tools-codegen-supported">Supported specifications</a> section of the <a href="#tools-codegen-chapter-index">CIF code generator</a>
+page for more information.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-differences-in-output">Differences in output</h6>
+<div class="paragraph">
+<p>When converting a real number to text, for example when printing a real value,
+the generated C89 code does not preserve trailing zeroes of real number
+fractions while using <code>%g</code>. For example <code>fmt("%.3g", 1.0)</code> will output
+<code>1</code> rather than <code>1.000</code>.</p>
+</div>
+<div class="paragraph">
+<p>This may cause real number values to be printed with less digits precision than
+indicated in the CIF program.</p>
+</div>
+<div class="paragraph">
+<p>Strings have an upper limit in length that is set during compilation. Longer
+strings are silently truncated to this length.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-15">Options</h6>
+<div class="paragraph">
+<p>The C89 code generator only uses the <a href="#tools-codegen-options">common options</a>
+that apply to all target languages/platforms of the
+<a href="#tools-codegen-chapter-index">CIF code generator</a>, it has no options of its own.</p>
+</div>
+<div class="paragraph">
+<p>The code prefix that can be configured using a common option is used to prefix
+external names, making them unique for the generated code.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generated-files">Generated files</h6>
+<div class="paragraph">
+<p>C89 code generation leads to creation of seven files:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 66.6667%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Generated file</th>
+<th class="tableblock halign-left valign-top">Purpose</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_library.h</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Runtime support code and library headers</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_library.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Runtime support code and library implementation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_engine.h</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Interface definition of the translated CIF program</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_engine.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implementation of the translated CIF program</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_compile.sh</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Compile script for Linux</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_test_code.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Example of external functions, allow compiling the generated code</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_readme.txt</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Short description of use, the interface, and compile options</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>where <code>&lt;prefix&gt;</code> is replaced by the value of the <em>Code prefix</em> option during
+code generation.</p>
+</div>
+<div class="paragraph">
+<p>The aim is to provide a complete and compilable package, to minimize the effort
+in converting a CIF specification. Most files are static text (modulo
+the <code>&lt;prefix&gt;</code> replacement). The two exceptions are both engine files that
+contain the C89 version of the CIF specification. The interface of these files
+is however fixed (modulo the <code>&lt;prefix&gt;</code> replacement), and generated data
+types and operations on them have predictable names, reducing the chance of
+failed compilation when re-generating the files.</p>
+</div>
+<div class="paragraph">
+<p>When modifying a generated file (such as the compile script or the example test
+code), keep in mind that running the code generator again will overwrite <em>all</em>
+files. Rename a file before modifying it to avoid loss of work.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-compilation-of-the-generated-code">Compilation of the generated code</h6>
+<div class="paragraph">
+<p>The generated code is C89 code that can be compiled using a C89 C compiler, like <code>gcc</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="shell">gcc -Wall -std=c89 -DPRINT_OUTPUT=1 -DCHECK_RANGES=1 \
+    &lt;prefix&gt;_engine.c &lt;prefix&gt;_library.c &lt;prefix&gt;_test_code.c -lm</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The single <code>\</code> is not part of the command, it means the next line should be appended at the end.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;prefix&gt;</code> should be replaced by the value of the <em>Code prefix</em> option during
+code generation. The <code>PRINT_OUTPUT</code> and <code>CHECK_RANGES</code> macros enable
+support for the CIF <code>print</code> statement and checking of integer range overlap,
+as defined by CIF. In general however, you may want to replace the test code
+file by your own code.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-c89-compile-time-options">C89 compile-time options</h6>
+<div class="paragraph">
+<p>Besides the <code>PRINT_OUTPUT</code> and <code>CHECK_RANGES</code> macros, the generated code
+has a few other compile-time options to customize its behavior. Below is the complete list.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 80%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Macro name</th>
+<th class="tableblock halign-left valign-top">Effect</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MAX_STRING_SIZE</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CIF has variable length strings, in the generated code they are converted to strings with a fixed
+upper limit. Default is 128 (including the terminator character). Set this macro for a different limit.
+<em>Note that both the library and the engine use this macro. It is crucial that both files use the same
+value for this macro</em>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CHECK_RANGES</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When copying integers from one range to another, where the latter is only partially covered by the
+former, CIF checks whether the copied values do not violate the destination range. Since violating
+this property generally indicates a programming error, it is recommended to enable this macro.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>EVENT_OUTPUT</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set, the generated code calls <code>&lt;prefix&gt;_InfoEvent()</code> before and after performing an event to
+allow third-party code to act on it. Enable if your code needs to know when an event is performed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>PRINT_OUTPUT</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set, the CIF <code>print</code> statement is performed, and the <code>&lt;prefix&gt;__PrintOutput()</code> is called with
+the resulting text and destination filename. Mainly intended for debugging, but only useful in
+systems where the text can be displayed to a user.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MAX_NUM_EVENTS</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The CIF semantics state that execution of edges is instantaneous and time-less. The generated code
+loops to perform edges, until no edge can be executed any more. Unfortunately, such a loop is not
+time-less. To avoid requiring too much time, there is an upper limit of 1000 iterations. Set this macro
+to change the limit.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>KEEP_RUNNING</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The CIF language checks range conversions (if <code>CHECK_RANGES</code> is set) and verifies updates of
+continuous variable updates. Setting this flag disables a few checks. Most of these checks are in
+<code>assert()</code> checks and not controlled by this macro, since violating the condition generally means a
+crash is eventually inevitable. It is recommended to avoid using this macro.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect5">
+<h6 id="tools-executing-the-code">Executing the code</h6>
+<div class="paragraph">
+<p>The engine files act as a library that implements the CIF program. To run the
+program, the code must be called regularly. The code has two entry points, one
+for initializing and performing the first steps, and one for handling a time
+delay.</p>
+</div>
+<div class="paragraph">
+<p>The first entry point is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_EngineFirstStep(<span class="directive">void</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This entry point initializes all the data, queries the values of the input
+variables if present, and performs execution of edges until blocked on the
+first time step or until hitting the <code>MAX_NUM_EVENTS</code> limit. Since this
+resets the entire CIF program to its initial state, you should only call this
+when the system being controlled is also (re-)initialized.</p>
+</div>
+<div class="paragraph">
+<p>The second entry point is more regularly called, after a period of time has passed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_EngineTimeStep(<span class="predefined-type">double</span> delta)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By calling this entry point, you indicate that <code>delta</code> (&gt; 0) time units have
+passed. The code reads new values of the input variables,
+<a href="#tools-codegen-accuracy-over-time">updates the continuous variables</a>,
+and performs edges until all edges are blocked, or
+hitting the <code>MAX_NUM_EVENTS</code> limit.</p>
+</div>
+<div class="paragraph">
+<p>When the call of either entry point returns, you can query the value of the
+variables to use as input for other parts of the system.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-environment-interface">Environment interface</h6>
+<div class="paragraph">
+<p>Calling one of the above entry points causes the CIF program to be executed,
+up to the next time step (assuming the <code>MAX_NUM_EVENTS</code> limit is high
+enough). During the execution, the code performs a number of callbacks to get
+information from the environment, to provide information about its actions, or
+to deliver output. In addition, after each call, variables may be inspected by
+the environment to get information about the decisions of the CIF program.</p>
+</div>
+<div class="paragraph">
+<p>The externally provided callback functions that are being used are:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_AssignInputVariables(<span class="directive">void</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The CIF program requests new values for all its input variables. In your
+implementation of this function you should write values directly in the input
+variables. Input variables are assumed to be independent of other parts of the
+CIF program, in general you should not need other CIF program values to
+implement this function.</p>
+</div>
+<div class="paragraph">
+<p>If <code>EVENT_OUTPUT</code> is set during compilation, executed events are reported with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_InfoEvent(&lt;prefix&gt;_Event_ event, BoolType pre)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the <code>EVENT_OUTPUT</code> macro is set during compilation, the generated code
+reports with this call that event event is about to (<code>pre</code> is <code>TRUE</code>),
+or has been (<code>pre</code> is <code>FALSE</code>) executed. In the pre-event call, the event
+can be executed, and all variables have their value before performing the
+updates of the involved edges. In the post-event call, all variables have their
+values updated as indicated in the updates of the edges.</p>
+</div>
+<div class="paragraph">
+<p>Primary use of this call is to forward the decision to other parts of the
+controlled system.</p>
+</div>
+<div class="paragraph">
+<p>Finally, if the <code>PRINT_OUTPUT</code> macro is set during compilation, the generated
+code reports lines of output to be printed with the following function call:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_PrintOutput(<span class="directive">const</span> <span class="predefined-type">char</span> *line, <span class="directive">const</span> <span class="predefined-type">char</span> *fname)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It denotes that text <code>line</code> should be printed at file <code>fname</code>. The primary
+uses of this call are to enable debugging the system, or to log relevant
+events. Note that <code>fname</code> here can mean anything. It can mean a real file,
+but also a pseudo-device like <code>:stdout</code> which is commonly used to print
+output to the C <code>stdout</code> stream.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-data-access">Data access</h6>
+<div class="paragraph">
+<p>Each CIF constant is available as a variable that does not change after
+initialization. Each algebraic variable can be queried by calling a function
+with the same name as the variable. The value of continuous variables is
+available by accessing the equivalent variable in the generated code. The
+derivative of each continuous variable is available as function named by the
+variable, and the suffix <code>deriv</code>. The model time is available as
+<code>model_time</code>. There is no derivative function of time. Internal functions are
+available as well if required.</p>
+</div>
+<div class="paragraph">
+<p>The engine header file lists the translated names. It should be easy to find
+the relevant entry, as the generated code also documents the original name.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-data-types">Data types</h6>
+<div class="paragraph">
+<p>The following table defines how CIF data types are converted in the C89 generated code.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF data type</th>
+<th class="tableblock halign-left valign-top">C89 data type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>BoolType</code> which is a typedef to <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>IntType</code> which is a typedef to <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>enum e = ...</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;Enum</code> which is a typedef to <code>enum Enum&lt;prefix&gt;_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RealType</code> which is a typedef to <code>double</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>string</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>StringType</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list[n] t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>...Type</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(...)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>...Type</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>A few notes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>...</code> in the C89 <code>...Type</code> name for arrays (fixed length lists) and
+tuples is the <a href="#tools-codegen-c89-systematic-type-names">systematic type name</a>
+of the array or tuple type.</p>
+</li>
+<li>
+<p>Due to <a href="#tools-cif2cif-chapter-linearize-merge">linearization</a> all enumerations
+are merged into one. The generated C89 code always has exactly one translated
+<code>enum</code>.</p>
+</li>
+<li>
+<p>The elementary data types (<code>BoolType</code>, <code>IntType</code>, <code>RealType</code>, and
+<code>StringType</code>) are defined in the library header file.</p>
+</li>
+<li>
+<p>The <code>StringType</code> structure wraps a <code>char data[MAX_STRING_SIZE]</code> array.
+The <code>struct</code> allows copying arrays by value using an assignment statement.</p>
+</li>
+<li>
+<p>The array type (list with a fixed length) structure wraps a
+<code>&lt;element-type&gt; data[&lt;size&gt;]</code> array for the same reason. Copying an array
+by assignment is allowed.</p>
+</li>
+<li>
+<p>The tuple type is a structure with fields <code>_field0</code>, <code>_field1</code>, and so
+on, where the type of each field in the structure matches with the type of
+the CIF tuple field.</p>
+</li>
+<li>
+<p>Boolean constants <code>true</code> and <code>false</code> are  named <code>TRUE</code> and <code>FALSE</code>
+respectively.</p>
+</li>
+<li>
+<p>The <code>-0.0</code> value of doubles gets replaced by <code>0.0</code> to void subtle equality
+problems.</p>
+</li>
+<li>
+<p>Strings get silently truncated to <code>MAX_STRING_SIZE - 1</code> characters. They
+are always terminated with a NUL character.</p>
+</li>
+<li>
+<p>Enumeration values get <code>_&lt;prefix&gt;_</code> added in front to make them unique.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-codegen-c89-systematic-type-names">Systematic type names</h6>
+<div class="paragraph">
+<p>For tuple and list types, the type is converted to a name in a systematic way,
+making each type unique and predictable.</p>
+</div>
+<div class="paragraph">
+<p>The conversion composes a name of a type from the type of its elements, and
+concatenates the result. The following conversion table applies:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF type</th>
+<th class="tableblock halign-left valign-top">Systematic name</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>B</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>enum e = ...</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>E</code> (Due to linearization, all enumerations are merged together to a
+single enumeration. As such, always exactly one <code>enum</code> is generated for a
+CIF model.)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>R</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list[n] t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>A&lt;n&gt;&lt;t&gt;</code>, with <code>&lt;n&gt;</code> the length of the array, and <code>&lt;t&gt;</code> the systematic
+type name of the element type of the array.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(t1, t2, t3, ..., tn)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>T&lt;n&gt;&lt;t1&gt;&lt;t2&gt;&lt;t3&gt;...&lt;tn&gt;</code>, with <code>&lt;n&gt;</code> the number of fields in the tuple, and
+<code>&lt;t1&gt;</code> to <code>&lt;tn&gt;</code> the systematic type names of the fields.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>For example, type <code>list[5] int</code> is converted to <code>A5I</code>, and type
+<code>tuple(list[5] int x; tuple(real a, b) z)</code> is converted to <code>T2A5IT2RR</code>
+(concatenation of <code>T2</code> with the field type names <code>A5I</code> and <code>T2RR</code>).</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-runtime-errors">Runtime errors</h6>
+<div class="paragraph">
+<p>The CIF language defines strict sets of allowed values for all data types, and
+performs checking of these values at run time. The generated C89 code follows
+that idea, and checks whether operations on data are safe. Most of these
+checks are performed with an <code>assert</code>. Executed C code does not provide useful
+stack traces by default, and original line numbers of e.g. a CIF program have no
+meaning due to the linearization that is performed before code is generated. In
+addition, the generated code is quite readable and it is not too hard to
+understand what the code is doing at some C source line.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-chapter-c99">C99 code generation</h5>
+<div class="paragraph">
+<p>
+
+The <a href="#tools-codegen-chapter-index">CIF code generator</a> can generate C99 code from a CIF
+specification. It is assumed the reader of this page is familiar with the
+general information of the CIF code generator tool. This page describes
+specific information applicable only to C99 code generation.</p>
+</div>
+<div class="paragraph">
+<p>The aim of the C99 code generation tool is to provide an easy conversion from
+a CIF program to control of a real time system. It uses a simple integrator
+intended for updating running clocks (derivative should not change during
+a time step for best results). Also, it does not compute length of the next
+time step, but instead assumes being called regularly to update
+internal state and perform discrete steps if possible.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-7">Supported specifications</h6>
+<div class="paragraph">
+<p>The CIF code generator supports a subset of CIF specifications. Generation
+of C99 code does not impose additional restrictions. See the
+<a href="#tools-codegen-supported">Supported specifications</a> section of the <a href="#tools-codegen-chapter-index">CIF code generator</a>
+page for more information.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-differences-in-output-2">Differences in output</h6>
+<div class="paragraph">
+<p>When converting a real number to text, for example when printing a real value,
+the generated C99 code does not preserve trailing zeroes of real number
+fractions while using <code>%g</code>. For example <code>fmt("%.3g", 1.0)</code> will output
+<code>1</code> rather than <code>1.000</code>.</p>
+</div>
+<div class="paragraph">
+<p>This may cause real number values to be printed with less digits precision than
+indicated in the CIF program.</p>
+</div>
+<div class="paragraph">
+<p>Strings have an upper limit in length that is set during compilation. Longer
+strings are silently truncated to this length.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-16">Options</h6>
+<div class="paragraph">
+<p>The C99 code generator only uses the <a href="#tools-codegen-options">common options</a> that apply to all target languages/platforms of the
+<a href="#tools-codegen-chapter-index">CIF code generator</a>, it has no options of its own.</p>
+</div>
+<div class="paragraph">
+<p>The code prefix that can be configured using a common option is used to prefix
+external names, making them unique for the generated code.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generated-files-2">Generated files</h6>
+<div class="paragraph">
+<p>C99 code generation leads to creation of seven files:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 66.6667%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Generated file</th>
+<th class="tableblock halign-left valign-top">Purpose</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_library.h</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Runtime support code and library headers</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_library.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Runtime support code and library implementation</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_engine.h</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Interface definition of the translated CIF program</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_engine.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implementation of the translated CIF program</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_compile.sh</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Compile script for Linux</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_test_code.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Example of external functions, allow compiling the generated code</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;_readme.txt</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Short description of use, the interface, and compile options</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>where <code>&lt;prefix&gt;</code> is replaced by the value of the <em>Code prefix</em> option during
+code generation.</p>
+</div>
+<div class="paragraph">
+<p>The aim is to provide a complete and compilable package, to minimize the effort
+in converting a CIF specification. Most files are static text (modulo
+the <code>&lt;prefix&gt;</code> replacement). The two exceptions are both engine files that
+contain the C99 version of the CIF specification. The interface of these files
+is however fixed (modulo the <code>&lt;prefix&gt;</code> replacement), and generated data
+types and operations on them have predictable names, reducing the chance of
+failed compilation when re-generating the files.</p>
+</div>
+<div class="paragraph">
+<p>When modifying a generated file (such as the compile script or the example test
+code), keep in mind that running the code generator again will overwrite <em>all</em>
+files. Rename a file before modifying it to avoid loss of work.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-compilation-of-the-generated-code-2">Compilation of the generated code</h6>
+<div class="paragraph">
+<p>The generated code is C99 code that can be compiled using a C99 C compiler, like <code>gcc</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="shell">gcc -Wall -std=c99 -DPRINT_OUTPUT=1 -DCHECK_RANGES=1 \
+    &lt;prefix&gt;_engine.c &lt;prefix&gt;_library.c &lt;prefix&gt;_test_code.c -lm</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The single <code>\</code> is not part of the command, it means the next line should be appended at the end.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;prefix&gt;</code> should be replaced by the value of the <em>Code prefix</em> option during
+code generation. The <code>PRINT_OUTPUT</code> and <code>CHECK_RANGES</code> macros enable
+support for the CIF <code>print</code> statement and checking of integer range overlap,
+as defined by CIF. In general however, you may want to replace the test code
+file by your own code.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-c99-compile-time-options">C99 compile-time options</h6>
+<div class="paragraph">
+<p>Besides the <code>PRINT_OUTPUT</code> and <code>CHECK_RANGES</code> macros, the generated code
+has a few other compile-time options to customize its behavior. Below is the complete list.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 80%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Macro name</th>
+<th class="tableblock halign-left valign-top">Effect</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MAX_STRING_SIZE</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">CIF has variable length strings, in the generated code they are converted to strings with a fixed
+upper limit. Default is 128 (including the terminator character). Set this macro for a different limit.
+<em>Note that both the library and the engine use this macro. It is crucial that both files use the same
+value for this macro</em>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CHECK_RANGES</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">When copying integers from one range to another, where the latter is only partially covered by the
+former, CIF checks whether the copied values do not violate the destination range. Since violating
+this property generally indicates a programming error, it is recommended to enable this macro.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>EVENT_OUTPUT</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set, the generated code calls <code>&lt;prefix&gt;_InfoEvent()</code> before and after performing an event to
+allow third-party code to act on it. Enable if your code needs to know when an event is performed.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>PRINT_OUTPUT</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">If set, the CIF <code>print</code> statement is performed, and the <code>&lt;prefix&gt;__PrintOutput()</code> is called with
+the resulting text and destination filename. Mainly intended for debugging, but only useful in
+systems where the text can be displayed to a user.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MAX_NUM_EVENTS</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The CIF semantics state that execution of edges is instantaneous and time-less. The generated code
+loops to perform edges, until no edge can be executed any more. Unfortunately, such a loop is not
+time-less. To avoid requiring too much time, there is an upper limit of 1000 iterations. Set this macro
+to change the limit.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>KEEP_RUNNING</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The CIF language checks range conversions (if <code>CHECK_RANGES</code> is set) and verifies updates of
+continuous variable updates. Setting this flag disables a few checks. Most of these checks are in
+<code>assert()</code> checks and not controlled by this macro, since violating the condition generally means a
+crash is eventually inevitable. It is recommended to avoid using this macro.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect5">
+<h6 id="tools-executing-the-code-2">Executing the code</h6>
+<div class="paragraph">
+<p>The engine files act as a library that implements the CIF program. To run the
+program, the code must be called regularly. The code has two entry points, one
+for initializing and performing the first steps, and one for handling a time
+delay.</p>
+</div>
+<div class="paragraph">
+<p>The first entry point is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_EngineFirstStep(<span class="directive">void</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This entry point initializes all the data, queries the values of the input
+variables if present, and performs execution of edges until blocked on the
+first time step or until hitting the <code>MAX_NUM_EVENTS</code> limit. Since this
+resets the entire CIF program to its initial state, you should only call this
+when the system being controlled is also (re-)initialized.</p>
+</div>
+<div class="paragraph">
+<p>The second entry point is more regularly called, after a period of time has passed:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_EngineTimeStep(<span class="predefined-type">double</span> delta)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By calling this entry point, you indicate that <code>delta</code> (&gt; 0) time units have
+passed. The code reads new values of the input variables,
+<a href="#tools-codegen-accuracy-over-time">updates the continuous variables</a>,
+and performs edges until all edges are blocked, or
+hitting the <code>MAX_NUM_EVENTS</code> limit.</p>
+</div>
+<div class="paragraph">
+<p>When the call of either entry point returns, you can query the value of the
+variables to use as input for other parts of the system.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-environment-interface-2">Environment interface</h6>
+<div class="paragraph">
+<p>Calling one of the above entry points causes the CIF program to be executed,
+up to the next time step (assuming the <code>MAX_NUM_EVENTS</code> limit is high
+enough). During the execution, the code performs a number of callbacks to get
+information from the environment, to provide information about its actions, or
+to deliver output. In addition, after each call, variables may be inspected by
+the environment to get information about the decisions of the CIF program.</p>
+</div>
+<div class="paragraph">
+<p>The externally provided callback functions that are being used are:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_AssignInputVariables(<span class="directive">void</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The CIF program requests new values for all its input variables. In your
+implementation of this function you should write values directly in the input
+variables. Input variables are assumed to be independent of other parts of the
+CIF program, in general you should not need other CIF program values to
+implement this function.</p>
+</div>
+<div class="paragraph">
+<p>If <code>EVENT_OUTPUT</code> is set during compilation, executed events are reported with:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_InfoEvent(&lt;prefix&gt;_Event_ event, BoolType pre)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If the <code>EVENT_OUTPUT</code> macro is set during compilation, the generated code
+reports with this call that event event is about to (<code>pre</code> is <code>TRUE</code>),
+or has been (<code>pre</code> is <code>FALSE</code>) executed. In the pre-event call, the event
+can be executed, and all variables have their value before performing the
+updates of the involved edges. In the post-event call, all variables have their
+values updated as indicated in the updates of the edges.</p>
+</div>
+<div class="paragraph">
+<p>Primary use of this call is to forward the decision to other parts of the
+controlled system.</p>
+</div>
+<div class="paragraph">
+<p>Finally, if the <code>PRINT_OUTPUT</code> macro is set during compilation, the generated
+code reports lines of output to be printed with the following function call:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="c">&lt;prefix&gt;_PrintOutput(<span class="directive">const</span> <span class="predefined-type">char</span> *line, <span class="directive">const</span> <span class="predefined-type">char</span> *fname)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It denotes that text <code>line</code> should be printed at file <code>fname</code>. The primary
+uses of this call are to enable debugging the system, or to log relevant
+events. Note that <code>fname</code> here can mean anything. It can mean a real file,
+but also a pseudo-device like <code>:stdout</code> which is commonly used to print
+output to the C <code>stdout</code> stream.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-data-access-2">Data access</h6>
+<div class="paragraph">
+<p>Each CIF constant is available as a variable that does not change after
+initialization. Each algebraic variable can be queried by calling a function
+with the same name as the variable. The value of continuous variables is
+available by accessing the equivalent variable in the generated code. The
+derivative of each continuous variable is available as function named by the
+variable, and the suffix <code>deriv</code>. The model time is available as
+<code>model_time</code>. There is no derivative function of time. Internal functions are
+available as well if required.</p>
+</div>
+<div class="paragraph">
+<p>The engine header file lists the translated names. It should be easy to find
+the relevant entry, as the generated code also documents the original name.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-data-types-2">Data types</h6>
+<div class="paragraph">
+<p>The following table defines how CIF data types are converted in the C99 generated code.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF data type</th>
+<th class="tableblock halign-left valign-top">C99 data type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>BoolType</code> which is a typedef to <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>IntType</code> which is a typedef to <code>int</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>enum e = ...</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;Enum</code> which is a typedef to <code>enum Enum&lt;prefix&gt;_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>RealType</code> which is a typedef to <code>double</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>string</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>StringType</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list[n] t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>...Type</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(...)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>...Type</code> which is a typedef to a <code>struct</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>A few notes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The <code>...</code> in the C99 <code>...Type</code> name for arrays (fixed length lists) and
+tuples is the <a href="#tools-codegen-c99-systematic-type-names">systematic type name</a>
+of the array or tuple type.</p>
+</li>
+<li>
+<p>Due to <a href="#tools-cif2cif-chapter-linearize-merge">linearization</a> all enumerations
+are merged into one. The generated C99 code always has exactly one translated
+<code>enum</code>.</p>
+</li>
+<li>
+<p>The elementary data types (<code>BoolType</code>, <code>IntType</code>, <code>RealType</code>, and
+<code>StringType</code>) are defined in the library header file.</p>
+</li>
+<li>
+<p>The <code>StringType</code> structure wraps a <code>char data[MAX_STRING_SIZE]</code> array.
+The <code>struct</code> allows copying arrays by value using an assignment statement.</p>
+</li>
+<li>
+<p>The array type (list with a fixed length) structure wraps a
+<code>&lt;element-type&gt; data[&lt;size&gt;]</code> array for the same reason. Copying an array
+by assignment is allowed.</p>
+</li>
+<li>
+<p>The tuple type is a structure with fields <code>_field0</code>, <code>_field1</code>, and so
+on, where the type of each field in the structure matches with the type of
+the CIF tuple field.</p>
+</li>
+<li>
+<p>Boolean constants <code>true</code> and <code>false</code> are  named <code>TRUE</code> and <code>FALSE</code>
+respectively.</p>
+</li>
+<li>
+<p>The <code>-0.0</code> value of doubles gets replaced by <code>0.0</code> to void subtle equality
+problems.</p>
+</li>
+<li>
+<p>Strings get silently truncated to <code>MAX_STRING_SIZE - 1</code> characters. They
+are always terminated with a NUL character.</p>
+</li>
+<li>
+<p>Enumeration values get <code>_&lt;prefix&gt;_</code> added in front to make them unique.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-codegen-c99-systematic-type-names">Systematic type names</h6>
+<div class="paragraph">
+<p>For tuple and list types, the type is converted to a name in a systematic way,
+making each type unique and predictable.</p>
+</div>
+<div class="paragraph">
+<p>The conversion composes a name of a type from the type of its elements, and
+concatenates the result. The following conversion table applies:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF type</th>
+<th class="tableblock halign-left valign-top">Systematic name</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>B</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>enum e = ...</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>E</code> (Due to linearization, all enumerations are merged together to a
+single enumeration. As such, always exactly one <code>enum</code> is generated for a
+CIF model.)</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>R</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list[n] t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>A&lt;n&gt;&lt;t&gt;</code>, with <code>&lt;n&gt;</code> the length of the array, and <code>&lt;t&gt;</code> the systematic
+type name of the element type of the array.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(t1, t2, t3, ..., tn)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>T&lt;n&gt;&lt;t1&gt;&lt;t2&gt;&lt;t3&gt;...&lt;tn&gt;</code>, with <code>&lt;n&gt;</code> the number of fields in the tuple, and
+<code>&lt;t1&gt;</code> to <code>&lt;tn&gt;</code> the systematic type names of the fields.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>For example, type <code>list[5] int</code> is converted to <code>A5I</code>, and type
+<code>tuple(list[5] int x; tuple(real a, b) z)</code> is converted to <code>T2A5IT2RR</code>
+(concatenation of <code>T2</code> with the field type names <code>A5I</code> and <code>T2RR</code>).</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-runtime-errors-2">Runtime errors</h6>
+<div class="paragraph">
+<p>The CIF language defines strict sets of allowed values for all data types, and
+performs checking of these values at run time. The generated C99 code follows
+that idea, and checks whether operations on data are safe. Most of these
+checks are performed with an <code>assert</code>. Executed C code does not provide useful
+stack traces by default, and original line numbers of e.g. a CIF program have no
+meaning due to the linearization that is performed before code is generated. In
+addition, the generated code is quite readable and it is not too hard to
+understand what the code is doing at some C source line.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-chapter-java">Java code generation</h5>
+<div class="paragraph">
+<p>
+
+The <a href="#tools-codegen-chapter-index">CIF code generator</a> can generate Java code from a CIF
+specification. It is assumed the reader of this page is familiar with the
+general information of the CIF code generator tool. This page describes
+specific information applicable only to Java code generation.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-8">Supported specifications</h6>
+<div class="paragraph">
+<p>The CIF code generator supports a subset of CIF specifications. Generation
+of Java code does not impose additional restrictions. See the
+<a href="#tools-codegen-supported">Supported specifications</a> section of the <a href="#tools-codegen-chapter-index">CIF code generator</a>
+page for more information.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-17">Options</h6>
+<div class="paragraph">
+<p>Besides the <a href="#tools-codegen-options">common options</a> that apply to all
+target languages/platforms of the <a href="#tools-codegen-chapter-index">CIF code generator</a>, the Java code
+generation can be influenced by the following additional options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Java package</em>: The Java package in which to generate Java code. If not
+specified, the code prefix is used. The specified package should be a valid
+Java package name, and must not be empty.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The code prefix that can be configured using a common option, is used in the
+generated Java code as prefix for class names.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-compilation">Compilation</h6>
+<div class="paragraph">
+<p>The generated Java code can be compiled with a Java 7 compiler or newer.</p>
+</div>
+<div class="paragraph">
+<p>The generated code is complete, and can be used as is, without any CIF related
+library or runtime. No additional dependencies or libraries are required.
+Only the standard Java libraries, part of any Java installation, are needed.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generated-files-3">Generated files</h6>
+<div class="paragraph">
+<p>Java code generation leads to two Java files being generated:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>&lt;prefix&gt;.java</code></p>
+</li>
+<li>
+<p><code>&lt;prefix&gt;Test.java</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>where <code>&lt;prefix&gt;</code> is replaced by the code prefix configured using the
+<em>Code prefix</em> option.</p>
+</div>
+<div class="paragraph">
+<p>The first file contains the code for all the features of the CIF model in an
+abstract class named <code>&lt;prefix&gt;</code>. The second file contains a class named
+<code>&lt;prefix&gt;Test</code>, which inherits from the <code>&lt;prefix&gt;</code> class, and implements
+various abstract methods. This test class can be used to test the code, and
+can serve as a starting point for actually implementing the coupling between
+the code generated for the CIF model, and the environment in which it runs.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-executing-the-code-3">Executing the code</h6>
+<div class="paragraph">
+<p>The code can be executed in multiple ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>execOnce</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> execOnce(<span class="type">double</span> newTime)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Invoke this method to execute the code once. Inputs are read, transitions are
+executed until none are possible, output is written, etc.</p>
+</div>
+<div class="paragraph">
+<p>The <code>newTime</code> is the time in seconds, since the start of the first
+execution of this method. For each invocation, the time that has elapsed
+so far should be provided. This becomes the new value of variable <code>time</code>.</p>
+</div>
+<div class="paragraph">
+<p>Using this method, you decide when you invoke this method, and with what
+values to use for variable <code>time</code>. This approach allows full control.</p>
+</div>
+</li>
+<li>
+<p><code>exec</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> exec(<span class="type">long</span> frequency)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Invoke this method to execute the code repeatedly, without ever stopping.
+This repeatedly invokes the <code>execOnce</code> method.</p>
+</div>
+<div class="paragraph">
+<p>The <code>frequency</code> can be used to configure how often, in number of times per
+second, the code should be executed. By given a frequency of <code>100</code>, the
+method attempts to execute the code every 10 milliseconds. If a single
+execution takes less than 10 milliseconds, the method will sleep for the
+remainder of what is left of the 10 milliseconds. However, if a single
+execution takes more than 10 milliseconds, the next execution is immediately
+started.</p>
+</div>
+<div class="paragraph">
+<p>It is also possible to execute the code repeatedly, as fast as possible,
+without any delays. As soon as a single execution has finished, another
+execution is started. This kind of behavior can be obtained by providing a
+negative or zero value for <code>frequency</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-environment-interface-3">Environment interface</h6>
+<div class="paragraph">
+<p>The code generated for the CIF model does not do anything useful by itself.
+Only once it is coupled to the environment, can the CIF model become useful.
+The following methods are provided in the interface of the generated class as
+abstract methods, and need to be implemented in a derived class:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>updateInputs</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> updateInputs()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In this method, you should update the values of the input variables of the
+CIF model. Note that you should obtain these from the environment. You should
+not access the state of the CIF model from this method, as it may not be
+initialized or up-to-date yet.</p>
+</div>
+<div class="paragraph">
+<p>An example of how to update the input variables, can be found in the
+generated <code>&lt;prefix&gt;Test</code> class. There, each input variable is assigned the
+default value for its data type.</p>
+</div>
+<div class="paragraph">
+<p>If you want to update the variable, you should always assign completely new
+fresh values. Don&#8217;t modify arrays and tuples in-place, as that may lead to
+other variables being changed as well.</p>
+</div>
+</li>
+<li>
+<p><code>preExec</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> preExec()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This method is invoked each time, just before the code for the CIF model is
+executed. This method is invoked before the <code>updateInputs</code> method is
+invoked.</p>
+</div>
+<div class="paragraph">
+<p>You should not access the state of the CIF model from this method, as it may
+not be initialized or up-to-date yet.</p>
+</div>
+</li>
+<li>
+<p><code>postExec</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> postExec()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This method is invoked each time, just after the code for the CIF model is
+executed.
+In this method, you should write the output variables of the CIF model to
+the environment. Since the code for the CIF model was just executed, these
+variables may have new values.</p>
+</div>
+<div class="paragraph">
+<p>All discrete and continuous variables of the CIF model are available, as are
+variable <code>time</code> and the current locations of all of the automata of the
+CIF model.</p>
+</div>
+<div class="paragraph">
+<p>The code to write the output values to the environment is the dual to reading
+the inputs from the environment, as is done in the <code>updateInputs</code> method.</p>
+</div>
+</li>
+<li>
+<p><code>infoExec</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> infoExec(<span class="type">long</span> duration, <span class="type">long</span> cycleTime)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This method informs about the duration of a single execution of the code
+generated for the CIF model.
+The <code>duration</code> is the total number of nanoseconds spent executing the code.
+The <code>cycleTime</code> is the desired maximum duration of the execution, in
+nanoseconds, or <code>-1</code> if not available.</p>
+</div>
+<div class="paragraph">
+<p>You can use this method to detect when the code runs longer than the desired
+maximum duration, and thus the desired execution frequency can not be
+achieved. You can also use this method to figure out the variability of the
+duration of execution.</p>
+</div>
+<div class="paragraph">
+<p>The <code>doInfoExec</code> field of the class can be used to configure whether this
+method is invoked during execution by the <code>exec</code> method. This is enabled
+(<code>true</code>) by default.</p>
+</div>
+</li>
+<li>
+<p><code>infoEvent</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> infoEvent(<span class="type">int</span> idx, <span class="type">boolean</span> pre)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This method informs about events that are about to be executed or have just
+been executed.
+The <code>idx</code> is the 0-based index of the event. You can feed this index to the
+<code>getEventName</code> method to obtain the absolute name of the event. The <code>pre</code>
+is <code>true</code> if the event is about to be executed, and <code>false</code> if the event
+has just been executed.</p>
+</div>
+<div class="paragraph">
+<p>You can use this method to be informed about what the code does during
+execution. You could for instance log that for debugging.</p>
+</div>
+<div class="paragraph">
+<p>The <code>doInfoEvent</code> field of the class can be used to configure whether this
+method is invoked during execution. This is disabled (<code>false</code>) by default.</p>
+</div>
+</li>
+<li>
+<p><code>infoPrintOutput</code> method</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="type">void</span> infoPrintOutput(<span class="predefined-type">String</span> text, <span class="predefined-type">String</span> target)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This method informs that new print output has been generated during
+execution.
+The <code>text</code> is the text that is to be printed. The <code>target</code> indicates the
+file or special target to which text is to be printed. If printed to a file,
+an absolute or relative local file system path is given. Paths may contain
+both <code>/</code> and <code>\</code> as path separators. Supply the path to the
+<code>&lt;prefix&gt;Utils.normalizePrintTarget</code> method to normalize the path to use
+path separators for the current platform on which the Java code is executed.</p>
+</div>
+<div class="paragraph">
+<p>There are two special targets: <code>:stdout</code> to print to the standard output
+stream, and <code>:stderr</code> to print to the standard error stream.</p>
+</div>
+<div class="paragraph">
+<p>You should use this method to actually print the text to standard output,
+standard error, or files. An example of how to do this, can be found in the
+generated <code>&lt;prefix&gt;Test</code> class.</p>
+</div>
+<div class="paragraph">
+<p>The <code>doInfoPrintOutput</code> field of the class can be used to configure whether
+this method is invoked during execution. This is enabled (<code>true</code>) by default.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-data-access-and-manipulation">Data access and manipulation</h6>
+<div class="paragraph">
+<p>For each CIF constant, a field is generated in the Java class. Similar fields
+are generated for the state variables (discrete and continuous variables), and
+the input variables. A <code>time</code> field is always present and contains the
+current model time.</p>
+</div>
+<div class="paragraph">
+<p>For each internal user-defined function of the CIF model, a method is generated
+in the Java class. Similarly, a method is generated for each algebraic variable
+of the CIF model, as well as for the derivative of each continuous variable
+(except variable <code>time</code>).</p>
+</div>
+<div class="paragraph">
+<p>The standard library functions and operators that are supported by the code
+generation, are also available, in the <code>&lt;prefix&gt;Utils</code> inner class. Not all
+operators and standard library functions are available. Only those that have
+no corresponding Java operator or method, or behave differently with respect to
+runtime errors, are available in this inner class.</p>
+</div>
+<div class="paragraph">
+<p>For more information on the names of the generated field and methods, see the
+section on <a href="#tools-codegen-java-naming">naming</a> below.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-codegen-java-datatypes">Data types</h6>
+<div class="paragraph">
+<p>The following table lists CIF types supported by the code generator, and their
+equivalent in the generated Java code:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 40%;">
+<col style="width: 40%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF type</th>
+<th class="tableblock halign-left valign-top">Java type</th>
+<th class="tableblock halign-left valign-top">Tuple postfix</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>bool</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>boolean</code> / <code>java.lang.Boolean</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>B</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code> (with or without range)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>int</code> / <code>java.lang.Integer</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>I</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>real</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>double</code> / <code>java.lang.Double</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>R</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>string</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.lang.String</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>S</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>list[...] t</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>java.util.List&lt;t&gt;</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Lt</code>, with <code>t</code> a postfix for the element type</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>enum e = ...</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;Enum</code> inner enumeration (class)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>E</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tuple(...)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CifTuple_T...</code> inner class</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>TnFFF</code>, with <code>n</code> the number of fields, and <code>FFF</code> a postfix for
+the type of each field.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Notes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>For each unique tuple type (ignoring integer and array ranges
+of the types of the fields, as well as field names) an inner
+Java class is generated. Their names all start with
+<code>CifTuple_</code>, and end in a postfix that describes the type.
+The <em>Tuple postfix</em> column in the table lists the texts used for each
+type in the postfix. For instance, for a
+<code>tuple(tuple(int x; real y; string z) a, list[3] int b)</code>
+type, the tuple class would be named <code>CifTuple_T2T3IRSLI</code>.</p>
+</li>
+<li>
+<p>For <code>boolean</code>, <code>int</code>, and <code>double</code>, the primitive type is preferred. It&#8217;s boxed
+variant is used when needed, for instance for element types of a
+<code>java.util.List&lt;...&gt;</code> class.</p>
+</li>
+<li>
+<p>Generic lists are not supported, only CIF arrays can be used.</p>
+</li>
+<li>
+<p>As linearization is applied on the CIF model prior to generating Java code,
+all enumerations are merged together to a single enumeration. As such, always
+exactly one Java <code>enum</code> is generated for a CIF model.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-runtime-errors-3">Runtime errors</h6>
+<div class="paragraph">
+<p>Some CIF models that are syntactically valid, may lead to runtime errors when
+simulated or executed. For instance, there may be a division by zero, an out
+of bounds projection, or an assignment may lead to the range of the assigned
+variable being violated. The generated Java code detects all such problems and
+throws a <code>&lt;prefix&gt;Exception</code> in such cases. This exception class is an inner
+class of the <code>&lt;prefix&gt;</code> class. The exception indicates what caused the
+runtime error, using an informative end-user readable message.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-codegen-java-naming">Naming</h6>
+<div class="paragraph">
+<p>The generated code will contain names for variables, functions, etc. The names
+in the generated code are based on the absolute names of the objects in the
+original CIF model. The names are further influenced by the
+<a href="#tools-cif2cif-chapter-linearize-merge">linearization</a> algorithm. Essentially,
+the absolute names are used, where each <code>.</code> is replaced by a <code>_</code>.
+Furthermore, a <code>_</code> is added at the end, to avoid conflicts with other
+non-generated names, Java keywords, etc. For instance, for an automaton <code>a</code>
+with a discrete variable <code>b</code> in it, the absolute name is <code>a.b</code>. In the
+Java code, the variable will be named <code>a_b_</code>.</p>
+</div>
+<div class="paragraph">
+<p>The code generator ensures unique names in the generated Java code. If the
+same Java name results from two different CIF objects, one of them is renamed,
+by adding a <code>2</code>, or <code>3</code>, or <code>4</code>, etc to make it unique. For instance,
+if the CIF model has a constant named <code>a_b</code> in the top level scope, and a
+constant named <code>b</code> in the <code>a</code> automaton, both would be named <code>a_b_</code>. One
+of them is renamed to <code>a_b_2</code>. If such renaming takes place, a warning is
+printed to the console.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 40%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+<col style="width: 20%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">CIF model</th>
+<th class="tableblock halign-left valign-top">Java code</th>
+<th class="tableblock halign-left valign-top">Example CIF name</th>
+<th class="tableblock halign-left valign-top">Example Java name</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Constant</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Field</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Discrete variable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Field</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Continuous variable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Field</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Derivative of a continuous variable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b'</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_deriv()</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Algebraic variable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_()</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Input variable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Field</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">User-defined function</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_()</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Parameter of a user-defined function</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Method parameter</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Local variable of an internal user-defined function</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Local variable of a method</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a_b_</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enumeration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enumeration</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;Enum</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enumeration literal</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Enumeration constant</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a.b.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;Enum._c</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Tuple type</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Inner class</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">n/a</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>CifTuple_T...</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Notes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As linearization is applied on the CIF model prior to generating Java code,
+all enumerations are merged together to a single enumeration. As such, always
+exactly one Java <code>enum</code> is generated for a CIF model.</p>
+</li>
+<li>
+<p>For details on tuple types and the classes that are generated for them,
+see the <a href="#tools-codegen-java-datatypes">data types</a> section above.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-chapter-simulink">Simulink C S-Function code generation</h5>
+<div class="paragraph">
+<p>Everywhere at this page, the terms <em>Matlab</em>, <em>Simulink</em>, <em>S-Function</em>, and
+<em>Mex</em> refer to products and programs developed and owned by <em>MathWorks</em>. For
+more information, please visit <a href="http://mathworks.com/" class="bare">http://mathworks.com/</a>.</p>
+</div>
+<div class="paragraph">
+<p>The <a href="#tools-codegen-chapter-index">CIF code generator</a> can generate Matlab Simulink S-Function C code
+from a CIF specification. It is assumed the reader of this page is familiar with the
+general information of the CIF code generator tool. This page describes
+specific information applicable only to Simulink code generation.</p>
+</div>
+<div class="paragraph">
+<p>The aim of the the conversion from CIF to Simulink is to provide a smooth path
+from a CIF specification to a controlled real-time system.</p>
+</div>
+<div class="paragraph">
+<p>At this page, all the details about the Simulink code generation are discussed.
+For an example of how to use this code generation in practice, read
+<a href="#tools-codegen-chapter-simulink-example">the example</a>.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-9">Supported specifications</h6>
+<div class="paragraph">
+<p>The CIF code generator supports a subset of CIF specifications.  See the
+<a href="#tools-codegen-supported">Supported specifications</a> section of the <a href="#tools-codegen-chapter-index">CIF code generator</a> page
+for more information. Generation of Simulink S-Function C code adds
+a restriction to the type of CIF input variables caused by limitations in
+Simulink input ports.</p>
+</div>
+<div class="paragraph">
+<p>Simulink input ports can only handle real and complex signals. The latter
+cannot be expressed in CIF, while the former creates the need for CIF input
+variables with data types that can be relatively easily converted to real
+number values. For this reason, CIF input variables must have a boolean,
+enumeration, integer, or real elementary type. Arrays (fixed length CIF lists)
+of these elementary types are also supported, they are converted to a vector
+of real numbers at a Simulink input port. Finally, arrays of arrays of the
+elementary types are converted to a matrix of real numbers at a Simulink input
+port.</p>
+</div>
+<div class="paragraph">
+<p>Data types of all other CIF variables have no additional constraints. However,
+Simulink poses similar restrictions to its other data vectors, in particular
+the output ports. The CIF to Simulink code generator toool only makes
+variables available for output that are compatible with real number, vectors
+of real numbers, or matrices of real numbers.
+That means that use of the CIF string type, the tuple type, or arrays with
+a deeper nesting than two levels will not be available at the output.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-differences-in-output-3">Differences in output</h6>
+<div class="paragraph">
+<p>When converting a real number to text, for example when printing a real value,
+the generated Simulink code does not preserve trailing zeroes of real number
+fractions while using <code>%g</code>. For example <code>fmt("%.3g", 1.0)</code> will output
+<code>1</code> rather than <code>1.000</code>.
+This may cause real number values to be printed with less digits precision than
+indicated in the CIF program.</p>
+</div>
+<div class="paragraph">
+<p>Strings have an upper limit in length that is set during compilation. Longer
+strings are silently truncated to this length.</p>
+</div>
+<div class="paragraph">
+<p>The CIF print statement is supported, but only for the <code>:stdout</code> file. It
+is translated to the <code>ssPrintf</code> C function. This is also the only way to get
+a string to appear outside the Simulink S-Function block. Note that Simulink
+may drop the output function for platforms that have no output possibilities.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-options-18">Options</h6>
+<div class="paragraph">
+<p>The CIF to Simulink code generator uses the <a href="#tools-codegen-options">common options</a>
+that apply to all target languages/platforms of the
+<a href="#tools-codegen-chapter-index">CIF code generator</a>. It also has the additional options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Simulink Outputs</em>: This option takes a list of CIF variables that should be
+made available as output of the generated S-Function. Only location
+varaiables (automata), discrete variables, continuous variables, and
+algebraic variables can be selected. The option also allows to use the
+wildcard character <code>*</code>, which represents zero or more characters from the
+name. You can use it to match several variables at once, for example
+<code>*out</code> matches all variables that end with <code>out</code>. The special name
+<code>nothing</code> means that no output should be produced at all.</p>
+</li>
+<li>
+<p><em>Simulink sample time</em>: This option controls how Simulink samples the
+generated block. Allowed values are <code>continuous</code>, <code>inherited</code>,
+<code>variable</code>, or a sample period. Check the Mathworks <code>ssSetSampleTime</code>
+function documentation for details which to use. By default, sample time is
+set to <code>continuous</code>.</p>
+</li>
+<li>
+<p><em>Simulink sample offset</em>: This option controls the offset of sampling. Its
+allowed values depend on the value of the <em>Simulink sample time</em> option.
+Possible values are <code>fixed</code>, <code>0.0</code>, or a positive non-zero value. Check
+the Mathworks <code>ssSetSampleOffset</code> function documentation for details which
+to use. By default, this options is set to <code>0.0</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The code prefix that can be configured using a common option is used as name
+for the generated S-Function.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generated-files-4">Generated files</h6>
+<div class="paragraph">
+<p>Running the Simulink code generator produces two output files:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 75%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Generated file</th>
+<th class="tableblock halign-left valign-top">Contents</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;prefix&gt;.c</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The generated Simulink S-Function C code.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Report file</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Links CIF variables to Simulink entries.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>where <code>&lt;prefix&gt;</code> is replaced by the value of the <em>Code prefix</em> option during
+code generation.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;prefix&gt;.c</code> file contains the source code of the actual S-Function. The
+file can be compiled using the Matlab Mex C compiler. The resulting mex file
+can be used in Simulink (Open the <b class="menuref">Simulink Library</b>, select
+<b class="menuref">User-defined functions</b>, and then the <b class="menuref">S-Function</b> block,
+drag it into the Simulink canvas, open the block , and type the <code>&lt;prefix&gt;</code>
+name into the <b class="menuref">Name</b> field.)</p>
+</div>
+<div class="paragraph">
+<p>The report file lists how CIF variables got mapped onto
+the input, mode, contstate, and output Simulink vectors. You can use this
+information to connect your CIF program with the other parts of the Simulink model.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-codegen-chapter-simulink-example">Simulink code generation and simulation example</h5>
+<div class="paragraph">
+<p>The <a href="#tools-codegen-chapter-simulink">Simulink C S-Function code generation</a> can generate Simulink C code from a
+CIF specification. Here an example is given to demonstrate how the code
+generator can be used to control a model in Simulink.</p>
+</div>
+<div class="paragraph">
+<p><em>Matlab</em> and <em>Simulink</em> are products owned by <a href="http://mathworks.com">Mathworks</a>.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-system-to-control">System to control</h6>
+<div class="paragraph">
+<p>The system to control is a simple water tank, as shown below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/tank.svg" alt="tank">
+</div>
+</div>
+<div class="paragraph">
+<p>The water in the tank has volume <code>V</code>. At the bottom of the tank is a pipe
+where water flows away with speed <code>Qo</code>. At the top is a pipe with valve
+<code>n</code> that can be open or closed. The <code>Qi</code> variable denotes the speed of
+water flowing into the tank. The equations that hold in this system are:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">Qi = n * 5
+Qo = sqrt(V)
+V' = Qi - Qo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>By switching <code>n</code> on or off, a controller can control the amount of water
+flowing into the tank, and with that, control the volume <code>V</code>. The objective
+is to keep the volume between 2 and 10.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-controller-in-cif">Controller in CIF</h6>
+<div class="paragraph">
+<p>A switching controller will be sufficient to control this system. In CIF that
+results in a <code>tank_ctrl.cif</code> file containing:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event open_valve;
+
+automaton controller:
+    disc int n = 0;
+    input real V;
+
+    location closed:
+        initial;
+        edge open_valve when V &lt;= 2 do n := 1 goto opened;
+
+    location opened:
+        edge when V &gt;= 10 do n := 0 goto closed;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The controller has the control variable <code>n</code>, and input variable <code>V</code>. When
+the volume of the tank is below 2, <code>n</code> is set to <code>1</code>, which turns on the
+inflow. When the volume of the tank is high enough, <code>n</code> is set to <code>0</code>
+which turns the inflow off.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generating-simulink-c-code">Generating Simulink C code</h6>
+<div class="paragraph">
+<p>To simulate the controlled system in Simulink, the code generator tool can
+produce C code for Simulink that can be used in a Simulink <em>System SFunction</em> block.
+Convert the CIF model to C for Simulink with the code generation tool, by
+selecting the code generation tool from the menu under the right mouse button:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/rmb-generate-code.png" alt="rmb generate code">
+</div>
+</div>
+<div class="paragraph">
+<p>By default, you will get all internal variables at the output of the
+SFunction, which is often too much. The <em>Simulink Generation</em> tab allows
+precise definition of what output variables should be added, in this case all
+variables in the <code>controller</code> automaton. (Input variables are never made
+available from the CIF SFunction block, as they are already available in Simulink.)</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/set-output-variables.png" alt="set output variables">
+</div>
+</div>
+<div class="paragraph">
+<p>After selecting <em>OK</em>, the CIF model is translated to C code. Code generation
+from the <code>tank_ctrl.cif</code> files results in two output files. The
+<code>tank_ctrl.c</code> file contains the generated C source code. The
+<code>tank_ctrl_report.txt</code> is a text file describing the data of the generated
+SFunction code:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>Input/output report of the tank_ctrl.cif SFunction.
+
+During code generation, CIF variables are made available in the Simulink vectors.
+This report lists the variables in each vector, along with their index number.
+
+Modes
+-----
+controller 1
+
+Continuous states
+-----------------
+time 1
+
+Inputs
+------
+controller.V 1
+
+Outputs
+-------
+controller.n 1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The report shows which CIF variables are available at each vector. The
+<em>Inputs</em> and <em>Outputs</em> are the most interesting. Here it shows that <code>V</code> is
+the only input variable, <code>n</code> is the only output variable, and they are both
+the first value in their vector. This is what you would expect for such
+a small system. With bigger systems, the index numbers are much more useful
+for making proper connections in Simulink.</p>
+</div>
+<div class="paragraph">
+<p>And this concludes the CIF part of this example, next step is setting things
+up in Matlab/Simulink.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-simulation-in-simulink">Simulation in Simulink</h6>
+<div class="paragraph">
+<p>After starting <em>Matlab</em>, and moving to the correct directory, you get
+a display like:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/matlab-mex.png" alt="matlab mex">
+</div>
+</div>
+<div class="paragraph">
+<p>You can see the files present in the directory, as you would expect. In
+Matlab, the generated C code is compiled with the Matlab <em>Mex</em>
+compiler:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="shell">mex tank_ctrl.c</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the compiler prints a warning about the wrong compiler version, this may
+be different at your system.</p>
+</div>
+<div class="paragraph">
+<p>The result of the compilation is a <code>tank_ctrl.mexa64</code> file at a 64 bit
+system. If you use a 32 bit system, the filename extension is different.</p>
+</div>
+<div class="paragraph">
+<p>The compiled CIF controller can be used in a Simulink <em>System SFunction</em>
+block, as shown below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/simulink-controlled-system.png" alt="simulink controlled system">
+</div>
+</div>
+<div class="paragraph">
+<p>In the middle the equations are modeled. The output of the equations is <code>V</code>,
+which is fed into the <code>S-Function</code> block with the CIF controller at the top.
+The controller computes <code>n</code> which is an input for the equations.</p>
+</div>
+<div class="paragraph">
+<p>At the bottom, a scope is attached that produces the following picture.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/codegen/simulink-example/simulation-graph.png" alt="simulation graph">
+</div>
+</div>
+<div class="paragraph">
+<p>The volume fluctuates between 2 and 10, at the bottom is the control signal
+<code>n</code>.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-cif2plc-chapter-index">CIF PLC code generator</h4>
+<div class="paragraph">
+<p>
+
+
+The CIF PLC code generator can be used to generate <strong>P</strong>rogrammable
+<strong>L</strong>ogic <strong>C</strong>ontroller (PLC) code, for the implementation of CIF
+controllers on PLCs. The generated PLC code adheres to the IEC 61131-3
+standard, a widely used international standard for PLC programming languages.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-generator-2">Starting the generator</h5>
+<div class="paragraph">
+<p>The generator can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF implementation tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Generate PLC code for CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF implementation tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Generate PLC code for CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cif2plc</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2plc</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output file. Depending on the <a href="#tools-cif2plc-output-type">output type</a>,
+this is either a file or a directory. The default depends on the output type
+as well.</p>
+</li>
+<li>
+<p><em>PLC code output type</em>: The PLC code <a href="#tools-cif2plc-output-type">output type</a>
+specifies the type of output (essentially the file format) that should be generated.</p>
+</li>
+<li>
+<p><em>PLC task name</em>: The name of the PLC task to generate. If not specified,
+defaults to <code>PlcTask</code>.</p>
+</li>
+<li>
+<p><em>PLC task cycle time</em>: If periodic task scheduling is to be used, use this
+option to enable it, by setting the cycle time in milliseconds for the task
+to generate. The cycle time must be a positive integer number. Cycle times of
+over a minute may not work as expected. However, since such large cycle times
+are of little practical use, that should not be a problem. Disable this
+option to disable periodic task scheduling. This option defaults to periodic
+task scheduling with a cycle time of 10 milliseconds. Disabling periodic task
+scheduling is not supported for the TwinCAT <a href="#tools-cif2plc-output-type">output type</a>.</p>
+</li>
+<li>
+<p><em>PLC task priority</em>: The scheduling priority of the task to generate. The
+priority must be in the range [0 .. 65535], where priority 0 is the highest
+priority, and priority 65535 is the lowest priority. The priority can be used
+for preemptive or non-preemptive scheduling. If not specified, the priority
+defaults to 20.</p>
+</li>
+<li>
+<p><em>PLC project name</em>: The name of the PLC project to generate. If not
+specified, defaults to <code>Untitled1</code>.</p>
+</li>
+<li>
+<p><em>PLC configuration name</em>: The name of the PLC configuration to generate. If
+not specified, defaults to <code>Untitled1</code>.</p>
+</li>
+<li>
+<p><em>PLC resource name</em>: The name of the PLC resource to generate. If not
+specified, defaults to <code>Untitled1</code>.</p>
+</li>
+<li>
+<p><em>PLC number bits</em>: The maximum number of bits supported by the PLC for
+representing numeric values. Use 64-bit if supported by the PLC, for full CIF
+compatibility, and the highest <a href="#tools-cif2plc-accuracy">accuracy</a>. If
+the PLC does not supported 64-bit integer and floating point numbers, set
+this option to 32-bit.</p>
+</li>
+<li>
+<p><em>PLC maximum iterations</em>: The maximum number of iterations of the main loop
+of the main program body, per execution of the main program body. Must be
+a positive number. May be set to infinite, to not impose a restriction. The
+default is set to at most 100 iterations. See the section on the
+<a href="#tools-cif2plc-progbody">program body</a> for more information.</p>
+</li>
+<li>
+<p><em>Formal function invocation (arguments based)</em>: Specifies for which functions
+to use formal invocation syntax in the generated PLC code. By default the
+formal syntax is used for none of the functions. For PLC implementations that
+don&#8217;t support the non-formal syntax, the formal syntax can be used for all
+functions, or only for functions with more than one argument.</p>
+</li>
+<li>
+<p><em>Formal function invocation (function kind based)</em>: Specifies for which
+functions to use formal invocation syntax in the generated PLC code. By
+default the formal syntax is used only for all but the standard
+library/conversion functions. This can be changed to only the standard
+library/conversion functions, or to all functions.</p>
+</li>
+<li>
+<p><em>Eliminate enumerations</em>: Enable this option to eliminate enumerations before
+generating the actual PLC code, in case the PLC doesn&#8217;t support enumerations.
+Disable this option to keep enumerations in the generated PLC code. By
+default this option is disabled.</p>
+</li>
+<li>
+<p><em>Simplify values</em>: Enable this option to simplify values and inline constants
+during generation of the PLC code. The benefit is that static computations
+are evaluated, and for the result simpler PLC code is generated. This applies
+to both the original model as well as anything generated during the code
+generation, for instance as the result of
+<a href="#tools-cif2cif-chapter-linearize-merge">linearization</a>. Enabling the option
+may thus lead to simpler PLC code. However, the simplification itself may
+take quite some time. Furthermore, as constants are inlined, they are
+duplicated for each use. If a constant with a large value (such as a large
+literal array) is used multiple times, this can lead to significantly larger
+PLC code. By default this option is enabled.</p>
+</li>
+<li>
+<p><em>Rename warnings</em>: Enable this option to print warnings to the console when
+a PLC name is renamed due to a conflict with another PLC name, or disable it
+to omit the warnings. The option is disabled by default. See the section on
+<a href="#tools-cif2plc-names">names</a> for more information.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Formal function invocation syntax (e.g. <code>MIN(IN1:3, IN2:5)</code>) is used in the
+generated PLC code only for those functions that are included by both the
+<b class="menuref">Formal function invocation (arguments based)</b>
+option and the
+<b class="menuref">Formal function invocation (function kind based)</b>
+option. If either
+of the options excludes the function, the non-formal function invocation syntax
+(e.g. <code>MIN(3, 5)</code>) is used for that function. Note that for invocations of
+function blocks, the generated PLC code always uses the formal syntax.
+Furthermore, for certain standard library functions, only the non-formal syntax
+is defined by the standard, and thus used in the generated PLC code.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-10">Supported specifications</h5>
+<div class="paragraph">
+<p>The CIF PLC code generator supports a subset of CIF specifications. The
+following restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Unrestricted events are not supported, as they can always be executed (are
+always enabled), and would lead to infinitely running PLC code. Detection of
+unrestricted events however, is incomplete. That is, for some unrestricted
+the code generation results in an error, while for other unrestricted events
+code is generated without any warnings or errors. See the
+<a href="#tools-cif2plc-progbody">Program body</a> section for more information.</p>
+</li>
+<li>
+<p>Specifications without automata are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates outside locations are not supported, except if it
+can be determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>State invariants in components are not supported, except if it can be
+determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>State/event exclusion invariants (in components as well as locations) are not
+supported. To allow state/event exclusion invariants to be used in the input,
+manually eliminate them first using the
+<a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a> CIF to CIF transformation.</p>
+</li>
+<li>
+<p>Discrete variables with multiple initial values (including <code>any</code>) are not
+supported.</p>
+</li>
+<li>
+<p>External user-defined functions are not supported.</p>
+</li>
+<li>
+<p>Urgent locations are not supported.</p>
+</li>
+<li>
+<p>Initialization predicates in locations that can not be statically evaluated
+are not supported.</p>
+</li>
+<li>
+<p>State invariants in locations are not supported, except if it can be
+determined statically that they are trivially <code>true</code>.</p>
+</li>
+<li>
+<p>Automata that do not have exactly one initial location are not supported.</p>
+</li>
+<li>
+<p>Urgent edges are not supported.</p>
+</li>
+<li>
+<p>User-defined functions without parameters are not supported.</p>
+</li>
+<li>
+<p>Internal user-defined functions that contain a multi-assignment that assigns
+multiple (non-overlapping) parts of a single variable are not supported.
+For instance, <code>a[0], a[1] := 1, 2</code> is not supported, as multiple parts
+(the first and second element) of array <code>a</code> are assigned in a single
+multi-assignment. This restriction applies only to multi-assignments in
+functions, not to multi-assignments on edges.</p>
+</li>
+<li>
+<p>Internal user-defined functions that contain a <code>continue</code> statement are
+not supported.</p>
+</li>
+<li>
+<p>Data types other than <code>bool</code>, <code>int</code> (with or without range), <code>real</code>,
+enumerations, tuples, and arrays, are not supported. This applies to the data
+types of variables, parameters of functions, return types of functions, etc.</p>
+</li>
+<li>
+<p>String values are not supported.</p>
+</li>
+<li>
+<p>Cast from <code>int</code> to <code>real</code> and casts that don&#8217;t change the type, are
+supported. All other casts are not supported.</p>
+</li>
+<li>
+<p>Sampling of distributions is not supported.</p>
+</li>
+<li>
+<p>The use of the conjunction and disjunction binary operators on anything other
+than boolean values is not supported.</p>
+</li>
+<li>
+<p>The use of the equality and inequality binary operators on anything other
+than boolean, integer, real, or enumeration values is not supported.</p>
+</li>
+<li>
+<p>The use of the addition and subtraction binary operators on anything other
+than integer or real values is not supported.</p>
+</li>
+<li>
+<p>The use of the element test and subset binary operators is not supported.</p>
+</li>
+<li>
+<p>Projection on anything other than tuples and arrays is not supported. This
+applies to expressions as well as addressables (the left hand sides of
+assignments). For arrays, both 0-based indices (counting from the left) as
+well as negative indices (counting from the right) are supported.</p>
+</li>
+<li>
+<p>Slicing is not supported.</p>
+</li>
+<li>
+<p>Function calls on anything other than standard library functions and internal
+user-defined functions is not supported.</p>
+</li>
+<li>
+<p>The <code>ceil</code>, <code>del</code>, <code>empty</code>, <code>floor</code>, <code>fmt</code>, <code>pop</code>, <code>round</code>,
+<code>scale</code>, <code>sign</code>, <code>size</code>, <code>acosh</code>, <code>asinh</code>, <code>atanh</code>, <code>cosh</code>,
+<code>sinh</code>, and <code>tanh</code> standard library functions are not supported.</p>
+</li>
+<li>
+<p>The distribution standard library functions are not supported.</p>
+</li>
+<li>
+<p>Lists (except for arrays), sets, and dictionaries are not supported.</p>
+</li>
+<li>
+<p>The use of functions as values is not supported. That is, functions may only
+be used in function calls, and may for instance not be stored in variables.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-7">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> (if <em>Simplify values</em> option is enabled)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-others">Simplify others</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-consts">Eliminate constants</a> (if <em>Simplify values</em> option is enabled)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>After these preprocessing steps, the generator checks whether the specification
+is supported. It then applies the following additional <a href="../../cif2cif/index.html">CIF to CIF
+transformations</a>:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-linearize-merge">Linearize (merge)</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> (if <em>Simplify values</em> option is enabled)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-standard-compliance">Standard compliance</h5>
+<div class="paragraph">
+<p>The PLC code that is generated complies with the second edition (from 2003) of
+the IEC 61131-3 standard. The code does not use any vendor specific extensions,
+functions, etc.</p>
+</div>
+<div class="paragraph">
+<p>For the TwinCAT <a href="#tools-cif2plc-output-type">output type</a>, <code>STRUCT</code>
+data type declarations have no <code>;</code> character after the <code>STRUCT</code> data types,
+to work around a bug in the TwinCAT parser. In that case the output is not
+compliant with the IEC 61131-3 standard.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-generated-plc-code">Generated PLC code</h5>
+<div class="paragraph">
+<p>The bodies of the programs and functions in the generated PLC code use
+Structured Text as programming language. Structured Text is one of the
+programming languages that is part of the IEC 61131-1 standard.</p>
+</div>
+<div class="paragraph">
+<p>The generated code contains a single program called <code>MAIN</code>. This program is
+instantiated in a task, which is part of a resource, which in turn is part of
+a configuration. The configuration is put in a project, but that is outside
+the range of the IEC 61131-3 standard. Most implementations however, work with
+projects. The effect of the project, configuration, resource, and task is
+dependent on the <a href="#tools-cif2plc-output-type">output type</a>. Besides a
+program, the code generator also generates data types, functions, and global
+variables.</p>
+</div>
+<div class="paragraph">
+<p>For algebraic variables, functions are generated that are parametrized over the
+state of the system. Similarly, functions are generated for the derivatives of
+the continuous variables. For the discrete and continuous variables (including
+variable <code>time</code>), a <code>STRUCT</code> data type named <code>STATE</code> is generated that
+holds the entire state of the system (or more precisely, the
+<a href="#tools-cifsim-traces-state">state</a> of the CIF specification). For input variables,
+an <code>INPUTS</code> global variables list/file is generated. For constants (if
+<em>Simplify values</em> option is disabled), a <code>CONSTS</code> global variables list/file
+is generated.</p>
+</div>
+<div class="paragraph">
+<p>For invalid CIF specifications, the resulting code may not always behave as the
+original CIF code. For instance, the ranges of integer types are ignored by the
+code generator. Furthermore, <code>mod</code> by zero in CIF results in a runtime error,
+while in the generated code it results in zero. Out of bound projection indices
+of arrays may for instance have the effect that the closest existing element is
+used instead, and the result may even be implementation dependent. There are
+other such differences as well.</p>
+</div>
+<div class="paragraph">
+<p>Little to no effort is put into generating readable code. That is, the
+generated is not meant to be inspected. The generated code is also not intended
+to be modified directly. Instead, the original CIF models should be modified,
+and from them new PLC code should be generated. Examples of non-readable code
+include the generated <a href="#tools-cif2plc-names">names</a>, and code generated
+for expressions (which has way more parentheses than strictly necessary).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-names">Names</h5>
+<div class="paragraph">
+<p>The generated PLC code will contain names for functions, variables, locations
+of automata, etc. The absolute names of all objects are used. The names are
+influenced by the <a href="#tools-cif2cif-chapter-linearize-merge">linearization</a>
+algorithm. They are further influenced by the PLC code generator.</p>
+</div>
+<div class="paragraph">
+<p>The code generator ensures unique names in the generated PLC code, taking into
+account the reserved names (keywords, standard functions, etc) of the IEC
+61131-3 standard and some of the common implementations of that standard. To
+avoid reserved names, names are prefixed with prefixes that depend on the type
+of object (for instance, <code>dvar_</code> for discrete variables). Furthermore, it
+takes into account that names in CIF are case sensitive, while they are case
+insensitive in IEC 61131-3. The code generator computes a candidate name based
+on these criteria.</p>
+</div>
+<div class="paragraph">
+<p>If this results in duplicate names, renaming is performed. A common reason for
+renaming is different locations (of the same automaton or of different
+automata) that have the same name, but in different casing. For instance,
+consider one location named <code>WaitForTimeout</code> and another named
+<code>WaitForTimeOut</code>. After linearization, there is an enumeration with a literal
+for each unique location name. The enumeration thus has at least two literals,
+named <code>WaitForTimeout</code> and <code>WaitForTimeOut</code>. The candidate names for these
+enumeration literals are <code>elit_WaitForTimeout</code> and <code>elit_WaitForTimeOut</code>.
+However, they are identical except for casing. Thus, the first one that is
+encountered during code generation gets the candidate name, and the second one
+is renamed. This results in a warning like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">WARNING: PLC variable &quot;elit_WaitForTimeout&quot; is renamed to &quot;elit_WaitForTimeout2&quot;.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Renaming may be needed to ensure valid functioning output. However, it may make
+it slightly more difficult to trace names in the generated PLC code back to the
+original CIF model. Also, in the PLC environment, when debugging the current
+values of variables may be shown. If enumeration literals are renamed, the
+renamed names may then be shown in the debugger. By default, the PLC code
+generator does not inform the user when renaming takes place. By enabling the
+<em>Rename Warnings</em> option, a warning will be printed to the console, each time
+a PLC name is renamed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-progbody">Program body</h5>
+<div class="paragraph">
+<p>The body of the <code>MAIN</code> program consists of several parts. The <code>MAIN</code>
+program is executed exactly once per cycle, by the PLC. The following parts are
+present, and are executed in order:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Time and cycle time handling.</p>
+</li>
+<li>
+<p>Initialization of the initial state, for the first cycle only.</p>
+</li>
+<li>
+<p>Updating of the continuous variables for the time that has passed since the
+previous cycle, for all but the first cycle.</p>
+</li>
+<li>
+<p>A loop that executes events for as long as they are possible.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The code automatically determines the cycle time that is used, in a manner that
+does not require any vendor specific extensions, functions, or data types.
+The generated code works for fixed cycle times (periodic task scheduling) as
+well as variable cycle times (non-periodic tasks).</p>
+</div>
+<div class="paragraph">
+<p>During the first cycle, the variables of the state are initialized to their
+proper values. For subsequent cycles, the state resulting from the previous
+cycle is reused, where the values of the continuous variables are updated to
+account for the time that has passed since the beginning of the previous cycle.
+For details on the method used to update the values of the continuous
+variables, see the <a href="#tools-cif2plc-accuracy">Accuracy over time</a> section.</p>
+</div>
+<div class="paragraph">
+<p>The loop at the end of the body evaluates the guard of each of the events of
+the CIF specification. If a guard holds, the corresponding update is performed.
+Code is generated for the events, or rather the edges, in the order that they
+occur in the <a href="#tools-cif2cif-chapter-linearize-merge">linearized</a> CIF
+specification. Linearization is performed in such a way, that the PLC code that
+is generated from it, has a correspondence to the simulator. Assuming the
+simulator is used to simulate by always automatically choosing the
+<a href="#tools-cifsim-input-chapter-automatic">first transition</a> that is enabled, the
+PLC code will choose that same transition. That is, for each iteration of the
+event loop, the code is executed for the first event with an enabled guard.
+Then, a new iteration of the loop is started, from the top, to ensure that the
+first enabled event is always executed, similar to simulation. If during an
+iteration of the loop none of the events is enabled, the loop terminates.</p>
+</div>
+<div class="paragraph">
+<p>If at least one event was enabled, the loop is executed again. If during an
+iteration of the loop none of the edges was enabled, the loop terminates. This
+approach generally does not result in predictable execution times of the
+program body. That is, if a certain edge keeps being enabled, the loop is
+executed over an over again. In that case, the execution time of the body
+exceeds the fixed cycle time, and the controller is no longer guaranteed to
+work correctly. Even if the loop is only executed a finite number of times,
+the execution time of the body may exceed the fixed cycle time. One may
+consider monitoring the execution times to detect such issues.</p>
+</div>
+<div class="paragraph">
+<p>
+Within the 'event loop', a counter is used to detect how often the loop is
+repeated. After the loop is executed a 100 times, the loop is terminated, to
+ensure that the body terminates in the case of events that are always possible.
+In such a cases, variable <code>loopsKilled</code> is incremented by one, for debugging.
+While by default the loop is terminated after 100 iterations, this maximum
+number of iterations can be configured using the
+<b class="menuref">PLC maximum iterations</b>
+option (<b class="menuref">Generator</b>
+category). The
+option can also be set to infinite, to not impose a restriction, and never
+terminate the loop due to too many iterations. See also the
+<a href="#tools-cif2plc-options">Options</a> section above.</p>
+</div>
+<div class="paragraph">
+<p>Obviously, similar to the fact that the controller cannot guarantee its correct
+behavior if the execution time of a cycle exceeds the cycle time, the
+controller also cannot guarantee its correct behavior if the inputs from the
+external I/O change more rapidly than the cycle time. That is, if an input
+changes during a cycle, the change is not noticed until the next cycle. If an
+input changes during a cycle and changes back during that same cycle, the
+change is not noticed at all. Therefore, choosing an appropriate cycle time is
+essential for the correct functioning of the controller.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-accuracy">Accuracy over time</h5>
+<div class="paragraph">
+<p>The generated code maintains the running time in seconds, by adding the cycle
+time to current running time, on each cycle. Due to the finite binary
+representation of real values, this results in loss of a accuracy over
+prolonged periods of execution time. As such, the use of variable <code>time</code> in
+CIF models is highly discouraged.</p>
+</div>
+<div class="paragraph">
+<p>However, for a cycle time of one millisecond, while there may be loss of
+accuracy, time should keep increasing for at least several thousand years.
+After that, adding the cycle time may no longer increase the value of the
+variable, potentially resulting in unexpected execution behavior.</p>
+</div>
+<div class="paragraph">
+<p>The continuous variables from the CIF specification are updated each cycle
+using the
+<a href="http://en.wikipedia.org/wiki/Euler_method">Euler method</a>
+for
+integration. That is, each cycle the cycle time is multiplied by the derivative
+of the continuous variable in the state of the previous cycle. This value is
+added to the value of the continuous variable. Essentially, a linear
+approximation of the derivative is used, calculated using the state of the
+previous cycle.</p>
+</div>
+<div class="paragraph">
+<p>The Euler method can be
+<a href="http://en.wikipedia.org/wiki/Numerical_stability">numerically unstable</a>,
+can suffer from rounding
+errors due to the use finite binary representations of real values, and has
+some other issues as well. The effects are likely to be limited if linear
+continuous variable (continuous variables with constant derivatives) are used.
+Especially clocks (derivative +1 or -1) generally don&#8217;t suffer too much from
+these issues. However, even clocks may suffer from loss of accuracy over time.
+As such, clocks should not be used to measure over long periods of time.
+Instead they should be reset, rendering the past loss of accuracy irrelevant
+for any future measurements.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-io-coupling">I/O coupling</h5>
+<div class="paragraph">
+<p>For all variables in the state of the CIF specification, except for variable
+<code>time</code>, PLC variables are generated with a <code>%Q*</code> address, to ensure they
+can be used as output variables, and can potentially be coupled to output
+ports. The state is maintained in a variable <code>state0</code>, a persistent local
+variable of the <code>MAIN</code> program.</p>
+</div>
+<div class="paragraph">
+<p>For all input variables of the CIF specification, a PLC variable is generated
+with a <code>%I*</code> addresses, to ensure they can be used as input variables, and
+can potentially be coupled to input ports. These variables are generated in a
+global variables list/file named <code>INPUTS</code>.</p>
+</div>
+<div class="paragraph">
+<p>The actual coupling to hardware addresses is something that is left to the
+implementation of the PLC programming environment.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-output-type">PLC output type</h5>
+<div class="paragraph">
+<p>The PLC code generator can generate its output in multiple forms (file formats)
+depending on the output type. The output type can be configured using the
+<b class="menuref">PLC code output type</b>
+option (
+<b class="menuref">Generator</b>
+category). The
+following output types are currently available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>PLCopen XML (default)</p>
+</li>
+<li>
+<p>IEC 61131-3</p>
+</li>
+<li>
+<p><a href="#tools-cif2plc-chapter-twincat">TwinCAT</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>PLCopen XML is an
+<a href="http://en.wikipedia.org/wiki/XML">XML</a>-based file format
+standardized by the PLCopen organization, intended for the exchange of complete
+projects of PLC code, even across different tools and vendors. The PLCopen
+XML files generated by the PLC code generator are compliant with version 2.01
+of the PLCopen XML standard. By default, if no output file is specified, it
+defaults to the input file path, where the <code>.cif</code> file extension is removed
+(if present), and a <code>.plcopen.xml</code> file extension is added.</p>
+</div>
+<div class="paragraph">
+<p>Output in IEC 61131-3 syntax generates multiple files. By default, if no output
+directory is specified, it defaults to the input file path, where the <code>.cif</code>
+file extension is removed (if present), and a <code>_plc</code> directory extension is
+added. The <code>MAIN</code> program gets a <code>.plcprog</code> file extension, functions get
+a <code>.plcfunc</code> file extension, type declarations get a <code>.plctype</code> file
+extension, and the configuration gets a <code>.plccfg</code> file extension. The
+<em>PLC project name</em> and <em>PLC resource name</em> options have no effect for this
+output type.</p>
+</div>
+<div class="paragraph">
+<p>TwinCAT is a complete
+<a href="http://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a>
+for the
+development and testing of PLC controllers. Using the TwinCAT PLC output type,
+the generated PLC code can be written to the native file formats of the TwinCAT
+IDE. By default, if no output directory is specified, it defaults to the input
+file path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>_twincat</code> directory extension is added. See the
+<a href="#tools-cif2plc-chapter-twincat">TwinCAT PLC output</a> page for further details.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2plc-chapter-twincat">TwinCAT PLC output</h5>
+<div class="paragraph">
+<p>
+
+<a href="http://www.beckhoff.com/english/twincat">TwinCAT</a>
+is a complete
+<a href="http://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a>
+for the
+development and testing of PLC controllers. Using the TwinCAT <a href="#tools-cif2plc-output-type">PLC output
+type</a>, the generated PLC code can be written to the
+native file formats of the TwinCAT IDE. This allows for more tight integration
+and smoother development cycles than using the PLCopen XML output type.</p>
+</div>
+<div class="paragraph">
+<p>We currently only provide official support for version 3.1 of TwinCAT.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2plc-twincat-modes">TwinCAT system modes</h6>
+<div class="paragraph">
+<p>The TwinCAT software IDE is built on Microsoft Visual Studio. TwinCAT also
+supplies a utility to monitor and control the TwinCAT System Service, via an
+icon in the system tray, part in the Windows taskbar. The icon shows the mode
+(or status) of the TwinCAT system:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_inactive.png" alt="mode inactive"></span>
+Inactive Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_stop.png" alt="mode stop"></span>
+Stop Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_config.png" alt="mode config"></span>
+Config Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_run.png" alt="mode run"></span>
+Run Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_ex.png" alt="mode ex"></span>
+Exception Mode</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In the <em>Inactive Mode</em>, the TwinCAT System Service is not running. Restart
+Windows or manually activate the TwinCAT System Service and related services.</p>
+</div>
+<div class="paragraph">
+<p>The <em>Stop Mode</em> is of little use, so
+<a href="#tools-cif2plc-twincat-modes-change">switch</a> to the <em>Config Mode</em>
+instead. In the <em>Config Mode</em>, the system (the PLC) can be configured. In the
+<em>Run Mode</em>, the system (the PLC) can be used to control the hardware. If a
+runtime exception occurs in <em>Run Mode</em>, the <em>Exception Mode</em> becomes active.</p>
+</div>
+<div class="paragraph">
+<p>Within Visual Studio, the mode is also shown as an icon in the bottom right
+corner of the IDE:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_stop.png" alt="mode stop"></span>
+Stop Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_config.png" alt="mode config"></span>
+Config Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_run.png" alt="mode run"></span>
+Run Mode</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_run.png" alt="mode run"></span> / <span class="image"><img src="./tools/cif2plc/mode_free_run.png" alt="mode free run"></span>
+Free Run Mode (alternating icons)</p>
+</li>
+<li>
+<p><span class="image"><img src="./tools/cif2plc/mode_ex.png" alt="mode ex"></span>
+Exception Mode</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If the system is only equipped with a <em>soft PLC</em>, and the TwinCAT environment
+is set up to target the local system, both icons should indicate a consistent
+status. This page assumes this situation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2plc-twincat-modes-change">Changing modes</h6>
+<div class="paragraph">
+<p>To change to <em>Config Mode</em> or restart <em>Config Mode</em> from the system tray:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Right click the system tray icon and choose
+<span class="menuseq"><b class="menu">System</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Config</b></span>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To change to <em>Config Mode</em> or restart <em>Config Mode</em> from Visual Studio:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Restart TwinCAT (Config Mode)</b></span>.
+Alternatively, click the appropriate toolbar item
+(<span class="image"><img src="./tools/cif2plc/restart_config.png" alt="restart config"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Restart TwinCAT System in Config Mode</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question <em>Load I/O Devices</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question <em>Activate Free Run</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To change to <em>Run Mode</em> or restart <em>Run Mode</em> from the system tray:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure the hardware is powered up.</p>
+</li>
+<li>
+<p>Right click the system tray icon and choose
+<span class="menuseq"><b class="menu">System</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Start/Restart</b></span>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To change to <em>Run Mode</em> or restart <em>Run Mode</em> from Visual Studio:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure the hardware is powered up.</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Restart TwinCAT System</b></span>. Alternatively,
+click the appropriate toolbar item (<span class="image"><img src="./tools/cif2plc/restart_run.png" alt="restart run"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question <em>Restart TwinCAT System in Run Mode</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In general it is recommended to switch modes via Visual Studio instead of via
+the system tray icon.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-generated-output">Generated output</h6>
+<div class="paragraph">
+<p>The CIF PLC code generator can generate code into an existing TwinCAT Visual
+Studio solution, with a TwinCAT XAE project that contains a TwinCAT Standard
+PLC project. The directory that contains the solution must have the same name
+(except for the file extension) as the solution file (<code>.sln</code> file). The
+TwinCAT XAE project (both the directory and the <code>.tsproj</code> file) in the
+solution should have the same name as well. The TwinCAT XAE project should
+contain a TwinCAT Standard PLC project. This project may be given any name,
+and this name can be configured using the
+<b class="menuref">PLC project name</b>
+option
+(<b class="menuref">Generator</b>
+category). However, in order to be able to import I/O
+mappings it is highly recommended to always use the default name suggested by
+TwinCAT (<code>Untitled1</code>) for TwinCAT Default PLC projects.</p>
+</div>
+<div class="paragraph">
+<p>The project should already contain a task. This task can be given any name,
+and this name can be configured using the
+<b class="menuref">PLC task name</b>
+option
+(<b class="menuref">Generator</b>
+category). By default, TwinCAT Default PLC projects have
+a task named <code>PlcTask</code>. This name is the default for the
+<b class="menuref">PLC task name</b>
+option as well. The cycle time and priority of the
+task are automatically updated by the PLC code generator, depending on the
+values provided for the options of the generator. The code generator also
+ensures that the <code>MAIN</code> program is instantiated/scheduled on the task.</p>
+</div>
+<div class="paragraph">
+<p>All <code>POU</code> (functions, programs, etc), <code>DUT</code> (data types), and <code>GVL</code>
+(global variable lists) code files that are present in the TwinCAT Default PLC
+project are removed, from both the project and from disk, by the PLC code
+generator. The newly generated code files are (over)written, and the project is
+updated to include and compile only the newly generated files.</p>
+</div>
+<div class="paragraph">
+<p>The
+<b class="menuref">PLC configuration name</b>
+and
+<b class="menuref">PLC resource name</b>
+options have no effect on the TwinCAT output.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2plc-twincat-usage">TwinCAT usage</h6>
+<div class="paragraph">
+<p>Follow these steps to create a solution and project in TwinCAT, generate PLC
+code in it, and use the PLC code to control the hardware:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Start TwinCAT (Visual Studio) by right clicking on the TwinCAT system tray
+icon and choosing
+<b class="menuref">TwinCAT XAE (VS 2010)</b>.</p>
+</li>
+<li>
+<p>Create a new TwinCAT XAE project:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Project&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In the
+<b class="menuref">New Project</b>
+window,
+<b class="menuref">TwinCAT XAE Project (XML format)</b>
+should already be selected. If not, first select
+<b class="menuref">TwinCAT Project</b>
+on the left (from the list of
+<b class="menuref">Installed Templates</b>),
+and then select
+<b class="menuref">TwinCAT XAE Project (XML format)</b>.</p>
+</li>
+<li>
+<p>Choose a project name and enter it in the
+<b class="menuref">Name</b>
+box at the
+bottom of the dialog.</p>
+</li>
+<li>
+<p>Make sure the
+<b class="menuref">Solution name</b>
+is exactly the same, and that the
+<b class="menuref">Create directory for solution</b>
+option is enabled.</p>
+</li>
+<li>
+<p>For
+<b class="menuref">Location</b>,
+select the directory in which the directory for
+the solution should be created. This is usually the directory that contains
+the script and/or source files you will be using to generate the PLC code.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>To figure out the directory that contains the ToolDef script, make sure
+that the <b class="menuref">Properties</b> view is visible in Eclipse. Select the ToolDef
+script in the 'Project Explorer' tab or 'Package Explorer' tab, and look
+for the <b class="menuref">location</b> property.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Click
+<b class="button">OK</b>
+to create the project.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Scan the available hardware:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure the hardware is powered up.</p>
+</li>
+<li>
+<p>Make sure the <a href="#tools-cif2plc-twincat-modes">Config Mode</a> is enabled,
+by <a href="#tools-cif2plc-twincat-modes-change">switching</a> to it if it is not
+the current mode.</p>
+</li>
+<li>
+<p>In the project, under
+<b class="menuref">I/O</b>,
+right click the
+<b class="menuref">Devices</b>
+item and choose
+<b class="menuref">Scan</b>.
+Alternatively, select the
+<b class="menuref">I/O</b>
+item and click the appropriate toolbar item (<span class="image"><img src="./tools/cif2plc/scan_devices.png" alt="scan devices"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the warning
+<em>HINT: Not all types of devices can be found automatically</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up where you have to choose the I/O device to scan. Normally,
+if you have only one I/O device, it should already be selected. Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question <em>Scan for boxes</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question <em>Activate Free Run</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Create a new TwinCAT PLC project:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Right click the
+<b class="menuref">PLC</b>
+item in the project, and choose
+<b class="menuref">Add New Item&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>In the
+<b class="menuref">Add New Item</b>
+dialog,
+<b class="menuref">Standard PLC project</b>
+should already be selected.</p>
+</li>
+<li>
+<p>Keep the name
+<code>Untitled1</code>
+in the
+<b class="menuref">Name</b>
+box at the
+bottom of the dialog.</p>
+</li>
+<li>
+<p>Also don&#8217;t change the
+<b class="menuref">Location</b>
+of the project.</p>
+</li>
+<li>
+<p>Click
+<b class="menuref">Add</b>
+to add the PLC project.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Save the entire solution by clicking <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Save All</b></span>.</p>
+</li>
+<li>
+<p>Generate PLC code. If using a script, wait for the execution of the script to
+finish (the status indicated
+as part of the title of the console should change from <code>running</code> to
+<code>FINISHED</code>).</p>
+</li>
+<li>
+<p>Switch back to TwinCAT (Microsoft Visual Studio).</p>
+</li>
+<li>
+<p>When a
+<em>File Modification Detected</em>
+window pops up for the project,
+click
+<b class="button">Reload</b>
+to reload the updated project that was written by
+the CIF tooling.</p>
+</li>
+<li>
+<p>Build the project by clicking <span class="menuseq"><b class="menu">Build</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Rebuild Solution</b></span>.</p>
+</li>
+<li>
+<p>Load the I/O mappings:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>In the project, under
+<b class="menuref">I/O</b>,
+right click
+<b class="menuref">Mappings</b>,
+and choose
+<b class="menuref">Import Mapping Infos&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>Select the mappings file for your hardware, and click
+<b class="menuref">Open</b>.</p>
+</li>
+<li>
+<p>If the import succeeds, you should see an
+<em>Untitled1 Instance - &#8230;&#8203;</em>
+item under the
+<b class="menuref">Mappings</b>
+item.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Activate the configuration:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Activate Configuration</b></span>. Alternatively,
+click the appropriate toolbar item (<span class="image"><img src="./tools/cif2plc/activate_cfg.png" alt="activate cfg"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Activate Configuration (Old Configurations will be overwritten!)</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Restart TwinCAT System in Run Mode</em>. Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Start the PLC:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Login</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/login.png" alt="login"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Application Port_851 does not
+exist on the device. Do you want to create it and proceed with download?</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Start</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/start.png" alt="start"></span>).</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The PLC is now running, and you can use the system.</p>
+</li>
+</ul>
+</div>
+<div id="tools-cif2plc-twincat-usage-stop" class="paragraph">
+<p>To stop the PLC:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Stop</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/stop.png" alt="stop"></span>).</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Logout</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/logout.png" alt="logout"></span>). This step is optional, and can usually be
+skipped.</p>
+</li>
+</ul>
+</div>
+<div id="tools-cif2plc-twincat-usage-reset" class="paragraph">
+<p>To reset the PLC and start the 'simulation' from the beginning, with the same
+code and the same configuration:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure the hardware is powered up.</p>
+</li>
+<li>
+<p>Load the I/O mappings, if the
+<em>Untitled1 Instance - &#8230;&#8203;</em>
+item under the
+<b class="menuref">Mappings</b>
+item is no longer present:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>In the project, under
+<b class="menuref">I/O</b>,
+right click
+<b class="menuref">Mappings</b>,
+and choose
+<b class="menuref">Import Mapping Infos&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>Select the mappings file for your hardware, and click
+<b class="menuref">Open</b>.</p>
+</li>
+<li>
+<p>If the import succeeds, you should see an
+<em>Untitled1 Instance - &#8230;&#8203;</em>
+item under the
+<b class="menuref">Mappings</b>
+item.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Reactivate the configuration:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Activate Configuration</b></span>. Alternatively,
+click the appropriate toolbar item (<span class="image"><img src="./tools/cif2plc/activate_cfg.png" alt="activate cfg"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Activate Configuration (Old Configurations will be overwritten!)</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Restart TwinCAT System in Run Mode</em>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Start the PLC:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Login</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/login.png" alt="login"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Application Port_851 does not
+exist on the device. Do you want to create it and proceed with download?</em>.
+Click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Start</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/start.png" alt="start"></span>).</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The PLC is now running, and you can use the system.</p>
+</li>
+</ul>
+</div>
+<div id="tools-cif2plc-twincat-usage-regen" class="paragraph">
+<p>Whenever you change a CIF source file, regenerate a supervisor, change a
+hardware mapping, etc, you need to regenerate the PLC code as well. Follow
+these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure the <a href="#tools-cif2plc-twincat-modes">Config Mode</a> is enabled,
+by <a href="#tools-cif2plc-twincat-modes-change">switching</a> to it if it is not
+the current mode.</p>
+</li>
+<li>
+<p>Save the entire solution in TwinCAT by clicking
+<span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Save All</b></span>.</p>
+</li>
+<li>
+<p>Regenerate PLC code from Eclipse.
+If using a script, wait for the execution of the script to finish (the status indicated
+as part of the title of the console should change from <code>running</code> to
+<code>FINISHED</code>).</p>
+</li>
+<li>
+<p>Switch back to TwinCAT (Microsoft Visual Studio).</p>
+</li>
+<li>
+<p>For all
+<em>File has been changed outside the environment. Reload the new file?</em>
+questions, click
+<b class="button">Yes</b>
+or press
+<kbd>ENTER</kbd>.
+See the
+<a href="#tools-cif2plc-twincat-faq">Frequently Asked Questions (FAQ)</a> for instructions on how to disable some of
+these questions.</p>
+</li>
+<li>
+<p>When a
+<em>File Modification Detected</em>
+window pops up for the project,
+click
+<b class="button">Reload</b>
+to reload the updated project that was written by
+the CIF tooling.</p>
+</li>
+<li>
+<p>Clean the project by clicking <span class="menuseq"><b class="menu">Build</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Clean Solution</b></span>.</p>
+</li>
+<li>
+<p>Rebuild the project by clicking <span class="menuseq"><b class="menu">Build</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Rebuild Solution</b></span>.</p>
+</li>
+<li>
+<p>Make sure the hardware is powered up.</p>
+</li>
+<li>
+<p>Reload the I/O mappings:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>In the project, under
+<b class="menuref">I/O</b>, right click
+<b class="menuref">Mappings</b>,
+and choose
+<b class="menuref">Import Mapping Infos&#8230;&#8203;</b>.</p>
+</li>
+<li>
+<p>Select the mappings file for your hardware, and click
+<b class="menuref">Open</b>.</p>
+</li>
+<li>
+<p>If the import succeeds, you should see an
+<em>Untitled1 Instance - &#8230;&#8203;</em>
+item under the
+<b class="menuref">Mappings</b>
+item.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Activate the configuration:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Activate Configuration</b></span>. Alternatively,
+click the appropriate toolbar item (<span class="image"><img src="./tools/cif2plc/activate_cfg.png" alt="activate cfg"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Activate Configuration (Old Configurations will be overwritten!)</em>. Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<b class="menuref">Restart TwinCAT System in Run Mode</b>.
+Click
+<b class="button">OK</b>
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Start the PLC:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Login</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/login.png" alt="login"></span>).</p>
+</li>
+<li>
+<p>A dialog pops up with the question
+<em>Application Port_851 does not
+exist on the device. Do you want to create it and proceed with download?</em>.
+Click
+btn:Yes[]
+or press
+<kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">PLC</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Start</b></span>. Alternatively, click the appropriate
+toolbar item (<span class="image"><img src="./tools/cif2plc/start.png" alt="start"></span>).</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The PLC is now running, and you can use the system.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2plc-twincat-faq">Frequently Asked Questions (FAQ)</h6>
+<div class="ulist">
+<ul>
+<li>
+<p><strong>Question</strong>: Is there something that can be done about the large number of
+<em>File has been changed outside the environment&#8230;&#8203;</em> prompts?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: Yes. Click <span class="menuseq"><b class="menu">Tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Options&#8230;&#8203;</b></span> to show the
+<b class="menuref">Options</b> dialog. On the left, select
+<span class="menuseq"><b class="menu">Environment</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Documents</b></span>. Then, on the right, enable the
+<b class="menuref">Detect when file is changed outside the environment</b> and
+<b class="menuref">Auto-load changes, if saved</b> options.</p>
+</div>
+</li>
+<li>
+<p><strong>Question</strong>: Why doesn&#8217;t importing the I/O mappings have any effect?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: Make sure the TwinCAT Standard PLC project is named
+<code>Untitled1</code>, and try again. Also, make sure you&#8217;ve built the
+solution before you try to import the I/O mappings.</p>
+</div>
+</li>
+<li>
+<p><strong>Question</strong>: I get a dialog with the warning
+<em>Device '&#8230;&#8203;' needs a sync master (at least one variable linked to a task variable)</em>.
+What should I do?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: You probably forgot to load an I/O mapping.</p>
+</div>
+</li>
+</ul>
+</div>
+<div id="tools-cif2plc-twincat-faq-inlinemon" class="ulist">
+<ul>
+<li>
+<p><strong>Question</strong>: Why does opening the MAIN program take so long in
+Run Mode?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: As the generated code becomes larger, it can take a long time for
+TwinCAT to set up the environment for inline monitoring of the MAIN
+program. To disable inline monitoring, click
+<span class="menuseq"><b class="menu">Tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Options&#8230;&#8203;</b></span> to show the <b class="menuref">Options</b> dialog.
+On the left, select
+<span class="menuseq"><b class="menu">TwinCAT</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">PLC Environment</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Text Editor</b></span>. Then, on the
+right, switch to the <b class="menuref">Monitoring</b> tab. Disable the
+<b class="menuref">Enable inline monitoring option</b>.</p>
+</div>
+</li>
+<li>
+<p><strong>Question</strong>: TwinCAT hangs for long periods of time, before crashing and
+automatically being restarted by Windows. What should I do?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: If the generated code is too large, TwinCAT may not be able to
+handle it. In such cases, reduce the size of the generated code, by reducing
+the size of the CIF model for which you are generating the code.</p>
+</div>
+</li>
+<li>
+<p><strong>Question</strong>: I get an error stating 'Reading file failed. [&#8230;&#8203;]'.
+What should I do?</p>
+<div class="paragraph">
+<p><strong>Answer</strong>: The generated code is too large for TwinCAT to handle. See also
+the answer to the previous question.</p>
+</div>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-miscellaneous-tools">Miscellaneous tools</h3>
+<div class="sect3">
+<h4 id="tools-cif2cif-chapter-index">CIF to CIF transformer</h4>
+<div class="paragraph">
+<p>
+
+The CIF to CIF transformer can be used to syntactically transform CIF
+specifications to similar CIF specifications, which behave in the same
+manner (are semantically equivalent), but are expressed using different
+language constructs. For example, the CIF to CIF transformation that
+eliminates constants, replaces all uses of constants by their values,
+and removes the constants from the specification.</p>
+</div>
+<div class="paragraph">
+<p>These reusable transformations are primarily used to increase the subset
+of CIF specifications that can be transformed or processed.
+Usually, there is no need to apply the CIF to CIF transformations manually.
+Transformations that work on subsets of the CIF language, automatically
+apply the necessary CIF to CIF transformations as a preprocessing step, to
+increase the translatable subset.</p>
+</div>
+<div class="paragraph">
+<p>The CIF to CIF transformer can also be used as a <a href="#tools-cif2cif-pprinter">pretty printer</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-6">Starting the transformation</h5>
+<div class="paragraph">
+<p>The transformation can be started from Eclipse in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Right click a <code>.cif</code> file in the 'Project Explorer' tab or
+'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply CIF to CIF transformations&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Apply CIF to CIF transformations&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cif2cif</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cif2cif</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-options-19">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative local file system path to the
+input CIF specification.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, the output file path defaults to
+the input file path, where the <code>.cif</code> file extension is removed (if
+present), and a <code>.transformed.cif</code> file extension is added.</p>
+</li>
+<li>
+<p><em>Transformations</em>: The CIF to CIF transformations to apply. The
+transformations are applied in the chosen order. Transformations may be
+applied multiple times. By default, no transformations are applied,
+essentially making the CIF to CIF transformer a <a href="#tools-cif2cif-pprinter">pretty printer</a>.</p>
+<div class="paragraph">
+<p>In the option dialog, the available transformations are shown. To add a
+transformation, double click it, or select it and click the <em>Add</em>
+button below the list of available transformations. To remove a
+transformation, double click on it in the list of chosen transformations, or
+select it in that list and click the <em>Remove</em> button.</p>
+</div>
+<div class="paragraph">
+<p>At the command line, specify comma separated transformation names, in the
+order they should be applied. The names to use are listed below, in the
+<a href="#tools-cif2cif-available">Available transformations</a> section.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-transformation-descriptions">Transformation descriptions</h5>
+<div class="paragraph">
+<p>The pages describing the <a href="#tools-cif2cif-available">available transformations</a> all use the same format. They have the following
+sections:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Introduction</em>: describes the transformation in a few sentences.</p>
+</li>
+<li>
+<p><em>Supported specifications</em>: describes the subset of CIF specifications to which
+the transformation can be applied.</p>
+</li>
+<li>
+<p><em>Preprocessing</em>: specifies the CIF to CIF transformations that are
+automatically applied as preprocessing, or the CIF to CIF transformations
+that can be manually applied as preprocessing, to increase the subset of
+CIF specifications that can be transformed by the transformation.</p>
+</li>
+<li>
+<p><em>Implementation details</em>: further specifies what the transformation does, how
+it does it, and what the result of the transformation is. Most
+transformations also show one or more examples.</p>
+</li>
+<li>
+<p><em>Renaming</em>: explains if and when renaming may be performed by the
+transformation.</p>
+</li>
+<li>
+<p><em>Size considerations</em>: describes whether the transformation reduces or
+increases the size of the specification. If the specification may increase
+in size, an estimate of the order of increase is given (linear, exponential,
+etc). Note that the size is not the file size, but rather the number of
+objects used to represent the specification (the number of automata,
+locations, edges, guards, binary operators, etc).</p>
+</li>
+<li>
+<p><em>Optimality</em>: describes why the transformation result may not be optimal, if
+applicable. May also explain how to eliminate certain concepts that may be
+introduced as the result of the transformation.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-available">Available transformations</h5>
+<div class="paragraph">
+<p>A whole collection of CIF to CIF transformations is available. The available
+transformations are listed below, with a link to the information about the
+transformation, and the name to use for that transformation on the command
+line.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a> (<code>add-default-init-values</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-alg-vars">Eliminate algebraic variables</a> (<code>elim-alg-vars</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-aut-casts">Eliminate automata to string casts</a> (<code>elim-aut-casts</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a> (<code>elim-comp-def-inst</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-consts">Eliminate constants</a> (<code>elim-consts</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a> (<code>elim-enums</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-equations">Eliminate equations</a> (<code>elim-equations</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-groups">Eliminate groups</a> (<code>elim-groups</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-if-updates">Eliminate <code>if</code> updates</a> (<code>elim-if-updates</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> (<code>elim-locs-in-exprs</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-monitors">Eliminate monitors</a> (<code>elim-monitors</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a> (<code>elim-self</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</a> (<code>elim-state-event-excl-invs</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-tau-event">Eliminate <code>tau</code> event</a> (<code>elim-tau-event</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-tuple-field-projs">Eliminate tuple field projections</a> (<code>elim-tuple-field-projs</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-type-decls">Eliminate type declarations</a> (<code>elim-type-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-lift-events">Lift events</a> (<code>lift-events</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-linearize-merge">Linearize (merge)</a> (<code>linearize-merge</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-linearize-product">Linearize (product)</a> (<code>linearize-product</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-merge-enums">Merge enumerations</a> (<code>merge-enums</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-print-file-into-decls">Push print file declarations into print declarations</a> (<code>print-file-into-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-cif-svg-decls">Remove CIF/SVG declarations</a> (<code>remove-cif-svg-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a> (<code>remove-io-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-print-decls">Remove print declarations</a> (<code>remove-print-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-pos-info">Remove position information</a> (<code>remove-pos-info</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-reqs">Remove requirements</a> (<code>remove-reqs</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-others">Simplify others</a> (<code>simplify-others</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> (<code>simplify-values</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values-optimized">Simplify values (optimized)</a> (<code>simplify-values-optimized</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values-no-refs">Simplify values (no references)</a> (<code>simplify-values-no-refs</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</a> (<code>simplify-values-no-refs-optimized</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-svg-file-into-decls">Push SVG file declarations into other CIF/SVG declarations</a> (<code>svg-file-into-decls</code>)</p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-switches-to-ifs">Convert <code>switch</code> expressions to <code>if</code> expressions</a> (<code>switches-to-ifs</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-pprinter">Pretty printer</h5>
+<div class="paragraph">
+<p>If no transformations are applied by the CIF to CIF transformer, the input CIF
+specification is just read from the input file, validated, and written to the
+output file. This can be useful, as it essentially turns the CIF to CIF
+transformer into a CIF <em>pretty printer</em>.</p>
+</div>
+<div class="paragraph">
+<p>As a side effect of reading the input file and validating it, the model may
+change slightly. In fact, this occurs not only for the CIF to CIF transformer
+but for all tools, as they all read input files and validate them, before
+continuing with their actual task. Examples of such changes include the
+elimination of imports, the loss of comments, and the evaluation of tuple
+projection indices.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-add-default-init-values">Add default initial values</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation adds the default initial values to variables
+that are not given an explicit initial value. This includes discrete and
+continuous variables, as well as local variables of functions.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-11">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-8">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details">Implementation details</h6>
+<div class="paragraph">
+<p>The default values for all types are simple values. The only exception are
+function types, for which a new function is introduced. This new functions
+returns the default value for the return type of the function. If multiple
+default values for the same function type are needed, the newly introduced
+function is reused. The functions are named <code>_f</code>, <code>_f2</code>, <code>_f3</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton x:
+  disc int x, y = 5;
+  disc func bool (int) f;
+  location;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">func bool _f(int p0):
+  return false;
+end
+
+automaton x:
+  disc int x = 0, y = 5;
+  disc func bool (int) f = _f;
+  location;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming">Renaming</h6>
+<div class="paragraph">
+<p>If the names of the functions that are introduced, conflict with already
+existing declarations, they are renamed. For instance, if <code>_f2</code> is already in
+use, <code>_f22</code>, <code>_f23</code>, etc, are used instead. If renaming takes place, a
+warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations">Size considerations</h6>
+<div class="paragraph">
+<p>Since values are added, this transformation increases the size of the
+specification. For an array of 400 elements, with an array of 300 integers
+each, the default initial value consists of 1,200 integers. Add such an initial
+value can significantly increase the size of the model.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality">Optimality</h6>
+<div class="paragraph">
+<p>The default values for all types are as primitive as they can be, and can
+usually not be simplified any further. It may however be possible that
+functions are introduced for the default values of function types, while such
+a function already existed in the original specification.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-switches-to-ifs">Convert <code>switch</code> expressions to <code>if</code> expressions</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation converts <code>switch</code> expressions to <code>if</code>
+expressions.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-12">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-9">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-2">Implementation details</h6>
+<div class="paragraph">
+<p>All <code>switch</code> expressions are replaced by <code>if</code> expressions. For instance,
+consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg int y = ...
+alg real x = switch y:
+               case 1: 1.0
+               case 2: 4.0
+               case 3: 9.0
+               else    0.0
+             end;
+alg real z = switch y:
+               else 1.0
+             end;
+
+automaton a:
+  alg string v = switch self:
+                   case l1: &quot;first&quot;
+                   case l2: &quot;second&quot;
+                 end;
+
+  location l1:
+    initial;
+    edge tau goto l2;
+
+  location l2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is transformed to the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg int y = ...
+alg real x = if   y = 1: 1.0
+             elif y = 2: 4.0
+             elif y = 3: 9.0
+             else        0.0
+             end;
+alg real z = 1.0;
+
+automaton a:
+  alg string v = if l1: &quot;first&quot;
+                 else   &quot;second&quot;
+                 end;
+
+  location l1:
+    initial;
+    edge tau goto l2;
+
+  location l2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For algebraic variable <code>z</code>, there is only one case (the <code>else</code>), so no
+<code>if</code> expression is generated. This optimization means that the control value
+(<code>y</code> in this case) is lost.</p>
+</div>
+<div class="paragraph">
+<p>For algebraic variable <code>v</code> in automaton <code>a</code>, the <code>switch</code> expression uses
+an automaton self reference. The cases list the possible locations of the
+automaton, and the <code>switch</code> expression maps them to string values. Since for
+<code>if</code> expressions the <code>else</code> part is mandatory, the last <code>case</code> of the
+<code>switch</code> is converted to the <code>else</code> of the <code>if</code> expression.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-2">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-2">Size considerations</h6>
+<div class="paragraph">
+<p>The created <code>if</code> expression is usually larger than the original <code>switch</code>
+expression, as the control value is duplicated for each <code>if</code> and <code>elif</code>
+part, where it is compared to the <code>case</code> values. For <code>switch</code> expressions
+with only one <code>case</code> or <code>else</code>, no <code>if</code> expression is generated, and the
+expression becomes smaller.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-2">Optimality</h6>
+<div class="paragraph">
+<p>This transformation transforms <code>switch</code> expressions to <code>if</code> expressions,
+leading to <code>if</code> expressions with <code>if</code> and <code>elif</code> guards that may not be
+optimal. To simplify the result, apply additional CIF to CIF transformations,
+such as <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-alg-vars">Eliminate algebraic variables</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates algebraic variables and their
+equations.</p>
+</div>
+<div class="paragraph">
+<p>See also: <a href="#tools-cif2cif-chapter-equations">Eliminate equations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-13">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+<li>
+<p>Automaton <code>self</code> references are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-10">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-3">Implementation details</h6>
+<div class="paragraph">
+<p>For each algebraic variable with a single equation in a component or automaton,
+all uses of the variable (for instance in guards, invariants, etc) are
+replaced by the value of the variable (the right hand side of its equation).
+For algebraic variables with equations specified in the locations of an
+automaton, an 'if' expression is created. This 'if' expression uses the
+locations of the automaton as guards, and the right hand sides of the equations
+as values for each of the alternatives. The last alternative is an 'else', and
+thus has no guard. If the automaton has only one location, generation of the
+'if' expression is suppressed.</p>
+</div>
+<div class="paragraph">
+<p>The algebraic variables and their equations are removed.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg bool b1 = true;
+alg bool b2;
+equation b2 = false;
+
+automaton aut:
+  alg int a;
+  location l1:
+    equation a = 1;
+  location l2:
+    equation a = 2;
+end
+
+invariant b1 or b2 or p.a &gt; 0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton aut:
+  location l1;
+  location l2;
+end
+
+invariant true or false or if p.l1: 1 else 2 end &gt; 0;</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-3">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-3">Size considerations</h6>
+<div class="paragraph">
+<p>Since algebraic variables are shortcuts for expressions, eliminating them
+could result in an increase of the size of the specification. Algebraic
+variables may be defined in terms of other algebraic variables. Therefore, in
+the worst case, the increase is exponential.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-3">Optimality</h6>
+<div class="paragraph">
+<p>For an assignment <code>x := 1 + y</code>, where <code>y</code> is an algebraic variable that is
+eliminated, and where <code>y</code> has value <code>5</code>, the resulting assignment is
+<code>x := 1 + 5</code>. The result is not simplified any further. To further simplify
+the result, apply additional CIF to CIF transformations, such as
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+<div class="paragraph">
+<p>This transformation introduces 'if' expressions for algebraic variables
+that have an equation per location, for automata with at least two locations.
+The guards of such 'if' expressions refer to the locations of the automata.
+To eliminate such location references, apply the
+<a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-aut-casts">Eliminate automata to string casts</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates casts of automata to strings.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-14">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-11">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-4">Implementation details</h6>
+<div class="paragraph">
+<p>All casts of automata to strings, using either implicit automaton <code>self</code>
+references or explicit automata references, are eliminated. If the referred
+automaton has only a single location, the cast is replaced by a string literal
+with the name of that location. If the automaton has multiple locations, the
+cast is replaced by an <code>if</code> expression, using the locations of the automaton
+as guards, and string literals containing the location names as values. For
+nameless locations the string literal <code>"*"</code> is used.</p>
+</div>
+<div class="paragraph">
+<p>For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  alg string x = &lt;string&gt;self;
+
+  location:
+    initial;
+end
+
+automaton b:
+  alg string x = &lt;string&gt;self;
+
+  location l1:
+    initial;
+  location l2:
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is transformed to the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  alg string x = &quot;*&quot;;
+
+  location:
+    initial;
+end
+
+automaton b:
+  alg string x = if   l1: &quot;l1&quot;
+                 elif l2: &quot;l2&quot;
+                 else     &quot;l3&quot;
+                 end;
+
+  location l1:
+    initial;
+  location l2;
+  location l3;
+end</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-4">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-4">Size considerations</h6>
+<div class="paragraph">
+<p>The created <code>if</code> expressions are usually larger than the original cast
+expressions. The increase is linear in terms of the number of locations times
+the number of casts.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-4">Optimality</h6>
+<div class="paragraph">
+<p>This transformation introduces 'if' expressions for automaton to string casts,
+for automata with at least two locations. The guards of such 'if' expressions
+refer to the locations of the automata. To eliminate such location references,
+apply the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</h5>
+<div class="paragraph">
+<p>
+
+
+
+This CIF to CIF transformation eliminates all component definitions and
+instantiations, by actually instantiating the component definitions.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-15">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-12">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-5">Implementation details</h6>
+<div class="paragraph">
+<p>This transformation operates in three phases:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Phase 1: Find the component definitions without any component definitions
+and/or component instantiations in them.</p>
+</li>
+<li>
+<p>Phase 2: Instantiate the component definitions found in phase 1, by putting
+the body of the definition in the place of the instantiation, in a component
+named after the component instantiation. Also removes the component
+definitions that were just instantiated, and introduces new local algebraic
+variables for the algebraic parameters.</p>
+</li>
+<li>
+<p>Phase 3: Replace uses of component, event, and location parameters by the
+actual arguments provided for the instantiation.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group def P(alg int x):
+  invariant x &gt; 0;
+end
+
+p1: P(1);
+
+alg int y = 2;
+p2: P(y);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group p1:
+  alg int x = 1;
+  invariant x &gt; 0;
+end
+
+alg int y = 2;
+group p2:
+  alg int x = y;
+  invariant x &gt; 0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Absolute references may be needed to express the results of this
+transformation. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 5;
+
+group def X():
+  invariant x = 5;
+end
+
+group a:
+  x: X();
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 5;
+
+group a:
+  group x:
+    invariant .x = 5;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note how the invariant in component <code>a.x</code> can not refer to constant <code>x</code>
+directly, as <code>x</code> refers to component <code>a.x</code> in that context. Therefore, the
+scope absolute reference <code>.x</code> is used instead.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-5">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-5">Size considerations</h6>
+<div class="paragraph">
+<p>Since component definitions are shortcuts for components, eliminating
+them could result in an increase of the size of the specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-5">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-consts">Eliminate constants</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates constants.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-16">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-13">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-6">Implementation details</h6>
+<div class="paragraph">
+<p>All uses of constants (for instance in guards, invariants, etc), are replaced
+by their values. The constants themselves are removed. For instance, the
+following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 1;
+const int z = y;
+const int y = x + 1;
+invariant x + y + z &gt; 0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">invariant 1 + 2 + 2 &gt; 0;</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-6">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-6">Size considerations</h6>
+<div class="paragraph">
+<p>Since constants are shortcuts for values, eliminating them could result in an
+increase of the size of the specification. Constants may be defined in terms of
+other constants. Therefore, in the worst case, the increase is exponential.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-6">Optimality</h6>
+<div class="paragraph">
+<p>For an assignment <code>x := 1 + y</code>, where <code>y</code> is a constant that is eliminated,
+and where <code>y</code> has value <code>5</code>, the resulting assignment is <code>x := 1 + 5</code>.
+The result is not simplified any further. To further simplify the result, apply
+additional CIF to CIF transformations, such as
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-enums">Eliminate enumerations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates enumerations.</p>
+</div>
+<div class="paragraph">
+<p>See also: <a href="#tools-cif2cif-chapter-merge-enums">Merge enumerations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-17">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-14">Preprocessing</h6>
+<div class="paragraph">
+<p>To increase the subset of specifications that can be transformed, apply
+the following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order) prior to using this transformation:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-7">Implementation details</h6>
+<div class="paragraph">
+<p>Enumerations, which are used as types, are replaced by integer types, with
+range <code>[0 .. n-1]</code>, where <code>n</code> is the number of literals of the enumeration.</p>
+</div>
+<div class="paragraph">
+<p>Enumeration literals, which are used as values, are replaced by integer values.
+If the used enumeration literal is the <code>n</code><sup>th</sup> literal in the corresponding
+enumeration (declaration), then the integer value is <code>n - 1</code>. That is, the
+integer value is the 0-based index of the enumeration literal into the literals
+of the enumeration declaration.</p>
+</div>
+<div class="paragraph">
+<p>All enumeration declarations are removed.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group x:
+  enum EX = A, B;
+
+  const EX x = A;
+end
+
+group y:
+  enum EY = B, A;
+
+  const EY y = A;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group x:
+  const int[0..1] x = 0;
+end
+
+group y:
+  const int[0..1] y = 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-7">Renaming</h6>
+<div class="paragraph">
+<p>This transformation itself does not perform any renaming.</p>
+</div>
+<div class="paragraph">
+<p>If enumeration literals are renamed, this may influence value equality for
+<em>compatible</em> enumerations (enumerations with the same number of literals,
+with the same names, in the same order). Therefore, either apply this
+transformation before applying other transformations that perform renaming on
+enumeration literals (such as the <a href="#tools-cif2cif-chapter-groups">Eliminate groups</a> CIF to CIF
+transformation), or otherwise ensure that renaming does not result in an
+invalid specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-7">Size considerations</h6>
+<div class="paragraph">
+<p>Integer types and integer values are not larger than enumerations and their
+literals. Therefore, this transformation does not increase the size of the
+specification. In fact, it may even be smaller.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-7">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-equations">Eliminate equations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates equations for algebraic variables
+and derivatives of continuous variables. Note that it does not eliminate the
+variables themselves.</p>
+</div>
+<div class="paragraph">
+<p>See also: <a href="#tools-cif2cif-chapter-elim-alg-vars">Eliminate algebraic variables</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-18">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+<li>
+<p>Automaton <code>self</code> references are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-15">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-8">Implementation details</h6>
+<div class="paragraph">
+<p>For algebraic variables with a single equation in a component or automaton,
+the value of the variable (the right hand side of the equation) is moved to
+the declaration of the algebraic variable. For algebraic variables with
+equations specified in the locations of an automaton, an 'if' expression is
+created. This 'if' expression uses the locations of the automaton as guards,
+and the right hand sides of the equations as values for each of the
+alternatives. The last alternative is an 'else', and thus has no guard. The
+single right hand side, or the 'if' expression, is put directly in the
+declaration of the algebraic variable. If the automaton has only one location,
+generation of the 'if' expression is suppressed.</p>
+</div>
+<div class="paragraph">
+<p>The derivatives of continuous variables are transformed in a similar way. The
+derivative ends up in the declaration of the continuous variable.</p>
+</div>
+<div class="paragraph">
+<p>All equations are removed from components (including automata) and locations.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg bool b1 = true;
+cont x;
+equation x' = 1.0;
+
+automaton p:
+  alg int a;
+  location l1:
+    equation a = 1;
+  location l2:
+    equation a = 2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg bool b1 = true;
+cont x der 1.0;
+
+automaton p:
+  alg int a = if l1: 1
+              else   2
+              end;
+  location l1;
+  location l2;
+end</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-8">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-8">Size considerations</h6>
+<div class="paragraph">
+<p>The right hand sides of the equations are simply moved. This does not influence
+the size of the specification. For equations specified in the locations of an
+automaton, an 'if' expression is created. This increases the size of the
+specification. The increase however, is linear in the number of equations.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-8">Optimality</h6>
+<div class="paragraph">
+<p>This transformation introduces 'if' expressions for algebraic variables and
+derivatives of continuous variables that have an equation per location of an
+automaton, for automata with at least two locations. The guards of such 'if'
+expressions refer to the locations of the automata. To eliminate such location
+references, apply the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF
+transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-groups">Eliminate groups</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation flattens the component structure of a
+specification, by eliminating all groups. That is, after this transformation,
+all automata will be at the top level, directly in the specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-19">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Furthermore, this transformation does not guarantee the correct result for
+specification with enumerations. See also the
+<a href="#tools-cif2cif-elim-groups-renaming">Renaming</a> section below.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-16">Preprocessing</h6>
+<div class="paragraph">
+<p>To increase the subset of specifications that can be transformed, apply
+the following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order) prior to using this transformation:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+automatically applied as preprocessing (in the given order), to increase the
+subset of CIF specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-svg-file-into-decls">Push SVG file declarations into other CIF/SVG declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-print-file-into-decls">Push print file declarations into print declarations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-9">Implementation details</h6>
+<div class="paragraph">
+<p>All declarations, invariants, initialization predicates, marker predicates, and
+equations from the groups are lifted to the top level of the specification.
+The automata are lifted to the top level of the specification as well.
+Subsequently, the groups are removed.</p>
+</div>
+<div class="paragraph">
+<p>In order to be able to track the origin of automata and declarations, they are
+named after their absolute names. For a group <code>x</code>, with a group
+<code>y</code>, with a constant <code>z</code>, the absolute name of the constant is <code>x.y.z</code>.
+The constant is lifted to the top level of the specification, and named
+<code>x_y_z</code>.</p>
+</div>
+<div class="paragraph">
+<p>For instance, this specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group a:
+  const int x = 5;
+  invariant x &gt; 4;
+end
+
+group p:
+  automaton q:
+    event e;
+    location;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int a_x = 5;
+invariant a_x &gt; 4;
+
+automaton p_q:
+  event e;
+  location;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-elim-groups-renaming">Renaming</h6>
+<div class="paragraph">
+<p>Since declarations of the specification are merged with the declarations of the
+groups and with automata, renaming may be necessary to ensure uniquely
+named declarations. For instance, for a group <code>x</code>, with a group
+<code>y</code>, with a constant <code>z</code>, the absolute name of the constant is <code>x.y.z</code>.
+The constant is lifted to the top level of the specification, and renamed to
+<code>x_y_z</code>. However, if the specification already contains a declaration of
+another constant, automaton, etc named <code>x_y_z</code>, then the lifted constant is
+renamed to <code>x_y_z2</code> instead. If that name is also already in use, it is
+renamed to <code>x_y_z3</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>Whenever renaming takes place, a warning will be printed to the console.</p>
+</div>
+<div class="sect6">
+<h7 id="tools-renaming-of-enumeration-literals">Renaming of enumeration literals</h7>
+<div class="paragraph">
+<p>Enumeration literals that are part of lifted enumeration declarations, are not
+renamed to their absolute names. To understand why this is necessary, consider:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group x:
+  enum E = A, B;
+end
+
+automaton y:
+  enum E = A, B;
+  location:
+    initial;
+end
+
+invariant x.A = y.A;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, group <code>x</code> and automaton <code>y</code> both have an enumeration <code>E</code> with
+enumeration literals <code>A</code> and <code>B</code>. The invariant of the specification
+compares the literals of the two different enumerations. This is allowed, since
+the enumerations are <em>compatible</em> (they have the same enumeration literals,
+with the same names, in the same order). If we were to rename the enumeration
+literals to absolute names as we lift them to the top level of the
+specification, the result would be:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum x_E = x_A, x_B;
+
+automaton y:
+  enum E = A, B;
+  location:
+    initial;
+end
+
+invariant x_A = y.A;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which would no longer be a valid specification, as enumerations <code>x_E</code> and
+<code>y.E</code> are no longer compatible (they have enumeration literals with different
+names). Since we leave the names of the enumeration literals as they are, the
+result of the transformation is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum x_E = A, B;
+
+automaton y:
+  enum E = A, B;
+  location:
+    initial;
+end
+
+invariant A = y.A;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>which is still a correct specification, and has the same meaning as the
+original specification.</p>
+</div>
+<div class="paragraph">
+<p>Now assume the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group x:
+  enum E = A, B;
+end
+
+group y:
+  enum E = A, B;
+end
+
+invariant x.A = y.A;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the two enumerations are both in groups. If we lift them, we have
+two enumerations, with the same literals, which is not a valid CIF
+specification. As such, renaming can not be avoided, and the result of the
+transformation will be:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum x_E = A, B;
+enum y_E = A2, B2;
+
+invariant A = A2;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This result is an invalid CIF specification. Whenever an enumeration literal
+is renamed, a warning is printed to the console, informing of the possibility
+that the resulting specification is invalid. As such, it is highly recommended
+to avoid such situations, and eliminate the enumerations prior to the
+elimination of the groups.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-9">Size considerations</h6>
+<div class="paragraph">
+<p>The groups are removed. Other objects are lifted, which essentially means
+they are moved. The size of the specification does not increase.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-9">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-if-updates">Eliminate <code>if</code> updates</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates 'if' updates on edges.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-20">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Multi-assignments and partial variable assignments are not supported. That
+is, the left hand sides of the assignments on edges (the addressables) must
+be single variables without projections.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-17">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing, to increase the subset of CIF specifications that can be
+transformed, is currently performed by this CIF to CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-elim-if-updates-impl">Implementation details</h6>
+<div class="paragraph">
+<p>This transformation ensures that each variable that is assigned, gets
+a single explicit assignment. Simply put, the 'if' update structure is
+replicated by an 'if' expression. For instance, the following edge updates:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">if g:
+  if g2:
+    x := 5
+  else
+    y := 6
+  end
+end,
+z := 7</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>are transformed to the following edge updates:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">x := if g:
+       if g2:
+         5
+       else
+         x
+       end
+     else
+       x
+     end,
+y := if g:
+       if g2:
+         y
+       else
+         6
+       end
+     else
+       y
+     end,
+z := 7</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Observe how variables <code>x</code> and <code>y</code> are assigned inside two <code>if</code> updates.
+These <code>if</code> updates are replicated by two <code>if</code> expressions.</p>
+</div>
+<div class="paragraph">
+<p>Since for <code>if</code> expressions the <code>else</code> part is not optional, dummy
+<code>x := x</code> assignments are sometimes performed in cases where the original
+specification would not have assigned variable <code>x</code> at all. That is, variables
+may be assigned their old values, resulting in superfluous assignments.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-9">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-10">Size considerations</h6>
+<div class="paragraph">
+<p>The 'if' structure may be replicated for multiple variables, which may result
+in an increase of the specification size. The increase amount is influenced
+by the size of the guard expressions, and the number of levels of nesting 'if'
+updates.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-10">Optimality</h6>
+<div class="paragraph">
+<p>The superfluous assignments (see the <a href="#tools-cif2cif-elim-if-updates-impl">Implementation details</a>
+section above), are obviously not optimal. The language however requires them.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation eliminates the use of locations in expressions
+(such as guards, invariants, and equations), by introducing location pointer
+variables for automata, and using them instead.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-21">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-18">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-10">Implementation details</h6>
+<div class="paragraph">
+<p>For each automaton for which a location is used (referred to) in an expression
+(such as a guard, invariant, or equation), a location pointer variable is
+introduced, with as value the current location of the automaton. The values
+for such a new variables are part of a newly created enumeration that has a
+value (an enumeration literal) for each location of the automaton.</p>
+</div>
+<div class="paragraph">
+<p>To initialize the new location pointer variable, the variable itself is
+initialized to <code>any</code> (meaning any value in its domain), and initialization
+predicates are added to all locations that could potentially be initial
+locations. For automata with exactly one initial state, the initial value
+of the location pointer variable is set directly, instead of using
+initialization predicates.</p>
+</div>
+<div class="paragraph">
+<p>All edges in the automaton that change the current location of that automaton,
+get an additional assignment to update the location pointer variable.</p>
+</div>
+<div class="paragraph">
+<p>All uses of the locations of the automaton in expressions (that is, all
+location reference expressions) are changed to equality binary expressions for
+the location pointer variable and the enumeration literal corresponding to the
+location.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton x:
+  event e;
+  alg bool a = l1;
+
+  location l1:
+    initial;
+    edge e goto l2;
+
+  location l2:
+    edge e;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton x:
+  event e;
+  alg bool a = LP_x = LOC_l1;
+  disc LOCS_x LP_x = LOC_l1;
+  enum LOCS_x = LOC_l1, LOC_l2;
+
+  location l1:
+    initial;
+    edge e do LP_x := LOC_l2 goto l2;
+
+  location l2:
+    edge e;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Location pointer variable <code>LP_x</code> is added. It is initialized directly in the
+declaration, since there is exactly one initial location in this automaton.
+Enumeration <code>LOCS_x</code> is created to represent the possible values of the
+location pointer variable. Enumerations literals <code>LOC_l1</code> and <code>LOC_l2</code>
+represent locations <code>l1</code> and <code>l2</code>, respectively.</p>
+</div>
+<div class="paragraph">
+<p>The edge from location <code>l1</code> to location <code>l2</code> is extended with an update
+to the location pointer. The self loop in location <code>l2</code> is not extended, as
+the location does not change.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-10">Renaming</h6>
+<div class="paragraph">
+<p>If the names of the location pointer variables that are introduced, conflict
+with already existing declarations, they are renamed. For instance, if <code>LP_x</code>
+is already in use, <code>LP_x2</code>, <code>LP_x3</code>, etc, are used instead. Similarly,
+renaming is performed for enumerations, and enumeration literals that conflict
+with already existing declarations. If renaming takes place, a warning is
+printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-11">Size considerations</h6>
+<div class="paragraph">
+<p>The number of added location pointer variables is linear in the number of
+automata. The number of added initialization predicates for the location
+pointer variables is linear in the number of possible initial locations. The
+number of added enumerations is linear in the number of automata. The number of
+added enumeration literals is linear in the number of locations. The number of
+added updates is linear in the number of edges. The number of added equality
+binary expressions is linear in the number of location references.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-11">Optimality</h6>
+<div class="paragraph">
+<p>This transformation introduces enumerations for the possible values of the
+location pointer variables. To eliminate the enumerations, apply the
+<a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a> CIF to CIF transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-monitors">Eliminate monitors</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates monitor events.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-22">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-19">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-11">Implementation details</h6>
+<div class="paragraph">
+<p>For each monitor event in an automaton, additional self loops are added as
+needed, to make sure the automaton doesn&#8217;t disable the monitor event.
+Furthermore, all monitors are removed from all automata.</p>
+</div>
+<div class="paragraph">
+<p>The self loop edges created by this transformation have no communication
+(no <code>!...</code>, no <code>?...</code>), no urgency (no <code>now</code>), and no updates
+(no <code>do ...</code>).</p>
+</div>
+<div class="paragraph">
+<p>For instance, for the following locations and edges, for monitor event <code>e</code>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">location l1:
+  edge e goto l2;
+  edge f when x = 2 goto l3;
+
+location l2:
+  edge e when x = 1 goto l3;
+  edge e when x = 2 goto l1;
+
+location l3;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>the result after this transformation is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">location l1:
+  edge e goto l2;
+  edge f when x = 2 goto l3;
+
+location l2:
+  edge e when x = 1 goto l3;
+  edge e when x = 2 goto l1;
+  edge e when not(x = 1 or x = 2);
+
+location l3:
+  edge e;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In location <code>l1</code>, monitor event <code>e</code> is always enabled (no guard implies
+a <code>true</code> guard), and thus no additional self loop is needed. In location
+<code>l2</code>, event <code>e</code> is only enabled if <code>x</code> has either value <code>1</code> or value
+<code>2</code>. A self loop is added for all other cases, to ensure the event is always
+enabled. In location <code>l3</code>, the event is never enabled (no edges, which
+essentially means guard <code>false</code>). A self loop is added, to ensure the event
+is always enabled.</p>
+</div>
+<div class="paragraph">
+<p>Event <code>f</code> is not a monitor event, and is thus not affected by this
+transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-11">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-12">Size considerations</h6>
+<div class="paragraph">
+<p>Since self loop edges may be added by this transformation, the size of the
+specification may increase.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-12">Optimality</h6>
+<div class="paragraph">
+<p>For an edge with guard <code>x = 1</code>, a self loop with guard <code>not (x = 1)</code> may
+be generated by this transformation. The guard could be simplified to
+<code>x != 1</code>. However, this transformation does not simplify guards. To further
+simplify the result, apply additional CIF to CIF transformations, such as
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation replaces implicit automaton <code>self</code> references
+by explicit automaton references.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-23">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-20">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-12">Implementation details</h6>
+<div class="paragraph">
+<p>All implicit automaton <code>self</code> references are replaced by explicit automaton
+references. For instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  alg string x = &lt;string&gt;self;
+
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This is transformed to the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton a:
+  alg string x = &lt;string&gt;a;
+
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-12">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-13">Size considerations</h6>
+<div class="paragraph">
+<p>Since both references are single expression nodes, this transformation does not
+increase the size of the specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-13">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-state-event-excl-invs">Eliminate state/event exclusion invariants</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates state/event exclusion invariants. It
+replaces them with automata with self loops.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-24">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-21">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-13">Implementation details</h6>
+<div class="paragraph">
+<p>All state/event exclusion invariants are removed from the specification.</p>
+</div>
+<div class="paragraph">
+<p>They are replaced with automata with self loops. Per component, the state/event
+exclusion invariants of the component (the top level scope of the
+specification, groups, automata), as well as those of its locations (only for
+automata), are partitioned per
+<a href="#lang-tut-extensions-synthesis-invkind">supervisory kind</a>. Per such
+partition, an automaton is created.</p>
+</div>
+<div class="paragraph">
+<p>The automaton is put along side the component (for groups and automata), as
+sibling. For invariants in the top level scope of the specification, the new
+automaton is put in the top level scope of the specification. The new automaton
+gets the same name as the component that contained the invariants as prefix,
+with some postfixes. For invariants at the top level scope of the
+specification, an empty prefix is used. The first postfix is indicates the
+supervisory kind of the invariants of the partition: <code>Plant</code>,
+<code>Requirement</code>, <code>Supervisor</code>, or empty for regular/kindless invariants.
+The second postfix is <code>StateEvtExcls</code>. So, for an automaton <code>Abc</code> with
+some plant invariants, an automaton <code>AbcPlantStateEvtExcls</code> is created. The
+name may conflict with existing automata or other declarations, in which case
+it is <a href="#tools-cif2cif-elim-state-event-excl-invs-renaming">renamed</a>.</p>
+</div>
+<div class="paragraph">
+<p>The automata that are created inherit the supervisory kind of the state/event
+exclusion invariants in the partition for which the automaton is created. The
+automata have a single nameless location, that is both initial and marked.</p>
+</div>
+<div class="paragraph">
+<p>For each state/event exclusion invariant in the partition, and self loop edge
+is created per event. The condition predicates of the invariants are used as
+guard, possible after some manipulation.</p>
+</div>
+<div class="paragraph">
+<p>For state/event exclusion invariants of the locations of automata, the
+condition predicate is made conditional on the location. However, this is only
+done for automata with at least two locations, as conditioning on an always
+active location is of little use. For a location <code>loc</code>, and a state/event
+exclusion invariant <code>invariant evt needs x = 1</code>, predicate <code>x = 1</code> is
+changed to <code>loc =&gt; x = 1</code>.</p>
+</div>
+<div class="paragraph">
+<p>For state/event exclusion invariants that indicate when an event is to be
+disallowed/disabled, the condition predicate is inverted. The inversion is
+performed after the condition predicate is made condition on the location, if
+applicable. For instance, for a state/event exclusion invariant
+<code>invariant x != 1 disables evt</code> in a location <code>loc</code>, the condition
+predicate <code>x != 1</code> is first made conditional on the location. This results in
+<code>loc =&gt; x != 1</code>. The condition predicate is then inverted to
+<code>not(loc =&gt; x != 1)</code>, which is then used as guard.</p>
+</div>
+<div class="paragraph">
+<p>The alphabets of the automata are left implicit.</p>
+</div>
+<div class="paragraph">
+<p>Consider the following example CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton aut:
+  controllable e1, e2, e3;
+  disc int[0..10] x;
+
+  requirement invariant e1    needs    x &lt; 10;
+  requirement invariant x = 0 disables {e1, e2};
+
+  location:
+    initial;
+
+    requirement invariant x = 0 disables e3;
+
+    edge e1 do x := x + 1;
+    edge e2 do x := x - 1;
+    edge e3 do x := 0;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is transformed to the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton aut:
+  controllable e1, e2, e3;
+  disc int[0..10] x;
+
+  location:
+    initial;
+
+    edge e1 do x := x + 1;
+    edge e2 do x := x - 1;
+    edge e3 do x := 0;
+end
+
+requirement automaton autRequirementStateEvtExcls:
+  location:
+    initial;
+    marked;
+
+    edge aut.e1 when aut.x &lt; 10, not(aut.x = 0);
+    edge aut.e2 when not(aut.x = 0);
+    edge aut.e3 when not(aut.x = 0);
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-elim-state-event-excl-invs-renaming">Renaming</h6>
+<div class="paragraph">
+<p>New automata are created. If the desired name for an automaton is already in
+use for some other automaton or declaration, the new automaton is given a
+different name. For instance, if an automaton is to be named
+<code>ControllerStateEvtExcls</code> and that name is already in use, it will be named
+<code>ControllerStateEvtExcls2</code>. If that name is also already in use, it will be
+named <code>ControllerStateEvtExcls3</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-14">Size considerations</h6>
+<div class="paragraph">
+<p>The constant amount of additional objects are created (e.g. an automaton, a
+location, a <code>true</code> initialization predicate, etc). At most one automaton is
+created per state/event exclusion invariant. As such, the size increase is
+linear in the number of state/event exclusion invariants.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-14">Optimality</h6>
+<div class="paragraph">
+<p>For state/event exclusion invariants that are defined in locations of automata
+with more than one location, this transformation makes their predicates
+conditional on those locations. To eliminate such location references, apply
+the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p>This transformation generate boolean implication and inversion predicates.
+These are not simplified. To simply them, apply the
+the <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> CIF to CIF transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-tau-event">Eliminate <code>tau</code> event</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates the <code>tau</code> event.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-25">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-22">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-14">Implementation details</h6>
+<div class="paragraph">
+<p>This transformation introduces new events for the <code>tau</code> event, one per
+automaton where a <code>tau</code> event is used. The new events are named <code>tau_</code> (if
+that name is not already in use).</p>
+</div>
+<div class="paragraph">
+<p>If the alphabet is explicit specified, it is extended as well.</p>
+</div>
+<div class="paragraph">
+<p>The new events are neither controllable nor uncontrollable, and don&#8217;t have a
+data type.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+
+  location l1:
+    initial;
+    edge when true goto l2;
+
+  location l2:
+    edge e, tau goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+  event tau_;
+
+  location l1:
+    initial;
+    edge tau_ when true goto l2;
+
+  location l2:
+    edge e, tau_ goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-13">Renaming</h6>
+<div class="paragraph">
+<p>The newly introduced <code>tau_</code> events are renamed to <code>tau_2</code>, <code>tau_3</code>, etc,
+if they conflict with other declarations with the same name, that already
+exist in the automata. If renaming is needed, a warning is printed to the
+console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-15">Size considerations</h6>
+<div class="paragraph">
+<p>New events may be added, the alphabet may be extended, and an explicit event
+may be added to edges. Therefore, the size of the specification may increase.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-15">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-tuple-field-projs">Eliminate tuple field projections</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates tuple field projections by replacing
+them with tuple index projections.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-26">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-23">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-15">Implementation details</h6>
+<div class="paragraph">
+<p>Obtaining the value of a field of a tuple is called tuple projection.
+There are two ways to project a tuple. That is, there are two ways to indicate
+from which field to obtain the value. The first way is to use the name of the
+field, the second way is to use the 0-based index of the field into the fields
+of the tuple&#8217;s type. For instance:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const tuple(int a; real b) t = (1, 2.0);
+const int x = t[a];
+const int y = t[0];</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, both constants <code>x</code> and <code>y</code> have value <code>1</code>, obtained from field
+<code>a</code> of the tuple value of constant <code>t</code>.</p>
+</div>
+<div class="paragraph">
+<p>This transformation replaces tuple field projections (using the name of the
+field), by tuple index projections (using the 0-based index of the field). For
+instance, for the example above, the result of this transformation is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const tuple(int a; real b) t = (1, 2.0);
+const int x = t[0];
+const int y = t[0];</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-14">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-16">Size considerations</h6>
+<div class="paragraph">
+<p>Since both field references and integer values are single expression nodes,
+this transformation does not increase the size of the specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-16">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-elim-type-decls">Eliminate type declarations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation eliminates type declarations.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-27">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-24">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-16">Implementation details</h6>
+<div class="paragraph">
+<p>All uses of type declarations (in types of variables, types of other type
+declarations, etc), are replaced by the types of those type declarations. The
+type declarations themselves are removed. For instance, the following
+specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">type t = int;
+type u = v;
+type v = tuple(t a, b);
+
+const t x = 1;
+const u y = (2, 3);
+const v z = (4, 5);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 1;
+const tuple(int a, b) y = (2, 3);
+const tuple(int a, b) z = (4, 5);</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-15">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-17">Size considerations</h6>
+<div class="paragraph">
+<p>Since type declarations are shortcuts for types, eliminating them could result
+in an increase of the size of the specification. Type declarations may be
+defined in terms of other type declarations. Therefore, in the worst case, the
+increase is exponential.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-17">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-lift-events">Lift events</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation lifts event declarations to the top level of the
+specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-28">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+<li>
+<p>Groups are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-25">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-groups">Eliminate groups</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-17">Implementation details</h6>
+<div class="paragraph">
+<p>All events declared in the automata, are lifted to the top level of the
+specification.</p>
+</div>
+<div class="paragraph">
+<p>In order to be able to track the origin of the events, they are named after
+their absolute names. For a group <code>x</code>, with a group <code>y</code>, with an
+event <code>e</code>, the absolute name of the event is <code>x.y.e</code>. The event is lifted
+to the top level of the specification, and named <code>x_y_e</code>.</p>
+</div>
+<div class="paragraph">
+<p>For instance, this specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+
+automaton a:
+  event e;
+  location;
+end
+
+group b:
+  automaton c:
+    event e;
+    location;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+event a_e;
+event b_c_e;
+
+automaton a:
+  location;
+end
+
+group b:
+  automaton c:
+    location;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-16">Renaming</h6>
+<div class="paragraph">
+<p>Since events of the automata are merged with the declarations of the
+specification, renaming may be necessary to ensure uniquely named declarations.
+For instance, for a group <code>x</code>, with a group <code>y</code>, with an event
+<code>e</code>, the absolute name of the event is <code>x.y.e</code>. The event is lifted to the
+top level of the specification, and renamed to <code>x_y_e</code>. However, if the
+specification already contains a declaration of a constant, automaton, other
+event, etc, named <code>x_y_e</code>, then the lifted event is renamed to <code>x_y_e2</code>
+instead. If that name is also already in use, it is renamed to <code>x_y_e3</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>Whenever renaming takes place, a warning is be printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-18">Size considerations</h6>
+<div class="paragraph">
+<p>Events are lifted, which essentially means they are moved. The size of the
+specification does not increase.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-18">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-linearize-merge">Linearize (merge)</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation performs process-algebraic linearization,
+thereby eliminating parallel composition and event synchronization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-29">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Specifications without automata are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-26">Preprocessing</h6>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-pos-info">Remove position information</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-groups">Eliminate groups</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-switches-to-ifs">Convert <code>switch</code> expressions to <code>if</code> expressions</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-equations">Eliminate equations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-aut-casts">Eliminate automata to string casts</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-18">Implementation details</h6>
+<div class="paragraph">
+<p>A location pointer variable is introduced for each original automaton, and the
+use of locations in expressions is eliminated. This is mostly similar to what
+the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF transformation does,
+except that for instance location pointer variables are added for all automata.
+For nameless locations, name <code>X</code> is used.</p>
+</div>
+<div class="paragraph">
+<p>One new automaton, named <code>M</code>, is created. If all original automata have
+the same supervisory kind, the new automaton gets this kind as well. Otherwise,
+it gets no supervisory kind. The alphabet of this new automaton is the union of
+alphabets of the original automata, including the events that are used to
+send or receive in any of the automata.</p>
+</div>
+<div class="paragraph">
+<p>All declarations from the original automata are moved to the new automaton.
+They are renamed based on their absolute names. That is, for an automaton <code>a</code>
+with a constant <code>c</code>, the absolute name of the constant is <code>a.c</code> and the
+moved constant will be named <code>a_c</code>. Enumeration literals are not given
+absolute names, and keep their original names
+<a href="#tools-cif2cif-linearize-merge-renaming">if possible</a>.</p>
+</div>
+<div class="paragraph">
+<p>One location, named <code>L</code>, is added. This location is both initial and marked.
+All initialization and marker predicates from all the original automata
+(including ones from locations) are merged together. They are put in the new
+automaton, and restrict the initialization and marker predicates of location
+<code>L</code>.</p>
+</div>
+<div class="paragraph">
+<p>The invariants of the original automata (including ones from locations) are
+merged together in a similar way as the initialization and marker predicates.
+The supervisory kinds of the invariants are made explicit, to ensure that the
+original supervisory kinds inherited from automata are preserved.</p>
+</div>
+<div class="paragraph">
+<p>For the <code>tau</code> event, a self loop is created per original <code>tau</code> edge. For
+all other events, the edges are merged, resulting in a single self loop for
+each non-<code>tau</code> event. By creating single edges per non-<code>tau</code> event,
+<a href="#tools-cif2cif-linearize-merge-nondet">non-deterministic choice</a> may be
+eliminated, ensuring that the model size of the resulting specification is
+near-linear <a href="#tools-cif2cif-linearize-merge-size">compared to</a> the model
+size of the original specification.</p>
+</div>
+<div class="paragraph">
+<p>Monitors are taken into account when merging the guards of the edges, resulting
+in simpler guard predicates. Communication is eliminated altogether, and events
+no longer have data types after linearization. For edges with receives, the
+'received value' is replaced (in the updates) by the 'send value'.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+
+plant automaton p:
+  disc int x = 1;
+
+  location l1:
+    initial;
+    edge e when x = 1 do x := 2 goto l2;
+
+  location l2:
+    edge e when x = 2 do x := 1 goto l1;
+end
+
+plant automaton q:
+  location l1:
+    initial;
+    edge tau goto l2;
+
+  location l2:
+    edge e goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+enum E = l1, l2;
+
+plant automaton M:
+  alphabet e;
+
+  disc int p_x = 1;
+  disc E p = l1;
+  disc E q = l1;
+
+  initial p = l1 and true or p = l2 and false,
+          q = l1 and true or q = l2 and false;
+
+  marked p = l1 and false or p = l2 and false,
+         q = l1 and false or q = l2 and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge e when (p = l1 and p_x = 1 or p = l2 and p_x = 2) and
+                (q = l1 and false or q = l2 and true)
+           do if   p = l1 and p_x = 1: p_x := 2, p := l2
+              elif p = l2 and p_x = 2: p_x := 1, p := l1
+              end,
+              q := l1;
+    edge tau when q = l1 do q := l2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We see that an enumeration <code>E</code> is added, with literals for all the locations
+of the original automata. We also see that plant automata <code>p</code> and <code>q</code> are
+linearized to plant automaton <code>M</code>. Two location pointers, <code>p</code> and <code>q</code>,
+named after the original automata, are added. The variables are moved. The
+initialization and marker predicates are linearized. We have one location
+<code>L</code>, which is initial and marked. For event <code>e</code>, the guards and updates are
+linearized into a single self loop. Location pointer updates are incorporated
+as well. For event <code>tau</code>, the single original edge is simply included as a
+self loop.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-cif2cif-linearize-merge-nondet">Non-determinism</h7>
+<div class="paragraph">
+<p>If the original automata have non-determinism, this choice is eliminated as
+part of this transformation. Non-determinism can be present due to multiple
+outgoing edges for a single location, for the same event (excluding the
+<code>tau</code> event), with overlapping guards. Another cause of non-determinism is
+multiple senders or receivers that are enabled at the same time, for the same
+channel. In the resulting specification, the first possible transition is
+always taken, similar to how the simulator chooses, assuming the simulator is
+configured to always automatically choose the
+<a href="#tools-cifsim-input-chapter-automatic">first transition</a>. Linearization eliminates some of the
+non-determinism in this case, essentially choosing a specific trace through
+the state space. To ensure the same choices are made, events and automata are
+sorted in the same order for linearization and simulation.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+  disc int x = 0;
+
+  location:
+    edge e when x &lt; 5 do x := x + 1;
+    edge e when x &gt; 3 do x := x - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = X;
+
+automaton M:
+  alphabet p_e;
+
+  event p_e;
+
+  disc int p_x = 0;
+  disc E p in any;
+
+  initial p = X and false;
+  marked p = X and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge p_e when p = X and (p_x &lt; 5 or p_x &gt; 3)
+             do if   p = X and p_x &lt; 5: p_x := p_x + 1
+                elif p = X and p_x &gt; 3: p_x := p_x - 1
+                end;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, we see that the edge for event <code>e</code> with guard <code>x &lt; 5</code> and update
+<code>x := x + 1</code> is chosen to take precedence over the edge with guard <code>x &gt; 3</code>
+with update <code>x := x - 1</code>. This choice is based on the original specification,
+where the edge with guard <code>x &lt; 5</code> is listed before the edge with guard
+<code>x &gt; 3</code>.</p>
+</div>
+<div class="paragraph">
+<p>Related to this, are dummy updates, which are added to ensure that the correct
+updates are taken. For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+  disc int x = 0;
+  location:
+    edge e when x &gt;= 3;
+    edge e when x &lt; 3 do x := x + 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = X;
+
+automaton M:
+  alphabet p_e;
+  event p_e;
+
+  disc int p_x = 0;
+  disc E p in any;
+
+  initial p = X and false;
+  marked p = X and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge p_e when p = X and (p_x &gt;= 3 or p_x &lt; 3)
+             do if   p = X and p_x &gt;= 3: p := X
+                elif p = X and p_x &lt; 3:  p_x := p_x + 1
+                end;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, the edge with guard <code>x &gt;= 3</code> takes precedence over the edge with guard
+<code>x &lt; 3</code>. To ensure that no updates are performed when the edge with guard
+<code>x &gt;= 3</code> is chosen, a dummy update is added (reassigning the location pointer
+variable the value it already has). If this update were to be omitted, the
+update of the other edge would instead be executed, which is undesirable.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-order">Order</h7>
+<div class="paragraph">
+<p>If code generation is performed on a linearized version of the specification,
+it may be a good idea to ensure the same order is used and the same choices
+are made, both in the generated code and in simulation. Assuming simulation
+was performed by always automatically choosing the
+<a href="#tools-cifsim-input-chapter-automatic">first transition</a>, this should correspond to the output of
+linearization. The linearized edges are in the same order as the transitions
+are calculated by the simulator. This is ensured by sorting events and automata
+in the same order for linearization and simulation. Also, as the
+<a href="#tools-cif2cif-linearize-merge-nondet">Non-determinism</a> section above explains, if
+non-determinism is eliminated, it is done in a way that preserves that order.</p>
+</div>
+<div class="paragraph">
+<p>Code should thus be generated in the order of the linearized edges resulting
+from linearization. Each time the code for an edge is executed, the code should
+start from the top, to ensure always the first enabled transition is chosen.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-urgency">Urgency</h7>
+<div class="paragraph">
+<p>If the original automata contain urgent locations and/or urgent edges, a
+discrete boolean variable <code>u</code> is added to the linearized automaton.
+Initially, it&#8217;s value is <code>true</code>, and it must always remain so
+(<code>plant invariant u;</code>). We add self loops (event <code>tau</code>), with as guard the
+urgent locations and guards of urgent edges, such that the edge can be taken if
+the system is in an urgent location, or an urgent edge is enabled (guard wise).
+However, these edges update <code>u</code> to <code>false</code>, which violates the target
+location invariant, meaning we can never take these edges in a transition.
+Since the edge is also urgent, it means that if the edge is enabled guard wise,
+time may not progress, thus ensuring the urgency behavior of the original
+urgent locations and edges.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+
+  location l1:
+    initial;
+    urgent;
+    edge e when true goto l2;
+
+  location l2:
+    edge e when 1 = 1 now goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = l1, l2;
+
+automaton M:
+  alphabet p_e;
+  event p_e;
+
+  disc E p = l1;
+  disc bool u = true;
+
+  initial p = l1 and true or p = l2 and false;
+  marked p = l1 and false or p = l2 and false;
+
+  plant invariant u;
+
+  location L:
+    initial;
+    marked;
+
+    edge p_e when p = l1 and true or p = l2 and 1 = 1
+             do if   p = l1 and true:  p := l2
+                elif p = l2 and 1 = 1: p := l1
+                end;
+
+    edge when p = l1 or p = l2 and 1 = 1 now do u := false;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>So, if <code>p</code> (the location pointer variable for original automaton <code>p</code>) is
+equal to <code>l1</code> (the enumeration literal for original location <code>l1</code>), then
+the guard of the new urgent edge is enabled, and time may not progress.
+Similarly, if <code>p</code> is equal to <code>l2</code> and the guard <code>1 = 1</code> of the original
+urgent edge is enabled, the guard of the new urgent edge is enabled, and time
+may not progress. This correctly reflects the urgency conditions of the
+original specification.</p>
+</div>
+<div class="paragraph">
+<p>To ensure that no additional event transitions are possible, the new urgent
+edge can never be taken, as it would update <code>u</code> to <code>false</code>, which violates
+<code>plant invariant u</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-received-values-and-tuple-field-projections">Received values and tuple field projections</h7>
+<div class="paragraph">
+<p>The following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event tuple(int a, b) e;
+
+automaton s:
+  location:
+    edge e!(1, 2);
+end
+
+automaton r:
+  disc int x;
+  location:
+    edge e? do x := ?[a];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+enum E = X;
+
+automaton M:
+  alphabet e;
+
+  disc E s in any;
+  disc int r_x;
+  disc E r in any;
+
+  initial s = X and false,
+          r = X and false;
+  marked s = X and false,
+         r = X and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge e when s = X and true and (r = X and true) do r_x := (1, 2)[0];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Observe how event <code>e</code> no longer has a data type, and the communication (send
+and receive) have been eliminated. In the assignment <code>x := ?[a]</code>, received
+value <code>?</code> has been replaced by send value <code>(1, 2)</code>. Since tuple values
+don&#8217;t have field names, the right hand side <code>(1, 2)[a]</code> has been replaced
+by <code>(1, 2)[0]</code>, using the <a href="#tools-cif2cif-chapter-elim-tuple-field-projs">Eliminate tuple field projections</a> CIF to
+CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-elimination-of-communication">Elimination of communication</h7>
+<div class="paragraph">
+<p>Since channel communication is completely eliminated, and channels become
+regular events after this transformation, it is no longer possible to
+<a href="#tools-chapter-mergecif">merge</a> additional senders/receivers with the linearized
+specification. If you wish to merge another specification with additional
+communication partners, first perform the merging, and then the linearization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-linearize-merge-renaming">Renaming</h6>
+<div class="paragraph">
+<p>Since declarations are moved/merged, and new names are introduced, renaming may
+be necessary to ensure unique names within a single scope. In order to reduce
+the amount of renaming for the enumeration literals introduced for the
+locations of the original automata, all enumerations are merged together into a
+single enumeration in the specification, with name <code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>If renaming is performed, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-linearize-merge-size">Size considerations</h6>
+<div class="paragraph">
+<p>Declarations are moved, so they don&#8217;t increase the size of the specification.</p>
+</div>
+<div class="paragraph">
+<p>The addition of location variables increases the size of the specification, but
+this is linear in the number of automata and the number of locations.</p>
+</div>
+<div class="paragraph">
+<p>Assignment are added for the updates to the location pointers. The increase is
+linear in the number of edges. The additional dummy updates that are added are
+linear in the number of edges as well.</p>
+</div>
+<div class="paragraph">
+<p>A single self loop is added for each non-<code>tau</code> event. This does increase the
+size of the specification. The guards are simply combined using boolean
+operators, and the increase is therefore linear in the number of guards.
+Similarly, updates are combined using 'if' updates, and the increase is also
+linear.</p>
+</div>
+<div class="paragraph">
+<p>For original edges with multiple events however, the guards and updates are
+duplicated for each event. The duplication is linear in the number of events
+on those edges.</p>
+</div>
+<div class="paragraph">
+<p>Since <code>tau</code> edges are essentially just moved, they don&#8217;t increase the size
+of the specification. That is, their size is linear in the number of original
+<code>tau</code> edges.</p>
+</div>
+<div class="paragraph">
+<p>The initialization and marker predicates, as well as the invariants are moved.
+They remain linear in size related to the number of original predicates. The
+predicates for the locations are also made conditional on the values of the
+location pointer variable. This size increase is linear in the number of
+original locations. Predicates are combined using boolean operators, leading
+to a size increase that is linear in the number of original predicates.</p>
+</div>
+<div class="paragraph">
+<p>If a single received value is used multiple times in the updates of a single
+edge, the send value is duplicated for each of those uses. As such, the size
+increase is linear in the number of uses of the received value.</p>
+</div>
+<div class="paragraph">
+<p>If multiple senders and multiple receivers (individual send/receive edges, not
+whole automata) are present for a certain event, then the received value is
+expanded to all the potential send values, with the conditions under which they
+are used as send value (using an 'if' expression). As such, the received
+value are expanded into expressions that are linear in the number of senders.
+If we have only a single sender or a single receiver, this is linear. If we
+have multiple of both, this becomes quadratic (number of senders times number
+of receivers).</p>
+</div>
+<div class="paragraph">
+<p>For urgency, an additional variable and invariant are added. This is a constant
+increase in size. A self loop is added as well. This self loop duplicates
+the guards of urgent edges. It also includes predicates for the urgent
+locations. The size of this edge is linear in the number of urgent locations,
+and the guards of the urgent edges.</p>
+</div>
+<div class="paragraph">
+<p>From the above, it should be clear that while the specification may increase
+in size, it is mostly linear. Practically, the size of the linearized
+specification is usually linear compared to the size of the input
+specification.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-19">Optimality</h6>
+<div class="paragraph">
+<p>As should be clear from the examples above, this transformation does not try
+to generate optimized expressions. In fact, often almost all generated
+expressions can easily be simplified. To further simplify the result, apply
+additional CIF to CIF transformations, such as
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+<div class="paragraph">
+<p>Currently, no effort is made by this transformation to reduce for instance the
+number of dummy assignments, or the number of replacements of tuple field
+projections by tuple index projections.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-linearize-product">Linearize (product)</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation performs process-algebraic linearization,
+thereby eliminating parallel composition and event synchronization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-30">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Specifications without automata are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-27">Preprocessing</h6>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-pos-info">Remove position information</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-groups">Eliminate groups</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-switches-to-ifs">Convert <code>switch</code> expressions to <code>if</code> expressions</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-equations">Eliminate equations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-aut-casts">Eliminate automata to string casts</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-19">Implementation details</h6>
+<div class="paragraph">
+<p>A location pointer variable is introduced for each original automaton, and the
+use of locations in expressions is eliminated. This is mostly similar to what
+the <a href="#tools-cif2cif-chapter-elim-locs-in-exprs">Eliminate the use of locations in expressions</a> CIF to CIF transformation does,
+except that for instance location pointer variables are added for all automata.
+For nameless locations, name <code>X</code> is used.</p>
+</div>
+<div class="paragraph">
+<p>One new automaton, named <code>M</code>, is created. If all original automata have
+the same supervisory kind, the new automaton gets this kind as well. Otherwise,
+it gets no supervisory kind. The alphabet of this new automaton is the union of
+alphabets of the original automata, including the events that are used to
+send or receive in any of the automata.</p>
+</div>
+<div class="paragraph">
+<p>All declarations from the original automata are moved to the new automaton.
+They are renamed based on their absolute names. That is, for an automaton <code>a</code>
+with a constant <code>c</code>, the absolute name of the constant is <code>a.c</code> and the
+moved constant will be named <code>a_c</code>. Enumeration literals are not given
+absolute names, and keep their original names
+<a href="#tools-cif2cif-linearize-product-renaming">if possible</a>.</p>
+</div>
+<div class="paragraph">
+<p>One location, named <code>L</code>, is added. This location is both initial and marked.
+All initialization and marker predicates from all the original automata
+(including ones from locations) are merged together. They are put in the new
+automaton, and restrict the initialization and marker predicates of location
+<code>L</code>.</p>
+</div>
+<div class="paragraph">
+<p>The invariants of the original automata (including ones from locations) are
+merged together in a similar way as the initialization and marker predicates.
+The supervisory kinds of the invariants are made explicit, to ensure that the
+original supervisory kinds inherited from automata are preserved.</p>
+</div>
+<div class="paragraph">
+<p>For the <code>tau</code> event, a self loop is created per original <code>tau</code> edge. For
+all other events, the
+<a href="http://en.wikipedia.org/wiki/Cartesian_product">Cartesian product</a>
+of all
+edges is created, combining the edges in all possible combinations. This
+results in self loops for all non-<code>tau</code> events, where the combination of all
+self loops maintains all non-deterministic choices of the original
+specification. Worst case, the model size of the resulting specification
+compared to the model size of the original specification
+<a href="#tools-cif2cif-linearize-product-size">could blow up</a> exponentially.</p>
+</div>
+<div class="paragraph">
+<p>Monitors are taken into account when merging the guards of the edges, resulting
+in simpler guard predicates. Communication is eliminated altogether, and events
+no longer have data types after linearization. For edges with receives, the
+'received value' is replaced (in the updates) by the 'send value'.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+
+plant automaton p:
+  disc int x = 1;
+
+  location l1:
+    initial;
+    edge e when x = 1 do x := 2 goto l2;
+
+  location l2:
+    edge e when x = 2 do x := 1 goto l1;
+end
+
+plant automaton q:
+  location l1:
+    initial;
+    edge tau goto l2;
+
+  location l2:
+    edge e goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+enum E = l1, l2;
+
+plant automaton M:
+  alphabet e;
+
+  disc int p_x = 1;
+  disc E p = l1;
+  disc E q = l1;
+
+  initial p = l1 and true or p = l2 and false,
+          q = l1 and true or q = l2 and false;
+
+  marked p = l1 and false or p = l2 and false,
+         q = l1 and false or q = l2 and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge e when p = l1 and p_x = 1 and q = l2
+           do p_x := 2, p := l2, q := l1;
+    edge e when p = l2 and p_x = 2 and q = l2
+           do p_x := 1, p := l1, q := l1;
+    edge tau when q = l1 do q := l2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>We see that an enumeration <code>E</code> is added, with literals for all the locations
+of the original automata. We also see that plant automata <code>p</code> and <code>q</code> are
+linearized to plant automaton <code>M</code>. Two location pointers, <code>p</code> and <code>q</code>,
+named after the original automata, are added. The variables are moved. The
+initialization and marker predicates are linearized. We have one location
+<code>L</code>, which is initial and marked. For event <code>e</code>, two self loop edges are
+added, as automaton <code>p</code> has two edges for <code>e</code> and automaton <code>q</code> has one
+edge for <code>e</code> and <code>2 * 1</code> is <code>2</code>. For the self loop edges, the guards and
+updates are combined. Location pointer updates are incorporated as well. For
+event <code>tau</code>, the single original edge is simply included as a self loop.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect6">
+<h7 id="tools-non-determinism">Non-determinism</h7>
+<div class="paragraph">
+<p>If the original automata have non-determinism, this choice is maintained as
+part of this transformation. Non-determinism can be present due to multiple
+outgoing edges for a single location, for the same event (excluding the
+<code>tau</code> event), with overlapping guards. Another cause of non-determinism is
+multiple senders or receivers that are enabled at the same time, for the same
+channel. In the resulting specification, all possible combinations are
+included as self loops. For a specification with 4 sender automata with two
+send edges each (8 send edges in total) and 5 receiver automata with two
+receive edges each (10 receive edges in total) for event <code>e</code>, and also 6
+automata with two edges each that synchronize over that event (12
+synchronization edges in total), the number of possible combinations for
+communication with synchronization is <code>8 * 10 * 12</code>, which is <code>960</code>
+possible combinations.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+
+automaton p:
+  disc int x = 0;
+
+  location:
+    edge e when x &lt; 5 do x := x + 1;
+    edge e when x &gt; 3 do x := x - 1;
+end
+
+automaton q:
+  disc int y = 0;
+
+  location:
+    edge e when y &lt; 5 do y := y + 1;
+    edge e when y &gt; 3 do y := y - 1;
+    edge e when y = 4 do y := y - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+
+enum E = X;
+
+automaton M:
+  alphabet e;
+
+  disc int p_x = 0;
+  disc E p in any;
+  disc int q_y = 0;
+  disc E q in any;
+
+  initial p = X and false,
+          q = X and false;
+
+  marked p = X and false,
+         q = X and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge e when p = X and p_x &lt; 5 and q = X and q_y &lt; 5
+           do p_x := p_x + 1, q_y := q_y + 1;
+    edge e when p = X and p_x &lt; 5 and q = X and q_y &gt; 3
+           do p_x := p_x + 1, q_y := q_y - 1;
+    edge e when p = X and p_x &lt; 5 and q = X and q_y = 4
+           do p_x := p_x + 1, q_y := q_y - 1;
+    edge e when p = X and p_x &gt; 3 and q = X and q_y &lt; 5
+           do p_x := p_x - 1, q_y := q_y + 1;
+    edge e when p = X and p_x &gt; 3 and q = X and q_y &gt; 3
+           do p_x := p_x - 1, q_y := q_y - 1;
+    edge e when p = X and p_x &gt; 3 and q = X and q_y = 4
+           do p_x := p_x - 1, q_y := q_y - 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here, we see that for event <code>e</code>, automaton <code>p</code> has two edges and automaton
+<code>q</code> has three edges. The linearization result has six edges.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-order-2">Order</h7>
+<div class="paragraph">
+<p>If code generation is performed on a linearized version of the specification,
+it may be a good idea to ensure the same order is used and the same choices
+are made, both in the generated code and in simulation. Assuming simulation
+was performed by always automatically choosing the
+<a href="#tools-cifsim-input-chapter-automatic">first transition</a>, this should correspond to the output of
+linearization. The linearized edges are in the same order as the transitions
+are calculated by the simulator. This is ensured by sorting events and automata
+in the same order for linearization and simulation.</p>
+</div>
+<div class="paragraph">
+<p>Code should thus be generated in the order of the linearized edges resulting
+from linearization. Each time the code for an edge is executed, the code should
+start from the top, to ensure always the first enabled transition is chosen.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-urgency-2">Urgency</h7>
+<div class="paragraph">
+<p>If the original automata contain urgent locations and/or urgent edges, a
+discrete boolean variable <code>u</code> is added to the linearized automaton.
+Initially, it&#8217;s value is <code>true</code>, and it must always remain so
+(<code>plant invariant u;</code>). We add self loops (event <code>tau</code>), with as guard the
+urgent locations and guards of urgent edges, such that the edge can be taken if
+the system is in an urgent location, or an urgent edge is enabled (guard wise).
+However, these edges update <code>u</code> to <code>false</code>, which violates the target
+location invariant, meaning we can never take these edges in a transition.
+Since the edge is also urgent, it means that if the edge is enabled guard wise,
+time may not progress, thus ensuring the urgency behavior of the original
+urgent locations and edges.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">automaton p:
+  event e;
+
+  location l1:
+    initial;
+    urgent;
+    edge e when true goto l2;
+
+  location l2:
+    edge e when 1 = 1 now goto l1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = l1, l2;
+
+automaton M:
+  alphabet p_e;
+  event p_e;
+
+  disc E p = l1;
+  disc bool u = true;
+
+  initial p = l1 and true or p = l2 and false;
+  marked p = l1 and false or p = l2 and false;
+
+  plant invariant u;
+
+  location L:
+    initial;
+    marked;
+
+    edge p_e when p = l1 and true do p := l2;
+    edge p_e when p = l2 and 1 = 1 do p := l1;
+
+    edge when p = l1 or p = l2 and 1 = 1 now do u := false;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>So, if <code>p</code> (the location pointer variable for original automaton <code>p</code>) is
+equal to <code>l1</code> (the enumeration literal for original location <code>l1</code>), then
+the guard of the new urgent edge is enabled, and time may not progress.
+Similarly, if <code>p</code> is equal to <code>l2</code> and the guard <code>1 = 1</code> of the original
+urgent edge is enabled, the guard of the new urgent edge is enabled, and time
+may not progress. This correctly reflects the urgency conditions of the
+original specification.</p>
+</div>
+<div class="paragraph">
+<p>To ensure that no additional event transitions are possible, the new urgent
+edge can never be taken, as it would update <code>u</code> to <code>false</code>, which violates
+<code>plant invariant u</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-received-values-and-tuple-field-projections-2">Received values and tuple field projections</h7>
+<div class="paragraph">
+<p>The following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event tuple(int a, b) e;
+
+automaton s:
+  location:
+    edge e!(1, 2);
+end
+
+automaton r:
+  disc int x;
+  location:
+    edge e? do x := ?[a];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">event e;
+enum E = X;
+
+automaton M:
+  alphabet e;
+
+  disc E s in any;
+  disc int r_x;
+  disc E r in any;
+
+  initial s = X and false,
+          r = X and false;
+  marked s = X and false,
+         r = X and false;
+
+  location L:
+    initial;
+    marked;
+
+    edge e when s = X and r = X do r_x := (1, 2)[0];
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Observe how event <code>e</code> no longer has a data type, and the communication (send
+and receive) have been eliminated. In the assignment <code>x := ?[a]</code>, received
+value <code>?</code> has been replaced by send value <code>(1, 2)</code>. Since tuple values
+don&#8217;t have field names, the right hand side <code>(1, 2)[a]</code> has been replaced
+by <code>(1, 2)[0]</code>, using the <a href="#tools-cif2cif-chapter-elim-tuple-field-projs">Eliminate tuple field projections</a> CIF to
+CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect6">
+<h7 id="tools-elimination-of-communication-2">Elimination of communication</h7>
+<div class="paragraph">
+<p>Since channel communication is completely eliminated, and channels become
+regular events after this transformation, it is no longer possible to
+<a href="#tools-chapter-mergecif">merge</a> additional senders/receivers with the linearized
+specification. If you wish to merge another specification with additional
+communication partners, first perform the merging, and then the linearization.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-linearize-product-renaming">Renaming</h6>
+<div class="paragraph">
+<p>Since declarations are moved/merged, and new names are introduced, renaming may
+be necessary to ensure unique names within a single scope. In order to reduce
+the amount of renaming for the enumeration literals introduced for the
+locations of the original automata, all enumerations are merged together into a
+single enumeration in the specification, with name <code>E</code>.</p>
+</div>
+<div class="paragraph">
+<p>If renaming is performed, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-cif2cif-linearize-product-size">Size considerations</h6>
+<div class="paragraph">
+<p>Declarations are moved, so they don&#8217;t increase the size of the specification.</p>
+</div>
+<div class="paragraph">
+<p>The addition of location variables increases the size of the specification, but
+this is linear in the number of automata and the number of locations.</p>
+</div>
+<div class="paragraph">
+<p>Assignment are added for the updates to the location pointers. The increase is
+linear in the number of edges.</p>
+</div>
+<div class="paragraph">
+<p>Since <code>tau</code> edges are essentially just moved, they don&#8217;t increase the size
+of the specification. That is, their size is linear in the number of original
+<code>tau</code> edges.</p>
+</div>
+<div class="paragraph">
+<p>Multiple self loops may be added for non-<code>tau</code> event, and thus may result in
+an exponential blow up of the number of edges.</p>
+</div>
+<div class="paragraph">
+<p>The initialization and marker predicates, as well as the invariants are moved.
+They remain linear in size related to the number of original predicates. The
+predicates for the locations are also made conditional on the values of the
+location pointer variable. This size increase is linear in the number of
+original locations. Predicates are combined using boolean operators, leading
+to a size increase that is linear in the number of original predicates.</p>
+</div>
+<div class="paragraph">
+<p>If a single received value is used multiple times in the updates of a single
+edge, the send value is duplicated for each of those uses. As such, the size
+increase is linear in the number of uses of the received value.</p>
+</div>
+<div class="paragraph">
+<p>For urgency, an additional variable and invariant are added. This is a constant
+increase in size. A self loop is added as well. This self loop duplicates
+the guards of urgent edges. It also includes predicates for the urgent
+locations. The size of this edge is linear in the number of urgent locations,
+and the guards of the urgent edges.</p>
+</div>
+<div class="paragraph">
+<p>From the above, it should be clear that due to the exponential blow up of the
+edges, linearization results can be significantly larger than the original
+specifications.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-20">Optimality</h6>
+<div class="paragraph">
+<p>As should be clear from the examples above, this transformation does not try
+to generate optimized expressions. In fact, often almost all generated
+expressions can easily be simplified. To further simplify the result, apply
+additional CIF to CIF transformations, such as
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>.</p>
+</div>
+<div class="paragraph">
+<p>Currently, no effort is made by this transformation to reduce for instance the
+number of replacements of tuple field projections by tuple index projections.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-merge-enums">Merge enumerations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation merges all enumerations together to a single
+enumeration.</p>
+</div>
+<div class="paragraph">
+<p>See also: <a href="#tools-cif2cif-chapter-elim-enums">Eliminate enumerations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-31">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-28">Preprocessing</h6>
+<div class="paragraph">
+<p>To increase the subset of specifications that can be transformed, apply
+the following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order) prior to using this transformation:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+automatically applied as preprocessing (in the given order), to increase the
+subset of CIF specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-20">Implementation details</h6>
+<div class="paragraph">
+<p>If there are any enumerations in the specification, a single new enumeration
+is created. This enumeration is named <code>E</code>. All literals of the original
+enumerations are added to this new enumeration. Obviously, duplicate literals
+are only included once. The literals are added in sorted order.</p>
+</div>
+<div class="paragraph">
+<p>The original enumerations are removed.</p>
+</div>
+<div class="paragraph">
+<p>For instance, the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum A = B, C;
+
+automaton p:
+  enum A = C, B;
+  enum X = D, C;
+  disc A a = C;
+  disc X x = D;
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = B, C, D;
+
+automaton p:
+  disc E a = C;
+  disc E x = D;
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-17">Renaming</h6>
+<div class="paragraph">
+<p>The newly created enumeration <code>E</code> and its literals, may conflict with
+declarations already present in the specification. If this is the case, they
+are renamed. For instance, if <code>E</code> is already in use, <code>E2</code>, or <code>E3</code>, etc,
+is used instead. If renaming is performed, a warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p>In general, renaming of enumeration literals may influence value equality for
+<em>compatible</em> enumerations (enumerations with the same number of literals, with
+the same names, in the same order). However, since the resulting specification
+has at most one enumeration, there are no multiple enumerations, and thus
+compatibility is not an issue (since the enumeration is always compatible with
+itself).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-default-initial-values">Default initial values</h6>
+<div class="paragraph">
+<p>Consider the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group g1:
+  enum e1 = A, B;
+end
+
+group g2:
+  enum e2 = B, A;
+end
+
+automaton p:
+  disc g1.e1 v1;
+  disc g2.e2 v2;
+
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If we apply merging of enumerations directly, we get the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">enum E = A, B;
+
+group g1:
+end
+
+group g2:
+end
+
+automaton p:
+  disc E v1;
+  disc E v2;
+
+  location:
+    initial;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the original specification, <code>v1</code> had value <code>A</code>, and <code>v2</code> had value
+<code>B</code>. After the merging of the enumerations, both <code>v1</code> and <code>v2</code> have
+implicit initial value <code>A</code>. Thus, they had different initial values
+beforehand, and the same initial values afterward. To solve this problem, the
+<a href="#tools-cif2cif-chapter-add-default-init-values">Add default initial values</a> CIF to CIF transformation is
+automatically applied as preprocessing before the actual elimination of the
+enumerations, to ensure that the explicit initial values are properly
+transformed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-19">Size considerations</h6>
+<div class="paragraph">
+<p>Since enumerations are merged, duplicate literals become a single new literal.
+Therefore, this transformation may decrease the size of the specification.</p>
+</div>
+<div class="paragraph">
+<p>The added default initial values may significantly increase the size of the
+specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-21">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-print-file-into-decls">Push print file declarations into print declarations</h5>
+<div class="paragraph">
+<p>
+
+
+
+This CIF to CIF transformation pushes
+<a href="#tools-cifsim-output-print-chapter-ref-printfile">print file declarations</a>
+inwards into the
+<a href="#tools-cifsim-output-print-chapter-ref-printdecl">print declarations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-32">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-29">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-21">Implementation details</h6>
+<div class="paragraph">
+<p>All <a href="#tools-cifsim-output-print-chapter-ref-printfile">print file declarations</a>
+specified in the top level scope of the specification, in groups, and in
+automata, are removed. The
+<a href="#tools-cifsim-output-print-chapter-ref-printdecl">print declarations</a> to which
+they applied, each get a local print file declaration instead. If they already
+had a local print file declaration, the print declaration is not changed.
+Print declarations to which no print file declaration applies, get the default
+target <code>":stdout"</code>.</p>
+</div>
+<div class="paragraph">
+<p>For instance, this specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">printfile &quot;out1.txt&quot;;
+
+print 5;
+print 6 file &quot;out2.txt&quot;;
+
+group g:
+  printfile &quot;out3.txt&quot;;
+
+  print 7;
+  print 8;
+  print 9 file &quot;out4.txt&quot;;
+
+  group h:
+    printfile &quot;out5.txt&quot;;
+  end
+
+  group i:
+    print 10;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">print 5 file &quot;out1.txt&quot;;
+print 6 file &quot;out2.txt&quot;;
+
+group g:
+  print 7 file &quot;out3.txt&quot;;
+  print 8 file &quot;out3.txt&quot;;
+  print 9 file &quot;out4.txt&quot;;
+
+  group h:
+  end
+
+  group i:
+    print 10 file &quot;out3.txt&quot;;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The print declaration that prints <code>5</code> is declared in the top level scope of
+the specification, and does not have a local print file declaration. As such,
+the print file declaration from the top level scope (<code>out1.txt</code>) is pushed
+inwards into the print declaration. The print declaration that prints <code>6</code> is
+declared in the same scope, but already has a local print file declaration
+(<code>out2.txt</code>), and is thus not changed.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g</code> also has an print file declaration (<code>out3.txt</code>). This is pushed
+inwards to the print declarations that print <code>7</code> and <code>8</code>, as they are
+declared in the same scope, and don&#8217;t have local print file declarations. The
+print declaration that prints <code>9</code> is not changed, as it already has a local
+print file declaration (<code>out4.txt</code>).</p>
+</div>
+<div class="paragraph">
+<p>The print file declaration (<code>out5.txt</code>) from group <code>g.h</code> does not apply to
+any print declarations, and thus gets lost.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g.i</code> does not have an print file declaration, so the print declaration
+that prints <code>10</code>, which is declared in that group, gets the print file
+declaration from group <code>g</code> (the parent scope of group <code>g.i</code>) instead.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-18">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-20">Size considerations</h6>
+<div class="paragraph">
+<p>As print file declarations may apply to multiple print declarations, this
+transformation may increase the number of (local) print file declarations in
+the specification. The number of print file declarations after the
+transformation is at most the number of print declarations, and as such the
+increase is at most linear in the number of print declarations as well.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-22">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-svg-file-into-decls">Push SVG file declarations into other CIF/SVG declarations</h5>
+<div class="paragraph">
+<p>
+
+
+
+This CIF to CIF transformation pushes
+<a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declarations</a> inwards into
+the other <a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-33">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-30">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-22">Implementation details</h6>
+<div class="paragraph">
+<p>All <a href="#tools-cifsim-output-svgviz-chapter-svgfile">SVG file declarations</a>
+specified in the top level scope of the specification, in groups, and in
+automata, are removed. The other
+<a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a> to which they
+apply, each get a local SVG file declaration instead. If they already had a
+local SVG file declaration, the CIF/SVG declaration is not changed.</p>
+</div>
+<div class="paragraph">
+<p>For instance, this specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgfile &quot;file1.svg&quot;;
+
+svgout id &quot;a&quot; attr &quot;b&quot; value 5;
+
+svgout id &quot;c&quot; attr &quot;d&quot; value 6 file &quot;file2.svg&quot;;
+
+group g:
+  svgfile &quot;file3.svg&quot;;
+
+  svgout id &quot;e&quot; attr &quot;f&quot; value 7;
+
+  svgout id &quot;g&quot; attr &quot;h&quot; value 8;
+
+  svgout id &quot;i&quot; attr &quot;j&quot; value 9 file &quot;file4.svg&quot;;
+
+  group h:
+    svgfile &quot;file5.svg&quot;;
+  end
+
+  group i:
+    svgout id &quot;k&quot; attr &quot;l&quot; value 10;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>is transformed to the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">svgout id &quot;a&quot; attr &quot;b&quot; value 5 file &quot;file1.svg&quot;;
+
+svgout id &quot;c&quot; attr &quot;d&quot; value 6 file &quot;file2.svg&quot;;
+
+group g:
+  svgout id &quot;e&quot; attr &quot;f&quot; value 7 file &quot;file3.svg&quot;;
+
+  svgout id &quot;g&quot; attr &quot;h&quot; value 8 file &quot;file3.svg&quot;;
+
+  svgout id &quot;i&quot; attr &quot;j&quot; value 9 file &quot;file4.svg&quot;;
+
+  group h:
+  end
+
+  group i:
+    svgout id &quot;k&quot; attr &quot;l&quot; value 10 file &quot;file3.svg&quot;;
+  end
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The mapping for the SVG element with id <code>a</code> is declared in the top level
+scope of the specification, and does not have a local SVG file declaration.
+As such, the SVG file declaration from the top level scope (<code>file1.svg</code>) is
+pushed inwards into the mapping. The mapping for the SVG element with id <code>b</code>
+is declared in the same scope, but already has a local SVG file declaration
+(<code>file2.svg</code>), and is thus not changed.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g</code> also has an SVG file declaration (<code>file3.svg</code>). This is pushed
+inwards to the mappings for ids <code>e</code> and <code>g</code>, as they are declared in the
+same scope, and don&#8217;t have local SVG file declarations. The mapping for SVG
+element id <code>i</code> is not changed, as it already has a local SVG file declaration
+(<code>file4.svg</code>).</p>
+</div>
+<div class="paragraph">
+<p>The SVG file declaration (<code>file5.svg</code>) from group <code>g.h</code> does not apply to
+any mappings, and thus gets lost.</p>
+</div>
+<div class="paragraph">
+<p>Group <code>g.i</code> does not have an SVG file declaration, so the mapping for SVG
+element id <code>k</code>, which is declared in that group, gets the SVG file
+declaration from group <code>g</code> (the parent scope of group <code>g.i</code>) instead.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-19">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-21">Size considerations</h6>
+<div class="paragraph">
+<p>As SVG file declarations may apply to multiple other CIF/SVG declarations, this
+transformation may increase the number of SVG file declarations in the
+specification. The number of SVG file declarations after the transformation is
+at most the number of 'other' CIF/SVG declarations, and as such the increase is
+at most linear in the number of 'other' CIF/SVG declarations as well.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-23">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-remove-cif-svg-decls">Remove CIF/SVG declarations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation removes
+<a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG</a> declarations from the
+specification. This may reduce the size of the specification. It may also lead
+to the specification being supported by more tools, as the CIF/SVG declarations
+may use features of the CIF language that certain tools don&#8217;t support.</p>
+</div>
+<div class="paragraph">
+<p>This CIF to CIF transformation removes only CIF/SVG declarations. The
+<a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a> CIF to CIF transformation removes them
+as well, but additionally also removes the other I/O declarations.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-34">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-31">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-23">Implementation details</h6>
+<div class="paragraph">
+<p>All CIF/SVG declarations are removed from the specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-20">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-22">Size considerations</h6>
+<div class="paragraph">
+<p>Since information is removed from the specification, the specification can only
+become smaller as a result of this transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-24">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation removes I/O declarations from the specification.
+This may reduce the size of the specification. It may also lead to the
+specification being supported by more tools, as the I/O declarations may use
+features of the CIF language that certain tools don&#8217;t support.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-35">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-32">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-24">Implementation details</h6>
+<div class="paragraph">
+<p>All I/O declarations are removed from the specification. I/O declarations
+include:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-printdecl">Print declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-print-chapter-ref-printfile">Print file declaration</a></p>
+</li>
+<li>
+<p><a href="#tools-cifsim-output-svgviz-chapter-cifsvg">CIF/SVG declarations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>This transformation removes all I/O declarations. To only remove certain kinds
+of I/O declarations, see the following CIF to CIF transformations:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-print-decls">Remove print declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-cif-svg-decls">Remove CIF/SVG declarations</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-21">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-23">Size considerations</h6>
+<div class="paragraph">
+<p>Since information is removed from the specification, the specification can only
+become smaller as a result of this transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-25">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-remove-print-decls">Remove print declarations</h5>
+<div class="paragraph">
+<p>
+
+
+
+This CIF to CIF transformation removes
+<a href="#tools-cifsim-output-print-chapter-ref-printdecl">print</a> and
+<a href="#tools-cifsim-output-print-chapter-ref-printfile">print file</a> declarations
+from the specification. This may reduce the size of the specification. It may
+also lead to the specification being supported by more tools, as the print and
+print file declarations may use features of the CIF language that certain tools
+don&#8217;t support.</p>
+</div>
+<div class="paragraph">
+<p>This CIF to CIF transformation removes only print and print file declarations.
+The <a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a> CIF to CIF transformation removes
+them as well, but additionally also removes the other I/O declarations.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-36">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-33">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-25">Implementation details</h6>
+<div class="paragraph">
+<p>All print and print file declarations are removed from the specification.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-22">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-24">Size considerations</h6>
+<div class="paragraph">
+<p>Since information is removed from the specification, the specification can only
+become smaller as a result of this transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-26">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-remove-pos-info">Remove position information</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation removes position information from the internal
+representation of the specification.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-37">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports all CIF specifications.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-34">Preprocessing</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-26">Implementation details</h6>
+<div class="paragraph">
+<p>When performing operations on CIF specifications, the specification is first
+read from disk, and stored into memory. The internal representation
+stores position information with all objects (such as declarations,
+types, expression nodes, automata, locations, etc). The position information of
+an object includes information about the location of the object in the original
+textual source. This information is used during validation of the specification
+(i.e. type checking), when reporting errors, to indicate where in the original
+specification the error is found.</p>
+</div>
+<div class="paragraph">
+<p>
+After type checking, this information is no longer used. To make sure that
+subsequent operations, such as CIF to CIF transformations, don&#8217;t have to
+process the position information, this transformation can be applied to rid
+the specification of all position information. Applying this transformation
+may increase the performance of subsequent transformations.</p>
+</div>
+<div class="paragraph">
+<p>Applying this transformation has no effect on the actual contents of the
+specification, and does not change the effect of subsequent transformation.
+That is, it may affect the performance of subsequent transformations, but has
+no effect on the result of the subsequent transformations, as they are written
+to disk.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-23">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-25">Size considerations</h6>
+<div class="paragraph">
+<p>Since position information is removed from the specification, this
+transformation has an effect on the size of the specification as it is
+represented in memory. However, this transformation has no effect on the size
+of the specification, as far as actual content (which affects the meaning of
+the specification) is concerned.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-27">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-remove-reqs">Remove requirements</h5>
+<div class="paragraph">
+<p>
+
+
+This CIF to CIF transformation removes
+<a href="#lang-tut-extensions-synthesis-plant-req-sup">requirements</a> from the
+specification. By removing all requirements from a CIF specification with both
+<a href="#lang-tut-extensions-synthesis-plant-req-sup">plants</a> and requirements, only the
+plants remain. The resulting plants can then be <a href="#tools-chapter-mergecif">merged</a>
+with a <a href="#lang-tut-extensions-synthesis-plant-req-sup">supervisor</a> or other
+controller.</p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-38">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+<li>
+<p>Using (referring to) requirement automata or declarations from requirement
+automata from outside requirement automata.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Specifications where requirement automata or declarations declared in
+requirement automata are used (referred to) from outside requirement automata
+are not supported. By removing the requirement automata, those uses
+(references) become invalid, as the automata or declarations that are
+referenced no longer exist. For instance, consider:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg int x = switch req: case l1: 1 else 2 end;
+
+requirement automaton req:
+  location l1:
+    initial;
+    edge tau goto l2;
+
+  location l2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When requirement automaton <code>req</code> is removed, the <code>switch</code> expression can no
+longer refer to that automaton, or to its locations. Removing the requirements
+from this CIF specification is not supported.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-35">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-27">Implementation details</h6>
+<div class="paragraph">
+<p>Both <a href="#lang-tut-extensions-synthesis-autkind">requirement automata</a> and
+<a href="#lang-tut-extensions-synthesis-invkind">requirement invariants</a> are
+removed. Requirement invariants are removed from the top level scope of the
+specification, all groups and automata, and all locations of automata. For
+instance, consider the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">controllable add;
+
+plant automaton buffer:
+  disc int x;
+
+  plant invariant 0 &lt;= x and x &lt;= 5;
+  requirement invariant x &lt; 5;
+
+  location:
+    initial;
+    plant invariant x &gt;= 0;
+    edge add do x := x + 1;
+end
+
+requirement automaton not2:
+  location:
+    initial;
+    requirement invariant buffer.x &gt;= 0;
+    edge add when buffer.x != 2;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The result after this transformation is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">controllable add;
+
+plant automaton buffer:
+  disc int x;
+
+  plant invariant 0 &lt;= x and x &lt;= 5;
+
+  location:
+    initial;
+    plant invariant x &gt;= 0;
+    edge add do x := x + 1;
+end</code></pre>
+</div>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-24">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-26">Size considerations</h6>
+<div class="paragraph">
+<p>Since information is removed from the specification, the specification can only
+become smaller as a result of this transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-28">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-simplify-others">Simplify others</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation simplifies CIF specifications, by applying
+the following non-value related simplifications:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Duplicate monitor events of automata are removed.</p>
+</li>
+<li>
+<p>Duplicate events in the alphabet are removed.</p>
+</li>
+<li>
+<p>Duplicate events on edges are removed, with the exception of duplicate sends
+for the same event, as they may send different values.</p>
+</li>
+<li>
+<p>Self-loops with a target location are simplified by removing the target
+location.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-39">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-36">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-28">Implementation details</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-25">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-27">Size considerations</h6>
+<div class="paragraph">
+<p>This transformation tries to simplify the specification, possibly reducing its
+size.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-29">Optimality</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-simplify-values">Simplify values</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation simplifies CIF specifications, by applying
+the following value-related simplifications:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Evaluation of constant (sub-)expressions. For instance, <code>1 + 1</code> is
+simplified to <code>2</code>.</p>
+</li>
+<li>
+<p>Simplification of short-circuit boolean binary operators. For instance,
+<code>true and x</code> is simplified to <code>x</code>.</p>
+</li>
+<li>
+<p>Simplification of boolean unary operators. For instance, <code>not not x</code> is
+simplified to <code>x</code>.</p>
+</li>
+<li>
+<p>Removal of default values. For instance, <code>true</code> state invariants are
+removed.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-40">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-37">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-29">Implementation details</h6>
+<div class="paragraph">
+<p>The following is a complete list of the short-circuit boolean binary operators
+that are simplified (with <code>x</code> an arbitrary boolean expression):</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Original</th>
+<th class="tableblock halign-left valign-top">Simplified</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true  and x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     and true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false and x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     and false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true  or  x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     or  true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false or  x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     or  false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true  =&gt;  x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     =&gt;  true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false =&gt;  x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     =&gt;  false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>true  &lt;=&gt; x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     &lt;=&gt; true</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false &lt;=&gt; x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x     &lt;=&gt; false</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not x</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The following is a complete list of the boolean unary operators that are
+simplified (with <code>x</code> and <code>y</code> two arbitrary expressions):</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Original</th>
+<th class="tableblock halign-left valign-top">Simplified</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not not x</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x &lt; y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt;= y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x &lt;= y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &gt;  y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x = y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x != y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x != y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x =  y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x &gt; y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &#8656; y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x &gt;= y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x &lt;  y</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>not(x =&gt; y)</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>x and not y</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Default values are removed in the following places:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Initialization predicates of components (including automata) and locations.</p>
+</li>
+<li>
+<p>Marker predicates of components (including automata) and locations.</p>
+</li>
+<li>
+<p>Invariants of components (including automata) and locations.</p>
+</li>
+<li>
+<p>Guards of edges.</p>
+</li>
+<li>
+<p>Guards of 'if' and 'elif' updates on edges.</p>
+</li>
+<li>
+<p>Guards of 'if' and 'elif' expressions.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Predicates that are trivially equal to the default value are removed. If a
+trivial value is found that is equal to the negation of the default value, the
+entire feature gets the non-default value. For instance, for guards on edges,
+<code>true</code>, <code>1 = 1</code>, etc, are removed as they are all trivially <code>true</code>
+(the default for guards). If however, <code>false</code>, <code>1 = 2</code>, <code>1 != 1</code>, or any
+other trivially <code>false</code> guards is found, all guards on that edge are removed,
+and a single <code>false</code> guard is added.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-26">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-28">Size considerations</h6>
+<div class="paragraph">
+<p>This transformation tries to simplify the specification, possibly reducing its
+size.</p>
+</div>
+<div class="paragraph">
+<p>All uses of constants lead to constant (sub-)expressions, and they are
+evaluated. This leads to constants being inlined. For constants with large
+literal values, this may significantly increase the size of the specification,
+especially if the constant is used more than once. For information on how to
+prevent this, see the <a href="#tools-cif2cif-chapter-simplify-values-no-refs">Simplify values (no references)</a> CIF to CIF
+transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-30">Optimality</h6>
+<div class="paragraph">
+<p>Not all simplifications that could potentially be performed are implemented in
+this transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-simplify-values-optimized">Simplify values (optimized)</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation simplifies CIF specifications, by applying
+same value-related simplifications as the <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>
+CIF to CIF transformation, but with optimizations for literal expressions.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-41">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-38">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-30">Implementation details</h6>
+<div class="paragraph">
+<p>One of the simplifications that the CIF to CIF transformation to
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> performs, is the evaluation of constant
+(sub-)expressions. For large literal expressions, such as arrays with thousands
+or even millions of elements, this is expensive, without having any effect.
+For instance, consider list/array literal <code>[1, 2, 3]</code>. Evaluating the
+list/array and the integer elements, and then reconstructing the literal
+list/array expression and literal integer expressions, has no effect. The
+result is the same list/array literal as the original.</p>
+</div>
+<div class="paragraph">
+<p>This transformation detects literal expressions, and doesn&#8217;t further simplify
+them, thus greatly improving performance for large literal expressions.
+Literal expressions are detected using a static analysis. Due to using static
+analysis, some literals may not be simplified, while they would have been
+simplified if this literal detection optimization was not used. For instance,
+a set literal <code>{1, 2, 1}</code> is simplified to <code>{1, 2}</code> without optimizations,
+and is not simplified with optimizations. In this case, static analysis does
+not account for duplicate elements of the set.</p>
+</div>
+<div class="paragraph">
+<p>The following differences can be observed for literal optimization, with
+respect to not using literal optimization:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Negations of integer literals are not normalized, although this only affects
+the internal representation of negative integer values, and may not be
+externally visible to end users.</p>
+</li>
+<li>
+<p>Real literals are not normalized. For instance, <code>1e3</code> is not normalized
+to <code>1000.0</code>.</p>
+</li>
+<li>
+<p>For set literals, duplicate elements are not removed.</p>
+</li>
+<li>
+<p>For dictionary literals, duplicate keys are not removed, and the dictionary
+literal is not further simplified. Without literal optimization, duplicate
+keys would lead to an error during simplification.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-27">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-29">Size considerations</h6>
+<div class="paragraph">
+<p>This transformation tries to simplify the specification, possibly reducing its
+size.</p>
+</div>
+<div class="paragraph">
+<p>All uses of constants lead to constant (sub-)expressions, and they are
+evaluated. This leads to constants being inlined. For constants with large
+literal values, this may significantly increase the size of the specification,
+especially if the constant is used more than once. For information on how to
+prevent this, see the <a href="#tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</a>
+CIF to CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-31">Optimality</h6>
+<div class="paragraph">
+<p>Not all simplifications that could potentially be performed are implemented in
+this transformation.</p>
+</div>
+<div class="paragraph">
+<p>The optimizations for literals that are performed influence the optimality of
+the simplification, as described above.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-simplify-values-no-refs">Simplify values (no references)</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation simplifies CIF specifications, by applying
+same value-related simplifications as the <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>
+CIF to CIF transformation, but without simplifying reference expressions.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-42">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-39">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-31">Implementation details</h6>
+<div class="paragraph">
+<p>The CIF to CIF transformation to <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>,
+transforms the following specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 3;
+invariant x - 5 + 1 &gt; 0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>into the following simplified specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 3;
+invariant false;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This transformation however, does not take the values of declarations into
+account, and thus for instance does not fill in the values of constants,
+algebraic variables, etc. Therefore, this transformation transforms that same
+specification into the following simplified specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">const int x = 3;
+invariant x - 4 &gt; 0;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This variant can be useful, as it prevents the use of constants from being
+eliminated. This makes it possible to change the value of the constant in one
+place (the one place being the declaration of the constant), and have all uses
+of that constant automatically change with it (as they still refer to the
+constant). If the value of the constant would be filled in as well, changing
+the value of the constant would be more work, as all those places where it was
+filled in, need to be replaced as well. In the above example, the issue is
+even bigger, as the result is simplified even further, eliminating the entire
+comparison to a single boolean value.</p>
+</div>
+<div class="paragraph">
+<p>Another issue related to simplification of constants, is that inlining them
+can be very expensive. If a constant has a large literal as its value, the
+large literal is inlined wherever the constant is used. This may lead to
+significantly larger specifications. Also, tools that use the resulting model
+may handle constants in a special way to ensure they are evaluated only once,
+but may not do so for large literals that occur in the middle of other
+expressions. As such, simplification/inlining of constants may significantly
+reduce performance.</p>
+</div>
+<div class="paragraph">
+<p>The reference expressions that are not simplified (filled in) include among
+others the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Values of constants.</p>
+</li>
+<li>
+<p>Values of discrete variables.</p>
+</li>
+<li>
+<p>Values of algebraic variables.</p>
+</li>
+<li>
+<p>Values of continuous variables.</p>
+</li>
+<li>
+<p>Values of input variables.</p>
+</li>
+<li>
+<p>Derivatives of continuous variables.</p>
+</li>
+<li>
+<p>Values of local variables of functions.</p>
+</li>
+<li>
+<p>Values of parameters of functions.</p>
+</li>
+<li>
+<p>User-defined functions.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-28">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-30">Size considerations</h6>
+<div class="paragraph">
+<p>This transformation tries to simplify the specification, possibly reducing its
+size.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-32">Optimality</h6>
+<div class="paragraph">
+<p>Not all simplifications that could potentially be performed are implemented in
+this transformation.</p>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</h5>
+<div class="paragraph">
+<p>
+
+This CIF to CIF transformation simplifies CIF specifications, by applying
+same value-related simplifications as the <a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a>
+CIF to CIF transformation, but without simplifying reference expressions, and
+with optimizations for literal expressions.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect5">
+<h6 id="tools-supported-specifications-43">Supported specifications</h6>
+<div class="paragraph">
+<p>This transformation supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-preprocessing-40">Preprocessing</h6>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-implementation-details-32">Implementation details</h6>
+<div class="paragraph">
+<p>This CIF to CIF transformation simplifies CIF specifications, by applying
+same value-related simplifications as the
+<a href="#tools-cif2cif-chapter-simplify-values">Simplify values</a> CIF to CIF transformation.</p>
+</div>
+<div class="paragraph">
+<p>However, it does not simplifying reference expressions. For details, see the
+<a href="#tools-cif2cif-chapter-simplify-values-no-refs">Simplify values (no references)</a> CIF to CIF transformation.
+Furthermore, it simplifies with optimizations for literal expressions. For
+details, see the <a href="#tools-cif2cif-chapter-simplify-values-optimized">Simplify values (optimized)</a> CIF to CIF
+transformation.</p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-renaming-29">Renaming</h6>
+<div class="paragraph">
+<p>n/a</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-size-considerations-31">Size considerations</h6>
+<div class="paragraph">
+<p>This transformation tries to simplify the specification, possibly reducing its
+size.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect5">
+<h6 id="tools-optimality-33">Optimality</h6>
+<div class="paragraph">
+<p>Not all simplifications that could potentially be performed are implemented in
+this transformation.</p>
+</div>
+<div class="paragraph">
+<p>The optimizations for literals that are performed influence the optimality of
+the simplification, as described above.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-mergecif">CIF merger</h4>
+<div class="paragraph">
+<p>
+
+The CIF merger can be used to merge two or more CIF specifications into a
+single CIF specification. The result of the merger is essentially the parallel
+composition of the input specifications. Unlike the
+<a href="#tools-chapter-cif-explorer">CIF explorer</a> and <a href="#tools-eventbased-chapter-product">Event-based synchronous product</a> tools
+however, the parallel composition is not unfolded into a
+<a href="#tools-cifsim-traces-state-space">state space</a>.</p>
+</div>
+<div class="paragraph">
+<p>It can for instance be useful to merge a synthesized supervisor with a timed or
+hybrid plant, to validate the supervisor against that more detailed plant,
+using interactive simulation and visualization on the merged specification.</p>
+</div>
+<div class="paragraph">
+<p>The specifications that are being merged can <a href="#tools-mergecif-shared">share</a>
+events and variables, making it possible to have
+interaction between the merged specifications.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-transformation-7">Starting the transformation</h5>
+<div class="paragraph">
+<p>The merger can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Use the Eclipse IDE to merge multiple files:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Select a <code>.cif</code> file in the 'Project Explorer' tab or
+'Package Explorer' tab by left clicking on it.</p>
+</li>
+<li>
+<p>Select additional <code>.cif</code> files by left clicking on them while pressing
+the
+<kbd>Ctrl</kbd>
+or
+<kbd>Control</kbd>
+key.</p>
+</li>
+<li>
+<p>Make sure at least two <code>.cif</code> files are selected.</p>
+</li>
+<li>
+<p>Right click one of the <code>.cif</code> files and choose
+<b class="menuref">Merge CIF specifications&#8230;&#8203;</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Use the Eclipse IDE to merge a single file with itself (allowed, but
+practically not that useful):</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Right click a <code>.cif</code> file in the 'Project Explorer' tab or
+'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Merge CIF specifications&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Merge CIF specifications&#8230;&#8203;</b></span>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Use the <code>cifmerge</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifmerge</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-options-20">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input files</em>: The absolute or relative local file system path to the
+input CIF specifications. These are the files to merge.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+merged/output CIF specification. If not specified, the output file defaults
+to <code>merged.cif</code>. If the merger is executed via the Eclipse GUI, the output
+file, if specified as a relative path (or just a file name), is resolved
+relative to the directory that contains the first input file.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-41">Preprocessing</h5>
+<div class="paragraph">
+<p>The following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are
+applied as preprocessing (in the given order), to increase the subset of CIF
+specifications that can be transformed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-svg-file-into-decls">Push SVG file declarations into other CIF/SVG declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-print-file-into-decls">Push print file declarations into print declarations</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If only one input file is provided to the CIF merger, essentially that single
+input file is preprocessed and written as output, without any merging taking
+place.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-example-4">Example</h5>
+<div class="paragraph">
+<p>Consider the following supervisor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group button:
+  uncontrollable u_pushed, u_released;
+end
+
+group lamp:
+  controllable c_on, c_off;
+end
+
+group timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+end
+
+supervisor automaton timed_lamp:
+  location s0:
+    initial;
+    edge button.u_pushed goto s1;
+    edge button.u_released;
+
+  location s1:
+    edge lamp.c_on goto s2;
+    edge button.u_pushed, button.u_released;
+
+  location s2:
+    edge timer.c_start goto s3;
+    edge button.u_pushed, button.u_released;
+
+  location s3:
+    edge timer.u_timeout goto s4;
+    edge button.u_pushed, button.u_released;
+
+  location s4:
+    edge lamp.c_off goto s0;
+    edge button.u_pushed, button.u_released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>and the following timed plant:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton button:
+  uncontrollable u_pushed, u_released;
+
+  location released:
+    initial;
+    edge u_pushed goto pushed;
+
+  location pushed:
+    edge u_released goto released;
+end
+
+plant automaton lamp:
+  controllable c_on, c_off;
+
+  location off:
+    initial;
+    edge c_on goto on;
+
+  location on:
+    edge c_off goto off;
+end
+
+plant automaton timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+
+  cont t der 1.0;
+
+  location idle:
+    initial;
+    edge c_start do t := 0.0 goto running;
+
+  location running:
+    edge u_timeout when t &gt;= 2.0 goto idle;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Merging these two specifications results in the following merged specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton button:
+  uncontrollable u_pushed;
+  uncontrollable u_released;
+  location released:
+    initial;
+    edge u_pushed goto pushed;
+  location pushed:
+    edge u_released goto released;
+end
+plant automaton lamp:
+  controllable c_on;
+  controllable c_off;
+  location off:
+    initial;
+    edge c_on goto on;
+  location on:
+    edge c_off goto off;
+end
+plant automaton timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+  cont t der 1.0;
+  location idle:
+    initial;
+    edge c_start do t := 0.0 goto running;
+  location running:
+    edge u_timeout when t &gt;= 2.0 goto idle;
+end
+supervisor automaton timed_lamp:
+  location s0:
+    initial;
+    edge button.u_pushed goto s1;
+    edge button.u_released;
+  location s1:
+    edge lamp.c_on goto s2;
+    edge button.u_pushed, button.u_released;
+  location s2:
+    edge timer.c_start goto s3;
+    edge button.u_pushed, button.u_released;
+  location s3:
+    edge timer.u_timeout goto s4;
+    edge button.u_pushed, button.u_released;
+  location s4:
+    edge lamp.c_off goto s0;
+    edge button.u_pushed, button.u_released;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The supervisor specification contains three <em>skeletons</em>: groups that only
+contain event declarations, and have no behavior. The skeletons represent the
+plants of the system, which are controlled by the supervisor. The supervisor
+specification also contains a supervisor automaton, which waits for the button
+to be pushed, then turns on the lamp and start the timer, waits for the timer
+to time out, turns the lamp back off, and keeps repeating this behavior.
+Pushing or releasing the button during the cycle has no effect.</p>
+</div>
+<div class="paragraph">
+<p>The timed specification contains the same plants, with the same events, but
+here the plants are actual automata with behavior, instead of just skeleton
+groups. For the button and lamp, the events occur in alternating sequences.
+The timer has a clock that ensures that the timeout happens two time units
+after the timer is started.</p>
+</div>
+<div class="paragraph">
+<p>Since both specifications contain the same events (based on their absolute
+names), these events are merged together. This ensures that uses of those
+events become linked (or coupled), and all refer to the single merged event in
+the merged specification. This means that the events used in the supervisor are
+the same events as used the timed plant. This also means that they synchronize,
+and the supervisor thus controls the timed plants.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-mergecif-shared">Shared events and variables</h5>
+<div class="paragraph">
+<p>The example above shows how shared events can be used to link (or couple)
+multiple specifications through merging.</p>
+</div>
+<div class="paragraph">
+<p>Similarly to the way events can be merged, it is possible to merge input
+variables with other variables, as long as the types are compatible. That is,
+an input variable can be merged with another input variable, a discrete
+variable, a continuous variable, an algebraic variable, a constant, or a
+location. The input variable is then a sort of <em>skeleton</em> definition that is
+merged with an actual definition (for instance an algebraic variable), which
+defines the value.</p>
+</div>
+<div class="paragraph">
+<p>There are thus two ways for merged specifications to become linked (or
+coupled): by means of shared events and by means of shared variables (including
+constants).</p>
+</div>
+<div class="paragraph">
+<p>For further details and restrictions, see the
+<a href="#tools-mergecif-compatibility">Merge compatibility</a> section.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-mergecif-compatibility">Merge compatibility</h5>
+<div class="paragraph">
+<p>In general, objects (components, declarations, etc) that only occur in one
+of the specifications being merged, are simply copied to the merged
+specification. If in two (or more) specifications objects with the same
+absolute name are present, they need to be merged. Not all objects can be
+merged with all other objects, i.e. not all objects are <em>merge compatible</em>.
+The following table gives an overview of what can be merged:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6923%;">
+<col style="width: 7.6924%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Merge with</th>
+<th class="tableblock halign-left valign-top">Group</th>
+<th class="tableblock halign-left valign-top">Automaton</th>
+<th class="tableblock halign-left valign-top">Event</th>
+<th class="tableblock halign-left valign-top">Input var</th>
+<th class="tableblock halign-left valign-top">Discrete var</th>
+<th class="tableblock halign-left valign-top">Continuous var</th>
+<th class="tableblock halign-left valign-top">Algebraic var</th>
+<th class="tableblock halign-left valign-top">Constant</th>
+<th class="tableblock halign-left valign-top">Location</th>
+<th class="tableblock halign-left valign-top">Type declaration</th>
+<th class="tableblock halign-left valign-top">Enumeration</th>
+<th class="tableblock halign-left valign-top">Enumeration literal</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Group</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Automaton</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Event</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Input var</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Discrete var</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Continuous var</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Algebraic var</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Constant</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Location</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Type declaration</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Enumeration</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Enumeration literal</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>For components (i.e. groups and automata) that are present in more than one
+specification, the contents are recursively merged into a single component.
+The contents of components consists not only of their declarations (such as
+events) and their sub-components (for groups), but also of their invariants,
+initialization predicates, marker predicates, equations, locations
+(for automata), etc.</p>
+</div>
+<div class="paragraph">
+<p>As the button/lamp example above shows, automata can be merged with groups
+(often acting as skeletons), resulting in an automaton with the contents of
+the group merged into it. Since automata can&#8217;t contain sub-components and
+user-defined functions, groups with sub-components and/or user-defined
+functions can not be merged with automata.</p>
+</div>
+<div class="paragraph">
+<p>Groups can also be merged with other groups. Automata however can not be merged
+with other automata, as that may lead to the merge of conflicting behavioral
+specifications.</p>
+</div>
+<div class="paragraph">
+<p>Events can be merged with other events. Each event must then either be a
+channel in all of the specifications in which it occurs, or in none of them.
+If it is a channel, the data type must be exactly the same in all
+specifications in which it is declared. Events that have different
+controllability in different specifications, can also not be merged.</p>
+</div>
+<div class="paragraph">
+<p>Constants can be merged with other constants. However, the constants must then
+have the exact same type and value in all the specifications in which they
+occur. This restriction prevents the merge of conflicting values. Due to this
+restriction, constants that have a type of which the values can not be compared
+for equality (e.g. function types), are not supported (can not be merged).</p>
+</div>
+<div class="paragraph">
+<p>As mentioned in the <a href="#tools-mergecif-shared">Shared events and variables</a> section, an input variable can
+be merged with another input variable, discrete variable, continuous variable,
+algebraic variable, constant, or location. Input variables can only be merged
+with other objects that have the exact same type.</p>
+</div>
+<div class="paragraph">
+<p>A location can be merged with an input variable that has a boolean type. The
+input variable is then a placeholder for the location, indicating whether the
+location is the current location of its automaton.</p>
+</div>
+<div class="paragraph">
+<p>It is not allowed to merge two algebraic variables, two discrete variables, or
+two continuous variables, as that may lead to the merge of conflicting values.</p>
+</div>
+<div class="paragraph">
+<p>In general, only one of the specifications defines the variable as a concrete
+variable that defines a value (e.g. as a discrete, continuous, or algebraic
+variable). All the other specifications that have that same variable must
+declare it as an input variable (essentially a <em>placeholder</em>). It is however
+allowed to merge two or more constants with the same type and the same value.</p>
+</div>
+<div class="paragraph">
+<p>Type declarations can be merged with other type declarations, as long as they
+have the exact same type.</p>
+</div>
+<div class="paragraph">
+<p>Enumerations can be merged with other enumerations, as long as they are
+compatible. Two enumerations are compatible if they have the same number of
+literals, with the exact same names, in the same order.</p>
+</div>
+<div class="paragraph">
+<p>Enumeration literals can only be merged as the result of the enumerations of
+which they are a part being merged. Merging two literals from different
+enumerations (which then have different names) is not supported.</p>
+</div>
+<div class="paragraph">
+<p>Type declarations and enumerations can be merged, as long as the type of the
+type declaration is compatible with the enumeration.</p>
+</div>
+<div class="paragraph">
+<p>User-defined functions can never be merged with other objects of the same name.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-invariants-2">Invariants</h5>
+<div class="paragraph">
+<p>Merging a group with an automaton, may change the supervisory kinds of the
+invariants of the group. For instance, consider the following CIF
+specifications:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">group x:
+  input int y;
+  invariant y = 1;
+end</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton x:
+  disc int y;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When merged, this leads to the following CIF specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">plant automaton x:
+  disc int y;
+  invariant y = 1;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In the original group <code>x</code>, the invariant did not have a supervisory kind.
+After merging, the invariant still does not specify a supervisory kind.
+However, since it is now specified in an automaton <code>x</code> of kind <code>plant</code>, the
+invariant <a href="#lang-tut-extensions-synthesis-invkind-implicit">implicitly</a>
+becomes a plant invariant as well.</p>
+</div>
+<div class="paragraph">
+<p>When an invariant gets an implicit supervisory kind as a result of merging,
+the merge tool prints a warning to the console.</p>
+</div>
+<div class="paragraph">
+<p>To get rid of the warning, the invariant in group <code>x</code> can be declared
+explicitly as being a <code>plant</code> invariant. The supervisory kind then matches
+the supervisory kind of automaton <code>x</code>. When the group and automaton are
+merged, the invariant keeps its explicit supervisory <code>plant</code> kind. The merge
+result is thus the same as the earlier merge result, as in both cases the
+invariant in the merged specification is interpreted as a print invariant.
+However, in this last case, no warning is printed to the console.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-merge-problems">Merge problems</h5>
+<div class="paragraph">
+<p>Even when two or more CIF specifications are merge compatible, as described
+above, the resulting merged CIF specification can still be invalid. In such
+cases, merging fails. For instance, consider the following two CIF
+specifications:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">input int x;
+alg int y = x;</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg int x = y;
+input int y;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Merging them would result in:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="cif">alg int x = y;
+alg int y = x;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>But this merged specification is invalid, as <code>x</code> is defined in terms of
+<code>y</code>, which is defined in terms of <code>x</code>, leading to a loop (definition/use
+cycle).</p>
+</div>
+<div class="paragraph">
+<p>Another example of merge problems is two CIF specifications that have SVG
+output mappings for the same SVG element id and attribute, for the same SVG
+image file. In the individual CIF specifications there are no duplicate output
+mappings, but in the merged specification there are.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-event-disabler">CIF event disabler</h4>
+<div class="paragraph">
+<p>
+
+The CIF event disabler tool can be used to disable certain events of a CIF
+specification, or even to disable events not currently present in a CIF
+specification. The tool has various <a href="#tools-event-disabler-options">options</a> that can be used to control the working of the
+tool, and influence its output.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-event-disabler-usage-scenario">Usage scenario</h5>
+<div class="paragraph">
+<p>Assume a system with some sensors and actuators. From the view of the
+supervisor (or controller in general), the sensors are uncontrollable, and the
+actuators are controllable. Now assume a controller is being designed for this
+system, and it is to be merged with a simulation model of the uncontrolled
+system, that is being designed as well.</p>
+</div>
+<div class="paragraph">
+<p>The situation may arise that the controller only controls a part of the
+uncontrolled system. This may for instance be the case if the designer of the
+controller starts with a small controller and incrementally extends it to cover
+more and more functionality of the system. The designer may have already made
+a full simulation model of the uncontrolled system beforehand. Alternatively,
+if one designer develops the controller and another develops the simulation
+model of the uncontrolled system, the simulation model may be finished well
+before the controller for the entire system is finished.</p>
+</div>
+<div class="paragraph">
+<p>A problem arises when a controller that controls only part of the system, is
+merged with a simulation model of the entire uncontrolled system. In the
+uncontrolled system, the actuators can usually be turned on and off
+arbitrarily, as they are not yet controlled in any way. If the controller
+doesn&#8217;t control certain actuators, the behavior of those actuators is not
+restricted, and during simulation the events to turn the actuators on and off
+can happen at any time. Events are urgent, that is, they take precedence over
+passage of time, and thus happen 'immediately'. Events that are always enabled
+thus prevent passage of time. The simulation will turn the actuators on, off,
+on again, off again, etc.</p>
+</div>
+<div class="paragraph">
+<p>To solve this problem, the controllable events of the uncontrolled system that
+are not restricted in any way by the controller need to be disabled. The CIF
+event disabler tool makes this possible.</p>
+</div>
+<div class="paragraph">
+<p>This is however not the only usage scenario. The same controller may be used
+for implementation. For the implementation, a mapping from events to variables
+that represent the I/O ports may be needed. This mapping could be a CIF
+specification, with an automaton that performs the mapping. Similar to having
+a complete simulation model, a complete mapping specification for the
+implementation may be available. If in such mappings the actuator events are
+always enabled, this may lead to similar problems as for the simulation, if
+the controller only controls part of the system. Here too, the event disabler
+can be used to restrict such actuator events from causing trouble.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-tool">Starting the tool</h5>
+<div class="paragraph">
+<p>The tool can be started in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In Eclipse, right click a <code>.cif</code> file in the 'Project Explorer' tab
+or 'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Disable events of CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>In Eclipse, right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Disable events of CIF specification&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifevtdis</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifevtdis</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-44">Supported specifications</h5>
+<div class="paragraph">
+<p>The event disabler supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Component definitions and component instantiations are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-42">Preprocessing</h5>
+<div class="paragraph">
+<p>No preprocessing is currently performed by this CIF to CIF transformation. To
+increase the subset of specifications that can be transformed, apply the
+following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> (in the
+given order):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-event-disabler-options">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, this application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file</em>: The absolute or relative local file system path to the
+input CIF specification. If we relate this to the above
+<a href="#tools-event-disabler-usage-scenario">usage scenario</a>, the input file should be the
+controller that only controls part of the system.</p>
+</li>
+<li>
+<p><em>Output file</em>: The absolute or relative local file system path to the
+output CIF specification. If not specified, defaults to the input file
+path, where the <code>.cif</code> file extension is removed (if present), and a
+<code>.disabled.cif</code> file extension is added.</p>
+</li>
+<li>
+<p><em>Event names</em>: The absolute names of the events. How these supplied events
+are used depends on the <em>Event usage</em> option. Multiple events may be
+specified, separated by commas and/or spaces.</p>
+</li>
+<li>
+<p><em>Event names file</em>: The absolute or relative local file system path of a file
+with the absolute names of the events. How these supplied events are used
+depends on the <em>Event usage</em> option. Multiple events may be specified in the
+file, on separate lines. Empty lines are ignored. Lines starting with a <code>#</code>
+character are ignored as well, and can thus be used to add comments.</p>
+</li>
+<li>
+<p><em>SVG input events</em>: Enable this option to use the SVG input events. How the
+events are used depends on the <em>Event usage</em> option.</p>
+</li>
+<li>
+<p><em>Event usage</em>: This option can be used to specify how the supplied events are
+to be used. That is, it specifies which events to disable. See the
+<a href="#tools-event-disabler-spec-evts-to-disable">Specifying the events to disable</a> section for more
+information.</p>
+</li>
+<li>
+<p><em>Include input specification</em>: Should the output file contain only the new
+automaton that is created to disable the events, or should it include the
+input specification as well? See the
+<a href="#tools-event-disabler-output">Output</a> section for more information.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>At least one of the <em>Event names</em>, <em>Event names file</em>, or <em>SVG input events</em>
+options must be used to supply events to the tool. It is allowed to use
+multiple of these options, to combine events from multiple sources, and supply
+all of them to the tool.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-event-disabler-spec-evts-to-disable">Specifying the events to disable</h5>
+<div class="paragraph">
+<p>The <em>Event names</em>, <em>Event names file</em>, and <em>SVG input events</em> options can be
+used to supply events to the tool. How these events are used (or interpreted)
+depends on the <em>Event usage</em> option. Several alternatives are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Disable the supplied events, regardless of the alphabet of the input
+specification (<code>disable</code>)</p>
+</li>
+<li>
+<p>Disable all supplied events, that are not in the alphabet of the input
+specification (<code>alphabet</code>)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The texts between parentheses at the end of the alternatives indicate the
+command line option values that correspond with the alternatives. The default
+is <code>alphabet</code>.</p>
+</div>
+<div class="paragraph">
+<p>The most straightforward alternative is to manually specify the events to
+<code>disable</code> (the first alternative in the above list). The supplied events are
+then disabled.</p>
+</div>
+<div class="paragraph">
+<p>Manually specifying the events to disable can be cumbersome. Especially if the
+controller is developed incrementally, this can be a burden. The more events
+the controller does restrict, the less events should be disabled using the
+event disabler. In this case it may be easier to list the controllable events
+of the uncontrolled system that the controller may or may not restrict. That
+is, the <code>alphabet</code> (the second alternative in the above list) of controllable
+events of the uncontrolled system is specified. Supplied events that are not
+in the alphabet of any of the automata of the input specification, are
+disabled.</p>
+</div>
+<div class="paragraph">
+<p>The following table summarizes which events get disabled by the tool:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+<col style="width: 25%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Event usage</th>
+<th class="tableblock halign-left valign-top">Event supplied</th>
+<th class="tableblock halign-left valign-top">Event in alphabet</th>
+<th class="tableblock halign-left valign-top">Event is disabled by tool</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">disable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes/no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">disable</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes/no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">alphabet</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">alphabet</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">alphabet</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">yes/no</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">no</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-event-disabler-output">Output</h5>
+<div class="paragraph">
+<p>If the <em>Include input specification</em> option is enabled, the output
+specification is a copy of the input specification, which is then modified to
+disable certain events. For events that are disabled by the tool, but did not
+exist in the input specification, an event declaration is added. If the option
+is disabled, the output specification starts empty. For all events are
+disabled, an event declaration is added. Event declarations are added in
+their proper scopes, based on their absolute names, by adding groups around
+them as needed.</p>
+</div>
+<div class="paragraph">
+<p>
+
+By default, the <em>Include input specification</em> option is disabled. This ensures
+that the output specification is small. The typical scenario is to merge the
+input specification, event disabler output specification, and simulation model
+together using the <a href="#tools-chapter-mergecif">CIF merger</a> tool. Disabling the <em>Include input
+specification</em> specification option then gives the best performance for the
+tool chain.</p>
+</div>
+<div class="paragraph">
+<p>If any events are disabled by the tool, a new automaton is created, and this
+automaton is added to the output specification. The automaton is named
+<code>event_disabler</code>, but may be renamed if it conflicts with an already existing
+object with the same name. The automaton has no supervisory kind, and has the
+disabled events as alphabet. It has a single nameless location, with a single
+self loop for all of the events that are disabled. The guard of the self
+loop is <code>false</code>, which results in the events being globally disabled.</p>
+</div>
+<div class="paragraph">
+<p>If the <em>Include input specification</em> option is enabled, and events are disabled
+that did not exist in the input specification, event declarations are added to
+the output specification for those events. If the <em>Include input specification</em>
+option is disabled, event declarations are added for all events that are
+disabled. Event declarations that are added and existed in the input
+specification (in case the <em>Include input specification</em> option is disabled),
+inherit their controllability from the input specification. All other events
+that are added are declared as controllable events if their name starts with
+<code>c_</code>, are declared as uncontrollable events if their name starts with <code>u_</code>,
+and are declared as neither controllable nor uncontrollable otherwise.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-chapter-cif-explorer">CIF explorer</h4>
+<div class="paragraph">
+<p>
+
+
+
+
+The CIF explorer unfolds the state space expressed by a CIF specification, in
+an untimed setting. It takes a CIF model and iteratively explores the states
+using event transitions, unfolding the state space. Available output forms
+include a CIF automaton of the state space, and a report with details of the
+found states. Time transitions are never taken. The explorer will return a
+deadlock state when forced into a time step. Continuous variables are allowed,
+but behave much like discrete variables due to lack of time steps.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="tools-starting-the-program">Starting the program</h5>
+<div class="paragraph">
+<p>The explorer can be started in Eclipse in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Right click a <code>.cif</code> file in the 'Project Explorer' tab or
+'Package Explorer' tab and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Explore untimed state space&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Right click an open text editor for a <code>.cif</code> file and choose
+<span class="menuseq"><b class="menu">CIF miscellaneous tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Explore untimed state space&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Use the <code>cifexplorer</code> tool in a
+ToolDef script. See the
+<a href="#tools-scripting-chapter-intro">scripting documentation</a> and
+<a href="#tools-scripting-chapter-tools">tools overview</a> page for details.</p>
+</li>
+<li>
+<p>Use the <code>cifexplorer</code> command line tool.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-options-21">Options</h5>
+<div class="paragraph">
+<p>Besides the general application options, the application has the following
+options:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Input file path</em>: The absolute or relative file system path to the input
+CIF specification.</p>
+</li>
+<li>
+<p><em>Enable edge minimization</em>: Enable edge minimization to remove duplicate
+edges of the state space, before printing statistics, and writing output
+files. Two edges are duplicates if they have the same source and target
+states, and the same event. The communication value, if any, is ignored.
+Enabled by default.</p>
+</li>
+<li>
+<p><em>Enable statistics</em>: Enable printing of statistics of the resulting state
+space to the console. Statistics include the number of states and the number
+of edges of the resulting state space. It is recommended to enable the
+edge minimization option when printing statistics. Enabled by default.</p>
+</li>
+<li>
+<p><em>Enable CIF output</em>: Enable output of states and edges as a CIF automaton.
+Enabled by default.</p>
+</li>
+<li>
+<p><em>Output file path</em>: The absolute or relative file system path of the output
+CIF specification with the generated state space as a CIF automaton.</p>
+</li>
+<li>
+<p><em>Enable report</em>: Enable writing a detailed report on the found states.
+Disabled by default.</p>
+</li>
+<li>
+<p><em>Report file path</em>: The absolute or relative file system path of the report
+file. If specified, option <em>Enable report</em> is implied.</p>
+</li>
+<li>
+<p><em>Print progress</em>: The number of states to process before printing progress
+information. Must be a non-negative integer number. May be <code>off</code> to disable
+progress information. The default is to print progress information after
+processing 1000 states.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The CIF output file is written if the <em>Enable CIF output</em> option is set, or if
+a path is supplied with the <em>Output file path</em> option. If the latter is given,
+its value is used as the path for writing the report file. If only the
+<em>Enable CIF output</em> option is set, the value of the <em>Input file path</em> option is
+used, where the <code>.cif</code> extension is removed (if present), and
+a <code>_statespace.cif</code> suffix is added.</p>
+</div>
+<div class="paragraph">
+<p>The report file is written if the <em>Enable report</em> option is set, or if a path
+is supplied with the <em>Report file path</em> option. If the latter is given, its
+value is used as the path for writing the report file. If only the
+<em>Enable report</em> option is set, the value of the <em>Input file path</em> option is
+used, where the <code>.cif</code> extension is removed (if present), and
+a <code>_report.txt</code> suffix is added.</p>
+</div>
+<div class="paragraph">
+<p>If both the CIF output and the report file output are disabled, the resulting
+state space is not outputted at all. In such cases, the state space explorer
+acts as a verifier for runtime errors, which can make the exploration fail.
+If exploration completes without errors, the explorer has verified that no
+runtime errors occur. Runtime errors include failures to compute values, such
+as division by zero, as well as assignments that assign values to variables
+that are outside the allowed bounds/ranges of the variables.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-supported-specifications-45">Supported specifications</h5>
+<div class="paragraph">
+<p>The explorer supports a subset of CIF specifications. The following
+restrictions apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Usage of distribution types and distribution standard library functions is
+not supported.</p>
+</li>
+<li>
+<p>Usage of derivatives is not supported.</p>
+</li>
+<li>
+<p>External user-defined functions are not supported.</p>
+</li>
+<li>
+<p>Input variables are not supported.</p>
+</li>
+<li>
+<p>Specifications with more than 2<sup>31</sup> - 1 = 2,147,483,647 potential
+initial states are not supported.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following information from the specification is ignored:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Automaton and invariant supervisory kinds.</p>
+</li>
+<li>
+<p>Controllability of events.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-preprocessing-43">Preprocessing</h5>
+<div class="paragraph">
+<p>Prior to exploration, the following <a href="#tools-cif2cif-chapter-index">CIF to CIF transformations</a> are applied as preprocessing (in the given order), to
+increase the subset of CIF specifications that can be explored:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#tools-cif2cif-chapter-remove-io-decls">Remove I/O declarations</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-comp-def-inst">Eliminate component definition/instantiation</a></p>
+</li>
+<li>
+<p><a href="#tools-cif2cif-chapter-elim-self">Eliminate automaton <code>self</code> references</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In addition it applies the
+<a href="#tools-cif2cif-chapter-simplify-values-no-refs-optimized">Simplify values (no references, optimized)</a> CIF to CIF
+transformation to speed up processing.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-scripting">Scripting</h3>
+<div class="sect3">
+<h4 id="tools-scripting-chapter-intro">Introduction to scripting</h4>
+<div class="paragraph">
+<p>All CIF <a href="#tools-chapter-index">tools</a> can be used in
+ToolDef scripts. ToolDef is a
+cross-platform and machine-independent scripting language that supports command
+line execution, but is also available as plug-in for
+<a href="https://eclipse.org">Eclipse</a>, providing an integrated development
+experience.</p>
+</div>
+<div class="sect4">
+<h5 id="tools-scenarios">Scenarios</h5>
+<div class="paragraph">
+<p>Using CIF tools in a ToolDef script can be useful for various reasons.</p>
+</div>
+<div class="paragraph">
+<p>Scripts allow executing multiple tools, one after the other, for instance to
+perform <a href="#tools-chapter-datasynth">data-based synthesis</a> on some sub-systems,
+<a href="#tools-chapter-mergecif">merge</a> the resulting supervisors, and
+<a href="#tools-cif2plc-chapter-index">generate PLC code</a> from it. Once a script is made,
+these steps can be easily repeated whenever the models for the sub-systems
+change. This is much easier than starting each of the tools manually, and saves
+valuable time. Furthermore, it is possible to share your script with others,
+who can then perform the same steps, and get the same results.</p>
+</div>
+<div class="paragraph">
+<p>A script can also be used to execute a single tool, specifying the parameters
+used when executing it. For instance, a script could execute the simulator,
+specifying not only which model (file) to simulate, but also the simulation
+options. If various <a href="#tools-cifsim-output-chapter-index">visualizations</a> are
+enabled, variables are <a href="#tools-cifsim-output-plotviz-filtering">filtered</a>,
+etc, manually configuring the options for each simulation can become tiresome.
+By specifying them in a script, simulating again with the same options becomes
+as simple as executing the script again. By sharing such a script with others,
+they can simulate the same model with the same options.</p>
+</div>
+<div class="paragraph">
+<p>Another use of scripts is to repeatedly execute the same tool, but with
+different parameters. A good example is
+<a href="#tools-cifsim-chapter-repeated-simulation">repeatedly simulating</a> a model.
+Instead of manually simulating a model with
+<a href="#tut-stochastics-chapter-intro">stochastics</a> hundreds or even thousands of
+times, which can be very time consuming, a script can be used to automate this
+task. The script can then also be used to automatically collect the results,
+and process them. Others can use the same script to repeat the experiments and
+verify the results, or to perform similar experiments.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-library-import">Library import</h5>
+<div class="paragraph">
+<p>In order to use CIF tools in a ToolDef script, the library with all CIF
+tools needs to be imported. The import statement to use is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This statement imports all tools from the <code>cif</code> library, a library
+registered by the CIF tooling. You&#8217;ll want to include this import statement
+in all your own scripts that use CIF tools.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-execution-a-tool">Execution a tool</h5>
+<div class="paragraph">
+<p>Here is a simple example of a ToolDef script that simulates a model using the
+<a href="#tools-cifsim-chapter-index">CIF simulator</a>:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(&quot;some_model.cif -i auto -t 10&quot;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The second statement executes the <code>cifsim</code> tool (the CIF simulator). This
+is just one of the tools that is available, but there are
+<a href="#tools-scripting-chapter-tools">many more</a>.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-command-line-arguments">Command line arguments</h5>
+<div class="paragraph">
+<p>Command line arguments can be used to let a tool know on which files it should
+operate, and what options it should use. The example above uses
+<code>"some_model.cif -i auto -t 10"</code> as arguments, consisting of the model to
+simulate (the <code>some_model.cif</code> file) and some simulation options
+(<a href="#tools-cifsim-input-chapter-automatic">automatic simulation</a> due to
+<code>-i auto</code>, and a simulation
+<a href="#tools-cifsim-termination-endtime">end time</a> of 10 time units due to
+<code>-t 10</code>).</p>
+</div>
+<div class="paragraph">
+<p>The command line options to use in ToolDef, are identical to the command line
+options to use for command line scripts, in a
+shell or command window. The CIF documentation generally refers to command line
+arguments or command line options, which can thus be used on the actual command
+line, as well as in ToolDef scripts.</p>
+</div>
+<div class="paragraph">
+<p>The command line arguments that are available are different for each tool. All
+CIF tools have <code>-h</code> and <code>--help</code> command line arguments that can be used
+to print the application help text to the console. The help text contains
+detailed information on all the command line arguments supported by the tool.
+Here is an example of how to show the help text for the simulator:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(&quot;-h&quot;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This information can also be seen in the option dialog:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/scripting/option_dialog_cmdline_help.png" alt="option dialog cmdline help">
+</div>
+</div>
+<div class="paragraph">
+<p>The option dialog shows the same help text as the command line <code>--help</code> and
+<code>-h</code> options. In this screenshot, you can see the help text of the
+<code>--end-time</code> or <code>-t</code> option. This particular option can also be configured
+using the option dialog. It is part of the
+<b class="menuref">Simulator</b>
+category:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./tools/scripting/option_dialog_cmdline_link.png" alt="option dialog cmdline link">
+</div>
+</div>
+<div class="paragraph">
+<p>There, it is listed as
+<b class="menuref">Simulator end time</b>
+option. After that name,
+the command line names of the option (<code>--end-time</code> and <code>-t</code>) are also
+listed. This makes it easier to link options in the option dialog with command
+line options.</p>
+</div>
+<div class="paragraph">
+<p>In the example ToolDef scripts so far, all command line arguments are provided
+as a single string of text. However, it is also possible to provide each
+command line argument as a separate string. In fact, you may provide as many
+strings as you like, and each string may contain as many command line arguments
+as you like. For instance, the following statements each execute the simulator,
+and all have the same command line arguments, but provided in a different way:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">cifsim(&quot;some_model.cif -i auto -t 10&quot;);       // Single string, all arguments.
+cifsim(&quot;some_model.cif&quot;, &quot;-i auto&quot;, &quot;-t 10&quot;); // Multiple strings, multiple arguments each.
+cifsim(&quot;some_model.cif&quot;, &quot;-i&quot;, &quot;auto&quot;, &quot;-t&quot;, &quot;10&quot;); // Multiple strings, one argument each.</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>For simulations, disabling a certain simulation option is a common task. By
+listing each simulation option on a separate line of the script, disabling or
+enabling a simulation option becomes as easy as commenting or uncommenting a
+line of the script. For instance, consider the following script:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(
+    &quot;some_model.cif&quot;,
+    &quot;-i auto&quot;,
+    &quot;-t 10&quot;,
+);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The model to simulate, the enabling of the automatic input mode, and the
+simulation end time, are each specified on a separate line. This makes it very
+easy to disable the simulation end time:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(
+    &quot;some_model.cif&quot;,
+    &quot;-i auto&quot;,
+    // &quot;-t 10&quot;,
+);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>To comment a line or multiple selected lines in a ToolDef text editor, use
+keyboard shortcut <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>/</kbd></span> or the corresponding toolbar button
+(<span class="image"><img src="./tools/scripting/comment.png" alt="comment"></span>). For uncommenting, use keyboard shortcut
+<span class="keyseq"><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>/</kbd></span> or the corresponding toolbar button
+(<span class="image"><img src="./tools/scripting/uncomment.png" alt="uncomment"></span>).</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-output-redirection-and-other-options">Output redirection and other options</h5>
+<div class="paragraph">
+<p>Besides the application specific options that can be configured using the
+command line arguments, all tools such as the <code>cifsim</code> tool, have some
+additional options. This includes the possibility to write the output of the
+tool to a file instead of the console:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">from &quot;lib:cif&quot; import *;
+
+cifsim(&quot;some_model.cif -i auto -t 10&quot;, stdout=&quot;output.txt&quot;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <code>stdout</code> parameter of the <code>cifsim</code> tool is used to specify the
+filename of the file to which to write the output. A complete list of the
+available parameters and their meaning, is available on the
+<a href="#tools-scripting-chapter-tools">Overview of scriptable tools</a> page.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="tools-scripting-chapter-tools">Overview of scriptable tools</h4>
+<div class="paragraph">
+<p>This page provides an overview of the CIF tools that are available in the
+<code>cif</code> library that is registered with ToolDef by CIF.</p>
+</div>
+<div class="sect4">
+<h5 id="tools-tools">Tools</h5>
+<div class="paragraph">
+<p>The following table shows the relation between the names of the ToolDef tools
+in the library and the tools of the CIF tool set:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">ToolDef tool name</th>
+<th class="tableblock halign-left valign-top">CIF tool</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2yed</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-cif2yed">CIF to yEd transformer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifdatasynth</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-datasynth">Data-based supervisory controller synthesis</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2supremica</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-cif2supremica">CIF to Supremica transformer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifsim</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cifsim-chapter-index">CIF simulator</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2mcrl2</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-cif2mcrl2">CIF to mCRL2 transformer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2uppaal</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-cif2uppaal">CIF to UPPAAL transformer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifcodegen</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-codegen-chapter-index">CIF code generator</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2plc</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cif2plc-chapter-index">CIF PLC code generator</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cif2cif</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-cif2cif-chapter-index">CIF to CIF transformer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifmerge</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-mergecif">CIF merger</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifevtdis</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-event-disabler">CIF event disabler</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifexplorer</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-chapter-cif-explorer">CIF explorer</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifprod</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-product">Event-based synchronous product</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifsupsynth</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-supervisorsynthesis">Event-based supervisor synthesis</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifsynthanalys</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-synthesis-analysis">Event-based synthesis analysis</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifncchk</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-nonconflicting-check">Event-based nonconflicting check</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifctrlchk</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-controllability-check">Event-based controllability check</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ciflngeqv</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-language-equivalence-check">Event-based language equivalence check</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifnfadfa</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-nfa-to-dfa">Event-based NFA to DFA automaton conversion</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifdfamin</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-dfa-minimization">Event-based DFA minimization</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifproj</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-projection">Event-based automaton projection</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifobschk</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-observer-check">Event-based observer check</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>cifabstr</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-automaton-abstraction">Event-based automaton abstraction</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ciftrimchk</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-trim-check">Event-based trim check</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ciftrim</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#tools-eventbased-chapter-trim">Event-based trim</a></p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="sect4">
+<h5 id="tools-parameters">Parameters</h5>
+<div class="paragraph">
+<p>For every CIF tool, two ToolDef tool variants are available in the <code>cif</code>
+ToolDef library. All the CIF tools in the <code>cif</code> ToolDef library have
+the same tool signatures, including the same parameters. Only their names
+differ. Below the tool signatures for the two variants are listed, with
+<code>toolname</code> instead of the actual tool name (e.g. <code>cifsim</code>):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int toolname(
+            string... args,
+            string stdin = &quot;-&quot;,
+            string stdout = &quot;-&quot;,
+            string stderr = &quot;-&quot;,
+            bool appendOut = false,
+            bool appendErr = false,
+            bool errToOut = false,
+            bool ignoreNonZeroExitCode = false
+)
+
+tool int toolname(
+            list string args = [],
+            string stdin = &quot;-&quot;,
+            string stdout = &quot;-&quot;,
+            string stderr = &quot;-&quot;,
+            bool appendOut = false,
+            bool appendErr = false,
+            bool errToOut = false,
+            bool ignoreNonZeroExitCode = false
+)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The meaning of each of the parameters is as follows:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">args</dt>
+<dd>
+<p>The command line arguments of the application. Each argument string is parsed
+to zero or more actual arguments. It is possible to use a single string with
+all arguments (where the arguments themselves are separated by spaces), comma
+separated strings for each of the arguments (each string has one argument),
+or a mix of those.</p>
+<div class="paragraph">
+<p>In argument strings, individual arguments are separated by whitespace
+(spaces, tabs, new lines, etc). The whitespace itself is ignored, and only
+serves as separation. To include whitespace in an argument, the argument (or
+a part of it), may be quoted, by putting it between double quotes (<code>"</code>) or
+single quotes (<code>'</code>). Characters may be escaped by prefixing them with a
+backslash (<code>\</code>). This is particularly useful for single/double quotes, and
+escape characters, and can also be used to escape spaces. Escapes work the
+same inside of quoted parts as they do outside of quoted parts.</p>
+</div>
+</dd>
+<dt class="hdlist1">stdin</dt>
+<dd>
+<p>Specify whether to have a standard input (stdin) stream and where the input
+comes from. Use <code>""</code> to not have a stdin stream, "-" to use the stdin
+stream of the ToolDef interpreter, or otherwise an absolute or relative local
+file system path of the file from which to read the standard input. May
+contain both <code>\</code> and <code>/</code> as path separators</p>
+</dd>
+<dt class="hdlist1">stdout</dt>
+<dd>
+<p>Specify whether to have a standard output (stdout) stream and where to write
+the standard output. Use <code>""</code> to not have a stdout stream, <code>"-"</code> to use
+the stdout stream of the ToolDef interpreter, or otherwise an absolute or
+relative local file system path of the file to which to write the standard
+output. May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1">stderr</dt>
+<dd>
+<p>Specify whether to have a standard error (stderr) stream and where to write
+the standard error output. Use <code>""</code> to not have a stderr stream, <code>"-"</code>
+to use the stderr stream of the ToolDef interpreter, or otherwise an absolute
+or relative local file system path of the file to which to write the standard
+error output. May contain both <code>\</code> and <code>/</code> as path separators. Is ignored
+when the standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1">appendOut</dt>
+<dd>
+<p>Whether to append to the stdout file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored when standard output is not written to a file.</p>
+</dd>
+<dt class="hdlist1">appendErr</dt>
+<dd>
+<p>Whether to append to the stderr file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored if standard error output is not written to a file. Is also ignored
+when standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1">errToOut</dt>
+<dd>
+<p>Whether to redirect the standard error stream to the standard output stream
+(<code>true</code>) or use separate streams (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1">ignoreNonZeroExitCode</dt>
+<dd>
+<p>Whether to ignore non-zero exit codes (<code>true</code>) or consider them as errors
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-return-value">Return value</h5>
+<div class="paragraph">
+<p>All the tools return an integer value. This value is the exit code of the
+application. A zero (<code>0</code>) exit code means the application terminated without
+any errors. A non-zero exit code means the application terminated with an
+error.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="tools-implementation">Implementation</h5>
+<div class="paragraph">
+<p>All the tools are internally implemented using the ToolDef <code>app</code> tool.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="examples-chapter-index">CIF examples</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>CIF ships with several examples. To obtain these examples, follow these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Start the Eclipse ESCET IDE.</p>
+</li>
+<li>
+<p>Click <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Example&#8230;&#8203;</b></span>.</p>
+</li>
+<li>
+<p>Select <em>CIF Examples</em> and click <b class="button">Next</b>.</p>
+</li>
+<li>
+<p>Choose the name of the new project that will be created.</p>
+</li>
+<li>
+<p>Choose a location for the new project, on your hard disk. If you leave the
+<em>Use default location</em> option enabled, the new project will be created in
+workspace directory. See the Eclipse ESCET documentation for more
+information on workspaces.</p>
+</li>
+<li>
+<p>Click <b class="button">Finish</b> to create the new project, and fill it with the
+examples.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For new releases of CIF, the examples may change. The examples project that you
+previously created won&#8217;t be automatically updated. You can however go
+through the steps again, and get a second project, with the new examples. The
+version of the release is included in the suggested project name, allowing
+multiple example projects for different releases.</p>
+</div>
+<div class="paragraph">
+<p>Most examples also include a ToolDef <a href="#tools-scripting-chapter-intro">script</a>
+(<code>.tooldef</code> file) that can be used to perform various tasks, such as
+simulation. To execute such a script, right click a <code>.tooldef</code> file an choose
+<b class="menuref">Execute ToolDef</b>. Alternatively, select the file and press
+<kbd>F10</kbd>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="release-notes-chapter-index">CIF release notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The release notes for the releases of CIF and the associated tools, as
+part of the Eclipse ESCET project, are listed below in reverse chronological
+order.</p>
+</div>
+<div class="sect2">
+<h3 id="version-0-1-unreleased">Version 0.1 (unreleased)</h3>
+<div class="paragraph">
+<p>The first release of CIF as part of the Eclipse ESCET project.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="dev-chapter-index">Developers</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The CIF developers manual is intended only for those who develop or extend
+the CIF language or tools. It is not intended for end users.</p>
+</div>
+<div class="paragraph">
+<p>This manual only contains CIF specific information. For general developers
+information, see the Eclipse ESCET developers manual.</p>
+</div>
+<div class="paragraph">
+<p>The following information is available for developers:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#dev-lang-modify">CIF language modification</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="dev-lang-modify">CIF language modification</h3>
+<div class="paragraph">
+<p>For each change to the CIF language, follow these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Update <code>cif.setext</code> syntax.</p>
+</li>
+<li>
+<p>Update <code>cif.bnf</code> syntax in documentation.</p>
+</li>
+<li>
+<p>Update example models for changed syntax.</p>
+</li>
+<li>
+<p>Update Ecore metamodel. Update Ecore diagram images.</p>
+</li>
+<li>
+<p>Update Ecore genmodel. Remove and re-generate model code.</p>
+</li>
+<li>
+<p>Update generated Java constructors and walker code.</p>
+</li>
+<li>
+<p>Update LaTeX documentation skeleton files.</p>
+</li>
+<li>
+<p>Update LaTeX documentation, including constraints. Generate new PDF.</p>
+</li>
+<li>
+<p>Update example models for changed constraints.</p>
+</li>
+<li>
+<p>Update parser implementation, including AST classes.</p>
+</li>
+<li>
+<p>Update text editor, including keywords and syntax highlighting.</p>
+</li>
+<li>
+<p>Update type checker, including error message enumeration.</p>
+</li>
+<li>
+<p>Update pretty printer, including set of keywords.</p>
+</li>
+<li>
+<p>Update CIF to CIF transformations and other tools.</p>
+</li>
+<li>
+<p>Update CIF documentation, including language reference manual with lexical
+syntax and grammar.</p>
+</li>
+<li>
+<p>Update CIF syntax highlighting definition for LaTeX.</p>
+</li>
+<li>
+<p>Update CIF syntax highlighting definition for AsciiDoctor.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="legal-chapter-index">Legal</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The material in this documentation is
+Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
+Eclipse, and the Eclipse Logo are registered trademarks of the
+Eclipse Foundation. Other names may be trademarks of their
+respective owners.</p>
+</div>
+<div class="paragraph">
+<p><strong>License</strong></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Foundation makes available all content in this document
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the MIT License. A copy of the MIT License
+is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>. For purposes of the
+MIT License, "Software" will mean the Content.</p>
+</div>
+<div class="paragraph">
+<p>If you did not receive this Content directly from the Eclipse Foundation,
+the Content is being redistributed by another party ("Redistributor") and
+different terms and conditions may apply to your use of any object code in
+the Content. Check the Redistributor&#8217;s license that was provided with the
+Content. If no such license exists, contact the Redistributor. Unless
+otherwise indicated below, the terms and conditions of the MIT License
+still apply to any source code in the Content and such source code may be
+obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
+pre.CodeRay{background:#f7f7f8}
+.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
+.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
+.CodeRay .line-numbers strong{color:#000}
+table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.CodeRay td{vertical-align:top;line-height:inherit}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.code{padding:0 0 0 .75em}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+  messageStyle: "none",
+  tex2jax: {
+    inlineMath: [["\\(", "\\)"]],
+    displayMath: [["\\[", "\\]"]],
+    ignoreClass: "nostem|nolatexmath"
+  },
+  asciimath2jax: {
+    delimiters: [["\\$", "\\$"]],
+    ignoreClass: "nostem|noasciimath"
+  },
+  TeX: { equationNumbers: { autoNumber: "none" } }
+})
+MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
+  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
+    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
+      data.math.root.display = "block"
+    }
+    return data
+  })
+})
+</script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+
+<div id="footer">
+<div id="footer-text">
+<a href="https://www.eclipse.org">Eclipse Home</a>
+|
+<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
+|
+<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
+|
+<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
+|
+<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/v0.1-M1/cif/lang-ref/syntax/cif.bnf b/v0.1-M1/cif/lang-ref/syntax/cif.bnf
new file mode 100644
index 0000000..8904324
--- /dev/null
+++ b/v0.1-M1/cif/lang-ref/syntax/cif.bnf
@@ -0,0 +1,617 @@
+Specification : GroupBody
+              ;
+
+GroupBody : OptGroupDecls
+          ;
+
+AutomatonBody : OptAutDecls Locations OptIoDecls
+              ;
+
+OptGroupDecls : /* empty */
+              | OptGroupDecls GroupDecl
+              ;
+
+GroupDecl : Decl
+          | "import" Imports ";"
+          | "namespace" IDENTIFIERTK ";"
+          | "namespace" RELATIVENAMETK ";"
+          | "func" Types Identifier FuncParams ":" FuncBody
+          | Identifier ":" Name ActualParms ";"
+          | "group"                "def" Identifier FormalParms ":" GroupBody     "end"
+          | OptSupKind "automaton" "def" Identifier FormalParms ":" AutomatonBody "end"
+          |    SupKind             "def" Identifier FormalParms ":" AutomatonBody "end"
+          | "group"                      Identifier             ":" GroupBody     "end"
+          | OptSupKind "automaton"       Identifier             ":" AutomatonBody "end"
+          |    SupKind                   Identifier             ":" AutomatonBody "end"
+          ;
+
+OptAutDecls : /* empty */
+            | OptAutDecls AutDecl
+            ;
+
+AutDecl : Decl
+        | "alphabet" Events ";"
+        | "alphabet" ";"
+        | "monitor" Events ";"
+        | "monitor" ";"
+        | "disc" Type DiscDecls ";"
+        ;
+
+Decl : "type" TypeDefs ";"
+     | "enum" Identifier "=" "{" Identifiers "}" ";"
+     | "enum" Identifier "=" Identifiers ";"
+     | OptControllability "event"           Identifiers ";"
+     | OptControllability "event" EventType Identifiers ";"
+     |    Controllability                   Identifiers ";"
+     |    Controllability         EventType Identifiers ";"
+     | "const" Type ConstantDefs ";"
+     | "alg" Type AlgVarsDefs ";"
+     | "input" Type Identifiers ";"
+     | "cont" ContDecls ";"
+     | "equation" Equations ";"
+     | "initial" Expressions ";"
+     | InvariantDecls
+     | "marked" Expressions ";"
+     | IoDecl
+     ;
+
+Identifier : IDENTIFIERTK
+           ;
+
+Imports : StringToken
+        | Imports "," StringToken
+        ;
+
+StringToken : STRINGTK
+            ;
+
+TypeDefs : Identifier "=" Type
+         | TypeDefs "," Identifier "=" Type
+         ;
+
+ConstantDefs : Identifier "=" Expression
+             | ConstantDefs "," Identifier "=" Expression
+             ;
+
+AlgVarsDefs : Identifier
+            | Identifier "=" Expression
+            | AlgVarsDefs "," Identifier
+            | AlgVarsDefs "," Identifier "=" Expression
+            ;
+
+FuncParams : "(" ")"
+           | "(" FuncParamDecls ")"
+           ;
+
+FuncParamDecls : Type Identifiers
+               | FuncParamDecls ";" Type Identifiers
+               ;
+
+FuncBody : FuncVarDecls FuncStatements "end"
+         | StringToken ";"
+         ;
+
+FuncVarDecls : /* empty */
+             | FuncVarDecls Type FuncVarDecl ";"
+             ;
+
+FuncVarDecl : Identifier
+            | Identifier "=" Expression
+            | FuncVarDecl "," Identifier
+            | FuncVarDecl "," Identifier "=" Expression
+            ;
+
+FuncStatements : FuncStatement
+               | FuncStatements FuncStatement
+               ;
+
+FuncStatement : Addressables ":=" Expressions ";"
+              | "if" Expressions ":" FuncStatements
+                OptElifFuncStats OptElseFuncStat "end"
+              | "while" Expressions ":" FuncStatements "end"
+              | "break" ";"
+              | "continue" ";"
+              | "return" Expressions ";"
+              ;
+
+OptElifFuncStats : /* empty */
+                 | OptElifFuncStats "elif" Expressions ":" FuncStatements
+                 ;
+
+OptElseFuncStat : /* empty */
+                | "else" FuncStatements
+                ;
+
+Events : Name
+       | Events "," Name
+       ;
+
+CoreEdge : EdgeEvents         OptEdgeGuard OptEdgeUrgent OptEdgeUpdate
+         | "when" Expressions              OptEdgeUrgent OptEdgeUpdate
+         | "now"                                         OptEdgeUpdate
+         | "do" Updates
+         ;
+
+OptEdgeGuard : /* empty */
+             | "when" Expressions
+             ;
+
+OptEdgeUrgent : /* empty */
+              | "now"
+              ;
+
+OptEdgeUpdate : /* empty */
+              | "do" Updates
+              ;
+
+EdgeEvents : EdgeEvent
+           | EdgeEvents "," EdgeEvent
+           ;
+
+EdgeEvent : "tau"
+          | Name
+          | Name "!"
+          | Name "!" Expression
+          | Name "?"
+          ;
+
+Locations : Location
+          | Locations Location
+          ;
+
+Location : "location" ";"
+         | "location" Identifier ";"
+         | "location" ":" LocationElements
+         | "location" Identifier ":" LocationElements
+         ;
+
+LocationElements : LocationElement
+                 | LocationElements LocationElement
+                 ;
+
+LocationElement : "initial" ";"
+                | "initial" Expressions ";"
+                | InvariantDecls
+                | "equation" Equations ";"
+                | "marked" ";"
+                | "marked" Expressions ";"
+                | "urgent" ";"
+                | "edge" CoreEdge ";"
+                | "edge" CoreEdge "goto" Identifier ";"
+                ;
+
+ActualParms : "(" ")"
+            | "(" Expressions ")"
+            ;
+
+FormalParms : "(" ")"
+            | "(" FormalDecls ")"
+            ;
+
+FormalDecls : FormalDeclaration
+            | FormalDecls ";" FormalDeclaration
+            ;
+
+FormalDeclaration : OptControllability "event"           EventParamIds
+                  | OptControllability "event" EventType EventParamIds
+                  |    Controllability                   EventParamIds
+                  |    Controllability         EventType EventParamIds
+                  | Name Identifiers
+                  | "location" Identifiers
+                  | "alg" Type Identifiers
+                  ;
+
+EventParamIds : EventParamId
+              | EventParamIds "," EventParamId
+              ;
+
+EventParamId : Identifier OptEventParamFlags
+             ;
+
+OptEventParamFlags : /* empty */
+                   | OptEventParamFlags EventParamFlag
+                   ;
+
+EventParamFlag : "!"
+               | "?"
+               | "~"
+               ;
+
+DiscDecls : DiscDecl
+          | DiscDecls "," DiscDecl
+          ;
+
+DiscDecl : Identifier
+         | Identifier "in" "any"
+         | Identifier "=" Expression
+         | Identifier "in" "{" Expressions "}"
+         ;
+
+ContDecls : ContDecl
+          | ContDecls "," ContDecl
+          ;
+
+ContDecl : Identifier OptDerivative
+         | Identifier "=" Expression OptDerivative
+         ;
+
+OptDerivative : /* empty */
+              | "der" Expression
+              ;
+
+Equations : Equation
+          | Equations "," Equation
+          ;
+
+Equation : Identifier "'" "=" Expression
+         | Identifier "=" Expression
+         ;
+
+InvariantDecls : OptSupKind "invariant" Invariants ";"
+               |    SupKind             Invariants ";"
+               ;
+
+Invariants : Invariant
+           | Invariants "," Invariant
+           ;
+
+Invariant : Expression
+          | Name                  "needs"    Expression
+          | NonEmptySetExpression "needs"    Expression
+          | Expression            "disables" Name
+          | Expression            "disables" NamesSet
+          ;
+
+NamesSet : "{" Names "}"
+         ;
+
+Names : Name
+      | Names "," Name
+      ;
+
+Updates : Update
+        | Updates "," Update
+        ;
+
+Update : Addressable ":=" Expression
+       | "if" Expressions ":" Updates
+         OptElifUpdates OptElseUpdate "end"
+       ;
+
+Addressables : Addressable
+             | Addressables "," Addressable
+             ;
+
+Addressable : Identifier
+            | Identifier Projections
+            | "(" Addressable "," Addressables ")"
+            ;
+
+Projections : Projection
+            | Projections Projection
+            ;
+
+Projection : "[" Expression "]"
+           ;
+
+OptElifUpdates : /* empty */
+               | OptElifUpdates "elif" Expressions ":" Updates
+               ;
+
+OptElseUpdate : /* empty */
+              | "else" Updates
+              ;
+
+Identifiers : Identifier
+            | Identifiers "," Identifier
+            ;
+
+OptSupKind : /* empty */
+           | SupKind
+           ;
+
+OptControllability : /* empty */
+                   | Controllability
+                   ;
+
+Controllability : "controllable"
+                | "uncontrollable"
+                ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+OptIoDecls : /* empty */
+           | OptIoDecls IoDecl
+           ;
+
+IoDecl : SvgFile
+       | SvgCopy
+       | SvgMove
+       | SvgOut
+       | SvgIn
+       | PrintFile
+       | Print
+       ;
+
+SvgFile : "svgfile" StringToken ";"
+        ;
+
+OptSvgFile : /* empty */
+           | "file" StringToken
+           ;
+
+SvgCopy : "svgcopy" "id" Expression OptSvgCopyPre OptSvgCopyPost OptSvgFile ";"
+        ;
+
+OptSvgCopyPre : /* empty */
+              | "pre" Expression
+              ;
+
+OptSvgCopyPost : /* empty */
+               | "post" Expression
+               ;
+
+SvgMove : "svgmove" "id" Expression "to" Expression "," Expression
+          OptSvgFile ";"
+        ;
+
+SvgOut : "svgout" "id" Expression SvgAttr "value" Expression OptSvgFile
+         ";"
+       ;
+
+SvgAttr : "attr" StringToken
+        | "text"
+        ;
+
+SvgIn : "svgin" "id" Expression "event" SvgInEvent OptSvgFile ";"
+      ;
+
+SvgInEvent : Name
+           | "if" Expression ":" Name OptSvgInEventElifs "else" Name "end"
+           | "if" Expression ":" Name SvgInEventElifs "end"
+           ;
+
+OptSvgInEventElifs : /* empty */
+                   | SvgInEventElifs
+                   ;
+
+SvgInEventElifs : "elif" Expression ":" Name
+                | SvgInEventElifs "elif" Expression ":" Name
+                ;
+
+PrintFile : "printfile" StringToken ";"
+          ;
+
+Print : "print" PrintTxt OptPrintFors OptPrintWhen OptPrintFile ";"
+      ;
+
+PrintTxt : Expression
+         | "pre" Expression
+         | "post" Expression
+         | "pre" Expression "post" Expression
+         ;
+
+OptPrintFors : /* empty */
+             | "for" PrintFors
+             ;
+
+PrintFors : PrintFor
+          | PrintFors "," PrintFor
+          ;
+
+PrintFor : "event"
+         | "time"
+         | Name
+         | "initial"
+         | "final"
+         ;
+
+OptPrintWhen : /* empty */
+             | "when" Expression
+             | "when" "pre" Expression
+             | "when" "post" Expression
+             | "when" "pre" Expression "post" Expression
+             ;
+
+OptPrintFile : /* empty */
+             | "file" StringToken
+             ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+Types : Type
+      | Types "," Type
+      ;
+
+EventType : "void"
+          | Type
+          ;
+
+Type : "bool"
+     | "int"
+     | "int" "[" Expression ".." Expression "]"
+     | "real"
+     | "string"
+     | "list" Type
+     | "list" "[" Expression "]" Type
+     | "list" "[" Expression ".." Expression "]" Type
+     | "set" Type
+     | "dict" "(" Type ":" Type ")"
+     | "tuple" "(" Fields ")"
+     | "func" Type "(" ")"
+     | "func" Type "(" Types ")"
+     | "dist" Type
+     | Name
+     ;
+
+Fields : Field
+       | Fields ";" Field
+       ;
+
+Field : Type Identifiers
+      ;
+
+///////////////////////////////////////////////////////////////////////////////
+
+Expressions : Expression
+            | Expressions "," Expression
+            ;
+
+OptExpression : /* empty */
+              | Expression
+              ;
+
+Expression : OrExpression
+           | OrExpression "=>" OrExpression
+           | OrExpression "<=>" OrExpression
+           ;
+
+OrExpression : AndExpression
+             | OrExpression "or" AndExpression
+             ;
+
+AndExpression : CompareExpression
+              | AndExpression "and" CompareExpression
+              ;
+
+CompareExpression : AddExpression
+                  | CompareExpression "<"  AddExpression
+                  | CompareExpression "<=" AddExpression
+                  | CompareExpression "="  AddExpression
+                  | CompareExpression "!=" AddExpression
+                  | CompareExpression ">=" AddExpression
+                  | CompareExpression ">"  AddExpression
+                  | CompareExpression "in" AddExpression
+                  | CompareExpression "sub" AddExpression
+                  ;
+
+AddExpression : MulExpression
+              | AddExpression "+" MulExpression
+              | AddExpression "-" MulExpression
+              ;
+
+MulExpression : UnaryExpression
+              | MulExpression "*" UnaryExpression
+              | MulExpression "/" UnaryExpression
+              | MulExpression "div" UnaryExpression
+              | MulExpression "mod" UnaryExpression
+              ;
+
+UnaryExpression : FuncExpression
+                | "-" UnaryExpression
+                | "+" UnaryExpression
+                | "not" UnaryExpression
+                | "sample" FuncExpression
+                ;
+
+FuncExpression : ExpressionFactor
+               | FuncExpression "[" Expression "]"
+               | FuncExpression
+                 "[" OptExpression ":" OptExpression "]"
+               | FuncExpression "(" ")"
+               | FuncExpression "(" Expressions ")"
+               | StdLibFunction "(" ")"
+               | StdLibFunction "(" Expressions ")"
+               ;
+
+ExpressionFactor : "true"
+                 | "false"
+                 | NUMBERTK
+                 | REALTK
+                 | StringToken
+                 | "time"
+                 | "[" "]"
+                 | "[" Expressions "]"
+                 | "{" "}"
+                 | NonEmptySetExpression
+                 | "{" DictPairs "}"
+                 | "(" Expression "," Expressions ")"
+                 | "<" Type ">" ExpressionFactor
+                 | "if" Expressions ":" Expression
+                   OptElifExprs "else" Expression "end"
+                 | "switch" Expression ":" SwitchBody "end"
+                 | "(" Expression ")"
+                 | Name
+                 | Name "'"
+                 | "?"
+                 | "self"
+                 ;
+
+NonEmptySetExpression : "{" Expressions "}"
+                      ;
+
+DictPairs : Expression ":" Expression
+          | DictPairs "," Expression ":" Expression
+          ;
+
+OptElifExprs : /* empty */
+             | OptElifExprs "elif" Expressions ":" Expression
+             ;
+
+SwitchBody : SwitchCases
+           | SwitchCases "else" Expression
+           |             "else" Expression
+           ;
+
+SwitchCases : "case" Expression ":" Expression
+            | SwitchCases "case" Expression ":" Expression
+            ;
+
+Name : Identifier
+     | RELATIVENAMETK
+     | ABSOLUTENAMETK
+     | ROOTNAMETK
+     ;
+
+SupKind : "plant"
+        | "requirement"
+        | "supervisor"
+        ;
+
+StdLibFunction : "acosh"
+               | "acos"
+               | "asinh"
+               | "asin"
+               | "atanh"
+               | "atan"
+               | "cosh"
+               | "cos"
+               | "sinh"
+               | "sin"
+               | "tanh"
+               | "tan"
+               | "abs"
+               | "cbrt"
+               | "ceil"
+               | "del"
+               | "empty"
+               | "exp"
+               | "floor"
+               | "fmt"
+               | "ln"
+               | "log"
+               | "max"
+               | "min"
+               | "pop"
+               | "pow"
+               | "round"
+               | "scale"
+               | "sign"
+               | "size"
+               | "sqrt"
+               | "bernoulli"
+               | "beta"
+               | "binomial"
+               | "constant"
+               | "erlang"
+               | "exponential"
+               | "gamma"
+               | "geometric"
+               | "lognormal"
+               | "normal"
+               | "poisson"
+               | "random"
+               | "triangle"
+               | "uniform"
+               | "weibull"
+               ;
diff --git a/v0.1-M1/cif/screenshot_ide.png b/v0.1-M1/cif/screenshot_ide.png
new file mode 100644
index 0000000..80e0490
--- /dev/null
+++ b/v0.1-M1/cif/screenshot_ide.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/activate_cfg.png b/v0.1-M1/cif/tools/cif2plc/activate_cfg.png
new file mode 100644
index 0000000..1471c0b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/activate_cfg.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/login.png b/v0.1-M1/cif/tools/cif2plc/login.png
new file mode 100644
index 0000000..1086911
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/login.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/logout.png b/v0.1-M1/cif/tools/cif2plc/logout.png
new file mode 100644
index 0000000..96641bb
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/logout.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_config.png b/v0.1-M1/cif/tools/cif2plc/mode_config.png
new file mode 100644
index 0000000..303bcfd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_config.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_ex.png b/v0.1-M1/cif/tools/cif2plc/mode_ex.png
new file mode 100644
index 0000000..1633823
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_ex.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_free_run.png b/v0.1-M1/cif/tools/cif2plc/mode_free_run.png
new file mode 100644
index 0000000..6329333
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_free_run.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_inactive.png b/v0.1-M1/cif/tools/cif2plc/mode_inactive.png
new file mode 100644
index 0000000..65a2529
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_inactive.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_run.png b/v0.1-M1/cif/tools/cif2plc/mode_run.png
new file mode 100644
index 0000000..969f1b8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_run.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/mode_stop.png b/v0.1-M1/cif/tools/cif2plc/mode_stop.png
new file mode 100644
index 0000000..f9bb568
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/mode_stop.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/restart_config.png b/v0.1-M1/cif/tools/cif2plc/restart_config.png
new file mode 100644
index 0000000..95a308c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/restart_config.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/restart_run.png b/v0.1-M1/cif/tools/cif2plc/restart_run.png
new file mode 100644
index 0000000..eb2f9a5
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/restart_run.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/scan_devices.png b/v0.1-M1/cif/tools/cif2plc/scan_devices.png
new file mode 100644
index 0000000..27f59c8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/scan_devices.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/start.png b/v0.1-M1/cif/tools/cif2plc/start.png
new file mode 100644
index 0000000..415c12c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/start.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2plc/stop.png b/v0.1-M1/cif/tools/cif2plc/stop.png
new file mode 100644
index 0000000..b8248cf
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2plc/stop.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_bg.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_bg.png
new file mode 100644
index 0000000..8ff54fe
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_bg.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_header.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_header.png
new file mode 100644
index 0000000..6eb291a
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_code_header.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_comp_header.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_comp_header.png
new file mode 100644
index 0000000..9633823
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_comp_header.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_def_header.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_def_header.png
new file mode 100644
index 0000000..b8a474b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_def_header.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_inst_header.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_inst_header.png
new file mode 100644
index 0000000..2bd79e0
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_inst_header.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_loc_bg.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_loc_bg.png
new file mode 100644
index 0000000..c33e90c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_loc_bg.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_color_wrap_box_header.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_wrap_box_header.png
new file mode 100644
index 0000000..72dca3c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_color_wrap_box_header.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_data_decl.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_decl.png
new file mode 100644
index 0000000..f1f515a
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_decl.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_data_param.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_param.png
new file mode 100644
index 0000000..bda93e7
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_param.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_data_usage.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_usage.png
new file mode 100644
index 0000000..b30ff7d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_data_usage.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_event_decl.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_decl.png
new file mode 100644
index 0000000..a92a672
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_decl.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_event_param.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_param.png
new file mode 100644
index 0000000..31e0088
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_param.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_recv.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_recv.png
new file mode 100644
index 0000000..2f601e0
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_recv.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_send.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_send.png
new file mode 100644
index 0000000..0d4690f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_send.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_sync.png b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_sync.png
new file mode 100644
index 0000000..1dd6d62
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/cif2yed_event_usage_sync.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.graphml b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.graphml
new file mode 100644
index 0000000..5929d3d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.graphml
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="port" id="d0" yfiles.type="portgraphics"/>
+  <key for="port" id="d1" yfiles.type="portgeometry"/>
+  <key for="port" id="d2" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d3"/>
+  <key attr.name="description" attr.type="string" for="node" id="d4"/>
+  <key for="node" id="d5" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d6" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d7"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d8"/>
+  <key for="edge" id="d9" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <node id="n0" yfiles.foldertype="group">
+      <data key="d4"><![CDATA[Component definitions]]></data>
+      <data key="d5">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="176.96875" width="945.375" x="-439.4375" y="-336.0"/>
+              <y:Fill color="#EEEEEE" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80FF40" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="945.375" x="0.0" y="0.0">     Component definitions</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.25" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="191.0" x="-15.0" y="-15.0"/>
+              <y:Fill color="#CCCCCC" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80FF40" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="191.0" x="0.0" y="0.0">     Component definitions</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true" closedHeight="30.0" closedWidth="191.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n0:">
+        <node id="n0::n0" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[automaton def Generator()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="129.0" width="241.375" x="-423.1875" y="-303.03125"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="241.375" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="221.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="221.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="221.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n0:">
+            <node id="n0::n0::n0">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="-276.8125" y="-219.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n0::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="-251.8125" y="-269.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.0" x="9.0" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n0::n2">
+              <data key="d4"><![CDATA[generated]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="-365.6875" y="-219.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="13.0" y="5.5">&lt;html&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n0::n3">
+              <data key="d4"><![CDATA[generated]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="115.0" x="-408.1875" y="-269.03125"/>
+                  <y:Fill color="#FFC000" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="2.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="109.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;generated&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n1" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[automaton def Buffer()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="129.0" width="227.25" x="-169.6875" y="-303.03125"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="227.25" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="194.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="194.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="194.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n1:">
+            <node id="n0::n1::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="-153.6875" y="-269.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n1::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="-37.4375" y="-219.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n1::n2">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="-122.1875" y="-219.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="15.0" x="7.5" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n1::n3">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="-12.4375" y="-269.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.0" x="9.0" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n2" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[automaton def Machine()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="129.0" width="242.375" x="72.5625" y="-303.03125"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="242.375" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="209.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="209.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="209.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n2:">
+            <node id="n0::n2::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="88.5625" y="-269.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n2::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="219.9375" y="-219.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n2::n2">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="120.0625" y="-219.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="15.0" x="7.5" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n2::n3">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="244.9375" y="-269.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="12.0" x="9.0" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n0::n3" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[automaton def Exit()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="129.0" width="162.0" x="328.9375" y="-303.03125"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="162.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="38" rightF="38.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="179.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40C0FF" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="179.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="179.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n3:">
+            <node id="n0::n3::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="344.9375" y="-269.03125"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n0::n3::n1">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="30.0" x="376.4375" y="-219.03125"/>
+                  <y:Fill color="#FFC080" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="20" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="28.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="15.0" x="7.5" y="1.0">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+      </graph>
+    </node>
+    <node id="n1" yfiles.foldertype="group">
+      <data key="d4"><![CDATA[Components]]></data>
+      <data key="d5">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="220.96874999999997" width="1177.7008799999999" x="-439.4375" y="-144.03125"/>
+              <y:Fill color="#EEEEEE" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80FF40" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="1177.7008799999999" x="0.0" y="0.0">     Components</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="203.0" x="-15.0" y="-15.0"/>
+              <y:Fill color="#CCCCCC" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80FF40" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="203.0" x="0.0" y="0.0">     Components and events</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true" closedHeight="30.0" closedWidth="203.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n1:">
+        <node id="n1::n0" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[generator: Generator()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="79.0" width="176.0" x="-423.4375" y="-71.2065"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="176.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="62" leftF="62.0" right="4" rightF="4.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="195.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="195.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="195.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n0:">
+            <node id="n1::n0::n0">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="-346.4375" y="-37.206500000000005"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n1::n1" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[buffer: Buffer()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="79.0" width="227.25" x="-111.54950000000008" y="-71.2065"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="227.25" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="9" leftF="9.03612000000021" right="4" rightF="4.45049999999992" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="142.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="142.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="142.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n1:">
+            <node id="n1::n1::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="-87.51337999999987" y="-37.206500000000005"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n1::n1::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="16.25" y="-37.206500000000005"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n1::n2" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[machine1: Machine()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="79.0" width="216.67488000000003" x="251.58849999999984" y="-111.0625"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="216.67488000000003" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine1&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="181.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="181.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine1&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="181.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n2:">
+            <node id="n1::n2::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="267.58849999999984" y="-77.0625"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n1::n2::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="373.26337999999987" y="-77.0625"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n1::n3" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[machine2: Machine()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="79.0" width="216.67488000000003" x="251.58849999999984" y="-17.06250000000003"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="216.67488000000003" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine2&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="181.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="181.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine2&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="181.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n3:">
+            <node id="n1::n3::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="267.58849999999984" y="16.93749999999997"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="n1::n3::n1">
+              <data key="d4"><![CDATA[exit !]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="80.0" x="373.26337999999987" y="16.93749999999997"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="74.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n1::n4" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[exit: Exit()]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="79.0" width="125.0" x="598.2633799999999" y="-71.5625"/>
+                  <y:Fill color="#EEEEEE" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="125.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="1" leftF="1.0" right="1" rightF="1.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="112.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#CCCCCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF8000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="112.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="30.0" closedWidth="112.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n4:">
+            <node id="n1::n4::n0">
+              <data key="d4"><![CDATA[enter ?]]></data>
+              <data key="d5">
+                <y:ShapeNode>
+                  <y:Geometry height="30.0" width="93.0" x="614.2633799999999" y="-37.5625"/>
+                  <y:Fill color="#FFE0C0" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+                  <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="87.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="n1::n5">
+          <data key="d4"><![CDATA[g2b !?~]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="98.0" x="-226.4375" y="-37.206500000000005"/>
+              <y:Fill color="#FFC000" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="2.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="92.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;g2b&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n1::n6">
+          <data key="d4"><![CDATA[b2m !?~]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="101.0" x="132.58849999999984" y="-37.206500000000005"/>
+              <y:Fill color="#FFC000" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="2.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="95.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;b2m&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n1::n7">
+          <data key="d4"><![CDATA[m2e !?~]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="101.0" x="483.26337999999987" y="-37.206500000000005"/>
+              <y:Fill color="#FFC000" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="2.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="95.0" x="3.0" y="5.5">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;m2e&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <edge id="n0::n0::e0" source="n0::n0::n3" target="n0::n0::n2">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n0::e1" source="n0::n0::n1" target="n0::n0::n0">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n1::e0" source="n0::n1::n3" target="n0::n1::n1">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n1::e1" source="n0::n1::n0" target="n0::n1::n2">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n2::e0" source="n0::n2::n3" target="n0::n2::n1">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n2::e1" source="n0::n2::n0" target="n0::n2::n2">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n0::n3::e0" source="n0::n3::n0" target="n0::n3::n1">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="15.0" tx="0.0" ty="-15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e0" source="n1::n0::n0" target="n1::n5">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="20.52197265625" sy="0.0" tx="-29.5" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e1" source="n1::n5" target="n1::n1::n0">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="29.5" sy="0.0" tx="-26.9912109375" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e2" source="n1::n1::n1" target="n1::n6">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="39.990234375" sy="0.0" tx="-50.5" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e3" source="n1::n6" target="n1::n2::n0">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="50.49329268649194" sy="-6.754311925919801" tx="-46.485595703125" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e4" source="n1::n2::n1" target="n1::n7">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="39.990234375" sy="0.0" tx="-50.497361369021974" ty="-6.384140032877241"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e5" source="n1::n6" target="n1::n3::n0">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="50.5183557780407" sy="9.04004266689531" tx="-46.485595703125" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e6" source="n1::n3::n1" target="n1::n7">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="39.990234375" sy="0.0" tx="-50.51085905243883" ty="9.116771448635014"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e7" source="n1::n7" target="n1::n4::n0">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="31.0" sy="0.0" tx="-26.9912109375" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d6">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.png b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.png
new file mode 100644
index 0000000..faef101
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.layouted.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.orig.graphml b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.orig.graphml
new file mode 100644
index 0000000..1867205
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/machine_buffer.events.orig.graphml
@@ -0,0 +1,696 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<graphml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd" xmlns="http://graphml.graphdrawing.org/xmlns">
+  <key for="node" id="ng" yfiles.type="nodegraphics"/>
+  <key for="edge" id="eg" yfiles.type="edgegraphics"/>
+  <key attr.name="description" attr.type="string" for="node" id="dn"/>
+  <graph edgedefault="undirected" id="cif:">
+    <node id="cif::box0" yfiles.foldertype="group">
+      <graph edgedefault="undirected" id="cif::box0:">
+        <node id="cif:Generator" yfiles.foldertype="group">
+          <data key="dn">automaton def Generator()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="221.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:Generator:">
+            <node id="cif:Generator:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Generator::evtref1">
+              <data key="dn">exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Generator::evtref0">
+              <data key="dn">generated</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Generator:generated">
+              <data key="dn">event generated</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="115.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;generated&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle width="2.0"/>
+                  <y:Fill color="#ffc000"/>
+                  <y:Shape type="rectangle"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:Buffer" yfiles.foldertype="group">
+          <data key="dn">automaton def Buffer()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="194.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:Buffer:">
+            <node id="cif:Buffer:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Buffer:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Buffer::evtref3">
+              <data key="dn">enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Buffer::evtref2">
+              <data key="dn">exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:Machine" yfiles.foldertype="group">
+          <data key="dn">automaton def Machine()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="209.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:Machine:">
+            <node id="cif:Machine:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Machine:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Machine::evtref5">
+              <data key="dn">enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Machine::evtref4">
+              <data key="dn">exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:Exit" yfiles.foldertype="group">
+          <data key="dn">automaton def Exit()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="179.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#40c0ff" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;def&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:Exit:">
+            <node id="cif:Exit:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:Exit::evtref6">
+              <data key="dn">enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry height="30" width="30"/>
+                  <y:NodeLabel alignment="center" fontSize="20">&lt;html&gt;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#ffc080"/>
+                  <y:Shape type="ellipse"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+      </graph>
+      <data key="dn">Component definitions</data>
+      <data key="ng">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80ff40" modelName="internal" modelPosition="t">     Component definitions</y:NodeLabel>
+              <y:Fill color="#eeeeee"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="191.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80ff40" modelName="internal" modelPosition="t">     Component definitions</y:NodeLabel>
+              <y:Fill color="#cccccc"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+    </node>
+    <node id="cif::box1" yfiles.foldertype="group">
+      <graph edgedefault="undirected" id="cif::box1:">
+        <node id="cif:generator" yfiles.foldertype="group">
+          <data key="dn">generator: Generator()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="195.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Generator&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:generator:">
+            <node id="cif:generator:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:buffer" yfiles.foldertype="group">
+          <data key="dn">buffer: Buffer()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="142.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Buffer&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:buffer:">
+            <node id="cif:buffer:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:buffer:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:machine1" yfiles.foldertype="group">
+          <data key="dn">machine1: Machine()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine1&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="181.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine1&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:machine1:">
+            <node id="cif:machine1:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:machine1:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:machine2" yfiles.foldertype="group">
+          <data key="dn">machine2: Machine()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine2&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="181.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;machine2&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Machine&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:machine2:">
+            <node id="cif:machine2:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+            <node id="cif:machine2:exit">
+              <data key="dn">event exit !</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="80.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:exit" yfiles.foldertype="group">
+          <data key="dn">exit: Exit()</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#eeeeee"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="30.0" width="112.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff8000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#000000;"&gt;exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Exit&lt;/span&gt;&lt;span style="color:#402020;"&gt;()&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Fill color="#cccccc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="undirected" id="cif:exit:">
+            <node id="cif:exit:enter">
+              <data key="dn">event enter ?</data>
+              <data key="ng">
+                <y:ShapeNode>
+                  <y:Geometry width="93.0"/>
+                  <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;enter&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;?&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle type="dashed"/>
+                  <y:Fill color="#ffe0c0"/>
+                  <y:Shape type="octagon"/>
+                </y:ShapeNode>
+              </data>
+            </node>
+          </graph>
+        </node>
+        <node id="cif:g2b">
+          <data key="dn">event g2b !?~</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry width="98.0"/>
+              <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;g2b&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:BorderStyle width="2.0"/>
+              <y:Fill color="#ffc000"/>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="cif:b2m">
+          <data key="dn">event b2m !?~</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry width="101.0"/>
+              <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;b2m&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:BorderStyle width="2.0"/>
+              <y:Fill color="#ffc000"/>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="cif:m2e">
+          <data key="dn">event m2e !?~</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry width="101.0"/>
+              <y:NodeLabel alignment="center">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;event&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;m2e&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;!?~&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:BorderStyle width="2.0"/>
+              <y:Fill color="#ffc000"/>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+      <data key="dn">Components</data>
+      <data key="ng">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80ff40" modelName="internal" modelPosition="t">     Components</y:NodeLabel>
+              <y:Fill color="#eeeeee"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="129.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#80ff40" modelName="internal" modelPosition="t">     Components</y:NodeLabel>
+              <y:Fill color="#cccccc"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+    </node>
+    <edge directed="false" source="cif:Generator:generated" target="cif:Generator::evtref0">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="none"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Generator::evtref1" target="cif:Generator:exit">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Buffer::evtref2" target="cif:Buffer:exit">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Buffer:enter" target="cif:Buffer::evtref3">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Machine::evtref4" target="cif:Machine:exit">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Machine:enter" target="cif:Machine::evtref5">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:Exit:enter" target="cif:Exit::evtref6">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:generator:exit" target="cif:g2b">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:g2b" target="cif:buffer:enter">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:buffer:exit" target="cif:b2m">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:b2m" target="cif:machine1:enter">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:machine1:exit" target="cif:m2e">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:b2m" target="cif:machine2:enter">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:machine2:exit" target="cif:m2e">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge directed="true" source="cif:m2e" target="cif:exit:enter">
+      <data key="eg">
+        <y:PolyLineEdge>
+          <y:Arrows source="none" target="arrow"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+</graphml>
diff --git a/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.graphml b/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.graphml
new file mode 100644
index 0000000..926ecaa
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.graphml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.14.1-->
+  <key for="port" id="d0" yfiles.type="portgraphics"/>
+  <key for="port" id="d1" yfiles.type="portgeometry"/>
+  <key for="port" id="d2" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d3"/>
+  <key attr.name="description" attr.type="string" for="node" id="d4"/>
+  <key for="node" id="d5" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d6" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d7"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d8"/>
+  <key for="edge" id="d9" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <node id="n0" yfiles.foldertype="group">
+      <data key="d4"><![CDATA[group tank]]></data>
+      <data key="d5">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="157.84375" width="231.0" x="-283.5" y="16.578125"/>
+              <y:Fill color="#EEEEEE" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF0000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="italic" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="231.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="119.0" x="-15.0" y="-15.0"/>
+              <y:Fill color="#CCCCCC" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF0000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="italic" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="119.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true" closedHeight="30.0" closedWidth="119.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n0:">
+        <node id="n0::n0" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[Declarations]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="108.84375" width="201.0" x="-268.5" y="50.578125"/>
+                  <y:Fill color="#FFFFCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EEEE80" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="201.0" x="0.0" y="0.0">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18.0" bottomInset="3" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="81.0" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" textColor="#000000" topInset="3" visible="true" width="197.0" x="2.0" y="18.0">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;cont&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;10.0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;real&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qi&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller.n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;5.0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;real&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qo&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#8000ff;"&gt;sqrt&lt;/span&gt;&lt;span style="color:#402020;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&lt;span style="color:#402020;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&lt;span style="color:#402020;"&gt;'&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qi&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qo&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="108.84375" closedWidth="201.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#FFFFCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EEEE80" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="109.0" x="0.0" y="0.0">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18.0" bottomInset="3" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.96875" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" textColor="#000000" topInset="3" visible="true" width="17.443359375" x="45.7783203125" y="18.0">...</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="54.0" closedWidth="109.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n0::n0:"/>
+        </node>
+      </graph>
+    </node>
+    <node id="n1" yfiles.foldertype="group">
+      <data key="d4"><![CDATA[automaton controller]]></data>
+      <data key="d5">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="108.84375" width="642.5999999999999" x="-37.5" y="15.171875"/>
+              <y:Fill color="#EEEEEE" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF0000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="642.5999999999999" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false" closedHeight="80.0" closedWidth="100.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="4" bottomF="4.4375" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="183.0" x="-15.0" y="-15.0"/>
+              <y:Fill color="#CCCCCC" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#FF0000" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="183.0" x="0.0" y="0.0">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true" closedHeight="30.0" closedWidth="183.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n1:">
+        <node id="n1::n0" yfiles.foldertype="group">
+          <data key="d4"><![CDATA[Declarations]]></data>
+          <data key="d5">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0" x="-22.5" y="50.578125"/>
+                  <y:Fill color="#FFFFCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EEEE80" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="109.0" x="0.0" y="0.0">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18.0" bottomInset="3" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.0" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" textColor="#000000" topInset="3" visible="true" width="95.0" x="7.0" y="18.0">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#402020;"&gt;[&lt;/span&gt;&lt;span style="color:#006100;"&gt;0&lt;/span&gt;&lt;span style="color:#402020;"&gt;..&lt;/span&gt;&lt;span style="color:#006100;"&gt;1&lt;/span&gt;&lt;span style="color:#402020;"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false" closedHeight="54.0" closedWidth="109.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0" x="-15.0" y="-15.0"/>
+                  <y:Fill color="#FFFFCC" transparent="false"/>
+                  <y:BorderStyle color="#000000" type="line" width="1.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#EEEE80" borderDistance="0.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="17.96875" modelName="internal" modelPosition="t" textColor="#000000" visible="true" width="109.0" x="0.0" y="0.0">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18.0" bottomInset="3" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.96875" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" textColor="#000000" topInset="3" visible="true" width="17.443359375" x="45.7783203125" y="18.0">...</y:NodeLabel>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true" closedHeight="54.0" closedWidth="109.0" innerGraphDisplayEnabled="false"/>
+                  <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+                  <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+          <graph edgedefault="directed" id="n1::n0:"/>
+        </node>
+        <node id="n1::n1">
+          <data key="d4"><![CDATA[location closed]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="54.90625" width="138.0" x="170.5" y="49.171875"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="49.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="102.0" x="18.0" y="2.953125">&lt;html&gt;&lt;span style="color:#000000;"&gt;closed&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n1::n2">
+          <data key="d4"><![CDATA[<init>]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="8.296875" width="17.0" x="97.0" y="73.4296875"/>
+              <y:Fill color="#CCCCFF" transparent="true"/>
+              <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="4.0" x="6.5" y="2.1484375"/>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n1::n3">
+          <data key="d4"><![CDATA[location opened]]></data>
+          <data key="d5">
+            <y:ShapeNode>
+              <y:Geometry height="54.90625" width="138.0" x="452.0999999999999" y="49.171875"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="49.0" modelName="internal" modelPosition="c" textColor="#000000" visible="true" width="102.0" x="18.0" y="2.953125">&lt;html&gt;&lt;span style="color:#000000;"&gt;opened&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;1&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <edge id="n1::e0" source="n1::n2" target="n1::n1">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="-2.2079039999999566" sy="-0.953125" tx="-69.00927734375" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e1" source="n1::n1" target="n1::n3">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="69.01775642458114" sy="-13.969902892510284" tx="-69.00079999999974" ty="-13.969902892510284"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#EEEEEE" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="117.0" x="12.460638769531442" y="-23.465113961425786">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank.V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;&amp;lt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;2&lt;/span&gt;&lt;/html&gt;<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n1::e2" source="n1::n3" target="n1::n1">
+      <data key="d9">
+        <y:PolyLineEdge>
+          <y:Path sx="-69.00079999999974" sy="13.507893662371615" tx="69.00639818065497" ty="13.507893662371615"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" backgroundColor="#EEEEEE" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasLineColor="false" height="19.0" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" visible="true" width="125.0" x="-130.2056126464842" y="5.581887576660137">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank.V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;&amp;gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;10&lt;/span&gt;&lt;/html&gt;<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="true"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d6">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.png b/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.png
new file mode 100644
index 0000000..a2825c7
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/tank.model.layouted.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cif2yed/tank.model.orig.graphml b/v0.1-M1/cif/tools/cif2yed/tank.model.orig.graphml
new file mode 100644
index 0000000..b9ba7fe
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/tank.model.orig.graphml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<graphml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd" xmlns="http://graphml.graphdrawing.org/xmlns">
+  <key for="node" id="ng" yfiles.type="nodegraphics"/>
+  <key for="edge" id="eg" yfiles.type="edgegraphics"/>
+  <key attr.name="description" attr.type="string" for="node" id="dn"/>
+  <graph edgedefault="directed" id="cif:">
+    <node id="cif:tank" yfiles.foldertype="group">
+      <data key="dn">group tank</data>
+      <data key="ng">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff0000" fontStyle="italic" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#eeeeee"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="119.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff0000" fontStyle="italic" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;group&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#cccccc"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="cif:tank:">
+        <node id="cif:tank::code" yfiles.foldertype="group">
+          <data key="dn">Declarations</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="108.84375" width="201.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#eeee80" modelName="internal" modelPosition="t">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18" bottomInset="3" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" topInset="3">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;cont&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;10.0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;real&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qi&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller.n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;*&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;5.0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;real&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qo&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#8000ff;"&gt;sqrt&lt;/span&gt;&lt;span style="color:#402020;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&lt;span style="color:#402020;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;V&lt;/span&gt;&lt;span style="color:#402020;"&gt;'&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qi&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;-&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;Qo&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle lineType="dashed"/>
+                  <y:Fill color="#ffffcc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#eeee80" modelName="internal" modelPosition="t">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18" bottomInset="3" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" topInset="3">...</y:NodeLabel>
+                  <y:BorderStyle lineType="dashed"/>
+                  <y:Fill color="#ffffcc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="cif:controller" yfiles.foldertype="group">
+      <data key="dn">automaton controller</data>
+      <data key="ng">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff0000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#eeeeee"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="false"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="30.0" width="183.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#ff0000" fontStyle="plain" modelName="internal" modelPosition="t">&lt;html&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;automaton&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;controller&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#cccccc"/>
+              <y:Shape type="rectangle"/>
+              <y:State closed="true"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="cif:controller:">
+        <node id="cif:controller::code" yfiles.foldertype="group">
+          <data key="dn">Declarations</data>
+          <data key="ng">
+            <y:ProxyAutoBoundsNode>
+              <y:Realizers active="0">
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#eeee80" modelName="internal" modelPosition="t">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18" bottomInset="3" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" topInset="3">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;alg&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#402020;"&gt;[&lt;/span&gt;&lt;span style="color:#006100;"&gt;0&lt;/span&gt;&lt;span style="color:#402020;"&gt;..&lt;/span&gt;&lt;span style="color:#006100;"&gt;1&lt;/span&gt;&lt;span style="color:#402020;"&gt;]&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+                  <y:BorderStyle lineType="dashed"/>
+                  <y:Fill color="#ffffcc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="false"/>
+                </y:GroupNode>
+                <y:GroupNode>
+                  <y:Geometry height="54.0" width="109.0"/>
+                  <y:NodeLabel alignment="left" autoSizePolicy="node_width" backgroundColor="#eeee80" modelName="internal" modelPosition="t">     Declarations</y:NodeLabel>
+                  <y:NodeLabel alignment="left" autoSizePolicy="content" borderDistance="18" bottomInset="3" leftInset="3" modelName="internal" modelPosition="t" rightInset="3" topInset="3">...</y:NodeLabel>
+                  <y:BorderStyle lineType="dashed"/>
+                  <y:Fill color="#ffffcc"/>
+                  <y:Shape type="rectangle"/>
+                  <y:State closed="true"/>
+                </y:GroupNode>
+              </y:Realizers>
+            </y:ProxyAutoBoundsNode>
+          </data>
+        </node>
+        <node id="cif:controller::loc0">
+          <data key="dn">location closed</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry height="54.90625" width="138.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="content" modelName="internal" modelPosition="c">&lt;html&gt;&lt;span style="color:#000000;"&gt;closed&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;0&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#ccccff"/>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="cif:controller::loc0::init">
+          <data key="dn">&lt;init&gt;</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry height="1" width="1"/>
+              <y:BorderStyle hasColor="false"/>
+              <y:Fill transparent="true"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <edge source="cif:controller::loc0::init" target="cif:controller::loc0">
+          <data key="eg">
+            <y:PolyLineEdge>
+              <y:Arrows source="none" target="arrow"/>
+              <y:BendStyle smoothed="true"/>
+            </y:PolyLineEdge>
+          </data>
+        </edge>
+        <edge source="cif:controller::loc0" target="cif:controller::loc1">
+          <data key="eg">
+            <y:PolyLineEdge>
+              <y:Arrows source="none" target="arrow"/>
+              <y:BendStyle smoothed="true"/>
+              <y:EdgeLabel alignment="center" backgroundColor="#eeeeee">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank.V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;&amp;lt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;2&lt;/span&gt;&lt;/html&gt;</y:EdgeLabel>
+            </y:PolyLineEdge>
+          </data>
+        </edge>
+        <node id="cif:controller::loc1">
+          <data key="dn">location opened</data>
+          <data key="ng">
+            <y:ShapeNode>
+              <y:Geometry height="54.90625" width="138.0"/>
+              <y:NodeLabel alignment="left" autoSizePolicy="content" modelName="internal" modelPosition="c">&lt;html&gt;&lt;span style="color:#000000;"&gt;opened&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;equation&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;n&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;1&lt;/span&gt;&lt;span style="color:#402020;"&gt;;&lt;/span&gt;&lt;/html&gt;</y:NodeLabel>
+              <y:Fill color="#ccccff"/>
+              <y:Shape type="roundrectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <edge source="cif:controller::loc1" target="cif:controller::loc0">
+          <data key="eg">
+            <y:PolyLineEdge>
+              <y:Arrows source="none" target="arrow"/>
+              <y:BendStyle smoothed="true"/>
+              <y:EdgeLabel alignment="center" backgroundColor="#eeeeee">&lt;html&gt;&lt;span style="color:#0000ff;"&gt;when&lt;/span&gt;&amp;nbsp;&lt;span style="color:#000000;"&gt;tank.V&lt;/span&gt;&amp;nbsp;&lt;span style="color:#402020;"&gt;&amp;gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color:#006100;"&gt;10&lt;/span&gt;&lt;/html&gt;</y:EdgeLabel>
+            </y:PolyLineEdge>
+          </data>
+        </edge>
+      </graph>
+    </node>
+  </graph>
+</graphml>
diff --git a/v0.1-M1/cif/tools/cif2yed/yed_structure_view.png b/v0.1-M1/cif/tools/cif2yed/yed_structure_view.png
new file mode 100644
index 0000000..3264271
--- /dev/null
+++ b/v0.1-M1/cif/tools/cif2yed/yed_structure_view.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0.png b/v0.1-M1/cif/tools/cifsim/input/history_0.png
new file mode 100644
index 0000000..dabb044
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0.png.svg b/v0.1-M1/cif/tools/cifsim/input/history_0.png.svg
new file mode 100644
index 0000000..1c5872e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0.png.svg
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="history_0.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="60.979933"
+     inkscape:cy="60.575729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004"
+       width="49"
+       height="29"
+       x="0.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="25.046877"
+       y="93.748047"
+       id="text3798"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800"
+         x="25.046877"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">0</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_01.png b/v0.1-M1/cif/tools/cifsim/input/history_01.png
new file mode 100644
index 0000000..1a7afc1
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_01.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_01.png.svg b/v0.1-M1/cif/tools/cifsim/input/history_01.png.svg
new file mode 100644
index 0000000..cea46fa
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_01.png.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="history_01.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="60.979933"
+     inkscape:cy="60.575729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004"
+       width="49"
+       height="29"
+       x="0.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="25.046877"
+       y="93.748047"
+       id="text3798"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800"
+         x="25.046877"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">0</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7"
+       width="49"
+       height="29"
+       x="49.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="74.046875"
+       y="93.748047"
+       id="text3798-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3"
+         x="74.046875"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">1</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_012.png b/v0.1-M1/cif/tools/cifsim/input/history_012.png
new file mode 100644
index 0000000..dc48d0f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_012.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_012.png.svg b/v0.1-M1/cif/tools/cifsim/input/history_012.png.svg
new file mode 100644
index 0000000..f160cc3
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_012.png.svg
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="history_012.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="60.979933"
+     inkscape:cy="60.575729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004"
+       width="49"
+       height="29"
+       x="0.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="25.046877"
+       y="93.748047"
+       id="text3798"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800"
+         x="25.046877"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">0</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7"
+       width="49"
+       height="29"
+       x="49.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="74.046875"
+       y="93.748047"
+       id="text3798-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3"
+         x="74.046875"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">1</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3"
+       width="49"
+       height="29"
+       x="98.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="123.04688"
+       y="93.748047"
+       id="text3798-9-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1"
+         x="123.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">2</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0123.png b/v0.1-M1/cif/tools/cifsim/input/history_0123.png
new file mode 100644
index 0000000..173d818
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0123.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0123.png.svg b/v0.1-M1/cif/tools/cifsim/input/history_0123.png.svg
new file mode 100644
index 0000000..ae839fb
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0123.png.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="history_0123.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="60.979933"
+     inkscape:cy="60.575729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004"
+       width="49"
+       height="29"
+       x="0.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="25.046877"
+       y="93.748047"
+       id="text3798"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800"
+         x="25.046877"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">0</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7"
+       width="49"
+       height="29"
+       x="49.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="74.046875"
+       y="93.748047"
+       id="text3798-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3"
+         x="74.046875"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">1</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3"
+       width="49"
+       height="29"
+       x="98.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="123.04688"
+       y="93.748047"
+       id="text3798-9-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1"
+         x="123.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">2</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3-7"
+       width="49"
+       height="29"
+       x="147.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="172.04688"
+       y="93.748047"
+       id="text3798-9-6-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1-7"
+         x="172.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">3</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0234.png b/v0.1-M1/cif/tools/cifsim/input/history_0234.png
new file mode 100644
index 0000000..7e58676
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0234.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/history_0234.png.svg b/v0.1-M1/cif/tools/cifsim/input/history_0234.png.svg
new file mode 100644
index 0000000..b8cc5df
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/history_0234.png.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="history_0234.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="101.02419"
+     inkscape:cy="60.575729"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004"
+       width="49"
+       height="29"
+       x="0.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="25.046877"
+       y="93.748047"
+       id="text3798"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800"
+         x="25.046877"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">0</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3"
+       width="49"
+       height="29"
+       x="98.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="123.04688"
+       y="93.748047"
+       id="text3798-9-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1"
+         x="123.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">2</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3-7"
+       width="49"
+       height="29"
+       x="147.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="172.04688"
+       y="93.748047"
+       id="text3798-9-6-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1-7"
+         x="172.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">3</tspan></text>
+    <rect
+       style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3004-7-3-7-1"
+       width="49"
+       height="29"
+       x="196.5"
+       y="70.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="221.04688"
+       y="93.748047"
+       id="text3798-9-6-0-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3800-3-1-7-0"
+         x="221.04688"
+         y="93.748047"
+         style="font-size:24px;text-align:center;text-anchor:middle">4</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_basic.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_basic.png
new file mode 100644
index 0000000..6199731
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_basic.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_duration.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_duration.png
new file mode 100644
index 0000000..96feb7d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_duration.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_event.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_event.png
new file mode 100644
index 0000000..9d2ce5b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_event.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_reset.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_reset.png
new file mode 100644
index 0000000..94248fb
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_reset.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_time.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_time.png
new file mode 100644
index 0000000..58e79f2
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_time.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo12.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo12.png
new file mode 100644
index 0000000..56aeb7d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo12.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo2.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo2.png
new file mode 100644
index 0000000..de9628e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo2.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo_count.png b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo_count.png
new file mode 100644
index 0000000..8ba7aab
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/input/interactive_gui_undo_count.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/machine.cif b/v0.1-M1/cif/tools/cifsim/machine.cif
new file mode 100644
index 0000000..921bb4f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/machine.cif
@@ -0,0 +1,22 @@
+event enter;
+event processed;
+event exit;
+
+automaton machine:
+  disc int count = 0;
+  disc real process_time;
+  disc dist real d = normal(10, 7);
+  cont t der 1.0;
+
+  location waiting:
+    initial;
+    edge enter do (process_time, d) := sample d, t := 0 goto processing;
+
+  location processing:
+    edge processed when t >= process_time goto done;
+
+  location done:
+    edge exit do count := count + 1 goto waiting;
+end
+
+print machine.count for final;
diff --git a/v0.1-M1/cif/tools/cifsim/machine.tooldef b/v0.1-M1/cif/tools/cifsim/machine.tooldef
new file mode 100644
index 0000000..3959835
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/machine.tooldef
@@ -0,0 +1,21 @@
+from "lib:cif" import *;
+
+cifsim("machine.cif --compile-only=on");
+
+rmfile("out.txt", force=true);
+
+for x in range(1000):
+    string args = "machine.cifcode -i auto -a first -t 100 -o print";
+    cifsim(args, stdout="out.txt", appendOut=true);
+end
+
+double minimum = 9999;
+double maximum = -9999;
+for line in readlines("out.txt"):
+    double value = <double>line;
+    minimum = min(minimum, value);
+    maximum = max(maximum, value);
+end
+
+outln("Minimum: %.2f", minimum);
+outln("Maximum: %.2f", maximum);
diff --git a/v0.1-M1/cif/tools/cifsim/output/plotviz_sshot.png b/v0.1-M1/cif/tools/cifsim/output/plotviz_sshot.png
new file mode 100644
index 0000000..758b184
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/plotviz_sshot.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png b/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png
new file mode 100644
index 0000000..722076f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png.svg b/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png.svg
new file mode 100644
index 0000000..583e842
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/trace_extended.png.svg
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="850"
+   height="120"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="trace_extended.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3813"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="497.52518"
+     inkscape:cy="115.33604"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-80)">
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873415;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:5.39240485, 5.39240485;stroke-dashoffset:0"
+       id="path2839"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       transform="matrix(1.1126761,0,0,1.1126761,-67.387327,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,682.61267,77.119714)"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3613"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873427;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:5.3924055, 5.3924055;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3615"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       transform="matrix(1.1126761,0,0,1.1126761,382.61267,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,532.61267,77.119714)"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3617"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3619"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       transform="matrix(1.1126761,0,0,1.1126761,82.612673,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,232.61267,77.119714)"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3621"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 6;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 89.500003,49.999999 70.999997,0"
+       id="path3623"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path2839"
+       inkscape:connection-end="#path3619" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="102.99219"
+       y="140"
+       id="text4255"><tspan
+         sodipodi:role="line"
+         id="tspan4257"
+         x="102.99219"
+         y="140"
+         style="font-style:italic;-inkscape-font-specification:Bitstream Vera Sans Oblique">initial</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 239.5,49.999999 71,0"
+       id="path4259"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3619"
+       inkscape:connection-end="#path3621" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 389.5,49.999999 71,0"
+       id="path4261"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3621"
+       inkscape:connection-end="#path3615" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 539.5,49.999999 71,0"
+       id="path4263"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3615"
+       inkscape:connection-end="#path3617" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:6, 6;stroke-dashoffset:0;marker-end:url(#Arrow1Lend)"
+       d="m 689.5,49.999999 71,0"
+       id="path4265"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3617"
+       inkscape:connection-end="#path3613" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="20.785158"
+       y="155.71875"
+       id="text4267"><tspan
+         sodipodi:role="line"
+         id="tspan4269"
+         x="20.785158"
+         y="155.71875">cnt = 5</tspan></text>
+    <text
+       id="text4455"
+       y="155.71875"
+       x="170.78516"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="155.71875"
+         x="170.78516"
+         id="tspan4457"
+         sodipodi:role="line">cnt = 5</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="320.78516"
+       y="155.71875"
+       id="text4459"><tspan
+         sodipodi:role="line"
+         id="tspan4461"
+         x="320.78516"
+         y="155.71875">cnt = 6</tspan></text>
+    <text
+       id="text4463"
+       y="155.71875"
+       x="470.73047"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="155.71875"
+         x="470.73047"
+         id="tspan4465"
+         sodipodi:role="line">cnt = 7</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="620.78516"
+       y="155.71875"
+       id="text4467"><tspan
+         sodipodi:role="line"
+         id="tspan4469"
+         x="620.78516"
+         y="155.71875">cnt = 6</tspan></text>
+    <text
+       id="text4471"
+       y="155.71875"
+       x="770.78516"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="155.71875"
+         x="770.78516"
+         id="tspan4473"
+         sodipodi:role="line">cnt = 6</tspan></text>
+    <text
+       id="text4475"
+       y="140"
+       x="260.18359"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="140"
+         x="260.18359"
+         id="tspan4477"
+         sodipodi:role="line">add</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410.18359"
+       y="140"
+       id="text4479"><tspan
+         sodipodi:role="line"
+         id="tspan4481"
+         x="410.18359"
+         y="140">add</tspan></text>
+    <text
+       id="text4483"
+       y="140"
+       x="544.30859"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="140"
+         x="544.30859"
+         id="tspan4485"
+         sodipodi:role="line">remove</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="708.32812"
+       y="140"
+       id="text4487"><tspan
+         sodipodi:role="line"
+         id="tspan4489"
+         x="708.32812"
+         y="140"
+         style="font-style:italic;-inkscape-font-specification:Bitstream Vera Sans Oblique">final</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="190.04297"
+       y="100"
+       id="text4491"><tspan
+         sodipodi:role="line"
+         id="tspan4493"
+         x="190.04297"
+         y="100">S1</tspan></text>
+    <text
+       id="text4495"
+       y="100"
+       x="11.773439"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="100"
+         x="11.773439"
+         id="tspan4497"
+         sodipodi:role="line"
+         style="font-style:normal;-inkscape-font-specification:Bitstream Vera Sans">S0 (= S1)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="340.10547"
+       y="100"
+       id="text4499"><tspan
+         sodipodi:role="line"
+         id="tspan4501"
+         x="340.10547"
+         y="100">S2</tspan></text>
+    <text
+       id="text4503"
+       y="100"
+       x="489.94531"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="100"
+         x="489.94531"
+         id="tspan4505"
+         sodipodi:role="line">S3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="639.75391"
+       y="100"
+       id="text4507"><tspan
+         sodipodi:role="line"
+         id="tspan4509"
+         x="639.75391"
+         y="100">S4</tspan></text>
+    <text
+       id="text4511"
+       y="100"
+       x="762.38281"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="100"
+         x="762.38281"
+         id="tspan4513"
+         sodipodi:role="line"
+         style="font-style:normal;-inkscape-font-specification:Bitstream Vera Sans">S5 (= S4)</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png b/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png
new file mode 100644
index 0000000..b4666f7
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png.svg b/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png.svg
new file mode 100644
index 0000000..fbdf416
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/trace_normal.png.svg
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="850"
+   height="120"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="trace_normal.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3813"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="497.52518"
+     inkscape:cy="115.33604"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-80)">
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3615"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       transform="matrix(1.1126761,0,0,1.1126761,382.61267,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,532.61267,77.119714)"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3617"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3619"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       transform="matrix(1.1126761,0,0,1.1126761,82.612673,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,232.61267,77.119714)"
+       d="M 141,65.5 C 141,85.106109 125.10611,101 105.5,101 85.893891,101 70,85.106109 70,65.5 70,45.893891 85.893891,30 105.5,30 125.10611,30 141,45.893891 141,65.5 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3621"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 239.5,49.999999 71,0"
+       id="path4259"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3619"
+       inkscape:connection-end="#path3621" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 389.5,49.999999 71,0"
+       id="path4261"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3621"
+       inkscape:connection-end="#path3615" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 539.5,49.999999 71,0"
+       id="path4263"
+       transform="translate(0,100)"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3615"
+       inkscape:connection-end="#path3617" />
+    <text
+       id="text4455"
+       y="155.71875"
+       x="170.78516"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="155.71875"
+         x="170.78516"
+         id="tspan4457"
+         sodipodi:role="line">cnt = 5</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="320.55078"
+       y="155.71875"
+       id="text4459"><tspan
+         sodipodi:role="line"
+         id="tspan4461"
+         x="320.55078"
+         y="155.71875">cnt = 6</tspan></text>
+    <text
+       id="text4463"
+       y="155.71875"
+       x="470.73047"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="155.71875"
+         x="470.73047"
+         id="tspan4465"
+         sodipodi:role="line">cnt = 7</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="620.78516"
+       y="155.71875"
+       id="text4467"><tspan
+         sodipodi:role="line"
+         id="tspan4469"
+         x="620.78516"
+         y="155.71875">cnt = 6</tspan></text>
+    <text
+       id="text4475"
+       y="140"
+       x="260.18359"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="140"
+         x="260.18359"
+         id="tspan4477"
+         sodipodi:role="line">add</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="410.18359"
+       y="140"
+       id="text4479"><tspan
+         sodipodi:role="line"
+         id="tspan4481"
+         x="410.18359"
+         y="140">add</tspan></text>
+    <text
+       id="text4483"
+       y="140"
+       x="544.30859"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="140"
+         x="544.30859"
+         id="tspan4485"
+         sodipodi:role="line">remove</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="190.04297"
+       y="100"
+       id="text4491"><tspan
+         sodipodi:role="line"
+         id="tspan4493"
+         x="190.04297"
+         y="100">S1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="340.10547"
+       y="100"
+       id="text4499"><tspan
+         sodipodi:role="line"
+         id="tspan4501"
+         x="340.10547"
+         y="100">S2</tspan></text>
+    <text
+       id="text4503"
+       y="100"
+       x="489.94531"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="100"
+         x="489.94531"
+         id="tspan4505"
+         sodipodi:role="line">S3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="639.75391"
+       y="100"
+       id="text4507"><tspan
+         sodipodi:role="line"
+         id="tspan4509"
+         x="639.75391"
+         y="100">S4</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/transition.png b/v0.1-M1/cif/tools/cifsim/output/print/transition.png
new file mode 100644
index 0000000..66269f8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/transition.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/print/transition.png.svg b/v0.1-M1/cif/tools/cifsim/output/print/transition.png.svg
new file mode 100644
index 0000000..808a6a4
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/print/transition.png.svg
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="850"
+   height="120"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="transition.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3813"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="497.52518"
+     inkscape:cy="115.33604"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-80)">
+    <path
+       sodipodi:type="arc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3615"
+       sodipodi:cx="105.5"
+       sodipodi:cy="65.5"
+       sodipodi:rx="35.5"
+       sodipodi:ry="35.5"
+       d="m 141,65.5 a 35.5,35.5 0 1 1 -71,0 35.5,35.5 0 1 1 71,0 z"
+       transform="matrix(1.1126761,0,0,1.1126761,142.61267,77.119714)" />
+    <path
+       transform="matrix(1.1126761,0,0,1.1126761,-67.38733,77.119714)"
+       d="m 141,65.5 a 35.5,35.5 0 1 1 -71,0 35.5,35.5 0 1 1 71,0 z"
+       sodipodi:ry="35.5"
+       sodipodi:rx="35.5"
+       sodipodi:cy="65.5"
+       sodipodi:cx="105.5"
+       id="path3621"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:0.89873421;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="arc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 89.5,150 131,0"
+       id="path4261"
+       inkscape:connector-type="polyline"
+       inkscape:connection-start="#path3621"
+       inkscape:connection-end="#path3615" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="117.33203"
+       y="140"
+       id="text4479"><tspan
+         sodipodi:role="line"
+         id="tspan4481"
+         x="117.33203"
+         y="140">transition</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="7.2773438"
+       y="100"
+       id="text4499"><tspan
+         sodipodi:role="line"
+         id="tspan4501"
+         x="7.2773438"
+         y="100">pre/source</tspan></text>
+    <text
+       id="text4503"
+       y="100"
+       x="215.14062"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         y="100"
+         x="215.14062"
+         id="tspan4505"
+         sodipodi:role="line">post/target</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_algvar.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_algvar.png
new file mode 100644
index 0000000..d286cf8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_algvar.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_aut.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_aut.png
new file mode 100644
index 0000000..3c9ea3f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_aut.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_contvar.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_contvar.png
new file mode 100644
index 0000000..858d333
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_contvar.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_deriv.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_deriv.png
new file mode 100644
index 0000000..c0cf5d5
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_deriv.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_discvar.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_discvar.png
new file mode 100644
index 0000000..27a585b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_discvar.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/stateviz_sshot.png b/v0.1-M1/cif/tools/cifsim/output/stateviz_sshot.png
new file mode 100644
index 0000000..5d8c7be
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/stateviz_sshot.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.cif
new file mode 100644
index 0000000..62f8acd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.cif
@@ -0,0 +1,26 @@
+svgfile "buffers_products.svg";
+
+buffer0: Buffer(0);
+buffer1: Buffer(1);
+
+group def Buffer(alg int nr):
+  svgcopy id "buffer" post <string>nr;
+
+  svgmove id "buffer" + <string>nr to 10 + nr * 110, 10;
+
+  product0: Product(nr, 0);
+  product1: Product(nr, 1);
+  product2: Product(nr, 2);
+end
+
+group def Product(alg int bufferNr, productNr):
+  svgcopy id "product" + <string>bufferNr post "_" + <string>productNr;
+
+  svgout id fmt("product%d_%d", bufferNr, productNr)
+         attr "transform"
+         value fmt("translate(%d,0)", productNr * 20);
+
+  svgout id fmt("product%d_%d", bufferNr, productNr)
+         attr "visibility"
+         value "visible";
+end
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.png
new file mode 100644
index 0000000..aa5e402
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.svg
new file mode 100644
index 0000000..e72394c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="220" height="70" id="root" version="1.1">
+  <g id="buffer">
+    <rect width="100" height="50" x="-120" y="10" id="background" style="fill:#ff0000"/>
+    <rect width="10"  height="30" x="-110" y="20" id="product"    style="fill:#8b0000;visibility:hidden;"/>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products_inkscape.png
new file mode 100644
index 0000000..496dc46
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/buffers_products/buffers_products_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape.png
new file mode 100644
index 0000000..c831164
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape_props_xml.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape_props_xml.png
new file mode 100644
index 0000000..010161a
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/inkscape/inkscape_props_xml.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.cif
new file mode 100644
index 0000000..81e5f71
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.cif
@@ -0,0 +1,14 @@
+svgfile "lamp.svg";
+
+automaton lamp:
+  cont t der 1.0;
+
+  location Off:
+    initial;
+    edge when t >= 1.0 do t := 0.0 goto On;
+
+  location On:
+    edge when t >= 2.0 do t := 0.0 goto Off;
+
+  svgout id "lamp" attr "fill" value if Off: "gray" else "yellow" end;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.svg
new file mode 100644
index 0000000..6f9484b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="75"
+   height="100"
+   id="svg2819"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="lamp.svg">
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="903"
+     inkscape:window-height="484"
+     id="namedview5"
+     showgrid="false"
+     inkscape:zoom="2.247619"
+     inkscape:cx="37"
+     inkscape:cy="52.277542"
+     inkscape:window-x="702"
+     inkscape:window-y="120"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2819" />
+  <defs
+     id="defs2821">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 52.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="74 : 52.5 : 1"
+       inkscape:persp3d-origin="37 : 35 : 1"
+       id="perspective9" />
+  </defs>
+  <path
+     d="m 62.43731,34.999017 a 24.937405,24.938483 0 0 1 -49.87481,0 24.937405,24.938483 0 1 1 49.87481,0 z"
+     id="lamp"
+     style="fill:#ff0000;fill-rule:evenodd;stroke:#000000;stroke-width:0.09688673px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.tooldef
new file mode 100644
index 0000000..094f362
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp.tooldef
@@ -0,0 +1,8 @@
+from "lib:cif" import *;
+
+cifsim(
+    "lamp.cif",
+    "-t 10",
+    "-i auto",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_inkscape.png
new file mode 100644
index 0000000..7f6aebc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_off.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_off.png
new file mode 100644
index 0000000..32a039e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_off.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_on.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_on.png
new file mode 100644
index 0000000..a45c625
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamp/lamp_sim_on.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.cif
new file mode 100644
index 0000000..b69d3fc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.cif
@@ -0,0 +1,21 @@
+// Behavior.
+automaton def Lamp():
+  event toggle;
+  disc bool on = false;
+
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+
+lamp1: Lamp();
+lamp2: Lamp();
+
+// Visualization.
+svgfile "lamps2.svg";
+
+svgout id "lamp1" attr "fill" value if lamp1.on: "yellow" else "silver" end;
+svgout id "lamp2" attr "fill" value if lamp2.on: "yellow" else "silver" end;
+
+svgout id "lamp1" attr "stroke-width" value if lamp1.on: 5 else 2 end;
+svgout id "lamp2" attr "stroke-width" value if lamp2.on: 5 else 2 end;
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.svg
new file mode 100644
index 0000000..c1e67a1
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="700"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="lamps2.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="27.047"
+     inkscape:cy="-1.3649001"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     sodipodi:type="arc"
+     style="fill:#c0c0c0;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="lamp1"
+     sodipodi:cx="125.5"
+     sodipodi:cy="139.5"
+     sodipodi:rx="50.5"
+     sodipodi:ry="48.5"
+     d="m 176,139.5 a 50.5,48.5 0 1 1 -101,0 50.5,48.5 0 1 1 101,0 z"
+     transform="matrix(0.58415842,0,0,0.60824742,-23.311881,-34.850515)" />
+  <path
+     transform="matrix(0.58415842,0,0,0.60824742,76.688119,-34.850515)"
+     d="m 176,139.5 a 50.5,48.5 0 1 1 -101,0 50.5,48.5 0 1 1 101,0 z"
+     sodipodi:ry="48.5"
+     sodipodi:rx="50.5"
+     sodipodi:cy="139.5"
+     sodipodi:cx="125.5"
+     id="lamp2"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:4.9993185;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     sodipodi:type="arc" />
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.tooldef
new file mode 100644
index 0000000..d1032f6
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2.tooldef
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "lamps2.cif",
+    "-i auto",
+    "-a random",
+    "--auto-time=random:1.0",
+    "--env-events=*",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2_inkscape.png
new file mode 100644
index 0000000..a7148ba
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps2_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.cif
new file mode 100644
index 0000000..35ae30c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.cif
@@ -0,0 +1,26 @@
+svgfile "lamps3.svg";
+
+automaton def Lamp(alg int nr):
+  // Behavior.
+  event toggle;
+  disc bool on = false;
+
+  location:
+    initial;
+    edge toggle do on := not on;
+
+  // Visualization.
+  svgcopy id "lamp" post <string>nr;
+
+  svgmove id "lamp" + <string>nr to 20 + (nr - 1) * 100, 20;
+
+  svgout id "lamp" + <string>nr attr "fill"
+    value if on: "yellow" else "silver" end;
+
+  svgout id "lamp" + <string>nr attr "stroke-width"
+    value if on: 5 else 2 end;
+end
+
+lamp1: Lamp(1);
+lamp2: Lamp(2);
+lamp3: Lamp(3);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.simple.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.simple.cif
new file mode 100644
index 0000000..55a5cd9
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.simple.cif
@@ -0,0 +1,34 @@
+automaton lamp1:
+  event toggle;
+  disc bool on = false;
+  svgcopy id "lamp" post "1";
+  svgmove id "lamp1" to 20, 20;
+  svgout id "lamp1" attr "fill" value if on: "yellow" else "silver" end;
+  svgout id "lamp1" attr "stroke-width" value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+automaton lamp2:
+  event toggle;
+  disc bool on = false;
+  svgcopy id "lamp" post "2";
+  svgmove id "lamp2" to 120, 20;
+  svgout id "lamp2" attr "fill" value if on: "yellow" else "silver" end;
+  svgout id "lamp2" attr "stroke-width" value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+automaton lamp3:
+  event toggle;
+  disc bool on = false;
+  svgcopy id "lamp" post "3";
+  svgmove id "lamp3" to 220, 20;
+  svgout id "lamp3" attr "fill" value if on: "yellow" else "silver" end;
+  svgout id "lamp3" attr "stroke-width" value if on: 5 else 2 end;
+  location:
+    initial;
+    edge toggle do on := not on;
+end
+svgfile "lamps3.svg";
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.svg
new file mode 100644
index 0000000..bd9e830
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="700"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="lamps3.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="27.047"
+     inkscape:cy="-1.3649001"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     sodipodi:type="arc"
+     style="fill:#c0c0c0;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="lamp"
+     sodipodi:cx="125.5"
+     sodipodi:cy="139.5"
+     sodipodi:rx="50.5"
+     sodipodi:ry="48.5"
+     d="m 176,139.5 a 50.5,48.5 0 1 1 -101,0 50.5,48.5 0 1 1 101,0 z"
+     transform="matrix(0.58415842,0,0,0.60824742,-163.31188,-34.850515)" />
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.tooldef
new file mode 100644
index 0000000..a13fa7e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3.tooldef
@@ -0,0 +1,29 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cif2cif(
+    "lamps3.cif",
+    "-o lamps3.simple.cif",
+    "-t elim-comp-def-inst,elim-alg-vars,simplify-values",
+);
+
+cifsim(
+    "lamps3.cif",
+    "-i auto",
+    "-a random",
+    "--auto-time=random:1.0",
+    "--env-events=*",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3_inkscape.png
new file mode 100644
index 0000000..967bec1
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/lamps/lamps3_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.cif
new file mode 100644
index 0000000..52f871c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.cif
@@ -0,0 +1,23 @@
+// Behavior.
+const real MARGIN = 0.01;
+
+automaton machine:
+  cont rate der if rate < target_rate:  1.0
+                else                   -1.0
+                end;
+  disc real target_rate = 0.5;
+  disc dist real rate_sampler = uniform(0.0, 1.0);
+
+  location:
+    initial;
+    edge when rate - MARGIN <= target_rate and target_rate <= rate + MARGIN
+         do (target_rate, rate_sampler) := sample rate_sampler;
+end
+
+// Visualization.
+svgfile "rate.svg";
+
+svgout id "circle_bg_rect" attr "height"
+  value scale(machine.rate, 0, 1, 58, 0);
+
+svgout id "circle_bg_rect" attr "fill" value "white";
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.svg
new file mode 100644
index 0000000..98efdff
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="rate.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3734"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective3623"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3653"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3686"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3686-3"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3772"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2860"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2897"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4.277996"
+     inkscape:cx="111.50559"
+     inkscape:cy="75.443202"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="g_grp"
+     transform="translate(-308.07459,-900.56694)">
+    <path
+       sodipodi:type="arc"
+       style="fill:#00ff00;fill-opacity:1;stroke:none"
+       id="circle_bg"
+       sodipodi:cx="559.60779"
+       sodipodi:cy="106.03077"
+       sodipodi:rx="37.868198"
+       sodipodi:ry="37.868198"
+       d="m 597.47599,106.03077 a 37.868198,37.868198 0 1 1 -75.7364,0 37.868198,37.868198 0 1 1 75.7364,0 z"
+       transform="matrix(0.77901778,0,0,0.77901778,-79.188421,868.26599)" />
+    <rect
+       style="fill:#00ffff;fill-opacity:1;stroke:#804000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="circle_bg_rect"
+       width="73.388466"
+       height="15"
+       x="320.83356"
+       y="921.86584" />
+    <path
+       transform="matrix(0.77901778,0,0,0.77901778,-79.188421,868.26599)"
+       d="m 597.47599,106.03077 a 37.868198,37.868198 0 1 1 -75.7364,0 37.868198,37.868198 0 1 1 75.7364,0 z"
+       sodipodi:ry="37.868198"
+       sodipodi:rx="37.868198"
+       sodipodi:cy="106.03077"
+       sodipodi:cx="559.60779"
+       id="circle"
+       style="fill:none;stroke:#000000;stroke-width:2.56733561;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       sodipodi:type="arc" />
+    <text
+       id="rate_txt"
+       y="956.69006"
+       x="356.96692"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="text-align:center;text-anchor:middle"
+         y="956.69006"
+         x="356.96692"
+         id="tspan3743-4"
+         sodipodi:role="line">rate</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.tooldef
new file mode 100644
index 0000000..36bb456
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cif2sim(
+    "rate.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=25",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_inkscape.png
new file mode 100644
index 0000000..4c23207
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_partial.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_partial.png
new file mode 100644
index 0000000..865f364
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/rate/rate_partial.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.cif
new file mode 100644
index 0000000..7d7b9a3
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.cif
@@ -0,0 +1,21 @@
+svgfile "sun_moon.svg";
+
+automaton sun_moon:
+  cont t der 1.0;
+
+  location Day:
+    initial;
+    edge when t >= 12.0 do t := 0.0 goto Night;
+
+  location Night:
+    edge when t >= 12.0 do t := 0.0 goto Day;
+
+  svgout id "sun" attr "visibility"
+    value if Day: "visible" else "hidden" end;
+
+  svgout id "moon" attr "visibility"
+    value switch self:
+      case Day:   "hidden"
+      case Night: "visible"
+    end;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.svg
new file mode 100644
index 0000000..12d52e8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="400"
+   height="200"
+   id="sun_moon">
+  <defs
+     id="defs4" />
+  <g
+     transform="translate(0,-852.36218)"
+     id="layer1">
+    <g
+       id="sun">
+      <path
+         d="m 106.06602,69.185242 a 43.436559,43.436559 0 1 1 -86.873118,0 43.436559,43.436559 0 1 1 86.873118,0 z"
+         transform="matrix(1.1380045,0,0,1.1380045,28.727393,873.62907)"
+         id="sun-circle"
+         style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 10.624039,951.86218 28.751922,0"
+         id="sun-ray-w"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02250886px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 160.51512,951.85093 28.96975,0"
+         id="sun-ray-e"
+         style="fill:none;stroke:#ff0000;stroke-width:1.0263747px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 100.51125,862.87731 0,28.96975"
+         id="sun-ray-n"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02637482px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 100.51319,1012.8754 0,28.9735"
+         id="sun-ray-s"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02644193px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="M 36.463665,1015.2464 56.794344,994.91576"
+         id="sun-ray-sw"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02250886px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 142.44471,909.24948 20.48471,-20.4847"
+         id="sun-ray-ne"
+         style="fill:none;stroke:#ff0000;stroke-width:1.0263747px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 37.101716,888.76478 20.484707,20.4847"
+         id="sun-ray-nw"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02637482px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="m 143.16775,994.82807 20.48736,20.48733"
+         id="sun-ray-se"
+         style="fill:none;stroke:#ff0000;stroke-width:1.02644193px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    </g>
+    <path
+       d="m 299.431,952.36218 c 0,27.29998 10.61898,40.056 30.569,49.43102 -27.29999,0 -49.431,-22.13104 -49.431,-49.43102 0,-27.29999 22.13101,-49.431 49.431,-49.431 -20.01252,9.4375 -30.569,22.13101 -30.569,49.431 z"
+       id="moon"
+       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.13800454px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.tooldef
new file mode 100644
index 0000000..06b9a26
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "sun_moon.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=10",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon_inkscape.png
new file mode 100644
index 0000000..90683fc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/sun_moon/sun_moon_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap.svg
new file mode 100644
index 0000000..0d9ce81
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <g id="g">
+    <rect style="fill:green;" id="r" width="100" height="100" x="50" y="50"/>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out1.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out1.svg
new file mode 100644
index 0000000..67423d6
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out1.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <g id="ga">
+    <rect style="fill:green;" id="ra" width="100" height="100" x="50" y="50"/>
+  </g>
+  <g id="g">
+    <rect style="fill:green;" id="rb" width="100" height="100" x="50" y="50"/>
+    <rect style="fill:green;" id="r" width="100" height="100" x="50" y="50"/>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out2.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out2.svg
new file mode 100644
index 0000000..7898ad0
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out2.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <g id="ga">
+    <rect style="fill:green;" id="rba" width="100" height="100" x="50" y="50"/>
+    <rect style="fill:green;" id="ra" width="100" height="100" x="50" y="50"/>
+  </g>
+  <g id="g">
+    <rect style="fill:green;" id="rb" width="100" height="100" x="50" y="50"/>
+    <rect style="fill:green;" id="r" width="100" height="100" x="50" y="50"/>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out3.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out3.svg
new file mode 100644
index 0000000..eeda452
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/overlap_out3.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <g id="ga">
+    <rect style="fill:green;" id="rab" width="100" height="100" x="50" y="50"/>
+    <rect style="fill:green;" id="ra" width="100" height="100" x="50" y="50"/>
+  </g>
+  <g id="g">
+    <rect style="fill:green;" id="r" width="100" height="100" x="50" y="50"/>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.cif
new file mode 100644
index 0000000..b2fee32
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.cif
@@ -0,0 +1,5 @@
+svgfile "svgcopy.svg";
+
+svgcopy id "rect" pre "a";
+svgcopy id "grp" post "b";
+svgcopy id "rect3" pre "_" post "x";
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.out.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.out.svg
new file mode 100644
index 0000000..2fc3bde
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.out.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <rect style="fill:red;"   id="arect"   width="100" height="100" x="20" y="20"/>
+  <rect style="fill:red;"   id="rect"    width="100" height="100" x="20" y="20"/>
+  <g id="grpb">
+    <rect style="fill:green;" id="rect2b" width="100" height="100" x="50" y="50"/>
+  </g>
+  <g id="grp">
+    <rect style="fill:green;" id="rect2" width="100" height="100" x="50" y="50"/>
+  </g>
+  <rect style="fill:blue;"  id="_rect3x" width="100" height="100" x="80" y="80"/>
+  <rect style="fill:blue;"  id="rect3"   width="100" height="100" x="80" y="80"/>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.svg
new file mode 100644
index 0000000..281be0e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="250" height="250" id="root" version="1.1">
+  <rect style="fill:red;"   id="rect"  width="100" height="100" x="20" y="20"/>
+  <g id="grp">
+    <rect style="fill:green;" id="rect2" width="100" height="100" x="50" y="50"/>
+  </g>
+  <rect style="fill:blue;"  id="rect3" width="100" height="100" x="80" y="80"/>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.tooldef
new file mode 100644
index 0000000..04c480b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgcopy/svgcopy.tooldef
@@ -0,0 +1,16 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("svgcopy.cif");
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.cif
new file mode 100644
index 0000000..4415c53
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.cif
@@ -0,0 +1,4 @@
+svgfile "svgmove.svg";
+
+svgmove id "rect1" to 10, 10;
+svgmove id "rect2" to 10, 50;
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.png
new file mode 100644
index 0000000..8f71bc3
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.svg
new file mode 100644
index 0000000..a3b8be8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.out.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="400" height="400" id="root" version="1.1">
+  <g id="grp1">
+    <rect style="fill:green;" id="rect1" width="20" height="20" x="5" y="10"
+          transform="translate(15, 20) translate(-10.000000,-20.000000)"/>
+  </g>
+  <g id="grp2" transform="scale(5, 2)">
+    <rect style="fill:blue;" id="rect2" width="20" height="20" x="5" y="10"
+          transform="translate(15, 20) translate(-18.000000,-5.000000)"/>
+  </g>
+</svg>
+
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.png
new file mode 100644
index 0000000..5ca446d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.svg
new file mode 100644
index 0000000..673b0f4
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:svg="http://www.w3.org/2000/svg"
+     width="400" height="400" id="root" version="1.1">
+  <g id="grp1">
+    <rect style="fill:green;" id="rect1" width="20" height="20" x="5" y="10"
+          transform="translate(15, 20)"/>
+  </g>
+  <g id="grp2" transform="scale(5, 2)">
+    <rect style="fill:blue;" id="rect2" width="20" height="20" x="5" y="10"
+          transform="translate(15, 20)"/>
+  </g>
+</svg>
+
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.tooldef
new file mode 100644
index 0000000..63abeda
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/svgmove/svgmove.tooldef
@@ -0,0 +1,16 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("svgmove.cif");
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.cif
new file mode 100644
index 0000000..b0b2f9c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.cif
@@ -0,0 +1,23 @@
+// Behavior.
+const real CAPACITY   = 10.0;
+const real MAX_LEVEL  =  8.0;
+const real INIT_LEVEL =  5.0;
+const real MIN_LEVEL  =  2.0;
+
+automaton tank:
+  cont level = INIT_LEVEL;
+
+  location open:
+    initial;
+    equation level' =  1.0;
+    edge when level >= MAX_LEVEL goto closed;
+
+  location closed:
+    equation level' = -1.0;
+    edge when level <= MIN_LEVEL goto open;
+end
+
+// Visualization.
+svgfile "tank.svg";
+
+svgout id "water" attr "height" value scale(tank.level, 0, CAPACITY, 0, 80);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.svg
new file mode 100644
index 0000000..004cae8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="tank.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3199"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.62"
+     inkscape:cx="231.37409"
+     inkscape:cy="-42.489696"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1553"
+     inkscape:window-height="855"
+     inkscape:window-x="83"
+     inkscape:window-y="111"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#8080ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="water"
+       width="170"
+       height="60"
+       x="15"
+       y="30"
+       inkscape:label="#rect5026" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 15,10 0,80 170,0 0,-80"
+       id="tank"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.tooldef
new file mode 100644
index 0000000..c1b67ce
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "tank.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.cif
new file mode 100644
index 0000000..6da7201
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.cif
@@ -0,0 +1,36 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+// Behavior.
+const real CAPACITY   = 10.0;
+const real MAX_LEVEL  =  8.0;
+const real INIT_LEVEL =  5.0;
+const real MIN_LEVEL  =  2.0;
+
+automaton tank:
+  cont level = INIT_LEVEL;
+
+  location open:
+    initial;
+    equation level' =  1.0;
+    edge when level >= MAX_LEVEL goto closed;
+
+  location closed:
+    equation level' = -1.0;
+    edge when level <= MIN_LEVEL goto open;
+end
+
+// Visualization.
+svgfile "tank2.svg";
+
+svgout id "water" attr "height" value scale(tank.level, 0, CAPACITY, 0, 80);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.svg
new file mode 100644
index 0000000..58447bf
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   version="1.0"
+   sodipodi:docname="tank2.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3199"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.62"
+     inkscape:cx="231.37409"
+     inkscape:cy="-42.798338"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1553"
+     inkscape:window-height="855"
+     inkscape:window-x="83"
+     inkscape:window-y="111"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#8080ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="water"
+       width="170"
+       height="60"
+       x="15"
+       y="-90"
+       inkscape:label="#rect5026"
+       transform="scale(1,-1)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 15,10 0,80 170,0 0,-80"
+       id="tank"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.tooldef
new file mode 100644
index 0000000..c657f42
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "tank2.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2_inkscape.png
new file mode 100644
index 0000000..dcf0991
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank2_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_inkscape.png
new file mode 100644
index 0000000..7658fd3
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_problem.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_problem.png
new file mode 100644
index 0000000..7ada3bd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/tank/tank_problem.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.cif
new file mode 100644
index 0000000..e9f035b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.cif
@@ -0,0 +1,24 @@
+// Behavior.
+automaton person:
+  cont pos = 0.0;
+
+  location forward:
+    initial;
+    equation pos' =  1.0;
+    edge when pos >= 5.0 goto backward;
+
+  location backward:
+    equation pos' = -1.0;
+    edge when pos <= 0.0 goto forward;
+end
+
+// Visualization.
+svgfile "walk_floor.svg";
+
+// width of the floor - width of the person = movement
+// 180px              - 19px                = 161px
+svgout id "person" attr "transform"
+  value fmt("translate(%s,0)", scale(person.pos, 0, 5, 0, 161));
+
+svgout id "pos_txt" text
+  value fmt("%.1f%%", scale(person.pos, 0, 5, 0, 100));
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.svg
new file mode 100644
index 0000000..b3a176b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="walk_floor.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4213"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4322"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="230.00944"
+     inkscape:cy="73.116919"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:showpageshadow="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:object-paths="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="person">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 10.5,84.86218 9,-9"
+         id="leg_left" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 28.5,84.86218 -9,-9"
+         id="leg_right" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 19.5,76.36218 0,-21.5"
+         id="body" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 11,62.02689 16.98841,0"
+         id="arms" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.53206468;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="head"
+         sodipodi:cx="293.6261"
+         sodipodi:cy="-49.42197"
+         sodipodi:rx="6.8942909"
+         sodipodi:ry="6.8942909"
+         d="m 300.52039,-49.42197 a 6.8942909,6.8942909 0 1 1 -13.78858,0 6.8942909,6.8942909 0 1 1 13.78858,0 z"
+         transform="matrix(0.65271397,0,0,0.65271397,-172.15386,82.62059)" />
+    </g>
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:none"
+       id="floor"
+       width="180"
+       height="5"
+       x="10"
+       y="84.999992" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="8.4296875"
+       y="19.773438"
+       id="pos_txt"><tspan
+         sodipodi:role="line"
+         id="tspan2823"
+         x="8.4296875"
+         y="19.773438">Position: ?%</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.tooldef
new file mode 100644
index 0000000..4e84cf0
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "walk_floor.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=50",
+    "--speed=2",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_inkscape.png
new file mode 100644
index 0000000..ec3e116
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig.svg
new file mode 100644
index 0000000..b257ac1
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="walk_floor.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4213"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4322"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="230.00944"
+     inkscape:cy="73.116919"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:showpageshadow="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:object-paths="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="person"
+       transform="translate(-290,-467)">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 300.5,551.86218 9,-9"
+         id="leg_left" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 318.5,551.86218 -9,-9"
+         id="leg_right" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 309.5,543.36218 0,-21.5"
+         id="body" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 301,529.02689 16.98841,0"
+         id="arms" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.53206468;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="head"
+         sodipodi:cx="293.6261"
+         sodipodi:cy="-49.42197"
+         sodipodi:rx="6.8942909"
+         sodipodi:ry="6.8942909"
+         d="m 300.52039,-49.42197 c 0,3.807611 -3.08668,6.894291 -6.89429,6.894291 -3.80761,0 -6.89429,-3.08668 -6.89429,-6.894291 0,-3.807612 3.08668,-6.894291 6.89429,-6.894291 3.80761,0 6.89429,3.086679 6.89429,6.894291 z"
+         transform="matrix(0.65271397,0,0,0.65271397,117.84614,549.62059)" />
+    </g>
+    <rect
+       style="fill:#808080;fill-opacity:1;stroke:none"
+       id="floor"
+       width="180"
+       height="5"
+       x="10"
+       y="84.999992" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="8.4296875"
+       y="19.773438"
+       id="pos_txt"><tspan
+         sodipodi:role="line"
+         id="tspan2823"
+         x="8.4296875"
+         y="19.773438">Position: ?%</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig_inkscape.png
new file mode 100644
index 0000000..706fc69
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_floor/walk_floor_orig_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.cif
new file mode 100644
index 0000000..e408282
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.cif
@@ -0,0 +1,38 @@
+// Behavior.
+automaton person:
+  cont x = 0.0;
+  cont y = 0.0;
+
+  location right:
+    initial;
+    equation x' =  1.0;
+    equation y' =  0.0;
+    edge when x >= 5.0 goto down;
+
+  location down:
+    equation x' =  0.0;
+    equation y' =  1.0;
+    edge when y >= 5.0 goto left;
+
+  location left:
+    equation x' = -1.0;
+    equation y' =  0.0;
+    edge when x <= 0.0 goto up;
+
+  location up:
+    equation x' =  0.0;
+    equation y' = -1.0;
+    edge when y <= 0.0 goto right;
+end
+
+// Visualization.
+svgfile "walk_room.svg";
+
+// width of the room - width of the person = horizontal movement
+// 180px             - 19px                = 161px
+//
+// height of the room - height of the person = vertical movement
+// 180px              - 40x                  = 140px
+svgout id "person" attr "transform"
+  value fmt("translate(%s,%s)", scale(person.x, 0, 5, 0, 161),
+                                scale(person.y, 0, 5, 0, 140));
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.svg
new file mode 100644
index 0000000..d889c3e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="walk_room.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4213"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4322"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="143.00944"
+     inkscape:cy="73.116919"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:showpageshadow="true"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:object-paths="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,100)">
+    <g
+       id="person">
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 10.5,-50.13782 9,-9"
+         id="leg-left" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 28.5,-50.13782 -9,-9"
+         id="leg-right" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 19.5,-58.63782 0,-21.5"
+         id="body" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 11,-72.97311 16.98841,0"
+         id="arms" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.53206468;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="head"
+         sodipodi:cx="293.6261"
+         sodipodi:cy="-49.42197"
+         sodipodi:rx="6.8942909"
+         sodipodi:ry="6.8942909"
+         d="m 300.52039,-49.42197 a 6.8942909,6.8942909 0 1 1 -13.78858,0 6.8942909,6.8942909 0 1 1 13.78858,0 z"
+         transform="matrix(0.65271397,0,0,0.65271397,-172.15386,-52.37941)" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="room"
+       width="188"
+       height="188"
+       x="6"
+       y="-94" />
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.tooldef
new file mode 100644
index 0000000..e050a8c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "walk_room.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=40",
+    "--speed=3",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room_inkscape.png
new file mode 100644
index 0000000..172e25d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/walk_room/walk_room_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.cif b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.cif
new file mode 100644
index 0000000..24f2499
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.cif
@@ -0,0 +1,26 @@
+svgfile "workstation.svg";
+
+event generate, transfer, exit;
+
+m1: Machine(1, 1.0, generate, transfer);
+m2: Machine(2, 2.5, transfer, exit);
+
+automaton def Machine(alg int nr; alg real ptime; event start, done):
+  cont t der 1.0;
+
+  location idle:
+    initial;
+    edge start do t := 0.0 goto processing;
+
+  location processing:
+    edge when t >= ptime goto completed;
+
+  location completed:
+    edge done goto idle;
+
+  svgout id "m" + <string>nr + "_bar_front" attr "width"
+    value scale(if processing: t else ptime end, 0, ptime, 0, 130);
+
+  svgout id "m" + <string>nr + "_bar_front" attr "fill"
+    value if idle : "gray" else "dodgerblue" end;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.svg b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.svg
new file mode 100644
index 0000000..f6a4b23
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.svg
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="170"
+   height="170"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="workstation.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3259"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="210.31123"
+     inkscape:cy="57.159092"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1728"
+     inkscape:window-height="1080"
+     inkscape:window-x="184"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-80)">
+    <g
+       id="m1"
+       transform="translate(0,40)">
+      <rect
+         y="50.387024"
+         x="10.387024"
+         height="59.225952"
+         width="149.22595"
+         id="m1_box"
+         style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.77404726;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="m1_txt"
+         y="69.773438"
+         x="19.101562"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           y="69.773438"
+           x="19.101562"
+           id="tspan3205"
+           sodipodi:role="line">Machine 1</tspan></text>
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="m1_bar_back"
+         width="131"
+         height="21"
+         x="20.5"
+         y="78.5" />
+      <rect
+         y="79"
+         x="21"
+         height="20"
+         width="25"
+         id="m1_bar_front"
+         style="fill:#1e90ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </g>
+    <g
+       id="m2"
+       transform="translate(0,130)">
+      <rect
+         y="50.387024"
+         x="10.387024"
+         height="59.225952"
+         width="149.22595"
+         id="m2_box"
+         style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.77404726;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="m2_txt"
+         y="69.773438"
+         x="19.101562"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           y="69.773438"
+           x="19.101562"
+           id="tspan3213"
+           sodipodi:role="line">Machine 2</tspan></text>
+      <rect
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="m2_bar_back"
+         width="131"
+         height="21"
+         x="20.5"
+         y="78.5" />
+      <rect
+         y="79"
+         x="21"
+         height="20"
+         width="24.4"
+         id="m2_bar_front"
+         style="fill:#1e90ff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+    </g>
+    <g
+       id="c">
+      <path
+         inkscape:connector-type="polyline"
+         id="transfer_arrow"
+         d="m 85,-20.387024 0,29.3"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+         transform="translate(0,170)"
+         inkscape:connection-end="#m2"
+         inkscape:connection-start="#m1" />
+      <text
+         id="transfer_txt"
+         y="169.7812"
+         x="91.924561"
+         style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         xml:space="preserve"><tspan
+           style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans"
+           y="169.7812"
+           x="91.924561"
+           id="tspan3884"
+           sodipodi:role="line">transfer</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.tooldef b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.tooldef
new file mode 100644
index 0000000..17b282e
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim(
+    "workstation.cif",
+    "-i auto",
+    "-a first",
+    "--frame-rate=20",
+);
diff --git a/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation_inkscape.png b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation_inkscape.png
new file mode 100644
index 0000000..3d1a792
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/svgviz/workstation/workstation_inkscape.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/output/tank.trajdata b/v0.1-M1/cif/tools/cifsim/output/tank.trajdata
new file mode 100644
index 0000000..f179bd6
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/tank.trajdata
@@ -0,0 +1,10 @@
+# time                controller.n   tank.V               tank.V'               tank.Qi   tank.Qo
+0.0                   0              10.0                 -3.1622776601683795   0.0       3.1622776601683795
+0.08763429266802605   0              9.7247959763441      -3.1184605138343664   0.0       3.1184605138343664
+0.587634292668026     0              8.228065719426915    -2.868460513834366    0.0       2.868460513834366
+1.087634292668026     0              6.8563354625097315   -2.618460513834366    0.0       2.618460513834366
+1.587634292668026     0              5.609605205592543    -2.3684605138343646   0.0       2.3684605138343646
+2.0876342926680262    0              4.487874948675351    -2.1184605138343624   0.0       2.1184605138343624
+2.5876342926680262    0              3.491144691758149    -1.8684605138343569   0.0       1.8684605138343569
+3.0876342926680262    0              2.619414434840913    -1.618460513834339    0.0       1.618460513834339
+3.496128195593086     0              1.9999999999999958   -1.4142135623730936   0.0       1.4142135623730936
diff --git a/v0.1-M1/cif/tools/cifsim/output/tank_raw.trajdata b/v0.1-M1/cif/tools/cifsim/output/tank_raw.trajdata
new file mode 100644
index 0000000..9afb1fc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/output/tank_raw.trajdata
@@ -0,0 +1,10 @@
+# time controller.n tank.V tank.V' tank.Qi tank.Qo
+0.0 0 10.0 -3.1622776601683795 0.0 3.1622776601683795
+0.08763429266802605 0 9.7247959763441 -3.1184605138343664 0.0 3.1184605138343664
+0.587634292668026 0 8.228065719426915 -2.868460513834366 0.0 2.868460513834366
+1.087634292668026 0 6.8563354625097315 -2.618460513834366 0.0 2.618460513834366
+1.587634292668026 0 5.609605205592543 -2.3684605138343646 0.0 2.3684605138343646
+2.0876342926680262 0 4.487874948675351 -2.1184605138343624 0.0 2.1184605138343624
+2.5876342926680262 0 3.491144691758149 -1.8684605138343569 0.0 1.8684605138343569
+3.0876342926680262 0 2.619414434840913 -1.618460513834339 0.0 1.618460513834339
+3.496128195593086 0 1.9999999999999958 -1.4142135623730936 0.0 1.4142135623730936
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_discont.cif b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.cif
new file mode 100644
index 0000000..e34dd3b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.cif
@@ -0,0 +1,4 @@
+cont x = 1.0;
+equation x' = if x < 2: 1.0
+              else      3.0
+              end;
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png
new file mode 100644
index 0000000..c20d035
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.dat b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.dat
new file mode 100644
index 0000000..4a10f68
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.dat
@@ -0,0 +1,33 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                x                    x'
+0.0                   1.0                  1.0
+0.08177654339579425   1.0817765433957942   1.0
+0.8995419773537368    1.8995419773537372   1.0
+0.9701813903622956    1.970181390362296    1.0
+0.9813277600091546    1.981327760009155    1.0
+0.9885403027713907    1.988540302771391    1.0
+0.993691696922353     1.9936916969223533   1.0
+0.9981554517020158    1.9981554517020161   1.0
+0.9989981723801846    1.9989981723801848   1.0
+0.9995267508135063    1.9995267508135064   1.0
+0.9999688840311223    1.9999688840311225   1.0
+0.9999927807856158    1.999992780785616    1.0
+0.9999992904141694    1.9999992904141695   1.0
+1.0000305703935572    2.0000869366442884   3.0
+1.0000589738152084    2.0001721469092413   3.0
+1.0003430080317184    2.0010242495587716   3.0
+1.003183350196819     2.0095452760540735   3.0
+1.031586771847826     2.0947555410070944   3.0
+1.315620988357895     2.946858190537302    3.0
+2.0                   4.999995225463616    3.0
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.plt b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.plt
new file mode 100644
index 0000000..da6a41f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.png.plt
@@ -0,0 +1,43 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "integr_discont.png"
+
+set key top left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "integr_discont.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "integr_discont.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_discont.tooldef b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.tooldef
new file mode 100644
index 0000000..812bf2f
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_discont.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("integr_discont.cif",
+        "-i auto",
+        "-a first",
+        "-t 2",
+        "--trajdata=on",
+        "--trajdata-file=integr_discont.png.dat",
+        "--solver-int-maxstep=100");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_linear.cif b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.cif
new file mode 100644
index 0000000..63e4785
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.cif
@@ -0,0 +1,2 @@
+cont x = 0.0;
+equation x' = 1.0;
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png
new file mode 100644
index 0000000..44a7f70
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.dat b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.dat
new file mode 100644
index 0000000..7773f1b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.dat
@@ -0,0 +1,6 @@
+# time                 x                       x'
+0.0                    0.0                     1.0
+9.999999999999999e-5   1.0000000000000003e-4   1.0
+0.0011                 0.0011000000000000005   1.0
+0.0111                 0.011100000000000006    1.0
+0.1                    0.10000000000000006     1.0
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.plt b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.plt
new file mode 100644
index 0000000..ce17ddd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.png.plt
@@ -0,0 +1,43 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "integr_linear.png"
+
+set key center left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "integr_linear.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "integr_linear.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_linear.tooldef b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.tooldef
new file mode 100644
index 0000000..bf6e652
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_linear.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("integr_linear.cif",
+        "-i auto",
+        "-a first",
+        "-t 0.1",
+        "--trajdata=on",
+        "--trajdata-file=integr_linear.png.dat",
+        "--solver-int-maxstep=100");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.cif b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.cif
new file mode 100644
index 0000000..73af881
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.cif
@@ -0,0 +1,2 @@
+cont x = 0.0;
+equation x' = (x * x) - x - 2;
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png
new file mode 100644
index 0000000..1bb10dc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.dat b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.dat
new file mode 100644
index 0000000..660d3b2
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.dat
@@ -0,0 +1,34 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                 x                        x'
+0.0                    0.0                      -2.0
+9.999999999999999e-5   -1.9998999900012492e-4   -1.9997999700050002
+0.0011                 -0.0021987886708306876   -1.9977963766575504
+0.0111                 -0.022075441401570056    -1.9774372334853558
+0.1111                 -0.2086795844500907      -1.7477732465836469
+0.4386838927076575     -0.6452785517944979      -0.9383370387994976
+0.6439541417059881     -0.7973617350111273      -0.5668525285289174
+0.8310868671681683     -0.8809586816819749      -0.342953119487182
+1.1776607860442532     -0.9568045634801028      -0.12772046382354718
+1.5729136535125967     -0.9866698783663096      -0.03981267275830236
+1.9986161511748937     -0.9962710417387206      -0.011172969654123843
+2.450244854404956      -0.9990371264449505      -0.002887693539665559
+2.9664920067400513     -0.9997953220376393      -6.139919940137961e-4
+3.5695149089806435     -0.9999664699127607      -1.0058913745103482e-4
+4.293378771047167      -0.9999961774090081      -1.1467758363359337e-5
+5.191870617724527      -0.999999741962919       -7.741111764936193e-7
+6.367212114851151      -0.9999999926766214      -2.197013571070272e-8
+8.069182604876072      -1.000000000548613       1.645839020625317e-9
+11.291817194488493     -0.9999999464834497      -1.6054964802059146e-7
+13.182122839679401     -1.0000000138788474      4.163654221400748e-8
+15.0                   -0.999999997704039       -6.887882930683986e-9
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.plt b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.plt
new file mode 100644
index 0000000..7ecf345
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.png.plt
@@ -0,0 +1,43 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "integr_nonlinear.png"
+
+set key bottom right vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "integr_nonlinear.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "integr_nonlinear.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
diff --git a/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.tooldef b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.tooldef
new file mode 100644
index 0000000..85be756
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/integr_nonlinear.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("integr_nonlinear.cif",
+        "-i auto",
+        "-a first",
+        "-t 15",
+        "--trajdata=on",
+        "--trajdata-file=integr_nonlinear.png.dat",
+        "--solver-int-maxstep=100");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_comma_fail.cif b/v0.1-M1/cif/tools/cifsim/solver/root_comma_fail.cif
new file mode 100644
index 0000000..4c3b5f7
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_comma_fail.cif
@@ -0,0 +1,6 @@
+automaton p:
+  cont x der 1.0;
+  location:
+    initial;
+    edge when x > 0, 1 / x < 0.5 do x := 0.0;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem.cif b/v0.1-M1/cif/tools/cifsim/solver/root_problem.cif
new file mode 100644
index 0000000..aaeb45d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem.cif
@@ -0,0 +1,8 @@
+automaton p:
+  cont x = 0.0;
+  equation x' = 1.0;
+
+  location:
+    initial;
+    edge when x >= 2.33 and x <= 2.34 do x := 0.0;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem.png b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png
new file mode 100644
index 0000000..c2820d3
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.dat
new file mode 100644
index 0000000..59a9fe4
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.dat
@@ -0,0 +1,28 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                 p.x                     p.x'
+0.0                    0.0                     1.0
+9.999999999999999e-5   1.0000000000000003e-4   1.0
+0.0011                 0.0011000000000000005   1.0
+0.0111                 0.011100000000000006    1.0
+0.1111                 0.11110000000000006     1.0
+0.6111                 0.6111000000000003      1.0
+1.1111                 1.1111000000000004      1.0
+1.6111                 1.6111000000000006      1.0
+2.1111                 2.111100000000001       1.0
+2.6111                 2.6111000000000013      1.0
+3.1111                 3.1111000000000013      1.0
+3.6111                 3.6111000000000013      1.0
+4.1111                 4.111100000000001       1.0
+4.6111                 4.611100000000001       1.0
+5.0                    5.000000000000001       1.0
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.plt
new file mode 100644
index 0000000..5b14d6c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem.png.plt
@@ -0,0 +1,46 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,250 font 'sans'
+set output "root_problem.png"
+
+set key top left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+set samples 2000
+
+plot \
+  "root_problem.png.dat." using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "root_problem.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2, \
+  (x >= 2.33 && x <= 2.34) ? +1 : -1 title "guard" with lines ls 3
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem.tooldef b/v0.1-M1/cif/tools/cifsim/solver/root_problem.tooldef
new file mode 100644
index 0000000..2cefeee
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("root_problem.cif",
+        "-i auto",
+        "-a first",
+        "-t 5",
+        "--trajdata=on",
+        "--trajdata-file=root_problem.png.dat");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem2.cif b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.cif
new file mode 100644
index 0000000..de9df92
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.cif
@@ -0,0 +1,8 @@
+automaton p:
+  cont x = 0.0;
+  equation x' = 1.0;
+
+  location:
+    initial;
+    edge when x >= 2.33, x <= 2.34 do x := 0.0;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png
new file mode 100644
index 0000000..f5d8cdd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.dat
new file mode 100644
index 0000000..f21c198
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.dat
@@ -0,0 +1,41 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                 p.x                     p.x'
+0.0                    0.0                     1.0
+9.999999999999999e-5   1.0000000000000003e-4   1.0
+0.0011                 0.0011000000000000005   1.0
+0.0111                 0.011100000000000006    1.0
+0.1111                 0.11110000000000006     1.0
+0.6111                 0.6111000000000003      1.0
+1.1111                 1.1111000000000004      1.0
+1.6111                 1.6111000000000006      1.0
+2.1111                 2.111100000000001       1.0
+2.330000000000001      2.3300000000000014      1.0
+# time                 p.x                     p.x'
+2.330000000000001      0.0                     1.0
+2.330100000000001      1.0000000000000003e-4   1.0
+2.331100000000001      0.0011000000000000005   1.0
+2.341100000000001      0.011100000000000006    1.0
+2.441100000000001      0.11110000000000006     1.0
+2.941100000000001      0.6111000000000003      1.0
+3.441100000000001      1.1111000000000004      1.0
+3.941100000000001      1.6111000000000006      1.0
+4.4411000000000005     2.111100000000001       1.0
+4.660000000000002      2.330000000000002       1.0
+# time                 p.x                     p.x'
+4.660000000000002      0.0                     1.0
+4.660100000000002      1.0000000000000003e-4   1.0
+4.661100000000002      0.0011000000000000005   1.0
+4.671100000000002      0.011100000000000006    1.0
+4.7711000000000015     0.11110000000000006     1.0
+5.0                    0.33999999999999875     1.0
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.plt
new file mode 100644
index 0000000..830eec8
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.png.plt
@@ -0,0 +1,47 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "root_problem2.png"
+
+set key top left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.50, graph 0.05
+
+set samples 2000
+
+plot \
+  "root_problem2.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "root_problem2.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2, \
+  (x >= 2.33) ? +1 : -1 title "first guard"             with lines       ls 3, \
+  (x <= 2.34) ? +1 : -1 title "second guard"            with lines       ls 4
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_problem2.tooldef b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.tooldef
new file mode 100644
index 0000000..cf5aec5
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_problem2.tooldef
@@ -0,0 +1,21 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("root_problem2.cif",
+        "-i auto",
+        "-a first",
+        "-t 5",
+        "--trajdata=on",
+        "--trajdata-file=root_problem2.png.dat");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_root.png b/v0.1-M1/cif/tools/cifsim/solver/root_root.png
new file mode 100644
index 0000000..55c65dd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_root.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_root.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_root.png.dat
new file mode 100644
index 0000000..c220444
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_root.png.dat
@@ -0,0 +1,20 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# ix     guard   iy     ilow     ihigh
+0.75     -1       0.75  1.1111   5.0
+1.1111   -1       0.50  1.1111   3.0555
+1.5      -1       0.25  1.1111   2.0833
+1.5      +1       0.0   1.1111   1.5972
+2.0      +1      -0.25  1.3542   1.5972
+3.0      +1      -0.50  1.4757   1.5972
+5.0      +1      -0.75  1.4757   1.5364
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_root.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_root.png.plt
new file mode 100644
index 0000000..43cce35
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_root.png.plt
@@ -0,0 +1,45 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,200 font 'sans'
+set output "root_root.png"
+
+set key bottom right vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set ytics 1.0
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.15, graph 0.15
+
+plot "root_root.png.dat" using 1:($2) title "x >= 1.5" with lines ls 1, \
+     "root_root.png.dat" using 1:($3):($4):($5) title "root finding intervals" \
+                         with xerrorbars ls 2 pointtype -1
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple.cif b/v0.1-M1/cif/tools/cifsim/solver/root_simple.cif
new file mode 100644
index 0000000..6b5c499
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple.cif
@@ -0,0 +1,8 @@
+automaton p:
+  cont x = 0.0;
+  equation x' = 0.5;
+
+  location:
+    initial;
+    edge when x >= 1.5 do x := 0.0;
+end
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple.png b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png
new file mode 100644
index 0000000..08487fd
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.dat
new file mode 100644
index 0000000..ce02345
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.dat
@@ -0,0 +1,28 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                 p.x                     p.x'
+0.0                    0.0                     0.5
+9.999999999999999e-5   5.0000000000000016e-5   0.5
+0.0011                 5.500000000000002e-4    0.5
+0.0111                 0.005550000000000003    0.5
+0.1111                 0.05555000000000003     0.5
+1.1111                 0.5555500000000002      0.5
+3.000000000000004      1.5000000000000002      0.5
+# time                 p.x                     p.x'
+3.000000000000004      0.0                     0.5
+3.000100000000004      5.0000000000000016e-5   0.5
+3.001100000000004      5.500000000000002e-4    0.5
+3.011100000000004      0.005550000000000003    0.5
+3.111100000000004      0.05555000000000003     0.5
+4.111100000000004      0.5555500000000002      0.5
+5.0                    0.9999999999999984      0.5
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.plt
new file mode 100644
index 0000000..5a88611
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple.png.plt
@@ -0,0 +1,43 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "root_simple.png"
+
+set key top left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "root_simple.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "root_simple.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple.tooldef b/v0.1-M1/cif/tools/cifsim/solver/root_simple.tooldef
new file mode 100644
index 0000000..b2336c7
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("root_simple.cif",
+        "-i auto",
+        "-a first",
+        "-t 5",
+        "--trajdata=on",
+        "--trajdata-file=root_simple.png.dat",
+        "--solver-int-maxstep=100");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple2.cif b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.cif
new file mode 100644
index 0000000..953cf33
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.cif
@@ -0,0 +1,15 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+cont x = 0.0;
+equation x' = 0.5;
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png
new file mode 100644
index 0000000..94eba12
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.dat
new file mode 100644
index 0000000..5d14429
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.dat
@@ -0,0 +1,20 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time                 x                       x'
+0.0                    0.0                     0.5
+9.999999999999999e-5   5.0000000000000016e-5   0.5
+0.0011                 5.500000000000002e-4    0.5
+0.0111                 0.005550000000000003    0.5
+0.1111                 0.05555000000000003     0.5
+1.1111                 0.5555500000000002      0.5
+5.0                    2.500000000000001       0.5
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.plt
new file mode 100644
index 0000000..cc82760
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.png.plt
@@ -0,0 +1,43 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "root_simple2.png"
+
+set key top left vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "root_simple2.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "root_simple2.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple2.tooldef b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.tooldef
new file mode 100644
index 0000000..d93a814
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple2.tooldef
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifsim("root_simple2.cif",
+        "-i auto",
+        "-a first",
+        "-t 5",
+        "--trajdata=on",
+        "--trajdata-file=root_simple2.png.dat",
+        "--solver-int-maxstep=100");
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png
new file mode 100644
index 0000000..c6dc707
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.dat b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.dat
new file mode 100644
index 0000000..81fbd4d
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.dat
@@ -0,0 +1,13 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Dummy .dat file, needed by the Makefile target.
diff --git a/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.plt b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.plt
new file mode 100644
index 0000000..b36408c
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/solver/root_simple_guard.png.plt
@@ -0,0 +1,57 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 500,300 font 'sans'
+set output "root_simple_guard.png"
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set ytics 1.0
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.15, graph 0.15
+
+set samples 1000
+
+set multiplot layout 2, 1
+
+set size 1, 0.60
+set origin 0, 0.40
+set key top left vertical
+
+plot \
+  "root_simple2.png.dat" using 1:($2) title "x(time)"  with linespoints ls 1, \
+  "root_simple2.png.dat" using 1:($3) title "x'(time)" with linespoints ls 2
+
+set size 1, 0.40
+set origin 0, 0
+set key bottom right vertical
+
+plot [0:5] x >= 1.5 ? +1 : -1 title "x >= 1.5" with lines ls 1
diff --git a/v0.1-M1/cif/tools/cifsim/state_space.png b/v0.1-M1/cif/tools/cifsim/state_space.png
new file mode 100644
index 0000000..84478ea
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/cifsim/state_space.png.tex b/v0.1-M1/cif/tools/cifsim/state_space.png.tex
new file mode 100644
index 0000000..73f62dc
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/state_space.png.tex
@@ -0,0 +1,51 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[vcentering,dvips]{geometry}
+\geometry{papersize={20in,20in}}
+
+\usetikzlibrary{arrows, automata}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,very thick,top color=white,
+                      bottom color=se-blue!75,initial text=,
+                      minimum size=1.8cm},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial] (ri)               {\state{Released}{Idle}};
+  \node[state]          (pi) [right of=ri] {\state{Pushed}{Idle}};
+  \node[state]          (pp) [below of=pi] {\state{Pushed}{Producing}};
+  \node[state]          (rp) [below of=ri] {\state{Released}{Producing}};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=-2pt}]
+    (ri) edge [bend left]  node[sloped,anchor=south] {pushed}    (pi)
+    (pi) edge [bend left]  node[sloped,anchor=north] {released}  (ri)
+         edge [bend left]  node[sloped,anchor=south] {producing} (pp)
+    (pp) edge [bend left]  node[sloped,anchor=north] {released}  (rp)
+         edge [bend left]  node[sloped,anchor=south] {produced}  (pi)
+    (rp) edge [bend left]  node[sloped,anchor=south] {pushed}    (pp)
+         edge [bend left]  node[sloped,anchor=south] {produced}  (ri)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tools/cifsim/terminate_button.png b/v0.1-M1/cif/tools/cifsim/terminate_button.png
new file mode 100644
index 0000000..f07119b
--- /dev/null
+++ b/v0.1-M1/cif/tools/cifsim/terminate_button.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/controlledtank.slx b/v0.1-M1/cif/tools/codegen/simulink-example/controlledtank.slx
new file mode 100644
index 0000000..d703b6f
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/controlledtank.slx
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/matlab-mex.png b/v0.1-M1/cif/tools/codegen/simulink-example/matlab-mex.png
new file mode 100644
index 0000000..7cf56ad
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/matlab-mex.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/rmb-generate-code.png b/v0.1-M1/cif/tools/codegen/simulink-example/rmb-generate-code.png
new file mode 100644
index 0000000..3e4feb8
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/rmb-generate-code.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/set-output-variables.png b/v0.1-M1/cif/tools/codegen/simulink-example/set-output-variables.png
new file mode 100644
index 0000000..51608d5
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/set-output-variables.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/simulation-graph.png b/v0.1-M1/cif/tools/codegen/simulink-example/simulation-graph.png
new file mode 100644
index 0000000..bd3dd3f
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/simulation-graph.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/simulink-controlled-system.png b/v0.1-M1/cif/tools/codegen/simulink-example/simulink-controlled-system.png
new file mode 100644
index 0000000..8c0a424
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/simulink-controlled-system.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/codegen/simulink-example/tank.svg b/v0.1-M1/cif/tools/codegen/simulink-example/tank.svg
new file mode 100644
index 0000000..51be41a
--- /dev/null
+++ b/v0.1-M1/cif/tools/codegen/simulink-example/tank.svg
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="772.59546"
+   height="620.13062"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="tank.svg">
+  <defs
+     id="defs2987" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#ffffff"
+     borderopacity="0.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="0"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="998.95015"
+     inkscape:cy="-96.871635"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:snap-grids="true"
+     inkscape:window-width="1333"
+     inkscape:window-height="974"
+     inkscape:window-x="87"
+     inkscape:window-y="43"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <sodipodi:guide
+       orientation="0,1"
+       position="-16.397321,1672.1557"
+       id="guide2993" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-4.96875,-427.24435)">
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="-138.3909"
+       y="-93.150803"
+       id="text3824"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3826"
+         x="-138.3909"
+         y="-93.150803" /></text>
+    <rect
+       style="fill:#c1d9e8;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.73356569px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="rect2995"
+       width="657.4093"
+       height="165.98073"
+       x="41.312176"
+       y="698.31433" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 42.87395,527.01898 -1.42857,334.28571 657.14286,1.42857 0,-328.57143"
+       id="path3765"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 69.48454,459.82175 57.14286,32.85714 0,-31.78572 -56.78572,31.42858 z"
+       id="path3767"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 72.68022,476.39318 5,477.01753"
+       id="path3769"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g3799"
+       style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       transform="translate(475.73109,500.37108)">
+      <path
+         sodipodi:nodetypes="scs"
+         inkscape:connector-curvature="0"
+         id="path3789"
+         d="m -152.23191,135.74066 4.74964,28.69744 c 0,0 -9.83088,-59.39839 -4.74964,-28.69744 z"
+         style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3791"
+         d="m -157.5838,135.14367 -2.0203,29.29443"
+         style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path3793"
+         d="m -154.46429,135.66575 1.3393,27.67857"
+         style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3795"
+         d="M -155.71429,136.11218 -156.25,154.50504"
+         style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3797"
+         d="m -152.76786,136.29075 1.07143,16.07143"
+         style="fill:#000000;fill-opacity:1;stroke:#c1d9e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 125.20816,475.91065 c 149.90082,-3.1878 197.46002,29.27285 195.96959,161.62441"
+       id="path3771"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 607.05092,863.80923 -0.29587,183.55297"
+       id="path3806"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="640.38593"
+       y="953.71277"
+       id="text3808"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3810"
+         x="640.38593"
+         y="953.71277">Qo</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="499.97476"
+       y="685.01221"
+       id="text3812"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3814"
+         x="499.97476"
+         y="685.01221">V</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="304.00516"
+       y="500.1543"
+       id="text3816"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3818"
+         x="304.00516"
+         y="500.1543">Qi</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="83.791908"
+       y="449.6467"
+       id="text3820"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3822"
+         x="83.791908"
+         y="449.6467">n</tspan></text>
+    <path
+       style="fill:none;stroke:#d52141;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 684.30252,828.73326 31.42857,0 0,-151 -32.14286,0"
+       id="path3828"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="725.73108"
+       y="839.1618"
+       id="text3830"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3832"
+         x="725.73108"
+         y="839.1618">2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="729.30249"
+       y="689.8761"
+       id="text3834"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3836"
+         x="729.30249"
+         y="689.8761">10</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_basic.png b/v0.1-M1/cif/tools/eventbased/analysis_basic.png
new file mode 100644
index 0000000..b010edb
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_basic.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_chain.png b/v0.1-M1/cif/tools/eventbased/analysis_chain.png
new file mode 100644
index 0000000..279e336
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_chain.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_enable_synthesis_dump.png b/v0.1-M1/cif/tools/eventbased/analysis_enable_synthesis_dump.png
new file mode 100644
index 0000000..0e38701
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_enable_synthesis_dump.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_outgoing.png b/v0.1-M1/cif/tools/eventbased/analysis_outgoing.png
new file mode 100644
index 0000000..db96512
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_outgoing.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_removed.png b/v0.1-M1/cif/tools/eventbased/analysis_removed.png
new file mode 100644
index 0000000..d335930
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_removed.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/eventbased/analysis_startup.png b/v0.1-M1/cif/tools/eventbased/analysis_startup.png
new file mode 100644
index 0000000..db96fdd
--- /dev/null
+++ b/v0.1-M1/cif/tools/eventbased/analysis_startup.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/mergecif/merge.tooldef b/v0.1-M1/cif/tools/mergecif/merge.tooldef
new file mode 100644
index 0000000..46391f4
--- /dev/null
+++ b/v0.1-M1/cif/tools/mergecif/merge.tooldef
@@ -0,0 +1,16 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// This program and the accompanying materials are made available
+// under the terms of the MIT License which is available at
+// https://opensource.org/licenses/MIT
+//
+// SPDX-License-Identifier: MIT
+//////////////////////////////////////////////////////////////////////////////
+
+from "lib:cif" import *;
+
+cifmerge("merge_sup.cif merge_timed.cif -o merged.cif");
diff --git a/v0.1-M1/cif/tools/mergecif/merge_sup.cif b/v0.1-M1/cif/tools/mergecif/merge_sup.cif
new file mode 100644
index 0000000..ae13c4e
--- /dev/null
+++ b/v0.1-M1/cif/tools/mergecif/merge_sup.cif
@@ -0,0 +1,35 @@
+group button:
+  uncontrollable u_pushed, u_released;
+end
+
+group lamp:
+  controllable c_on, c_off;
+end
+
+group timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+end
+
+supervisor automaton timed_lamp:
+  location s0:
+    initial;
+    edge button.u_pushed goto s1;
+    edge button.u_released;
+
+  location s1:
+    edge lamp.c_on goto s2;
+    edge button.u_pushed, button.u_released;
+
+  location s2:
+    edge timer.c_start goto s3;
+    edge button.u_pushed, button.u_released;
+
+  location s3:
+    edge timer.u_timeout goto s4;
+    edge button.u_pushed, button.u_released;
+
+  location s4:
+    edge lamp.c_off goto s0;
+    edge button.u_pushed, button.u_released;
+end
diff --git a/v0.1-M1/cif/tools/mergecif/merge_timed.cif b/v0.1-M1/cif/tools/mergecif/merge_timed.cif
new file mode 100644
index 0000000..4396f7d
--- /dev/null
+++ b/v0.1-M1/cif/tools/mergecif/merge_timed.cif
@@ -0,0 +1,35 @@
+plant automaton button:
+  uncontrollable u_pushed, u_released;
+
+  location released:
+    initial;
+    edge u_pushed goto pushed;
+
+  location pushed:
+    edge u_released goto released;
+end
+
+plant automaton lamp:
+  controllable c_on, c_off;
+
+  location off:
+    initial;
+    edge c_on goto on;
+
+  location on:
+    edge c_off goto off;
+end
+
+plant automaton timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+
+  cont t der 1.0;
+
+  location idle:
+    initial;
+    edge c_start do t := 0.0 goto running;
+
+  location running:
+    edge u_timeout when t >= 2.0 goto idle;
+end
diff --git a/v0.1-M1/cif/tools/mergecif/merged.cif b/v0.1-M1/cif/tools/mergecif/merged.cif
new file mode 100644
index 0000000..49fa0fb
--- /dev/null
+++ b/v0.1-M1/cif/tools/mergecif/merged.cif
@@ -0,0 +1,46 @@
+plant automaton button:
+  uncontrollable u_pushed;
+  uncontrollable u_released;
+  location released:
+    initial;
+    edge u_pushed goto pushed;
+  location pushed:
+    edge u_released goto released;
+end
+plant automaton lamp:
+  controllable c_on;
+  controllable c_off;
+  location off:
+    initial;
+    edge c_on goto on;
+  location on:
+    edge c_off goto off;
+end
+plant automaton timer:
+  controllable c_start;
+  uncontrollable u_timeout;
+  cont t der 1.0;
+  location idle:
+    initial;
+    edge c_start do t := 0.0 goto running;
+  location running:
+    edge u_timeout when t >= 2.0 goto idle;
+end
+supervisor automaton timed_lamp:
+  location s0:
+    initial;
+    edge button.u_pushed goto s1;
+    edge button.u_released;
+  location s1:
+    edge lamp.c_on goto s2;
+    edge button.u_pushed, button.u_released;
+  location s2:
+    edge timer.c_start goto s3;
+    edge button.u_pushed, button.u_released;
+  location s3:
+    edge timer.u_timeout goto s4;
+    edge button.u_pushed, button.u_released;
+  location s4:
+    edge lamp.c_off goto s0;
+    edge button.u_pushed, button.u_released;
+end
diff --git a/v0.1-M1/cif/tools/scripting/comment.png b/v0.1-M1/cif/tools/scripting/comment.png
new file mode 100644
index 0000000..6e30e1e
--- /dev/null
+++ b/v0.1-M1/cif/tools/scripting/comment.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_help.png b/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_help.png
new file mode 100644
index 0000000..c980626
--- /dev/null
+++ b/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_help.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_link.png b/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_link.png
new file mode 100644
index 0000000..55d2218
--- /dev/null
+++ b/v0.1-M1/cif/tools/scripting/option_dialog_cmdline_link.png
Binary files differ
diff --git a/v0.1-M1/cif/tools/scripting/uncomment.png b/v0.1-M1/cif/tools/scripting/uncomment.png
new file mode 100644
index 0000000..38f8ce0
--- /dev/null
+++ b/v0.1-M1/cif/tools/scripting/uncomment.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png b/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png
new file mode 100644
index 0000000..75ee98e
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png.tex b/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png.tex
new file mode 100644
index 0000000..463d20f
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/coin_toss_state_space.png.tex
@@ -0,0 +1,48 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=2.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (hu)                                {h/u};
+  \node[state]            (au) [                 right of=hu] {a/u};
+  \node[state]            (gh) [above =1cm of au,right of=au] {g/h};
+  \node[state]            (gt) [below =1cm of au,right of=au] {g/t};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (hu) edge[]           node[]                    {toss}     (au)
+    (au) edge[]           node[sloped,anchor=south] {land}     (gh)
+    (au) edge[]           node[sloped,anchor=north] {land}     (gt)
+    (gh) edge[bend right] node[sloped,anchor=north] {pick\_up} (hu)
+    (gt) edge[bend left]  node[sloped,anchor=south] {pick\_up} (hu)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png
new file mode 100644
index 0000000..d1ce435
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png.tex b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png.tex
new file mode 100644
index 0000000..936f17f
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_finite.png.tex
@@ -0,0 +1,62 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=2.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00)                      {p/i};
+  \node[state]            (s01) [      right of=s00] {i/i};
+  \node[state]            (s02) [      right of=s01] {p/c};
+  \node[state]            (s03) [above right of=s02] {i/c};
+  \node[state]            (s04) [below right of=s02] {p/i};
+  \node[state]            (s05) [below right of=s03] {i/i};
+  \node[state]            (s06) [      right of=s05] {p/c};
+  \node[state]            (s07) [above right of=s06] {i/c};
+  \node[state]            (s08) [below right of=s06] {p/i};
+  \node[state]            (s09) [below right of=s07] {i/i};
+  \node[state, accepting] (s10) [      right of=s09] {p/c};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s00) edge[] node[]                    {produce} (s01)
+    (s01) edge[] node[]                    {provide} (s02)
+    (s02) edge[] node[sloped,anchor=south] {produce} (s03)
+    (s02) edge[] node[sloped,anchor=north] {consume} (s04)
+    (s03) edge[] node[sloped,anchor=south] {consume} (s05)
+    (s04) edge[] node[sloped,anchor=north] {produce} (s05)
+    (s05) edge[] node[]                    {provide} (s06)
+    (s06) edge[] node[sloped,anchor=south] {produce} (s07)
+    (s06) edge[] node[sloped,anchor=north] {consume} (s08)
+    (s07) edge[] node[sloped,anchor=south] {consume} (s09)
+    (s08) edge[] node[sloped,anchor=north] {produce} (s09)
+    (s09) edge[] node[]                    {provide} (s10)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png
new file mode 100644
index 0000000..34c9800
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png.tex b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png.tex
new file mode 100644
index 0000000..f5e092a
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/basics/producer_consumer_state_space_infinite.png.tex
@@ -0,0 +1,48 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=2.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s0)                    {p/i};
+  \node[state]            (s1) [right of=s0]      {i/i};
+  \node[state]            (s2) [below =1cm of s0] {p/c};
+  \node[state]            (s3) [below =1cm of s1] {i/c};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s0) edge[] node[]                    {produce} (s1)
+    (s1) edge[] node[sloped,anchor=south] {provide} (s2)
+    (s2) edge[] node[swap]                {produce} (s3)
+    (s3) edge[] node[swap]                {consume} (s1)
+    (s2) edge[] node[]                    {consume} (s0)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/channels/producer_consumer.png b/v0.1-M1/cif/tutorial/channels/producer_consumer.png
new file mode 100644
index 0000000..4061a2c
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/channels/producer_consumer.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/channels/producer_consumer.png.svg b/v0.1-M1/cif/tutorial/channels/producer_consumer.png.svg
new file mode 100644
index 0000000..e97cd60
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/channels/producer_consumer.png.svg
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="620"
+   height="180"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="producer_consumer.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3879"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3885"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective3669"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3776"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4"
+     inkscape:cx="153.97285"
+     inkscape:cy="106.85616"
+     inkscape:document-units="px"
+     inkscape:current-layer="g3861"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="g3861"
+     transform="translate(0.70532036,-1.6098709)">
+    <rect
+       style="fill:#f0f0f0;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3006"
+       width="99"
+       height="29"
+       x="9.7946796"
+       y="52.109871"
+       ry="5.75"
+       rx="5.75" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3051"
+       y="70.472176"
+       x="58.665771"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:14px;text-align:center;text-anchor:middle"
+         y="70.472176"
+         x="58.665771"
+         id="tspan3053"
+         sodipodi:role="line">producer</tspan></text>
+  </g>
+  <g
+     id="g3860"
+     transform="translate(0,3.7694445)">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)"
+       d="M 109.62408,59.500002 208.62407,30.500001"
+       id="path3870"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path4316"
+       d="M 109.62408,62.961111 208.62407,91.96111"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend)" />
+  </g>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3051-5"
+     y="37.445599"
+     x="151.29156"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:14px;text-align:center;text-anchor:middle"
+       y="37.445599"
+       x="151.29156"
+       id="tspan3053-7"
+       sodipodi:role="line">provide1</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="151.29156"
+     y="101.8831"
+     id="text4546"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4548"
+       x="151.29156"
+       y="101.8831"
+       style="font-size:14px;text-align:center;text-anchor:middle">provide2</tspan></text>
+  <g
+     transform="translate(200.70532,28.390129)"
+     id="g3840">
+    <rect
+       rx="5.75"
+       ry="5.75"
+       y="52.109871"
+       x="9.7946796"
+       height="29"
+       width="99"
+       id="rect3842"
+       style="fill:#f0f0f0;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="59.612549"
+       y="71.706062"
+       id="text3844"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3846"
+         x="59.612549"
+         y="71.706062"
+         style="font-size:14px;text-align:center;text-anchor:middle">consumer2</tspan></text>
+  </g>
+  <g
+     id="g3848"
+     transform="translate(200.70532,-31.609871)">
+    <rect
+       style="fill:#f0f0f0;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3850"
+       width="99"
+       height="29"
+       x="9.7946796"
+       y="52.109871"
+       ry="5.75"
+       rx="5.75" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3852"
+       y="71.613777"
+       x="59.557861"
+       style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:14px;text-align:center;text-anchor:middle"
+         y="71.613777"
+         x="59.557861"
+         id="tspan3854"
+         sodipodi:role="line">consumer1</tspan></text>
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tutorial/data/conveyor.png b/v0.1-M1/cif/tutorial/data/conveyor.png
new file mode 100644
index 0000000..eebdd49
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/conveyor.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/conveyor.png.svg b/v0.1-M1/cif/tutorial/data/conveyor.png.svg
new file mode 100644
index 0000000..7093bd3
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/conveyor.png.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="620"
+   height="180"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="conveyor.png.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective3669"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3776"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8284272"
+     inkscape:cx="208.39851"
+     inkscape:cy="95.424358"
+     inkscape:document-units="px"
+     inkscape:current-layer="g3017"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="belt"
+     transform="translate(199.5,-22)">
+    <path
+       id="belt_outer"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -174,169 c 8.28427,0 139.71573,0 148,0 8.28427,0 15,-6.7157 15,-15 0,-8.2843 -6.71573,-15 -15,-15 0,0 0,0 0,0 0,0 -148,0 -148,0 0,0 0,0 0,0 -8.28427,0 -15,6.7158 -15,15 0,8.2843 6.71573,15 15,15 z"
+       sodipodi:nodetypes="ccsccccsc"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3659"
+       sodipodi:cx="20.5"
+       sodipodi:cy="224.5"
+       sodipodi:rx="6.5"
+       sodipodi:ry="6.5"
+       d="m 27,224.5 c 0,3.58985 -2.910149,6.5 -6.5,6.5 -3.589851,0 -6.5,-2.91015 -6.5,-6.5 0,-3.58985 2.910149,-6.5 6.5,-6.5 3.589851,0 6.5,2.91015 6.5,6.5 z"
+       transform="matrix(1.7692307,0,0,1.7692286,-210.26923,-243.19183)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3659-9"
+       sodipodi:cx="20.5"
+       sodipodi:cy="224.5"
+       sodipodi:rx="6.5"
+       sodipodi:ry="6.5"
+       d="m 27,224.5 c 0,3.58985 -2.910149,6.5 -6.5,6.5 -3.589851,0 -6.5,-2.91015 -6.5,-6.5 0,-3.58985 2.910149,-6.5 6.5,-6.5 3.589851,0 6.5,2.91015 6.5,6.5 z"
+       transform="matrix(1.7692307,0,0,1.7692286,-62.26923,-243.19183)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -174,148.4998 0,11.0002"
+       id="path3683"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3697"
+       d="m -168.4999,153.9999 -11.0002,0"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3699"
+       d="M -26,148.4998 -26,159.5"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -20.4999,153.9999 -11.0002,0"
+       id="path3701"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     id="box_wrapper"
+     transform="translate(10,-22)">
+    <rect
+       style="fill:#855e42;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="box"
+       width="119"
+       height="44"
+       x="0"
+       y="93.499977"
+       inkscape:label="#rect3746" />
+  </g>
+  <g
+     id="g3017"
+     transform="translate(379.5,-22)">
+    <path
+       sodipodi:nodetypes="ccsccccsc"
+       d="m -174,169 c 8.28427,0 139.71573,0 103,0 8.28427,0 15,-6.7157 15,-15 0,-8.2843 -6.71573,-15 -15,-15 0,0 0,0 0,0 0,0 -103,0 -103,0 0,0 0,0 0,0 -8.28427,0 -15,6.7158 -15,15 0,8.2843 6.71573,15 15,15 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3019"
+       inkscape:connector-curvature="0" />
+    <path
+       transform="matrix(1.7692307,0,0,1.7692286,-210.26923,-243.19183)"
+       d="m 27,224.5 c 0,3.58985 -2.910149,6.5 -6.5,6.5 -3.589851,0 -6.5,-2.91015 -6.5,-6.5 0,-3.58985 2.910149,-6.5 6.5,-6.5 3.589851,0 6.5,2.91015 6.5,6.5 z"
+       sodipodi:ry="6.5"
+       sodipodi:rx="6.5"
+       sodipodi:cy="224.5"
+       sodipodi:cx="20.5"
+       id="path3021"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       sodipodi:type="arc" />
+    <path
+       transform="matrix(1.7692307,0,0,1.7692286,-107.26923,-243.19183)"
+       d="m 27,224.5 a 6.5,6.5 0 1 1 -13,0 6.5,6.5 0 1 1 13,0 z"
+       sodipodi:ry="6.5"
+       sodipodi:rx="6.5"
+       sodipodi:cy="224.5"
+       sodipodi:cx="20.5"
+       id="path3023"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       sodipodi:type="arc" />
+    <path
+       id="path3025"
+       d="m -174,148.4998 0,11.0002"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -168.4999,153.9999 -11.0002,0"
+       id="path3027"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -70.999999,148.4998 0,11.0002"
+       id="path3029"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3031"
+       d="m -65.499899,153.9999 -11.0002,0"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 9.5,155.16667 0,4"
+     id="path3033"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3035"
+     d="m 144.5,155.16667 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 99.5,155.16667 0,4"
+     id="path3037"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3039"
+     d="m 54.5,155.16667 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 324.5,155.16667 0,4"
+     id="path3043"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3045"
+     d="m 279.5,155.16667 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 189.5,155.16667 0,4"
+     id="path3047"
+     inkscape:connector-curvature="0" />
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="9.5078125"
+     y="176.11092"
+     id="text3051"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3053"
+       x="9.5078125"
+       y="176.11092"
+       style="text-align:center;text-anchor:middle">0</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3055"
+     y="176.11092"
+     x="54.363281"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="text-align:center;text-anchor:middle"
+       y="176.11092"
+       x="54.363281"
+       id="tspan3057"
+       sodipodi:role="line">1</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="99.71875"
+     y="176.11092"
+     id="text3059"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3061"
+       x="99.71875"
+       y="176.11092"
+       style="text-align:center;text-anchor:middle">2</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="144.53516"
+     y="176.11092"
+     id="text3067"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3069"
+       x="144.53516"
+       y="176.11092"
+       style="text-align:center;text-anchor:middle">3</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3071"
+     y="176.11092"
+     x="189.5625"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="text-align:center;text-anchor:middle"
+       y="176.11092"
+       x="189.5625"
+       id="tspan3073"
+       sodipodi:role="line">4</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="279.44922"
+     y="176.11092"
+     id="text3075"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3077"
+       x="279.44922"
+       y="176.11092"
+       style="text-align:center;text-anchor:middle">6</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="324.53125"
+     y="176.11092"
+     id="text3083"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3085"
+       x="324.53125"
+       y="176.11092"
+       style="text-align:center;text-anchor:middle">7</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 9.4399055,157.16667 314.9967245,0"
+     id="path3032"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3024"
+     d="m 234.5,155.16667 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <text
+     sodipodi:linespacing="125%"
+     id="text3026"
+     y="176.11092"
+     x="234.58594"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="text-align:center;text-anchor:middle"
+       y="176.11092"
+       x="234.58594"
+       id="tspan3028"
+       sodipodi:role="line">5</tspan></text>
+</svg>
diff --git a/v0.1-M1/cif/tutorial/data/conveyor_state_space.png b/v0.1-M1/cif/tutorial/data/conveyor_state_space.png
new file mode 100644
index 0000000..f100f94
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/conveyor_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/conveyor_state_space.png.tex b/v0.1-M1/cif/tutorial/data/conveyor_state_space.png.tex
new file mode 100644
index 0000000..3f5a413
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/conveyor_state_space.png.tex
@@ -0,0 +1,64 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=2.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s01) [            ] {0/-1};
+  \node[state]            (s02) [right of=s01] {1/-1};
+  \node[state]            (s03) [right of=s02] {2/-1};
+  \node[state]            (s04) [right of=s03] {3/-1};
+  \node[state]            (s05) [right of=s04] {4/-1};
+  \node[state]            (s06) [right of=s05] {0/4};
+  \node[state]            (s07) [right of=s06] {1/5};
+  \node[state]            (s08) [right of=s07] {2/6};
+  \node[state]            (s09) [right of=s08] {3/7};
+  \node[state]            (s10) [right of=s09] {4/7};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s01) edge[             ] node[                   ] {move   } (s02)
+    (s02) edge[             ] node[                   ] {move   } (s03)
+    (s03) edge[             ] node[                   ] {move   } (s04)
+    (s04) edge[             ] node[                   ] {move   } (s05)
+    (s05) edge[             ] node[                   ] {exit1  } (s06)
+    (s06) edge[             ] node[                   ] {move   } (s07)
+    (s07) edge[             ] node[                   ] {move   } (s08)
+    (s08) edge[             ] node[                   ] {move   } (s09)
+    (s09) edge[             ] node[                   ] {move   } (s10)
+
+    (s05) edge[loop below   ] node[                   ] {move   } (s05)
+    (s10) edge[loop below   ] node[                   ] {move   } (s10)
+
+    (s09) edge[bend right   ] node[sloped,anchor=south] {exit2  } (s04)
+    (s10) edge[bend right   ] node[sloped,anchor=south] {exit2  } (s05)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/counter_state_space.png b/v0.1-M1/cif/tutorial/data/counter_state_space.png
new file mode 100644
index 0000000..c1c8894
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/counter_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/counter_state_space.png.tex b/v0.1-M1/cif/tutorial/data/counter_state_space.png.tex
new file mode 100644
index 0000000..9d87ec5
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/counter_state_space.png.tex
@@ -0,0 +1,56 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial above},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state]            (s00) [            ] {0};
+  \node[state]            (s01) [right of=s00] {1};
+  \node[state]            (s02) [right of=s01] {2};
+  \node[state, initial]   (s03) [right of=s02] {3};
+  \node[state]            (s04) [right of=s03] {4};
+  \node[state]            (s05) [right of=s04] {5};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s00) edge[bend left] node[] {increment} (s01)
+    (s01) edge[bend left] node[] {decrement} (s00)
+    (s01) edge[bend left] node[] {increment} (s02)
+    (s02) edge[bend left] node[] {decrement} (s01)
+    (s02) edge[bend left] node[] {increment} (s03)
+    (s03) edge[bend left] node[] {decrement} (s02)
+    (s03) edge[bend left] node[] {increment} (s04)
+    (s04) edge[bend left] node[] {decrement} (s03)
+    (s04) edge[bend left] node[] {increment} (s05)
+    (s05) edge[bend left] node[] {decrement} (s04)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png b/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png
new file mode 100644
index 0000000..eddba38
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png.tex b/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png.tex
new file mode 100644
index 0000000..5de0ee2
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/discvar_change_state_space.png.tex
@@ -0,0 +1,52 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s01) [            ] {off/0};
+  \node[state]            (s02) [right of=s01] {on/1};
+  \node[state]            (s03) [right of=s02] {off/1};
+  \node[state]            (s04) [right of=s03] {on/2};
+  \node[state]            (s05) [right of=s04] {off/2};
+  \node[state]            (s06) [right of=s05] {on/3};
+  \node[state, accepting] (s07) [right of=s06] {off/3};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s01) edge[] node[] {turn\_on } (s02)
+    (s02) edge[] node[] {turn\_off} (s03)
+    (s03) edge[] node[] {turn\_on } (s04)
+    (s04) edge[] node[] {turn\_off} (s05)
+    (s05) edge[] node[] {turn\_on } (s06)
+    (s06) edge[] node[] {turn\_off} (s07)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png b/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png
new file mode 100644
index 0000000..49a71a5
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png.tex b/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png.tex
new file mode 100644
index 0000000..d2325ad
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/monitoring_fixed_state_space.png.tex
@@ -0,0 +1,55 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial] (s01) [                               ] {p/s};
+  \node[state]          (s02) [                   right of=s01] {i/s};
+  \node[state]          (s03) [                   right of=s02] {i/a};
+  \node[state]          (s05) [above =1cm of s03, right of=s03] {p/a};
+  \node[state]          (s06) [below =1cm of s03, right of=s03] {p/b};
+  \node[state]          (s04) [below =1cm of s05, right of=s05] {i/b};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=-1pt}]
+    (s01) edge[             ] node[                   ] {produce   } (s02)
+    (s02) edge[bend left =20] node[sloped,anchor=south] {provide\_a} (s05)
+    (s02) edge[bend right=20] node[sloped,anchor=north] {provide\_b} (s06)
+    (s03) edge[             ] node[sloped,anchor=north] {provide\_b} (s06)
+    (s04) edge[             ] node[sloped,anchor=south] {provide\_a} (s05)
+    (s05) edge[bend right= 7] node[sloped,anchor=south] {produce   } (s03)
+    (s06) edge[bend left = 7] node[sloped,anchor=south] {produce   } (s04)
+
+    (s03) edge[bend right= 7] node[sloped,anchor=north] {provide\_a} (s05)
+    (s04) edge[bend left = 7] node[sloped,anchor=north] {provide\_b} (s06)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png b/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png
new file mode 100644
index 0000000..f0374ba
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png.tex b/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png.tex
new file mode 100644
index 0000000..cde5b82
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/monitoring_problem_state_space.png.tex
@@ -0,0 +1,52 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial] (s01) [                               ] {p/s};
+  \node[state]          (s02) [                   right of=s01] {i/s};
+  \node[state]          (s03) [                   right of=s02] {i/a};
+  \node[state]          (s05) [above =1cm of s03, right of=s03] {p/a};
+  \node[state]          (s06) [below =1cm of s03, right of=s03] {p/b};
+  \node[state]          (s04) [below =1cm of s05, right of=s05] {i/b};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=-1pt}]
+    (s01) edge[             ] node[                   ] {produce   } (s02)
+    (s02) edge[bend left =20] node[sloped,anchor=south] {provide\_a} (s05)
+    (s02) edge[bend right=20] node[sloped,anchor=north] {provide\_b} (s06)
+    (s03) edge[             ] node[sloped,anchor=north] {provide\_b} (s06)
+    (s04) edge[             ] node[sloped,anchor=south] {provide\_a} (s05)
+    (s05) edge[             ] node[sloped,anchor=south] {produce   } (s03)
+    (s06) edge[             ] node[sloped,anchor=north] {produce   } (s04)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/mutex_state_space.png b/v0.1-M1/cif/tutorial/data/mutex_state_space.png
new file mode 100644
index 0000000..b3eff6d
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/mutex_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/mutex_state_space.png.tex b/v0.1-M1/cif/tutorial/data/mutex_state_space.png.tex
new file mode 100644
index 0000000..b8413bf
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/mutex_state_space.png.tex
@@ -0,0 +1,64 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s1) [                               ] {i/i};
+  \node[state]            (s2) [above =1.1cm of s1, right of=s1] {p/i};
+  \node[state]            (s3) [below =1.1cm of s1, right of=s1] {i/p};
+  \node[state]            (s4) [                    right of=s2] {c/i};
+  \node[state]            (s5) [                    right of=s3] {i/c};
+  \node[state]            (s6) [                    right of=s4] {c/p};
+  \node[state]            (s7) [                    right of=s5] {p/c};
+  \node[state]            (s8) [below =1.1cm of s6, right of=s6] {c/c};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s1) edge[             ] node[sloped,anchor=south] {start1} (s2)
+    (s1) edge[             ] node[sloped,anchor=north] {start2} (s3)
+    (s2) edge[             ] node[sloped,anchor=south] {done1 } (s4)
+    (s3) edge[             ] node[sloped,anchor=north] {done2 } (s5)
+    (s4) edge[             ] node[sloped,anchor=south] {start2} (s6)
+    (s5) edge[             ] node[sloped,anchor=north] {start1} (s7)
+    (s6) edge[             ] node[sloped,anchor=south] {done2 } (s8)
+    (s7) edge[             ] node[sloped,anchor=north] {done1 } (s8)
+
+    (s4) edge[bend right=22] node[sloped,anchor=south] {reset1} (s1)
+    (s5) edge[bend left =22] node[sloped,anchor=north] {reset2} (s1)
+
+    (s8) edge[bend right=22] node[sloped,anchor=south] {reset2} (s4)
+    (s8) edge[bend left =22] node[sloped,anchor=north] {reset1} (s5)
+
+    (s6) edge[bend right= 9] node[sloped,anchor=north] {reset1} (s3)
+    (s7) edge[bend left = 9] node[sloped,anchor=south] {reset2} (s2)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/supermarket_state_space.png b/v0.1-M1/cif/tutorial/data/supermarket_state_space.png
new file mode 100644
index 0000000..e43281c
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/supermarket_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/supermarket_state_space.png.tex b/v0.1-M1/cif/tutorial/data/supermarket_state_space.png.tex
new file mode 100644
index 0000000..efd2dc4
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/supermarket_state_space.png.tex
@@ -0,0 +1,78 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [                                 ] {0/0};
+  \node[state]            (s01) [below =1.3cm of s00, right of=s00] {0/1};
+  \node[state]            (s02) [below =1.3cm of s01, right of=s01] {0/2};
+  \node[state]            (s10) [above =1.3cm of s00, right of=s00] {1/0};
+  \node[state]            (s11) [below =1.3cm of s10, right of=s10] {1/1};
+  \node[state]            (s12) [below =1.3cm of s11, right of=s11] {1/2};
+  \node[state]            (s20) [above =1.3cm of s10, right of=s10] {2/0};
+  \node[state]            (s21) [below =1.3cm of s20, right of=s20] {2/1};
+  \node[state]            (s22) [below =1.3cm of s21, right of=s21] {2/2};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=-2pt}]
+    (s00) edge[bend left=3] node[sloped,anchor=south] {queue1.enter} (s10)
+    (s00) edge[bend left=3] node[sloped,anchor=south] {queue2.enter} (s01)
+
+    (s01) edge[bend left=3] node[sloped,anchor=south] {queue1.enter} (s11)
+    (s01) edge[bend left=3] node[sloped,anchor=north] {queue2.exit } (s00)
+
+    (s02) edge[bend left=3] node[sloped,anchor=south] {queue1.enter} (s12)
+    (s02) edge[           ] node[sloped,anchor=north] {queue2.exit } (s01)
+
+    (s10) edge[bend left=3] node[sloped,anchor=south] {queue2.enter} (s11)
+    (s10) edge[bend left=3] node[sloped,anchor=north] {queue1.exit } (s00)
+
+    (s11) edge[bend left=3] node[sloped,anchor=south] {queue1.enter} (s21)
+    (s11) edge[bend left=3] node[sloped,anchor=south] {queue2.enter} (s12)
+    (s11) edge[bend left=3] node[sloped,anchor=north] {queue1.exit } (s01)
+    (s11) edge[bend left=3] node[sloped,anchor=north] {queue2.exit } (s10)
+
+    (s12) edge[bend left=3] node[sloped,anchor=south] {queue1.enter} (s22)
+    (s12) edge[bend left=3] node[sloped,anchor=north] {queue1.exit } (s02)
+    (s12) edge[bend left=3] node[sloped,anchor=north] {queue2.exit } (s11)
+
+    (s20) edge[bend left=3] node[sloped,anchor=south] {queue2.enter} (s21)
+    (s20) edge[           ] node[sloped,anchor=north] {queue1.exit } (s10)
+
+    (s21) edge[bend left=3] node[sloped,anchor=south] {queue2.enter} (s22)
+    (s21) edge[bend left=3] node[sloped,anchor=north] {queue1.exit } (s11)
+    (s21) edge[bend left=3] node[sloped,anchor=north] {queue2.exit } (s20)
+
+    (s22) edge[bend left=3] node[sloped,anchor=north] {queue1.exit } (s12)
+    (s22) edge[bend left=3] node[sloped,anchor=north] {queue2.exit } (s21)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/swapper_state_space.png b/v0.1-M1/cif/tutorial/data/swapper_state_space.png
new file mode 100644
index 0000000..07f7a8a
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/swapper_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/swapper_state_space.png.tex b/v0.1-M1/cif/tutorial/data/swapper_state_space.png.tex
new file mode 100644
index 0000000..f70ab6a
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/swapper_state_space.png.tex
@@ -0,0 +1,55 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial above},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state]            (s00) [            ] {0/0};
+  \node[state]            (s01) [right of=s00] {0/1};
+  \node[state]            (s02) [right of=s01] {1/1};
+  \node[state, initial]   (s03) [right of=s02] {1/2};
+  \node[state]            (s04) [right of=s03] {2/2};
+  \node[state]            (s05) [right of=s04] {2/3};
+  \node[state]            (s06) [right of=s05] {3/3};
+  \node[state]            (s07) [right of=s06] {3/4};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s00) edge[] node[] {swap} (s01)
+    (s01) edge[] node[] {swap} (s02)
+    (s02) edge[] node[] {swap} (s03)
+    (s03) edge[] node[] {swap} (s04)
+    (s04) edge[] node[] {swap} (s05)
+    (s05) edge[] node[] {swap} (s06)
+    (s06) edge[] node[] {swap} (s07)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png b/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png
new file mode 100644
index 0000000..9f59804
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png.tex b/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png.tex
new file mode 100644
index 0000000..93e444a
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/tau_event_state_space1.png.tex
@@ -0,0 +1,43 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {processing};
+  \node[state]            (s01) [right of=s00] {providing};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s00) edge[bend left=15] node[] {process} (s01)
+    (s01) edge[bend left=15] node[] {provide} (s00)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png b/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png
new file mode 100644
index 0000000..c1f4808
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png.tex b/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png.tex
new file mode 100644
index 0000000..687c201
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/data/tau_event_state_space2.png.tex
@@ -0,0 +1,43 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {processing};
+  \node[state]            (s01) [right of=s00] {providing};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=0pt}]
+    (s00) edge[bend left=15] node[] {\texttt{tau}} (s01)
+    (s01) edge[bend left=15] node[] {provide} (s00)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/reuse1/conveyor.png b/v0.1-M1/cif/tutorial/reuse1/conveyor.png
new file mode 100644
index 0000000..b18defa
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/reuse1/conveyor.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/reuse1/conveyor.png.svg b/v0.1-M1/cif/tutorial/reuse1/conveyor.png.svg
new file mode 100644
index 0000000..8511020
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/reuse1/conveyor.png.svg
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="620"
+   height="180"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="conveyor.png.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective3669"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3776"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6568542"
+     inkscape:cx="144.32986"
+     inkscape:cy="72.276733"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <rect
+     style="fill:#adff2f;fill-opacity:1;stroke:none"
+     width="10"
+     height="75"
+     x="139.5"
+     y="82.5"
+     id="rect9" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3809"
+     d="m 149.5,83.494576 0,74.010844"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.00000001, 2.00000002;stroke-dashoffset:0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.00000001, 2.00000002;stroke-dashoffset:0"
+     d="m 139.5,83.494576 0,74.010844"
+     id="path3807"
+     inkscape:connector-curvature="0" />
+  <g
+     id="belt"
+     transform="translate(199.5,-22)">
+    <path
+       id="belt_outer"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -174,169 c 8.28427,0 139.71573,0 148,0 8.28427,0 15,-6.7157 15,-15 0,-8.2843 -6.71573,-15 -15,-15 0,0 0,0 0,0 0,0 -148,0 -148,0 0,0 0,0 0,0 -8.28427,0 -15,6.7158 -15,15 0,8.2843 6.71573,15 15,15 z"
+       sodipodi:nodetypes="ccsccccsc"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3659"
+       sodipodi:cx="20.5"
+       sodipodi:cy="224.5"
+       sodipodi:rx="6.5"
+       sodipodi:ry="6.5"
+       d="m 27,224.5 c 0,3.58985 -2.910149,6.5 -6.5,6.5 -3.589851,0 -6.5,-2.91015 -6.5,-6.5 0,-3.58985 2.910149,-6.5 6.5,-6.5 3.589851,0 6.5,2.91015 6.5,6.5 z"
+       transform="matrix(1.7692307,0,0,1.7692286,-210.26923,-243.19183)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#000000;stroke-width:0.56521809;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3659-9"
+       sodipodi:cx="20.5"
+       sodipodi:cy="224.5"
+       sodipodi:rx="6.5"
+       sodipodi:ry="6.5"
+       d="m 27,224.5 c 0,3.58985 -2.910149,6.5 -6.5,6.5 -3.589851,0 -6.5,-2.91015 -6.5,-6.5 0,-3.58985 2.910149,-6.5 6.5,-6.5 3.589851,0 6.5,2.91015 6.5,6.5 z"
+       transform="matrix(1.7692307,0,0,1.7692286,-62.26923,-243.19183)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -174,148.4998 0,11.0002"
+       id="path3683"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3697"
+       d="m -168.4999,153.9999 -11.0002,0"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path3699"
+       d="M -26,148.4998 -26,159.5"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -20.4999,153.9999 -11.0002,0"
+       id="path3701"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     id="box_wrapper"
+     transform="matrix(0.49579714,0,0,0.54544542,9.912529,40.663161)">
+    <rect
+       style="fill:#855e42;fill-opacity:1;stroke:#000000;stroke-width:1.92296922;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="box"
+       width="119"
+       height="44"
+       x="0"
+       y="93.499977"
+       inkscape:label="#rect3746" />
+  </g>
+  <g
+     id="g3017"
+     transform="translate(379.5,-22)" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 9.5,155.5 0,4"
+     id="path3033"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3035"
+     d="m 188.5,155.5 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 149.5,155.5 0,4"
+     id="path3037"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3039"
+     d="m 139.5,155.5 0,4"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="9.5078125"
+     y="176.77344"
+     id="text3051"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3053"
+       x="9.5078125"
+       y="176.77344"
+       style="text-align:center;text-anchor:middle">0</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3055"
+     y="176.77344"
+     x="132.12968"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="text-align:center;text-anchor:middle"
+       y="176.77344"
+       x="132.12968"
+       id="tspan3057"
+       sodipodi:role="line">13</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="156.42969"
+     y="176.77344"
+     id="text3059"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3061"
+       x="156.42969"
+       y="176.77344"
+       style="text-align:center;text-anchor:middle">14</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="188.53516"
+     y="176.77344"
+     id="text3067"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3069"
+       x="188.53516"
+       y="176.77344"
+       style="text-align:center;text-anchor:middle">18</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 9.2247186,157.5 179.4303714,0"
+     id="path3032"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/v0.1-M1/cif/tutorial/reuse2/library_dir_tree.png b/v0.1-M1/cif/tutorial/reuse2/library_dir_tree.png
new file mode 100644
index 0000000..621a518
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/reuse2/library_dir_tree.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/stochastics/pennies.png b/v0.1-M1/cif/tutorial/stochastics/pennies.png
new file mode 100644
index 0000000..ddb9767
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/stochastics/pennies.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/stochastics/pennies.png.dat b/v0.1-M1/cif/tutorial/stochastics/pennies.png.dat
new file mode 100644
index 0000000..65eeb17
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/stochastics/pennies.png.dat
@@ -0,0 +1,813 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+2.1000   0.0000
+2.1010   0.0000
+2.1020   0.0000
+2.1030   0.0000
+2.1040   0.0000
+2.1050   0.0000
+2.1060   0.0000
+2.1070   0.0000
+2.1080   0.0000
+2.1090   0.0000
+2.1100   0.0000
+2.1110   0.0000
+2.1120   0.0000
+2.1130   0.0000
+2.1140   0.0000
+2.1150   0.0000
+2.1160   0.0000
+2.1170   0.0000
+2.1180   0.0000
+2.1190   0.0000
+2.1200   0.0000
+2.1210   0.0000
+2.1220   0.0000
+2.1230   0.0000
+2.1240   0.0000
+2.1250   0.0000
+2.1260   0.0000
+2.1270   0.0000
+2.1280   0.0000
+2.1290   0.0000
+2.1300   0.0000
+2.1310   0.0000
+2.1320   0.0000
+2.1330   0.0000
+2.1340   0.0000
+2.1350   0.0000
+2.1360   0.0000
+2.1370   0.0000
+2.1380   0.0000
+2.1390   0.0000
+2.1400   0.0000
+2.1410   0.0000
+2.1420   0.0000
+2.1430   0.0000
+2.1440   0.0000
+2.1450   0.0000
+2.1460   0.0000
+2.1470   0.0000
+2.1480   0.0000
+2.1490   0.0000
+2.1500   0.0000
+2.1510   0.0000
+2.1520   0.0000
+2.1530   0.0000
+2.1540   0.0000
+2.1550   0.0000
+2.1560   0.0000
+2.1570   0.0000
+2.1580   0.0000
+2.1590   0.0000
+2.1600   0.0000
+2.1610   0.0000
+2.1620   0.0000
+2.1630   0.0000
+2.1640   0.0000
+2.1650   0.0000
+2.1660   0.0000
+2.1670   0.0000
+2.1680   0.0000
+2.1690   0.0000
+2.1700   0.0000
+2.1710   0.0000
+2.1720   0.0000
+2.1730   0.0000
+2.1740   0.0000
+2.1750   0.0000
+2.1760   0.0000
+2.1770   0.0000
+2.1780   0.0000
+2.1790   0.0000
+2.1800   0.0000
+2.1810   0.0000
+2.1820   0.0000
+2.1830   0.0000
+2.1840   0.0000
+2.1850   0.0000
+2.1860   0.0000
+2.1870   0.0000
+2.1880   0.0000
+2.1890   0.0000
+2.1900   0.0000
+2.1910   0.0000
+2.1920   0.0000
+2.1930   0.0000
+2.1940   0.0000
+2.1950   0.0000
+2.1960   0.0000
+2.1970   0.0000
+2.1980   0.0000
+2.1990   0.0000
+2.2000   0.0000
+2.2010   0.0000
+2.2020   0.0000
+2.2030   0.0000
+2.2040   0.0000
+2.2050   0.0000
+2.2060   0.0000
+2.2070   0.0000
+2.2080   0.0000
+2.2090   0.0000
+2.2100   0.0000
+2.2110   0.0000
+2.2120   0.0000
+2.2130   0.0000
+2.2140   0.0000
+2.2150   0.0000
+2.2160   0.0000
+2.2170   0.0000
+2.2180   0.0000
+2.2190   0.0000
+2.2200   0.0000
+2.2210   0.0000
+2.2220   0.0000
+2.2230   0.0000
+2.2240   0.0000
+2.2250   0.0000
+2.2260   0.0000
+2.2270   0.0000
+2.2280   0.0000
+2.2290   0.0000
+2.2300   0.0000
+2.2310   0.0000
+2.2320   0.0000
+2.2330   0.0000
+2.2340   0.0000
+2.2350   0.0000
+2.2360   0.0000
+2.2370   0.0000
+2.2380   0.0000
+2.2390   0.0000
+2.2400   0.0000
+2.2410   0.0000
+2.2420   0.0000
+2.2430   0.0000
+2.2440   0.0000
+2.2450   0.0000
+2.2460   0.0000
+2.2470   0.0000
+2.2480   0.0000
+2.2490   0.0000
+2.2500   0.0000
+2.2510   0.0000
+2.2520   0.0000
+2.2530   0.0000
+2.2540   0.0000
+2.2550   0.0000
+2.2560   0.0000
+2.2570   0.0000
+2.2580   0.0000
+2.2590   0.0000
+2.2600   0.0000
+2.2610   0.0000
+2.2620   0.0000
+2.2630   0.0000
+2.2640   0.0000
+2.2650   0.0000
+2.2660   0.0000
+2.2670   0.0000
+2.2680   0.0000
+2.2690   0.0000
+2.2700   0.0000
+2.2710   0.0000
+2.2720   0.0000
+2.2730   0.0000
+2.2740   0.0000
+2.2750   0.0000
+2.2760   0.0000
+2.2770   0.0000
+2.2780   0.0000
+2.2790   0.0000
+2.2800   0.0000
+2.2810   0.0000
+2.2820   0.0000
+2.2830   0.0000
+2.2840   0.0000
+2.2850   0.0000
+2.2860   0.0000
+2.2870   0.0000
+2.2880   0.0000
+2.2890   0.0000
+2.2900   0.0000
+2.2910   0.0000
+2.2920   0.0000
+2.2930   0.0000
+2.2940   0.0000
+2.2950   0.0000
+2.2960   0.0000
+2.2970   0.0000
+2.2980   0.0000
+2.2990   0.0000
+2.3000   0.0000
+2.3010   0.0000
+2.3020   0.0000
+2.3030   0.0000
+2.3040   0.0000
+2.3050   0.0000
+2.3060   0.0000
+2.3070   0.0000
+2.3080   0.0000
+2.3090   0.0000
+2.3100   0.0000
+2.3110   0.0000
+2.3120   0.0000
+2.3130   0.0000
+2.3140   0.0000
+2.3150   0.0000
+2.3160   0.0000
+2.3170   0.0000
+2.3180   0.0000
+2.3190   0.0000
+2.3200   0.0000
+2.3210   0.0000
+2.3220   0.0000
+2.3230   0.0000
+2.3240   0.0000
+2.3250   0.0000
+2.3260   0.0000
+2.3270   0.0000
+2.3280   0.0000
+2.3290   0.0000
+2.3300   0.0000
+2.3310   0.0000
+2.3320   0.0000
+2.3330   0.0000
+2.3340   0.0000
+2.3350   0.0000
+2.3360   0.0000
+2.3370   0.0000
+2.3380   0.0000
+2.3390   0.0000
+2.3400   0.0000
+2.3410   0.0000
+2.3420   0.0000
+2.3430   0.0000
+2.3440   0.0000
+2.3450   0.0000
+2.3460   0.0000
+2.3470   0.0000
+2.3480   0.0000
+2.3490   0.0000
+2.3500   0.0000
+2.3510   0.0000
+2.3520   0.0000
+2.3530   0.0000
+2.3540   0.0000
+2.3550   0.0000
+2.3560   0.0000
+2.3570   0.0000
+2.3580   0.0001
+2.3590   0.0001
+2.3600   0.0001
+2.3610   0.0001
+2.3620   0.0001
+2.3630   0.0002
+2.3640   0.0002
+2.3650   0.0003
+2.3660   0.0004
+2.3670   0.0005
+2.3680   0.0006
+2.3690   0.0007
+2.3700   0.0009
+2.3710   0.0011
+2.3720   0.0014
+2.3730   0.0017
+2.3740   0.0021
+2.3750   0.0027
+2.3760   0.0033
+2.3770   0.0040
+2.3780   0.0049
+2.3790   0.0061
+2.3800   0.0074
+2.3810   0.0090
+2.3820   0.0109
+2.3830   0.0133
+2.3840   0.0160
+2.3850   0.0194
+2.3860   0.0233
+2.3870   0.0280
+2.3880   0.0335
+2.3890   0.0400
+2.3900   0.0476
+2.3910   0.0566
+2.3920   0.0671
+2.3930   0.0793
+2.3940   0.0935
+2.3950   0.1100
+2.3960   0.1291
+2.3970   0.1511
+2.3980   0.1764
+2.3990   0.2055
+2.4000   0.2388
+2.4010   0.2767
+2.4020   0.3199
+2.4030   0.3689
+2.4040   0.4243
+2.4050   0.4869
+2.4060   0.5573
+2.4070   0.6362
+2.4080   0.7245
+2.4090   0.8231
+2.4100   0.9326
+2.4110   1.0542
+2.4120   1.1886
+2.4130   1.3368
+2.4140   1.4997
+2.4150   1.6783
+2.4160   1.8734
+2.4170   2.0860
+2.4180   2.3170
+2.4190   2.5671
+2.4200   2.8371
+2.4210   3.1276
+2.4220   3.4393
+2.4230   3.7726
+2.4240   4.1279
+2.4250   4.5054
+2.4260   4.9051
+2.4270   5.3269
+2.4280   5.7706
+2.4290   6.2356
+2.4300   6.7212
+2.4310   7.2266
+2.4320   7.7506
+2.4330   8.2918
+2.4340   8.8487
+2.4350   9.4194
+2.4360   10.0019
+2.4370   10.5938
+2.4380   11.1928
+2.4390   11.7961
+2.4400   12.4009
+2.4410   13.0042
+2.4420   13.6027
+2.4430   14.1933
+2.4440   14.7726
+2.4450   15.3371
+2.4460   15.8834
+2.4470   16.4080
+2.4480   16.9077
+2.4490   17.3792
+2.4500   17.8191
+2.4510   18.2246
+2.4520   18.5928
+2.4530   18.9210
+2.4540   19.2069
+2.4550   19.4485
+2.4560   19.6440
+2.4570   19.7919
+2.4580   19.8911
+2.4590   19.9409
+2.4600   19.9409
+2.4610   19.8911
+2.4620   19.7919
+2.4630   19.6440
+2.4640   19.4485
+2.4650   19.2069
+2.4660   18.9210
+2.4670   18.5928
+2.4680   18.2246
+2.4690   17.8191
+2.4700   17.3792
+2.4710   16.9077
+2.4720   16.4080
+2.4730   15.8834
+2.4740   15.3371
+2.4750   14.7726
+2.4760   14.1933
+2.4770   13.6027
+2.4780   13.0042
+2.4790   12.4009
+2.4800   11.7961
+2.4810   11.1928
+2.4820   10.5938
+2.4830   10.0019
+2.4840   9.4194
+2.4850   8.8487
+2.4860   8.2918
+2.4870   7.7506
+2.4880   7.2266
+2.4890   6.7212
+2.4900   6.2356
+2.4910   5.7706
+2.4920   5.3269
+2.4930   4.9051
+2.4940   4.5054
+2.4950   4.1279
+2.4960   3.7726
+2.4970   3.4393
+2.4980   3.1276
+2.4990   2.8371
+2.5000   2.5671
+2.5010   2.3170
+2.5020   2.0860
+2.5030   1.8734
+2.5040   1.6783
+2.5050   1.4997
+2.5060   1.3368
+2.5070   1.1886
+2.5080   1.0542
+2.5090   0.9326
+2.5100   0.8231
+2.5110   0.7245
+2.5120   0.6362
+2.5130   0.5573
+2.5140   0.4869
+2.5150   0.4243
+2.5160   0.3689
+2.5170   0.3199
+2.5180   0.2767
+2.5190   0.2388
+2.5200   0.2055
+2.5210   0.1764
+2.5220   0.1511
+2.5230   0.1291
+2.5240   0.1100
+2.5250   0.0935
+2.5260   0.0793
+2.5270   0.0671
+2.5280   0.0566
+2.5290   0.0476
+2.5300   0.0400
+2.5310   0.0335
+2.5320   0.0280
+2.5330   0.0233
+2.5340   0.0194
+2.5350   0.0160
+2.5360   0.0133
+2.5370   0.0109
+2.5380   0.0090
+2.5390   0.0074
+2.5400   0.0061
+2.5410   0.0049
+2.5420   0.0040
+2.5430   0.0033
+2.5440   0.0027
+2.5450   0.0021
+2.5460   0.0017
+2.5470   0.0014
+2.5480   0.0011
+2.5490   0.0009
+2.5500   0.0007
+2.5510   0.0006
+2.5520   0.0005
+2.5530   0.0004
+2.5540   0.0003
+2.5550   0.0002
+2.5560   0.0002
+2.5570   0.0001
+2.5580   0.0001
+2.5590   0.0001
+2.5600   0.0001
+2.5610   0.0001
+2.5620   0.0000
+2.5630   0.0000
+2.5640   0.0000
+2.5650   0.0000
+2.5660   0.0000
+2.5670   0.0000
+2.5680   0.0000
+2.5690   0.0000
+2.5700   0.0000
+2.5710   0.0000
+2.5720   0.0000
+2.5730   0.0000
+2.5740   0.0000
+2.5750   0.0000
+2.5760   0.0000
+2.5770   0.0000
+2.5780   0.0000
+2.5790   0.0000
+2.5800   0.0000
+2.5810   0.0000
+2.5820   0.0000
+2.5830   0.0000
+2.5840   0.0000
+2.5850   0.0000
+2.5860   0.0000
+2.5870   0.0000
+2.5880   0.0000
+2.5890   0.0000
+2.5900   0.0000
+2.5910   0.0000
+2.5920   0.0000
+2.5930   0.0000
+2.5940   0.0000
+2.5950   0.0000
+2.5960   0.0000
+2.5970   0.0000
+2.5980   0.0000
+2.5990   0.0000
+2.6000   0.0000
+2.6010   0.0000
+2.6020   0.0000
+2.6030   0.0000
+2.6040   0.0000
+2.6050   0.0000
+2.6060   0.0000
+2.6070   0.0000
+2.6080   0.0000
+2.6090   0.0000
+2.6100   0.0000
+2.6110   0.0000
+2.6120   0.0000
+2.6130   0.0000
+2.6140   0.0000
+2.6150   0.0000
+2.6160   0.0000
+2.6170   0.0000
+2.6180   0.0000
+2.6190   0.0000
+2.6200   0.0000
+2.6210   0.0000
+2.6220   0.0000
+2.6230   0.0000
+2.6240   0.0000
+2.6250   0.0000
+2.6260   0.0000
+2.6270   0.0000
+2.6280   0.0000
+2.6290   0.0000
+2.6300   0.0000
+2.6310   0.0000
+2.6320   0.0000
+2.6330   0.0000
+2.6340   0.0000
+2.6350   0.0000
+2.6360   0.0000
+2.6370   0.0000
+2.6380   0.0000
+2.6390   0.0000
+2.6400   0.0000
+2.6410   0.0000
+2.6420   0.0000
+2.6430   0.0000
+2.6440   0.0000
+2.6450   0.0000
+2.6460   0.0000
+2.6470   0.0000
+2.6480   0.0000
+2.6490   0.0000
+2.6500   0.0000
+2.6510   0.0000
+2.6520   0.0000
+2.6530   0.0000
+2.6540   0.0000
+2.6550   0.0000
+2.6560   0.0000
+2.6570   0.0000
+2.6580   0.0000
+2.6590   0.0000
+2.6600   0.0000
+2.6610   0.0000
+2.6620   0.0000
+2.6630   0.0000
+2.6640   0.0000
+2.6650   0.0000
+2.6660   0.0000
+2.6670   0.0000
+2.6680   0.0000
+2.6690   0.0000
+2.6700   0.0000
+2.6710   0.0000
+2.6720   0.0000
+2.6730   0.0000
+2.6740   0.0000
+2.6750   0.0000
+2.6760   0.0000
+2.6770   0.0000
+2.6780   0.0000
+2.6790   0.0000
+2.6800   0.0000
+2.6810   0.0000
+2.6820   0.0000
+2.6830   0.0000
+2.6840   0.0000
+2.6850   0.0000
+2.6860   0.0000
+2.6870   0.0000
+2.6880   0.0000
+2.6890   0.0000
+2.6900   0.0000
+2.6910   0.0000
+2.6920   0.0000
+2.6930   0.0000
+2.6940   0.0000
+2.6950   0.0000
+2.6960   0.0000
+2.6970   0.0000
+2.6980   0.0000
+2.6990   0.0000
+2.7000   0.0000
+2.7010   0.0000
+2.7020   0.0000
+2.7030   0.0000
+2.7040   0.0000
+2.7050   0.0000
+2.7060   0.0000
+2.7070   0.0000
+2.7080   0.0000
+2.7090   0.0000
+2.7100   0.0000
+2.7110   0.0000
+2.7120   0.0000
+2.7130   0.0000
+2.7140   0.0000
+2.7150   0.0000
+2.7160   0.0000
+2.7170   0.0000
+2.7180   0.0000
+2.7190   0.0000
+2.7200   0.0000
+2.7210   0.0000
+2.7220   0.0000
+2.7230   0.0000
+2.7240   0.0000
+2.7250   0.0000
+2.7260   0.0000
+2.7270   0.0000
+2.7280   0.0000
+2.7290   0.0000
+2.7300   0.0000
+2.7310   0.0000
+2.7320   0.0000
+2.7330   0.0000
+2.7340   0.0000
+2.7350   0.0000
+2.7360   0.0000
+2.7370   0.0000
+2.7380   0.0000
+2.7390   0.0000
+2.7400   0.0000
+2.7410   0.0000
+2.7420   0.0000
+2.7430   0.0000
+2.7440   0.0000
+2.7450   0.0000
+2.7460   0.0000
+2.7470   0.0000
+2.7480   0.0000
+2.7490   0.0000
+2.7500   0.0000
+2.7510   0.0000
+2.7520   0.0000
+2.7530   0.0000
+2.7540   0.0000
+2.7550   0.0000
+2.7560   0.0000
+2.7570   0.0000
+2.7580   0.0000
+2.7590   0.0000
+2.7600   0.0000
+2.7610   0.0000
+2.7620   0.0000
+2.7630   0.0000
+2.7640   0.0000
+2.7650   0.0000
+2.7660   0.0000
+2.7670   0.0000
+2.7680   0.0000
+2.7690   0.0000
+2.7700   0.0000
+2.7710   0.0000
+2.7720   0.0000
+2.7730   0.0000
+2.7740   0.0000
+2.7750   0.0000
+2.7760   0.0000
+2.7770   0.0000
+2.7780   0.0000
+2.7790   0.0000
+2.7800   0.0000
+2.7810   0.0000
+2.7820   0.0000
+2.7830   0.0000
+2.7840   0.0000
+2.7850   0.0000
+2.7860   0.0000
+2.7870   0.0000
+2.7880   0.0000
+2.7890   0.0000
+2.7900   0.0000
+2.7910   0.0000
+2.7920   0.0000
+2.7930   0.0000
+2.7940   0.0000
+2.7950   0.0000
+2.7960   0.0000
+2.7970   0.0000
+2.7980   0.0000
+2.7990   0.0000
+2.8000   0.0000
+2.8010   0.0000
+2.8020   0.0000
+2.8030   0.0000
+2.8040   0.0000
+2.8050   0.0000
+2.8060   0.0000
+2.8070   0.0000
+2.8080   0.0000
+2.8090   0.0000
+2.8100   0.0000
+2.8110   0.0000
+2.8120   0.0000
+2.8130   0.0000
+2.8140   0.0000
+2.8150   0.0000
+2.8160   0.0000
+2.8170   0.0000
+2.8180   0.0000
+2.8190   0.0000
+2.8200   0.0000
+2.8210   0.0000
+2.8220   0.0000
+2.8230   0.0000
+2.8240   0.0000
+2.8250   0.0000
+2.8260   0.0000
+2.8270   0.0000
+2.8280   0.0000
+2.8290   0.0000
+2.8300   0.0000
+2.8310   0.0000
+2.8320   0.0000
+2.8330   0.0000
+2.8340   0.0000
+2.8350   0.0000
+2.8360   0.0000
+2.8370   0.0000
+2.8380   0.0000
+2.8390   0.0000
+2.8400   0.0000
+2.8410   0.0000
+2.8420   0.0000
+2.8430   0.0000
+2.8440   0.0000
+2.8450   0.0000
+2.8460   0.0000
+2.8470   0.0000
+2.8480   0.0000
+2.8490   0.0000
+2.8500   0.0000
+2.8510   0.0000
+2.8520   0.0000
+2.8530   0.0000
+2.8540   0.0000
+2.8550   0.0000
+2.8560   0.0000
+2.8570   0.0000
+2.8580   0.0000
+2.8590   0.0000
+2.8600   0.0000
+2.8610   0.0000
+2.8620   0.0000
+2.8630   0.0000
+2.8640   0.0000
+2.8650   0.0000
+2.8660   0.0000
+2.8670   0.0000
+2.8680   0.0000
+2.8690   0.0000
+2.8700   0.0000
+2.8710   0.0000
+2.8720   0.0000
+2.8730   0.0000
+2.8740   0.0000
+2.8750   0.0000
+2.8760   0.0000
+2.8770   0.0000
+2.8780   0.0000
+2.8790   0.0000
+2.8800   0.0000
+2.8810   0.0000
+2.8820   0.0000
+2.8830   0.0000
+2.8840   0.0000
+2.8850   0.0000
+2.8860   0.0000
+2.8870   0.0000
+2.8880   0.0000
+2.8890   0.0000
+2.8900   0.0000
+2.8910   0.0000
+2.8920   0.0000
+2.8930   0.0000
+2.8940   0.0000
+2.8950   0.0000
+2.8960   0.0000
+2.8970   0.0000
+2.8980   0.0000
+2.8990   0.0000
+2.9000   0.0000
diff --git a/v0.1-M1/cif/tutorial/stochastics/pennies.png.plt b/v0.1-M1/cif/tutorial/stochastics/pennies.png.plt
new file mode 100644
index 0000000..d0a7462
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/stochastics/pennies.png.plt
@@ -0,0 +1,44 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 800,200 font 'sans'
+set output "pennies.png"
+
+set key top right vertical
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+#set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+#set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+#set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+#set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+set format y ""
+
+plot \
+  "pennies.png.dat" using 1:($2) title "normal(2.46, 0.0004)" with lines ls 1
diff --git a/v0.1-M1/cif/tutorial/time/machine_plot.png b/v0.1-M1/cif/tutorial/time/machine_plot.png
new file mode 100644
index 0000000..fdb8a47
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/machine_plot.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/machine_plot.png.dat b/v0.1-M1/cif/tutorial/time/machine_plot.png.dat
new file mode 100644
index 0000000..d015f5a
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/machine_plot.png.dat
@@ -0,0 +1,20 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time  t       t'
+0.0     0.0     1.0
+3.0     3.0     1.0
+3.0     0.0     1.0
+6.0     3.0     1.0
+6.0     0.0     1.0
+9.0     3.0     1.0
+9.0     0.0     1.0
diff --git a/v0.1-M1/cif/tutorial/time/machine_plot.png.plt b/v0.1-M1/cif/tutorial/time/machine_plot.png.plt
new file mode 100644
index 0000000..dd93906
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/machine_plot.png.plt
@@ -0,0 +1,44 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 600,300 font 'sans'
+set output "machine_plot.png"
+
+set key outside horizontal bottom center
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "machine_plot.png.dat" using 1:($1) title "time(time)" with lines ls 1, \
+  "machine_plot.png.dat" using 1:($2) title "t(time)"    with lines ls 2, \
+  "machine_plot.png.dat" using 1:($3) title "t'(time)"   with lines ls 3
diff --git a/v0.1-M1/cif/tutorial/time/machine_state_space.png b/v0.1-M1/cif/tutorial/time/machine_state_space.png
new file mode 100644
index 0000000..70ebcaf
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/machine_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/machine_state_space.png.tex b/v0.1-M1/cif/tutorial/time/machine_state_space.png.tex
new file mode 100644
index 0000000..2deeecd
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/machine_state_space.png.tex
@@ -0,0 +1,59 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.5cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial left},
+  accepting/.style={accepting by arrow,accepting text=\ldots},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {i, 0.0, 0.0};
+  \node[state]            (s01) [right of=s00] {p, 0.0, 0.0};
+  \node[state]            (s02) [right of=s01] {p, 3.0, 3.0};
+  \node[state]            (s03) [right of=s02] {i, 3.0, 3.0};
+  \node[state]            (s04) [right of=s03] {p, 3.0, 0.0};
+  \node[state]            (s05) [right of=s04] {p, 6.0, 3.0};
+  \node[state]            (s06) [right of=s05] {i, 6.0, 3.0};
+  \node[state]            (s07) [right of=s06] {p, 6.0, 0.0};
+  \node[state]            (s08) [right of=s07] {p, 9.0, 3.0};
+  \node[state, accepting] (s09) [right of=s08] {i, 9.0, 3.0};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=2pt}]
+    (s00) edge[] node[] {start}    (s01)
+    (s01) edge[] node[] {3.0}      (s02)
+    (s02) edge[] node[] {finished} (s03)
+    (s03) edge[] node[] {start}    (s04)
+    (s04) edge[] node[] {3.0}      (s05)
+    (s05) edge[] node[] {finished} (s06)
+    (s06) edge[] node[] {start}    (s07)
+    (s07) edge[] node[] {3.0}      (s08)
+    (s08) edge[] node[] {finished} (s09)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/time/person_plot.png b/v0.1-M1/cif/tutorial/time/person_plot.png
new file mode 100644
index 0000000..45f050d
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/person_plot.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/person_plot.png.dat b/v0.1-M1/cif/tutorial/time/person_plot.png.dat
new file mode 100644
index 0000000..b09b1d5
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/person_plot.png.dat
@@ -0,0 +1,23 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# time  pos     pos'
+0.0     0.0     1.0
+10.0    10.0    1.0
+10.0    10.0    -2.0
+15.0    0.0     -2.0
+15.0    0.0     1.0
+25.0    10.0    1.0
+25.0    10.0    -2.0
+30.0    0.0     -2.0
+30.0    0.0     1.0
+40.0    10.0    1.0
diff --git a/v0.1-M1/cif/tutorial/time/person_plot.png.plt b/v0.1-M1/cif/tutorial/time/person_plot.png.plt
new file mode 100644
index 0000000..4d33350
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/person_plot.png.plt
@@ -0,0 +1,44 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################
+
+# Requires Gnuplot 4.4 or higher.
+
+set terminal pngcairo size 600,300 font 'sans'
+set output "person_plot.png"
+
+set key outside horizontal bottom center
+
+set style line 1 linecolor rgb '#dc3912' linetype 1 linewidth 2
+set style line 2 linecolor rgb '#3366cc' linetype 1 linewidth 2
+set style line 3 linecolor rgb '#109618' linetype 1 linewidth 2
+set style line 4 linecolor rgb '#ff9900' linetype 1 linewidth 2
+set style line 5 linecolor rgb '#990099' linetype 1 linewidth 2
+set style line 6 linecolor rgb '#00cccc' linetype 1 linewidth 2
+
+set style line 11 lc rgb '#808080' lt 1
+set border 3 back ls 11
+set border linewidth 1.5
+
+set style line 12 lc rgb'#808080' lt 0 lw 1
+set grid back ls 12
+set grid back
+
+set autoscale yfixmin
+set autoscale yfixmax
+set autoscale xfixmin
+set autoscale xfixmax
+set offsets 0, 0, graph 0.05, graph 0.05
+
+plot \
+  "person_plot.png.dat" using 1:($1) title "time(time)" with lines ls 1, \
+  "person_plot.png.dat" using 1:($2) title "pos(time)"  with lines ls 2, \
+  "person_plot.png.dat" using 1:($3) title "pos'(time)" with lines ls 3
diff --git a/v0.1-M1/cif/tutorial/time/tank.png b/v0.1-M1/cif/tutorial/time/tank.png
new file mode 100644
index 0000000..54e8ec9
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/tank.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/tank.png.svg b/v0.1-M1/cif/tutorial/time/tank.png.svg
new file mode 100644
index 0000000..a0df95d
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/tank.png.svg
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="600"
+   height="250"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.3.1 r9886"
+   version="1.0"
+   sodipodi:docname="tank.png.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3199"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="214.11606"
+     inkscape:cy="260.89569"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1213"
+     inkscape:window-height="1080"
+     inkscape:window-x="296"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#8080ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="water"
+       width="170"
+       height="71"
+       x="100.5"
+       y="-179.5"
+       inkscape:label="#rect5026"
+       transform="scale(1,-1)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 185.48238,79.526202 0,48.145778"
+       id="path3953"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="195.10156"
+       y="99.059967"
+       id="Qi"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2832"
+         x="195.10156"
+         y="99.059967"
+         style="text-align:start;text-anchor:start">Qi</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 100.5,99.5 0,80 c 28.33333,0 56.66667,0 85,0 l 42.5,0 42.5,0 0,-80"
+       id="path4491"
+       sodipodi:nodetypes="cccccc"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="195.10156"
+       y="198.91934"
+       id="Qo"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2836"
+         x="195.10156"
+         y="198.91934"
+         style="text-align:start;text-anchor:start">Qo</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="278"
+       y="145.33203"
+       id="V"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2834"
+         x="278"
+         y="145.33203"
+         style="text-align:start;text-anchor:start">V</tspan></text>
+    <path
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0"
+       id="path3003"
+       d="m 185.48238,165.5262 0,48.14578"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+  </g>
+</svg>
diff --git a/v0.1-M1/cif/tutorial/time/tank_plot.png b/v0.1-M1/cif/tutorial/time/tank_plot.png
new file mode 100644
index 0000000..854fc6d
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/tank_plot.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png b/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png
new file mode 100644
index 0000000..a9d2f5b
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png.tex b/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png.tex
new file mode 100644
index 0000000..45dbb59
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/usecase_nonurg_state_space.png.tex
@@ -0,0 +1,45 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.8cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial left},
+  accepting/.style={accepting by arrow,accepting text=$\infty$},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {first,    0.0};
+  \node[state]            (s01) [right of=s00] {second,   0.0};
+  \node[state, accepting] (s02) [right of=s01] {done,     0.0};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=2pt}]
+    (s00) edge[] node[] {\texttt{tau}} (s01)
+    (s01) edge[] node[] {\texttt{tau}} (s02)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png b/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png
new file mode 100644
index 0000000..c57aef9
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png.tex b/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png.tex
new file mode 100644
index 0000000..e274219
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/usecase_urgloc_state_space.png.tex
@@ -0,0 +1,45 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.8cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial left},
+  accepting/.style={accepting by arrow,accepting text=$\infty$},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {first,    0.0};
+  \node[state]            (s01) [right of=s00] {second,   0.0};
+  \node[state]            (s02) [right of=s01] {done,     0.0};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=2pt}]
+    (s00) edge[] node[] {\texttt{tau}} (s01)
+    (s01) edge[] node[] {\texttt{tau}} (s02)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/time/user_state_space.png b/v0.1-M1/cif/tutorial/time/user_state_space.png
new file mode 100644
index 0000000..629d3cf
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/user_state_space.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/time/user_state_space.png.tex b/v0.1-M1/cif/tutorial/time/user_state_space.png.tex
new file mode 100644
index 0000000..c19b977
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/time/user_state_space.png.tex
@@ -0,0 +1,57 @@
+% ------------------------------------------------------------------------------
+% Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+%
+% See the NOTICE file(s) distributed with this work for additional
+% information regarding copyright ownership.
+%
+% This program and the accompanying materials are made available under the terms
+% of the MIT License which is available at https://opensource.org/licenses/MIT
+%
+% SPDX-License-Identifier: MIT
+% ------------------------------------------------------------------------------
+\documentclass{article}
+\usepackage{tikz}
+\usepackage{verbatim}
+
+\usepackage[paperwidth=40in, paperheight=20in]{geometry}
+
+\usetikzlibrary{arrows, automata, positioning, shapes.geometric}
+\begin{document}
+\pagestyle{empty}
+
+\definecolor{se-blue}{HTML}{D0D5FF}
+
+\newcommand{\state}[2]{\begin{tabular}{@{}c@{}}#1\\#2\end{tabular}}
+
+\begin{tikzpicture}[
+  ->,>=stealth',auto,node distance=3.8cm,thick,
+  every node/.style={font=\sffamily\small},
+  every state/.style={draw=se-blue,thick,top color=white,ellipse,
+                      bottom color=se-blue!75,initial text=},
+  initial/.style={initial left},
+  accepting/.style={accepting by arrow,accepting text=$\infty$},
+  every edge/.style={draw=black!50}]
+
+  \node[state, initial]   (s00) [            ] {push1,    0.0};
+  \node[state]            (s01) [right of=s00] {push1,    1.5};
+  \node[state]            (s02) [right of=s01] {release1, 1.5};
+  \node[state]            (s03) [right of=s02] {release1, 2.3};
+  \node[state]            (s04) [right of=s03] {push2,    2.3};
+  \node[state]            (s05) [right of=s04] {push2,    2.4};
+  \node[state]            (s06) [right of=s05] {release2, 2.4};
+  \node[state]            (s07) [right of=s06] {release2, 7.6};
+  \node[state, accepting] (s08) [right of=s07] {done,     7.6};
+
+  \path[every node/.style={font=\sffamily\normalsize,outer sep=2pt}]
+    (s00) edge[] node[] {1.5}     (s01)
+    (s01) edge[] node[] {push}    (s02)
+    (s02) edge[] node[] {0.8}     (s03)
+    (s03) edge[] node[] {release} (s04)
+    (s04) edge[] node[] {0.1}     (s05)
+    (s05) edge[] node[] {push}    (s06)
+    (s06) edge[] node[] {5.2}     (s07)
+    (s07) edge[] node[] {release} (s08)
+  ;
+
+\end{tikzpicture}
+\end{document}
diff --git a/v0.1-M1/cif/tutorial/values/list_indices.png b/v0.1-M1/cif/tutorial/values/list_indices.png
new file mode 100644
index 0000000..fad4887
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/values/list_indices.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/values/list_indices.png.svg b/v0.1-M1/cif/tutorial/values/list_indices.png.svg
new file mode 100644
index 0000000..15abbad
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/values/list_indices.png.svg
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="list_indices.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3890"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3884"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4"
+     inkscape:cx="52.083383"
+     inkscape:cy="72.481473"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1" />
+  <rect
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect3004"
+     width="49"
+     height="29"
+     x="10.5"
+     y="120.50002" />
+  <rect
+     y="120.50002"
+     x="59.5"
+     height="29"
+     width="49"
+     id="rect3774"
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+  <rect
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect3776"
+     width="49"
+     height="29"
+     x="108.5"
+     y="120.50002" />
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="35.046875"
+     y="143.74808"
+     id="text3798"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3800"
+       x="35.046875"
+       y="143.74808"
+       style="font-size:24px;text-align:center;text-anchor:middle">7</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3802"
+     y="143.73636"
+     x="84.011719"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:24px;text-align:center;text-anchor:middle"
+       y="143.73636"
+       x="84.011719"
+       id="tspan3804"
+       sodipodi:role="line">8</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="133.05273"
+     y="143.73636"
+     id="text3806"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3808"
+       x="133.05273"
+       y="143.73636"
+       style="font-size:24px;text-align:center;text-anchor:middle">3</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3834"
+     y="91.748077"
+     x="35.046875"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="91.748077"
+       x="35.046875"
+       id="tspan3836"
+       sodipodi:role="line">x[0]</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="84.011719"
+     y="91.748077"
+     id="text3838"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3840"
+       x="84.011719"
+       y="91.748077"
+       style="font-size:16px;text-align:center;text-anchor:middle">x[1]</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3842"
+     y="91.748077"
+     x="133.05273"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="91.748077"
+       x="133.05273"
+       id="tspan3844"
+       sodipodi:role="line">x[2]</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="35.046875"
+     y="187.89062"
+     id="text3846"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3848"
+       x="35.046875"
+       y="187.89062"
+       style="font-size:16px;text-align:center;text-anchor:middle">x[-3]</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3850"
+     y="187.87891"
+     x="84.011719"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="187.87891"
+       x="84.011719"
+       id="tspan3852"
+       sodipodi:role="line">x[-2]</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="133.05273"
+     y="187.87891"
+     id="text3854"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3856"
+       x="133.05273"
+       y="187.87891"
+       style="font-size:16px;text-align:center;text-anchor:middle">x[-1]</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 12.5,116 0,-5"
+     id="path3869"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3871"
+     d="m 57.5,116 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3873"
+     d="m 12.479185,113.5 45.08463,0"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3875"
+     d="m 34.294118,113.05113 0,-13.08827"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4507"
+     d="m 61.5,116 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 106.5,116 0,-5"
+     id="path4509"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 61.5,113.50014 45,0"
+     id="path4511"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+     d="m 83.294118,113.05113 0,-13.08827"
+     id="path4513"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 110.5,116 0,-5"
+     id="path4515"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4517"
+     d="m 155.5,116 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4519"
+     d="m 110.5,113.5 45,0"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4521"
+     d="m 132.29412,113.05113 0,-13.08827"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4523"
+     d="m 12.5,154.21286 0,5"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 57.5,154.21286 0,5"
+     id="path4525"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 12.478737,156.713 45.042526,0"
+     id="path4527"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+     d="m 34.294118,157.16173 0,13.08827"
+     id="path4529"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 61.5,154.21286 0,5"
+     id="path4531"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4533"
+     d="m 106.5,154.21286 0,5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4535"
+     d="m 61.5,156.713 45,0"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4537"
+     d="m 83.294118,157.16173 0,13.08827"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4539"
+     d="m 110.5,154.21286 0,5"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 155.5,154.21286 0,5"
+     id="path4541"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 110.5,156.71301 45,0"
+     id="path4543"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+     d="m 132.29412,157.16173 0,13.08827"
+     id="path4545"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/v0.1-M1/cif/tutorial/values/list_slicing.png b/v0.1-M1/cif/tutorial/values/list_slicing.png
new file mode 100644
index 0000000..5ea1c66
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/values/list_slicing.png
Binary files differ
diff --git a/v0.1-M1/cif/tutorial/values/list_slicing.png.svg b/v0.1-M1/cif/tutorial/values/list_slicing.png.svg
new file mode 100644
index 0000000..d9b90d4
--- /dev/null
+++ b/v0.1-M1/cif/tutorial/values/list_slicing.png.svg
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="list_slicing.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;">
+      <path
+         id="path3890"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.4) rotate(180) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path3884"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+         transform="scale(0.8) rotate(180) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="4"
+     inkscape:cx="131.62232"
+     inkscape:cy="85.218581"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="1916"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1" />
+  <rect
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect3004"
+     width="49"
+     height="29"
+     x="10.5"
+     y="100.50002" />
+  <rect
+     y="100.50002"
+     x="59.5"
+     height="29"
+     width="49"
+     id="rect3774"
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+  <rect
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect3776"
+     width="49"
+     height="29"
+     x="108.5"
+     y="100.50002" />
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="35.046875"
+     y="123.74808"
+     id="text3798"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3800"
+       x="35.046875"
+       y="123.74808"
+       style="font-size:24px;text-align:center;text-anchor:middle">7</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3802"
+     y="123.73636"
+     x="84.011719"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:24px;text-align:center;text-anchor:middle"
+       y="123.73636"
+       x="84.011719"
+       id="tspan3804"
+       sodipodi:role="line">8</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="133.05273"
+     y="123.73636"
+     id="text3806"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3808"
+       x="133.05273"
+       y="123.73636"
+       style="font-size:24px;text-align:center;text-anchor:middle">3</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3834"
+     y="51.747627"
+     x="35.046875"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="51.747627"
+       x="35.046875"
+       id="tspan3836"
+       sodipodi:role="line">x[:]</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="133.01172"
+     y="51.748077"
+     id="text3838"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3840"
+       x="133.01172"
+       y="51.748077"
+       style="font-size:16px;text-align:center;text-anchor:middle">x[2:4]</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3842"
+     y="51.747627"
+     x="231.46094"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="51.747627"
+       x="231.46094"
+       id="tspan3844"
+       sodipodi:role="line">x[2:7]</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     id="text3850"
+     y="177.87891"
+     x="231.46094"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:16px;text-align:center;text-anchor:middle"
+       y="177.87891"
+       x="231.46094"
+       id="tspan3852"
+       sodipodi:role="line">x[1:]</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="35.052727"
+     y="177.87863"
+     id="text3854"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3856"
+       x="35.052727"
+       y="177.87863"
+       style="font-size:16px;text-align:center;text-anchor:middle">x[:-1]</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 12.5,96 0,-5"
+     id="path3869"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3871"
+     d="m 253.5,96 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3873"
+     d="m 12.648926,93.5 240.745154,0"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path3875"
+     d="m 34.294118,93.05114 0,-32.004067"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4507"
+     d="m 110.5,76 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 204.5,76 0,-5"
+     id="path4509"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 110.50439,73.5 93.99123,0"
+     id="path4511"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+     d="m 132.29412,73.051133 0,-12.047632"
+     id="path4513"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 110.5,86 0,-5"
+     id="path4515"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4517"
+     d="m 253.5,86 0,-5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4519"
+     d="m 110.49866,83.5 143.00268,0"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4521"
+     d="m 231,83.05113 0,-22.062099"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 61.5,144.21286 0,5"
+     id="path4531"
+     inkscape:connector-curvature="0" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4533"
+     d="m 253.5,144.21286 0,5"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4535"
+     d="m 61.500767,146.713 191.998453,0"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4537"
+     d="m 231,146.50001 0,13.24123"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
+  <path
+     inkscape:connector-curvature="0"
+     id="path4539"
+     d="m 12.5,134.21286 0,5"
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 204.5,134.213 0,5"
+     id="path4541"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 12.5,136.71301 191.73913,0"
+     id="path4543"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+     d="m 34.29412,136.504 0,23.246"
+     id="path4545"
+     inkscape:connector-curvature="0" />
+  <rect
+     y="100.50002"
+     x="157.5"
+     height="29"
+     width="49"
+     id="rect3031"
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+  <text
+     sodipodi:linespacing="125%"
+     id="text3033"
+     y="123.57816"
+     x="182.05273"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"><tspan
+       style="font-size:24px;text-align:center;text-anchor:middle"
+       y="123.57816"
+       x="182.05273"
+       id="tspan3035"
+       sodipodi:role="line">5</tspan></text>
+  <rect
+     style="fill:#dedede;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect3037"
+     width="49"
+     height="29"
+     x="206.5"
+     y="100.50002" />
+  <text
+     xml:space="preserve"
+     style="font-size:16px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     x="231.05273"
+     y="123.73636"
+     id="text3039"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan3041"
+       x="231.05273"
+       y="123.73636"
+       style="font-size:24px;text-align:center;text-anchor:middle">9</tspan></text>
+</svg>
diff --git a/v0.1-M1/escet/developer/link-with-editor.png b/v0.1-M1/escet/developer/link-with-editor.png
new file mode 100644
index 0000000..f5e782c
--- /dev/null
+++ b/v0.1-M1/escet/developer/link-with-editor.png
Binary files differ
diff --git a/v0.1-M1/escet/developer/view-menu.png b/v0.1-M1/escet/developer/view-menu.png
new file mode 100644
index 0000000..d6c0e9f
--- /dev/null
+++ b/v0.1-M1/escet/developer/view-menu.png
Binary files differ
diff --git a/v0.1-M1/escet/eclipse-escet-incubation-manual.pdf b/v0.1-M1/escet/eclipse-escet-incubation-manual.pdf
new file mode 100644
index 0000000..37166a9
--- /dev/null
+++ b/v0.1-M1/escet/eclipse-escet-incubation-manual.pdf
Binary files differ
diff --git a/v0.1-M1/escet/eclipse-incubation.png b/v0.1-M1/escet/eclipse-incubation.png
new file mode 100644
index 0000000..5fccef5
--- /dev/null
+++ b/v0.1-M1/escet/eclipse-incubation.png
Binary files differ
diff --git a/v0.1-M1/escet/index.html b/v0.1-M1/escet/index.html
new file mode 100644
index 0000000..0808663
--- /dev/null
+++ b/v0.1-M1/escet/index.html
@@ -0,0 +1,6439 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation">
+<title>Eclipse ESCET&#8482; documentation (Incubation)</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+:not(pre)>code.nobreak{word-wrap:normal}
+:not(pre)>code.nowrap{white-space:nowrap}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<style>
+.menu, .submenu, .menuitem, .menuref {
+    background-color: Menu;
+}
+
+.button {
+    border: 1px solid ButtonFace;
+    /*
+    Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
+    border: 2px outset ButtonFace;
+    background-color: ButtonFace;
+    */
+    padding-left: 0.5ex;
+    padding-right: 0.5ex;
+    font-weight: normal;
+    font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
+    white-space: nowrap;
+}
+.button:before {
+    content: none !important;
+}
+.button:after {
+    content: none !important;
+}
+
+#footer-text, #footer-text a {
+    color: rgba(255,255,255,.8)
+}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<h1>Eclipse ESCET&#8482; documentation (Incubation)</h1>
+<div class="details">
+<span id="author" class="author">Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation</span><br>
+<span id="revnumber">version 0.1.0.20210211-193517</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#intro-chapter-index">Introduction to Eclipse ESCET project</a>
+<ul class="sectlevel2">
+<li><a href="#intro-chapter-chi">Chi</a></li>
+<li><a href="#intro-chapter-cif">CIF</a></li>
+<li><a href="#intro-chapter-setext">SeText</a></li>
+<li><a href="#intro-chapter-tooldef">ToolDef</a></li>
+</ul>
+</li>
+<li><a href="#download-install-chapter-index">Download and install Eclipse ESCET toolkit</a>
+<ul class="sectlevel2">
+<li><a href="#download-install-install">Installation of Eclipse ESCET tools</a></li>
+<li><a href="#download-install-first-start">Starting Eclipse ESCET IDE for the first time</a></li>
+<li><a href="#download-install-update">Updating Eclipse ESCET tools</a></li>
+<li><a href="#download-install-remove">Removing Eclipse ESCET tools</a></li>
+<li><a href="#download-install-find-version">Finding the tool&#8217;s version number</a></li>
+</ul>
+</li>
+<li><a href="#use-chapter-index">Using Eclipse ESCET tools</a>
+<ul class="sectlevel2">
+<li><a href="#use-terminology">Eclipse terminology</a></li>
+<li><a href="#use-projects">Working with projects, directories, and files</a></li>
+<li><a href="#use-edit-exec">Editing files and executing commands</a></li>
+<li><a href="#use-escet-perspective">Eclipse ESCET perspective</a></li>
+<li><a href="#use-apps-view">Applications view</a></li>
+</ul>
+</li>
+<li><a href="#performance-chapter-index">Resolving performance and memory problems</a>
+<ul class="sectlevel2">
+<li><a href="#performance-clear-console">Clearing the console</a></li>
+<li><a href="#performance-reduce-console-output">Reducing console output</a></li>
+<li><a href="#performance-close-running-apps">Closing running applications</a></li>
+<li><a href="#performance-tweak-perf-settings">Tweaking performance settings</a></li>
+</ul>
+</li>
+<li><a href="#developer-chapter-index">Eclipse ESCET development</a>
+<ul class="sectlevel2">
+<li><a href="#developer-development-process-chapter-index">Development process</a></li>
+<li><a href="#developer-contributing-chapter-index">Contributing</a></li>
+<li><a href="#developer-issue-tracking-chapter-index">Issue tracking</a></li>
+<li><a href="#developer-dev-env-setup-chapter-index">Development environment setup</a></li>
+<li><a href="#developer-git-repo-chapter-index">Git repository</a></li>
+<li><a href="#developer-coding-standards-chapter-index">Coding standards</a></li>
+<li><a href="#developer-building-and-testing-chapter-index">Building and testing</a></li>
+<li><a href="#developer-release-process-chapter-index">Release process</a></li>
+<li><a href="#developer-third-party-tools-chapter-index">Third party tools</a></li>
+<li><a href="#developer-upgrade-instructions-chapter-index">Upgrade instructions</a></li>
+</ul>
+</li>
+<li><a href="#app-framework-chapter-index">Application framework</a>
+<ul class="sectlevel2">
+<li><a href="#app-framework-introduction">Introduction</a></li>
+<li><a href="#app-framework-standalone-vs-eclipse">Stand-alone execution versus Eclipse IDE</a></li>
+<li><a href="#app-framework-application-class">The Application class</a></li>
+<li><a href="#app-framework-exception-framework">The exception framework</a></li>
+<li><a href="#app-framework-exit-codes">Exit codes</a></li>
+<li><a href="#app-framework-io-framework">The I/O framework</a></li>
+<li><a href="#app-framework-option-framework">The option framework</a></li>
+<li><a href="#app-framework-compiler-framework">The compiler framework</a></li>
+<li><a href="#app-framework-implement-your-application">How to implement your own application</a></li>
+<li><a href="#app-framework-registration">Application registration</a></li>
+<li><a href="#app-framework-execution">Execution</a></li>
+</ul>
+</li>
+<li><a href="#release-notes-chapter-index">Eclipse ESCET release notes</a>
+<ul class="sectlevel2">
+<li><a href="#version-0-1-unreleased">Version 0.1 (unreleased)</a></li>
+</ul>
+</li>
+<li><a href="#contact-chapter-index">Contact information</a></li>
+<li><a href="#legal-chapter-index">Legal</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>The Eclipse Supervisory Control Engineering Toolkit (Eclipse ESCET&#8482;)
+project is an <a href="https://eclipse.org">Eclipse</a> project that provides a
+toolkit for the development of supervisory controllers in the Model-Based
+Systems Engineering (MBSE) paradigm. The toolkit has a strong focus on
+model-based design, supervisory controller synthesis, and industrial
+applicability, for example to cyber physical systems. The toolkit supports
+the entire development process of (supervisory) controllers, from modeling,
+supervisory controller synthesis, simulation-based validation and
+visualization, and formal verification, to real-time testing and
+implementation.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The Eclipse ESCET project and all its tools are currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+You can <a href="eclipse-escet-incubation-manual.pdf">download this manual</a>
+as a PDF as well.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The Eclipse ESCET toolkit features the following languages and associated
+tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#intro-chapter-chi">Chi</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-cif">CIF</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-setext">SeText</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-tooldef">ToolDef</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>This manual includes information related to the Eclipse ESCET toolkit as a
+whole, and applies to those tools as well. The following information is
+available for end users of the toolkit:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#intro-chapter-index">Introduction to Eclipse ESCET project</a></p>
+</li>
+<li>
+<p><a href="#download-install-chapter-index">Download and install Eclipse ESCET toolkit</a></p>
+</li>
+<li>
+<p><a href="#use-chapter-index">Using Eclipse ESCET tools</a></p>
+</li>
+<li>
+<p><a href="#performance-chapter-index">Resolving performance and memory problems</a></p>
+</li>
+<li>
+<p><a href="#release-notes-chapter-index">Eclipse ESCET release notes</a></p>
+</li>
+<li>
+<p><a href="#contact-chapter-index">Contact information</a></p>
+</li>
+<li>
+<p><a href="#legal-chapter-index">Legal</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following information is available for developers of the toolkit:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#developer-chapter-index">Eclipse ESCET development</a></p>
+</li>
+<li>
+<p><a href="#app-framework-chapter-index">Application framework</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="intro-chapter-index">Introduction to Eclipse ESCET project</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>High-tech companies increasingly adopt the
+<a href="https://en.wikipedia.org/wiki/Model-based_systems_engineering">Model-Based Systems Engineering</a>
+(MBSE) paradigm. The use of (formal) models for controller design allows
+validation and verification of controllers long before they are implemented
+and integrated into the system. Early validation and verification have been
+shown to lead to less defects and reduced costs.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Supervisory Control Engineering Toolkit (Eclipse ESCET) project is
+an <a href="https://eclipse.org">Eclipse</a> project that provides a toolkit for the
+development of supervisory controllers in the MBSE paradigm. The toolkit has
+a strong focus on model-based design, supervisory controller synthesis, and
+industrial applicability, for example to cyber physical systems. The toolkit
+supports the entire development process of (supervisory) controllers, from
+modeling, supervisory controller synthesis, simulation-based validation and
+visualization, and formal verification, to real-time testing and
+implementation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>Supervisory controller synthesis is a key feature of the toolkit. It
+involves the automatic generation of supervisory controllers from a
+specification of the uncontrolled system and the (safety) requirements that
+the controller needs to enforce. This shifts controller design from 'how
+should the implementation work' to 'what should the controller do'.
+Implementation of the controller is achieved through (implementation
+language) code generation, reducing the number of errors introduced at this
+stage.</p>
+</div>
+<div class="paragraph">
+<p>The Eclipse ESCET toolkit features the following languages and associated
+tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#intro-chapter-chi">Chi</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-cif">CIF</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-setext">SeText</a></p>
+</li>
+<li>
+<p><a href="#intro-chapter-tooldef">ToolDef</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect2">
+<h3 id="intro-chapter-chi">Chi</h3>
+<div class="paragraph">
+<p>The Chi language is a modeling language for describing and analyzing the
+performance of discrete event systems by means of simulation. The language
+design is based on decades of successful analyses of various (industrial)
+systems, aiming to be powerful for advanced users, and easy to use for
+non-experts.</p>
+</div>
+<div class="paragraph">
+<p>The language uses a process-based view. A system (and its control) is
+modeled as a collection of parallel running processes, communicating with
+each other using point-to-point communication channels. Processes do not
+share data with other processes, and channels are synchronous (sending and
+receiving is always done together at the same time), making reasoning about
+process behavior easier. Processes and channels are dynamic, new processes
+can be created as needed, and communication channels can be created or
+rerouted, making for a powerful specification language.</p>
+</div>
+<div class="paragraph">
+<p>The language is designed to be formal and easily extensible. Models are
+written as an imperative program, with an intuitive syntax, making it easy
+to read and write models. A small generic set of statements can be used to
+describe algorithms, including assignments, <em>if</em>, <em>while</em> and <em>for</em>
+statements. This set is relatively easy to explain to non-experts, allowing
+them to understand the model, and participate in the discussions.</p>
+</div>
+<div class="paragraph">
+<p>The data of the system can be modeled using both basic data types, such as
+<em>booleans</em> and <em>integer</em> and <em>real</em> numbers, as well as high level structured
+collections of data like <em>lists</em>, <em>sets</em> and <em>dictionaries</em>. If desired,
+processes and channels can also be part of that data. Furthermore, timers and
+(quasi-)random number generation distributions are available for modeling
+timed and stochastic systems. Features to easily specify repeated experiments,
+e.g. for stochastic simulation, or simulation for various inputs obtained
+from files, exist to support large simulation experiments.</p>
+</div>
+<div class="paragraph">
+<p>While the language is generic, the main application area is modeling of
+the operation of (manufacturing) systems. During the design process,
+engineers can make use of analytical models, to get answers about the
+operation of the system. Simulation studies can provide insights into
+e.g. the throughput of the system, the effect of set-up time in a
+machine, or how the batch size of an order will influence the flow time
+of the product-items.</p>
+</div>
+<div class="paragraph">
+<p>The Chi toolset allows verification of properties of the actual system by
+means of simulation, e.g. to optimize the supervisory (logic) control of
+the system. The Chi language has features that allow for easy
+specification of . Chi aims to make the process of verifying properties for large
+systems effortless.</p>
+</div>
+<div class="paragraph">
+<p>Tutorials and manuals demonstrate the use of the language for effective
+modeling of system processes. More detailed modeling of the processes and
+e.g performance indicators, or custom tailoring them to the real situation,
+has no inherent limits.</p>
+</div>
+<div class="paragraph">
+<p>See the separate Chi documentation for more information.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="intro-chapter-cif">CIF</h3>
+<div class="paragraph">
+<p>The CIF language is a powerful declarative automata-based modeling language for the
+specification of discrete event, timed (linear dynamics), hybrid (piecewise
+continuous dynamics) systems. It can be seen as a rich state machine language
+with the following main features:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Modular specification with synchronized events and communication between
+automata.</p>
+</li>
+<li>
+<p>Many data types are available (booleans, integers, reals, tuples, lists,
+arrays, sets, and dictionaries), combined with a powerful expression language
+for compact variables updates.</p>
+</li>
+<li>
+<p>Text-based specification of the automata, with many features to simplify
+modeling large non-trivial industrial systems.</p>
+</li>
+<li>
+<p>Primitives for supervisory controller synthesis are integrated in the
+language.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The CIF tooling supports the entire development process of controllers,
+including among others specification, supervisory controller synthesis,
+simulation-based validation and visualization, verification, real-time
+testing, and code generation. Highlights of the CIF tooling include:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Text-based editor that allows to easily specify and edit models.</p>
+</li>
+<li>
+<p>Feature-rich powerful data-based synthesis tool. A transformation to the
+supervisory controller synthesis tool Supremica is also available.</p>
+</li>
+<li>
+<p>A simulator that supports both interactive and automated validation of
+specifications. Powerful visualization features allow for interactive
+visualization-based validation.</p>
+</li>
+<li>
+<p>Conversion to formal verification tools such as mCRL2 and UPPAAL.</p>
+</li>
+<li>
+<p>Implementation language code generation (PLC languages, Java, C, and
+Simulink) for real-time testing and implementation of the designed controller.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>See the separate CIF documentation for more information.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="intro-chapter-setext">SeText</h3>
+<div class="paragraph">
+<p>SeText is a textual syntax specification language and associated scanner/parser
+generator. It can be used to specify the syntax of a language, and automatically
+generate a scanner and LALR(1) parser(s).</p>
+</div>
+<div class="paragraph">
+<p>SeText is used as scanner/parser technology for the other tools within the
+Eclipse ESCET project. It is however a generic scanner/parser generator that can
+also be used for the development of scanners and parsers for other languages.</p>
+</div>
+<div class="paragraph">
+<p>See the separate SeText documentation for more information.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="intro-chapter-tooldef">ToolDef</h3>
+<div class="paragraph">
+<p>ToolDef is a cross-platform and machine-independent scripting language.
+It supports command line execution, but is also available as plug-in for
+the Eclipse IDE, providing an integrated development experience.</p>
+</div>
+<div class="paragraph">
+<p>The ToolDef language features a simple and intuitive syntax to make it easy to
+write scripts, static typing to catch simple mistakes, a large number of
+built-in data types and tools, Java integration, and more.</p>
+</div>
+<div class="paragraph">
+<p>ToolDef libraries with ToolDef compatible tools are available for all tools
+within the Eclipse ESCET toolkit, allowing cross-platform and
+machine-independent scripting using Eclipse ESCET tools. ToolDef however is a
+generic scripting language, and can be used without using any of the other
+Eclipse ESCET tools. Furthermore, other tools can be made available for use
+within ToolDef scripts by defining ToolDef libraries for them.</p>
+</div>
+<div class="paragraph">
+<p>See the separate ToolDef documentation for more information.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="download-install-chapter-index">Download and install Eclipse ESCET toolkit</h2>
+<div class="sectionbody">
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+The Eclipse ESCET project and all its tools are currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>You can download Eclipse ESCET from the following locations:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://download.eclipse.org/escet">Eclipse ESCET downloads</a> (for recent versions)</p>
+</li>
+<li>
+<p><a href="https://archive.eclipse.org/escet">Eclipse ESCET archived downloads</a> (for older versions)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Downloads for Eclipse ESCET tools are available for the following platforms:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Windows, x64 (64-bit)</p>
+</li>
+<li>
+<p>Linux, x64 (64-bit)</p>
+</li>
+<li>
+<p>macOS, x64 (64-bit)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The downloads are archives that can be extracted anywhere on the local system.
+Each download contains the Eclipse ESCET toolkit, with the tools available in
+two ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As IDE based on the Eclipse IDE, providing the full experience. Includes
+full GUI integration and e.g. text editors with syntax highlighting and error
+checking.</p>
+</li>
+<li>
+<p>As command line execution scripts (<code>bin</code> directory of the archives),
+allowing execution in a command line terminal or console,
+particularly useful for execution of the tools on headless clusters.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>The following dependencies need to be available on the system:</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Java Development Kit (JDK):</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Version 8 update 31 (8u31) or newer is required. Versions 9 and higher are
+currently not yet supported.</p>
+</li>
+<li>
+<p>An x64 (64-bit) version of Java is required, which also requires a 64-bit
+operating system.</p>
+</li>
+<li>
+<p>Currently the Eclipse ESCET tools are only tested using Oracle JDKs. Your
+experience with other JDK vendors may vary.</p>
+</li>
+<li>
+<p>A Java Runtime Environment (JRE) is not sufficient. A JDK is required.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following documentation is available for download:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Eclipse ESCET documentation (this documentation)</p>
+</li>
+<li>
+<p>Chi documentation</p>
+</li>
+<li>
+<p>CIF documentation</p>
+</li>
+<li>
+<p>SeText documentation</p>
+</li>
+<li>
+<p>ToolDef documentation</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following additional information is available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#download-install-install">Installation of Eclipse ESCET tools</a></p>
+</li>
+<li>
+<p><a href="#download-install-first-start">Starting Eclipse ESCET IDE for the first time</a></p>
+</li>
+<li>
+<p><a href="#download-install-update">Updating Eclipse ESCET tools</a></p>
+</li>
+<li>
+<p><a href="#download-install-remove">Removing Eclipse ESCET tools</a></p>
+</li>
+<li>
+<p><a href="#download-install-find-version">Finding the tool&#8217;s version number</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="download-install-install">Installation of Eclipse ESCET tools</h3>
+<div class="paragraph">
+<p>Before installing Eclipse ESCET tools, first install a Java Development Kit
+(JDK), taking into account the following restrictions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Version 8 update 31 (8u31) or newer is required. Versions 9 and higher are
+currently not yet supported.</p>
+</li>
+<li>
+<p>An x64 (64-bit) version of Java is required, which also requires a 64-bit
+operating system.</p>
+</li>
+<li>
+<p>Currently the Eclipse ESCET tools are only tested using Oracle JDKs. Your
+experience with other JDK vendors may vary.</p>
+</li>
+<li>
+<p>A Java Runtime Environment (JRE) is not sufficient. A JDK is required.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>You can download a JDK from Oracle&#8217;s
+<a href="https://www.oracle.com/java/technologies/javase-downloads.html">Java SE Downloads</a>
+page. For more information, see:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Oracle&#8217;s
+<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html">JDK Installation for Linux Platforms</a>
+page.</p>
+</li>
+<li>
+<p>Oracle&#8217;s
+<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jdk_install.html">JDK Installation for Microsoft Windows</a>
+page.</p>
+</li>
+<li>
+<p>Oracle&#8217;s
+<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html">JDK 8 Installation for OS X</a>
+page.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Ensure that this JDK is in your <code>PATH</code>. See e.g.
+<a href="https://www.java.com/en/download/help/path.xml">How do I set or change the PATH system variable?</a>
+for how to achieve this.</p>
+</div>
+<div class="paragraph">
+<p>Next, obtain the Eclipse ESCET tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#download-install-chapter-index">Download</a> the Eclipse ESCET tools.</p>
+</li>
+<li>
+<p>Extract the downloaded archive somewhere on your hard disk, to a new empty
+directory where you have read and write access.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>You can now start the Eclipse ESCET IDE:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>For Windows, execute <code>eclipse.exe</code> from the directory that contains the
+extracted files.</p>
+</li>
+<li>
+<p>For Linux, execute <code>eclipse</code> from the directory that contains the
+extracted files.</p>
+</li>
+<li>
+<p>For macOS, the archive contains a directory named <code>Eclipse.app</code>, which
+contains all the files of the release. The operating system recognizes this
+directory as a macOS application and displays it as <em>Eclipse</em> with a custom
+icon.  You can now execute the application by double clicking the <em>Eclipse</em>
+application icon. A dialog may be shown with the following text:
+<em>"Eclipse" is an application downloaded from the Internet. Are you sure you
+want to open it?</em> Click the <b class="button">Open</b> button to confirm. You may move/drag
+the <em>Eclipse</em> application icon to the macOS <em>Applications</em> folder, to
+make the Eclipse icon appear among the other macOS applications.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For more information, see the section on starting the Eclipse ESCET IDE
+<a href="#download-install-first-start">for the first time</a>.</p>
+</div>
+<div class="paragraph">
+<p>You can now also use the command line scripts located in the <code>bin</code>
+directory (<code>Eclipse.app/Contents/Eclipse/bin</code> on macOS). To see which
+tools are available, simply look in the <code>bin</code> directory. Each of these
+tools can be started with the <code>-h</code> or <code>--help</code> option to get further
+information. You may want to add the <code>bin</code> directory to your <code>PATH</code>
+environment variable. See e.g.
+<a href="https://www.java.com/en/download/help/path.xml">How do I set or change the PATH system variable?</a>
+for how to achieve this.</p>
+</div>
+<div class="paragraph">
+<p>If the Eclipse ESCET IDE or one of the command line scripts can&#8217;t be started,
+you can try the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The Eclipse ESCET tools may not be able to correctly detect the JDK you
+installed. In such a case, edit the <code>eclipse.ini</code> file from the directory
+that contains the extracted files and add in the following lines at the
+beginning of the file:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>-vm
+C:/Program Files/Java/jdk1.8.0_211/bin</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Note that <code>-vm</code> and the path to the JDK need to be on separate lines.
+Obviously, change the JDK path to the actual path for your system.
+Make sure to save the file and retry starting the Eclipse ESCET IDE
+or one of the command line scripts.</p>
+</div>
+</li>
+<li>
+<p>For macOS, open the <em>System Preferences</em> of the operation system. Click
+on <em>Security &amp; Privacy</em>. Click on the lock icon to allow changing the security
+settings. For <em>Allow apps downloaded from</em>, choose <em>Anywhere</em>. Close the
+<em>Security &amp; Privacy</em> settings window.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="download-install-first-start">Starting Eclipse ESCET IDE for the first time</h3>
+<div class="paragraph">
+<p>When you start the Eclipse ESCET IDE for the first time, it will ask you to
+choose a <a href="#use-terminology-workspace">workspace</a> directory. A workspace
+directory is where all your settings will be stored. It is also the default
+directory for <a href="#use-create-project">new projects</a>, in which you will store
+your files.</p>
+</div>
+<div class="paragraph">
+<p>Choose a workspace directory and continue. Make sure that you have read and
+write access to the directory you choose. If you wish, the Eclipse ESCET IDE
+can remember your workspace directory. Note that if the workspace directory
+you choose does not yet exist, Eclipse will create it for you.</p>
+</div>
+<div class="paragraph">
+<p>The first time Eclipse launches in a fresh workspace, you will get a
+<em>Welcome</em> screen. You can close this tab by clicking the 'X' at the right of
+the tab, or by clicking on the 'workbench' icon (the right most icon on
+the welcome page).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="download-install-update">Updating Eclipse ESCET tools</h3>
+<div class="paragraph">
+<p>There are two ways to obtain a newer version of the Eclipse ESCET tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>New download of the Eclipse ESCET tools (including command line scripts),
+to be used side-by-side the older version.</p>
+</li>
+<li>
+<p>In-place update of the Eclipse ESCET tools.</p>
+</li>
+</ul>
+</div>
+<div class="sect3">
+<h4 id="download-install-side-by-side-new-installation">Side by side new installation</h4>
+<div class="paragraph">
+<p>To download and install a new version of Eclipse ESCET tools (including the
+command line scripts) side-by-side an older version, follow these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Follow the normal <a href="#download-install-install">installation instructions</a>,
+extracting the new version to a different directory than the old version.</p>
+</li>
+<li>
+<p>You can copy the data (<a href="#use-terminology-project">projects</a>, files, and
+settings) of an earlier installation to the new installation. While neither
+version of the Eclipse ESCET IDE is running, simply remove the
+<a href="#use-terminology-workspace">workspace</a> directory of the new installation,
+and copy the workspace directory of the earlier installation to the new
+installation.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Using these instructions, it is possible to use multiple installations side
+by side, at the same time, regardless of whether the installations are the
+same release or different releases. Simply extract them to different
+directories and launch them as you would normally do.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="download-install-in-place-update">In-place update</h4>
+<div class="paragraph">
+<p>To perform an in-place update of the Eclipse ESCET tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Select <span class="menuseq"><b class="menu">Help</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Check for Updates</b></span> within the Eclipse ESCET IDE. Follow
+the on-screen instructions to perform an in-place update.</p>
+</li>
+<li>
+<p>This will <em>not</em> update the command line scripts.</p>
+</li>
+<li>
+<p>If the tool indicates that no updates are available, while you are sure that
+an updated version has been released, or if some other problem occurs, please
+restart the tool and try again. If still an in-place update fails, try to
+install a new version side-by-side the older version.</p>
+</li>
+<li>
+<p>If you get a dialog stating there is a problem, click the <b class="button">Details</b>
+button for further details. If may mention <code>Address family not supported by
+protocol family: connect</code>. If so, close Eclipse, and add the following line
+to the <code>eclipse.ini</code> file:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>-Djava.net.preferIPv4Stack=true</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Add the line at the end of the file, on a line by itself. By default,
+<code>eclipse.ini</code> is located in the Eclipse ESCET tools installation directory,
+except for macOS, where instead it is in the <code>Eclipse.app/Contents/MacOS</code>
+directory inside the Eclipse ESCET tools installation directory. Restart the
+Eclipse ESCET IDE and try again.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="download-install-remove">Removing Eclipse ESCET tools</h3>
+<div class="paragraph">
+<p>Before removing a version of the Eclipse ESCET tools, you may want to preserve
+(back up) its <a href="#use-terminology-workspace">workspace</a> directory, to keep your
+data (settings, projects, files). Then, to remove a release, simply remove the
+directory that contains files that you extracted from the downloaded archive
+during <a href="#download-install-install">installation</a>.</p>
+</div>
+<div class="paragraph">
+<p>Additionally, you may want to remove Java if you no longer need it.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="download-install-find-version">Finding the tool&#8217;s version number</h3>
+<div class="paragraph">
+<p>From the Eclipse ESCET IDE, there are multiple ways to find out which version
+of the toolkit or specific tools you have currently installed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Via the Eclipse <em>About Eclipse ESCET</em> dialog.</p>
+<div class="paragraph">
+<p>The <em>About Eclipse ESCET</em> dialog can be opened via the
+<span class="menuseq"><b class="menu">Help</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">About Eclipse ESCET</b></span> menu of the Eclipse ESCET IDE. The dialog has
+shows the version of the Eclipse ESCET toolkit. An <b class="button">Installation Details</b>
+button is available to open the <em>Eclipse Installation Details</em> dialog. In this
+dialog, the <em>Installed Software</em> tab shows all the installed software,
+including their versions under the <em>Version</em> column.</p>
+</div>
+</li>
+<li>
+<p>Via the option dialogs of the various tools.</p>
+<div class="paragraph">
+<p>Most of the Eclipse ESCET tools can be started in a way that shows the option
+dialog for that tool. All option dialogs for our tools have a <em>Help</em> category.
+By clicking on that category, the help text for that tool is shown.
+The help text includes the version of the tool that you are using.</p>
+</div>
+</li>
+<li>
+<p>Via the command line option, in a ToolDef script.</p>
+<div class="paragraph">
+<p>If you start an application using a ToolDef script, you can specify command
+line arguments in the script as well. Start a tool with the <code>-h</code> or <code>--help</code>
+option to see the command line help text, which includes the version.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For command line scripts, the following approach is recommended:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Start a tool with the <code>-h</code> or <code>--help</code> option to see the command line help
+text, which includes the version.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="use-chapter-index">Using Eclipse ESCET tools</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>After you have <a href="#download-install-install">installed</a> the Eclipse ESCET
+tools, you can start using them. The following information is available to
+get you started on using the Eclipse ESCET tools in general, and applies to
+the various tools in the toolkit:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#use-terminology">Eclipse terminology</a></p>
+</li>
+<li>
+<p><a href="#use-projects">Working with projects, directories, and files</a></p>
+</li>
+<li>
+<p><a href="#use-edit-exec">Editing files and executing commands</a></p>
+</li>
+<li>
+<p><a href="#use-escet-perspective">Eclipse ESCET perspective</a></p>
+</li>
+<li>
+<p><a href="#use-apps-view">Applications view</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Consult the documentation of the individual tools for specific information
+regarding their use.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect2">
+<h3 id="use-terminology">Eclipse terminology</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET IDE is based on the <em>Eclipse IDE</em>, a cross platform
+Integrated Development Environment (IDE). There is quite a bit of terminology
+that is used within the IDE. If you are not familiar with Eclipse terminology,
+it may be difficult to use the Eclipse ESCET IDE. Here we&#8217;ll explain some
+basic Eclipse terminology:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#use-terminology-workspace">Eclipse workspace</a></p>
+</li>
+<li>
+<p><a href="#use-terminology-view">Eclipse views</a></p>
+</li>
+<li>
+<p><a href="#use-terminology-project">Eclipse projects</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="use-terminology-workspace">Eclipse workspace</h4>
+<div class="paragraph">
+<p>Eclipse stores all its settings in a so-called <em>workspace</em>. The workspace is
+simply a directory on your computer. You can choose any directory you like to
+serve as a workspace, as long as you have write access to that directory. It is
+usually best to choose an empty directory or a directory that does not yet
+exist as your workspace.</p>
+</div>
+<div class="paragraph">
+<p>Typically, and by default, a directory named <code>workspace</code> inside your Eclipse
+ESCET installation directory is used. Eclipse will ask you to choose a
+workspace directory when you start the Eclipse ESCET IDE for the
+<a href="#download-install-first-start">first time</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+The actual settings are stored in a sub-directory of the workspace directory,
+called <code>.metadata</code>. You should avoid manually manipulating this directory.
+Note that because the name of the directory starts with a dot (<code>.</code>),
+depending on your operating system, file browser, and settings, the directory
+may be hidden.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div id="use-terminology-workspace-change" class="paragraph">
+<p>You can easily change your workspace directory from within Eclipse, by
+selecting <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Switch workspace</b></span>. Select one of the workspaces
+from the list of last used workspaces, or select <b class="menuref">Other&#8230;&#8203;</b>  to freely
+select any directory on your system to use as a workspace directory.</p>
+</div>
+<div class="paragraph">
+<p>
+It is possible to run multiple instances of Eclipse at the same time, but each
+instance must use its own workspace.</p>
+</div>
+<div class="paragraph">
+<p>
+
+The workspace is also the default directory for
+<a href="#use-create-project">new projects</a>. However,
+<a href="#use-terminology-project">projects</a> don&#8217;t have to be physically located
+inside your workspace directory. They can be stored in any directory on
+your system. Whenever you <a href="#use-create-project">create a project</a> and store
+it outside of your workspace, or whenever you
+<a href="#use-import-project">import an existing project</a> from outside your
+workspace, it is <em>linked</em> to the workspace, but remains physically stored in
+a directory outside of the workspace.</p>
+</div>
+<div class="paragraph">
+<p>Having projects stored outside of the workspace has some benefits. The most
+important benefit is that you can remove the workspace directory, without
+losing your files.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-terminology-view">Eclipse views</h4>
+<div class="paragraph">
+<p>Eclipse is an Integrated Development Environment (IDE) with a lot of
+functionality. Most of the functionality is available through <em>views</em>. A view
+is a part of the Eclipse graphical user interface. Views can be thought of as
+'sub-windows'. When you start Eclipse you are likely to see the
+<em>Project Explorer</em> or <em>Package Explorer</em> view on the left, and
+the <em>Problems</em> view at the bottom.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="use-terminology-view-open">Opening a view</h5>
+<div class="paragraph">
+<p>To open/show a view, select <span class="menuseq"><b class="menu">Window</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Show view</b></span> and then
+choose the view that you wish to open.</p>
+</div>
+<div class="paragraph">
+<p>If the particular view that you wish to open is not in that menu, choose
+<b class="menuref">Other&#8230;&#8203;</b> instead. A new dialog opens, in which you can find all
+available views. The views are organized into categories. Expand a category,
+select the desired view, and click <b class="button">OK</b>.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, in the <b class="menuref">Show view</b> dialog, enter the name of the view
+(or the first part of it) in the filter box at the top of the dialog, and
+observe how views that don&#8217;t match the filter are no longer displayed. This
+makes it easier to find the desired view.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-terminology-project">Eclipse projects</h4>
+<div class="paragraph">
+<p>Eclipse, being an Integrated Development Environment (IDE), does not
+only allow you to <a href="#use-edit">edit</a> a single file, and
+<a href="#use-commands">simulate</a> it, but also allows you to <em>manage</em> your files.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse works with so-called <em>projects</em>. A project is a collection of files
+and directories. A project may be located anywhere on your system, even though
+by default project are <a href="#use-create-project">created</a> in your
+<a href="#use-terminology-workspace">workspace</a> directory.</p>
+</div>
+<div class="paragraph">
+<p>A project is essentially a directory on your computer, with a special file
+named <code>.project</code>. This special file stores the information about your
+project, such as the name of the project. It is recommended to keep the name
+of the project as Eclipse sees it, the same as the name of the directory in
+which the project is stored on your hard disk.</p>
+</div>
+<div class="paragraph">
+<p>You can see the projects that Eclipse knows about in the
+<em>Project Explorer</em> or <em>Package Explorer</em> &lt;use-terminology-view,view&gt;&gt;.</p>
+</div>
+<div class="paragraph">
+<p>For more information on projects, see the <a href="#use-projects">Working with projects, directories, and files</a> section.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="use-projects">Working with projects, directories, and files</h3>
+<div class="paragraph">
+<p>Eclipse uses <a href="#use-terminology-project">projects</a> to manage files and
+directories (also called <em>folders</em>). This section contains information on the
+following topics:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#use-create-project">Creating a new project</a></p>
+</li>
+<li>
+<p><a href="#use-import-project">Importing an existing project</a></p>
+</li>
+<li>
+<p><a href="#use-create-dir">Creating a new directory</a></p>
+</li>
+<li>
+<p><a href="#use-create-file">Creating a new file</a></p>
+</li>
+<li>
+<p><a href="#use-rename">Renaming a file, directory, or project</a></p>
+</li>
+<li>
+<p><a href="#use-locations">Locating files, directories, and projects</a></p>
+</li>
+<li>
+<p><a href="#use-refresh">Refreshing a file, directory, or project</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="use-create-project">Creating a new project</h4>
+<div class="paragraph">
+<p>To create a new project, ensure you have either the <em>Project Explorer</em> or
+<em>Package Explorer</em> <a href="#use-terminology-view">view</a> visible.</p>
+</div>
+<div class="paragraph">
+<p>Select <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Project&#8230;&#8203;</b></span> to open the <em>New Project</em> window.
+Alternatively, right click somewhere in the <em>Project Explorer</em> or
+<em>Package Explorer</em> view, and select <span class="menuseq"><b class="menu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Project&#8230;&#8203;</b></span>, to open the same
+window.</p>
+</div>
+<div class="paragraph">
+<p>In the <em>New Project</em> window, from the <em>General</em> category select <em>Project</em>,
+and click the <b class="button">Next &gt;</b> button.</p>
+</div>
+<div class="paragraph">
+<p>In the next window, enter a project name, for example <code>models</code>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+By default, a project is created inside your
+<a href="#use-terminology-workspace">workspace</a> directory. If you want it at a
+different place (so you can remove the workspace without losing your
+projects), uncheck the <em>Use default location</em> option, and enter a
+<em>Location</em>. Make sure the location does not yet exist, for example by ending
+with the project name. It is recommended to always create a project in a
+directory that has the same name as the project.</p>
+</div>
+<div class="paragraph">
+<p>Click the <b class="button">Finish</b> button to create the project. Observe how it
+appears in the <em>Project Explorer</em> or <em>Package Explorer</em> view.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-import-project">Importing an existing project</h4>
+<div class="paragraph">
+<p>If you previously created a project, but it is no longer visible in your
+<em>Project Explorer</em> or <em>Package Explorer</em> <a href="#use-terminology-view">view</a>,
+you can import it. Imported projects are <em>linked</em> to your
+<a href="#use-terminology-workspace">workspace</a>, but remain in their original location
+on your hard disk (by default, they are <em>not</em> moved or copied to your
+workspace directory).</p>
+</div>
+<div class="paragraph">
+<p>Importing existing projects is particularly useful if you removed you workspace
+directory and started with a fresh one, e.g. for a new installation.</p>
+</div>
+<div class="paragraph">
+<p>To import one or more existing projects, select <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Import&#8230;&#8203;</b></span> to open
+the <em>Import</em> window. Alternatively, right click somewhere in the
+<em>Project Explorer</em> or <em>Package Explorer</em> view, and select
+<b class="menuref">Import&#8230;&#8203;</b> to open the same window.</p>
+</div>
+<div class="paragraph">
+<p>In the <em>Import</em> window, from the <em>General</em> category, select
+<em>Existing Projects into Workspace</em>, and click <b class="button">Next &gt;</b>.</p>
+</div>
+<div class="paragraph">
+<p>In the next window, in <em>Select root directory</em>, point it to the
+directory that contains the project you wish to import. The available projects
+in the given root directory, and all its sub-directories (recursively), are
+listed in the <em>Projects</em> list. Select the project(s) you want to
+import, by checking the relevant check boxes, and click <b class="button">Finish</b>.
+Observe how the project(s) appear(s) in the <em>Project Explorer</em> or
+<em>Package Explorer</em> view.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-remove-project">Removing a project from Eclipse</h4>
+<div class="paragraph">
+<p>To remove a project from Eclipse, ensure you have either the
+<em>Project Explorer</em> or <em>Package Explorer</em> <a href="#use-terminology-view">view</a>
+visible.</p>
+</div>
+<div class="paragraph">
+<p>Right click the project in the <em>Project Explorer</em> or <em>Package Explorer</em> view
+and choose <b class="menuref">Delete</b>. Alternatively, select it and press the <kbd>Delete</kbd>
+key on your keyboard. The <em>Delete Resources</em> dialog appears. To only remove
+the project from Eclipse, and keep the files on your hard disk, disable the
+<em>Delete project contents on disk (cannot be undone)</em> option and click the
+<b class="button">OK</b> button. Alternatively, to remove the project from Eclipse and also
+remove all the files in the project from your hard disk, enable the
+<em>Delete project contents on disk (cannot be undone)</em> option and click the
+<b class="button">OK</b> button.</p>
+</div>
+<div class="paragraph">
+<p>Wait for Eclipse to complete the removal operation.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-create-dir">Creating a new directory</h4>
+<div class="paragraph">
+<p>You can structure large collections of files, by putting them into different
+directories (also called <em>folders</em>). Directories can only be created in
+<a href="#use-terminology-project">projects</a>, or in other directories.</p>
+</div>
+<div class="paragraph">
+<p>Select the project or directory in which you want to create a new directory
+(by left clicking its name in the <em>Project Explorer</em> or <em>Package Explorer</em>
+<a href="#use-terminology-view">view</a>, and create a new directory by selecting
+<span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Folder</b></span>. Alternatively, right click on the project or
+directory instead, and from the popup menu select <span class="menuseq"><b class="menu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Folder</b></span>.</p>
+</div>
+<div class="paragraph">
+<p>In the <em>New Folder</em> window, enter the <em>Folder name</em>, and click <b class="button">Finish</b>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-create-file">Creating a new file</h4>
+<div class="paragraph">
+<p>Select the <a href="#use-terminology-project">project</a> or directory in which you
+want to create a new file (by left clicking its name in the
+<em>Project Explorer</em> or <em>Package Explorer</em> <a href="#use-terminology-view">view</a>),
+and create a new file by selecting <span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">File</b></span>. Alternatively,
+right click on the project or directory instead, and from the popup menu
+select <span class="menuseq"><b class="menu">New</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">File</b></span>.</p>
+</div>
+<div class="paragraph">
+<p>In the <em>New File</em> window, enter the <em>File name</em>, and click <b class="button">Finish</b>.
+Make sure to give the file the correct file extension. E.g. CIF files
+should end with <code>.cif</code>.</p>
+</div>
+<div class="paragraph">
+<p>An editor for the new file opens, and you can start <a href="#use-edit">editing it</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-rename">Renaming a file, directory, or project</h4>
+<div class="paragraph">
+<p>To rename a file, directory, or <a href="#use-terminology-project">project</a>,
+select it by left clicking its name in the <em>Project Explorer</em> or
+<em>Package Explorer</em> <a href="#use-terminology-view">view</a>, and then select
+<span class="menuseq"><b class="menu">File</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Rename&#8230;&#8203;</b></span>. Alternatively, right click on the file, directory, or
+project instead, and from the popup menu select <span class="menuseq"><b class="menu">Refactor</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Rename&#8230;&#8203;</b></span>.
+A second alternative is to select the file, directory, or project, and
+then press the <kbd>F2</kbd> key.</p>
+</div>
+<div class="paragraph">
+<p>In the <em>Rename Resource</em> window, enter the <em>New name</em>, and click <b class="button">OK</b>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-locations">Locating files, directories, and projects</h4>
+<div class="paragraph">
+<p>Often, it is convenient to be able to manage files not from inside Eclipse,
+but from outside Eclipse, for instance in a file explorer provided by your
+operating system. The <em>Properties</em> <a href="#use-terminology-view">view</a> can be used
+to find out where the files, directories, and projects that are in Eclipse,
+are located on your hard disk. With the <em>Properties</em> view visible, select a
+file, directory, or project in the <em>Project Explorer</em> or <em>Package Explorer</em>
+view. In the <em>Property</em> column of the <em>Properties</em> view, look for <em>location</em>.
+The corresponding <em>Value</em> indicates where the file, directory, or project is
+located on your hard disk. Note that you can right click the location and
+choose <em>Copy</em> to copy the location to the clipboard.</p>
+</div>
+<div class="paragraph">
+<p>As an alternative to the <em>Properties</em> view, you can also use the
+<em>Properties</em>  window. Right click a file, directory, or project in the
+<em>Project Explorer</em> or <em>Package Explorer</em> view and choose <b class="menuref">Properties</b>.
+In the window that shows, select <em>Resource</em> on the left, if it is not already
+selected. Then, on the right, look for the <em>Location</em>.</p>
+</div>
+<div class="paragraph">
+<p>To directly open the directory that contains a file, directory, or project
+in your system&#8217;s file explorer, right click the file, directory, or project in
+the <em>Project Explorer</em> or <em>Package Explorer</em> view and choose
+<span class="menuseq"><b class="menu">Show In</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">System Explorer</b></span>.</p>
+</div>
+<div class="paragraph">
+<p>Don&#8217;t forget to <a href="#use-refresh">refresh</a> your projects in Eclipse after
+manipulating them outside Eclipse.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-refresh">Refreshing a file, directory, or project</h4>
+<div class="paragraph">
+<p>Whenever changes are made to files or directories from outside Eclipse, and
+those files or directories are also in one of the projects inside Eclipse,
+the changes are <em>not</em> always automatically reflected in the
+<em>Project Explorer</em> or <em>Package Explorer</em> <a href="#use-terminology-view">view</a>. To
+ensure that the current state of the files and directories are properly
+reflected in Eclipse, a refresh is required. To refresh a file, directory,
+or project, right click it, and choose <b class="menuref">Refresh</b>. Any files and
+directories that no longer exist will disappear from Eclipse. Any new files
+and directories created outside Eclipse will appear in Eclipse as well.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-filesize">Checking the size of a file</h4>
+<div class="paragraph">
+<p>When working with files, you may occasionally encounter large files. Opening
+large files in Eclipse can cause serious
+<a href="#performance-chapter-index">performance problems</a>. You can use the
+<em>Properties</em> <a href="#use-terminology-view">view</a> to check the size of a file. With
+the <em>Properties</em> view visible, select a file in the <em>Project Explorer</em> or
+<em>Package Explorer</em> view. In the <em>Property</em> column of the <em>Properties</em> view,
+look for <em>size</em>. The corresponding <em>Value</em> indicates the size of the file.</p>
+</div>
+<div class="paragraph">
+<p>As an alternative to the <em>Properties</em> view, you can also use the <em>Properties</em>
+window. Right click a file in the <em>Project Explorer</em> or <em>Package Explorer</em>
+view and choose <b class="menuref">Properties</b>. In the window that shows, select <em>Resource</em>
+on the left, if it is not already selected. Then, on the right, look for the
+<em>Size</em>.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="use-edit-exec">Editing files and executing commands</h3>
+<div class="paragraph">
+<p>This section contains information on <a href="#use-edit">editing text files</a> and
+<a href="#use-commands">executing commands</a> (such as starting a simulator).</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+
+
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="use-edit">Editing a text file</h4>
+<div class="paragraph">
+<p>To edit a file, double click it in the <em>Project explorer</em> or
+<em>Package explorer</em> <a href="#use-terminology-view">view</a>.</p>
+</div>
+<div class="paragraph">
+<p>Whenever you open a text file, change it, or the editor receives the focus,
+the file is checked for errors. If there are errors (or warnings), they are
+displayed in the editor as shown below.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./use/model_with_error.png" alt="model with error">
+</div>
+</div>
+<div class="paragraph">
+<p>Note that you can hover over an error in the source code itself to find out
+what the problem is. Alternatively, you can hover over the error marker in
+the margin of the editor, or look at the <em>Problems</em> view. Also, if a file
+has an error or a warning, an overlay icon is shown in the <em>Project Explorer</em>
+and <em>Package Explorer</em> views, for that file, the directories that
+contain it, and the <a href="#use-terminology-project">project</a> that contains it.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-commands">Executing commands</h4>
+<div class="paragraph">
+<p>If you have a file without errors, you can execute certain commands on it. The
+various Eclipse ESCET tools add <em>commands</em> to Eclipse. For instance, CIF models
+can be simulated using a simulation command.</p>
+</div>
+<div class="paragraph">
+<p>To execute a command on a file, right click the file in the
+<em>Project Explorer</em> or <em>Package Explorer</em> <a href="#use-terminology-view">view</a>, and
+select the command. Alternatively, if you have the file open in an editor, right
+click the editor, and select the command.</p>
+</div>
+<div class="paragraph">
+<p>The commands that are available are determined by the file extension of the
+file. That is, only the commands applicable for a certain file are shown.</p>
+</div>
+<div class="paragraph">
+<p>Besides simulation, other commands may be available, depending on the modeling
+language and tools you use. Consult the specific documentation for each tool
+for more details.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="use-escet-perspective">Eclipse ESCET perspective</h3>
+<div class="paragraph">
+<p>The layout of the different parts of the Eclipse ESCET IDE, including the
+position and size of the various <a href="#use-terminology-view">views</a>, can be
+configured per perspective. Different perspectives allow you to use different
+layouts for different tasks.</p>
+</div>
+<div class="paragraph">
+<p>The Eclipse ESCET IDE ships with some built-in perspectives. The default
+<em>ESCET</em> perspective is ideally suited for the use of the Eclipse
+ESCET software.</p>
+</div>
+<div class="paragraph">
+<p>
+
+You can manually open the <em>ESCET</em> perspective (or any other perspective), by
+selecting <span class="menuseq"><b class="menu">Window</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Perspective</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Open Perspective</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Other&#8230;&#8203;</b></span>. Then, in the
+<em>Open Perspective</em> dialog, select the <em>ESCET</em> perspective from the list, and
+click the <b class="button">OK</b> button.</p>
+</div>
+<div class="paragraph">
+<p>
+
+By default, the Eclipse ESCET IDE shows the opened perspectives at the top
+right corner of the IDE. Each perspective is a button that can be used to
+active it. If the button appears in a pushed state, that perspective is
+active. The following image shows an Eclipse ESCET IDE with two open
+perspectives: the <em>Resource</em> perspective and the <em>ESCET</em> perspective.
+The <em>ESCET</em> perspective  is the currently enabled perspective.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./use/perspectives.png" alt="perspectives">
+</div>
+</div>
+<div class="paragraph">
+<p>By default, the <em>ESCET</em> perspective shows the following views:</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Project explorer (top left)</p>
+</li>
+<li>
+<p><a href="#use-apps-view">Applications</a> (bottom left)</p>
+</li>
+<li>
+<p>Problems (bottom, grouped)</p>
+</li>
+<li>
+<p>Properties (bottom, grouped)</p>
+</li>
+<li>
+<p>Console (bottom, grouped)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+You can manually <a href="#use-terminology-view-open">open</a> additional
+<a href="#use-terminology-view">views</a>, close some views, move views around,
+change the size of the different views, etc. If at any time you wish to go
+back to the original layout, you can reset the perspective, by selecting
+<span class="menuseq"><b class="menu">Window</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Perspective</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Reset Perspective&#8230;&#8203;</b></span>. Click the <b class="button">OK</b>
+button to confirm.</p>
+</div>
+<div class="paragraph">
+<p>
+
+Whenever a new release changes the default layout of a perspective, for
+instance by adding a new default view, you can reset the perspective to get
+the new view, or you can <a href="#use-terminology-view-open">open</a> that view it
+manually.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="use-apps-view">Applications view</h3>
+<div class="paragraph">
+<p>The <em>Applications</em> <a href="#use-terminology-view">view</a> can be used to manage the
+applications of the Eclipse ESCET software running within the Eclipse ESCET
+IDE.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./use/apps_view.png" alt="apps view">
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="use-opening-the-view">Opening the view</h4>
+<div class="paragraph">
+<p>The <em>Applications</em> view can be <a href="#use-terminology-view-open">opened</a> by
+selecting <span class="menuseq"><b class="menu">Window</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="submenu">Show view</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Applications</b></span>, assuming the
+<a href="#use-escet-perspective">ESCET perspective</a> is enabled.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-apps-view-status">Application status</h4>
+<div class="paragraph">
+<p>The view shows a list of running applications. If an application starts another
+application, it is shown as a child, forming a tree structure. Each item of the
+tree shows a single application. In the example screenshot above, there are
+four running applications. The first application is a <em>ToolDef interpreter</em>,
+which is running a second application, a <em>CIF simulator</em>. The third
+application is also a <em>ToolDef interpreter</em>, which is running a fourth
+application, also a <em>CIF simulator</em>.</p>
+</div>
+<div class="paragraph">
+<p>To the left of each item, the status of the application is indicated. The
+following statuses are available:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><span class="image"><img src="./use/status_starting.png" alt="status starting"></span> Staring</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_running.png" alt="status running"></span> Running</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_terminating.png" alt="status terminating"></span> Terminating</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_terminated.png" alt="status terminated"></span> Terminated</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_finished.png" alt="status finished"></span> Finished</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_failed.png" alt="status failed"></span> Failed</p>
+</li>
+<li>
+<p><span class="image"><img src="./use/status_crashed.png" alt="status crashed"></span> Crashed</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>When an application is started, it get a <em>Starting</em> state. Once the options
+have been processed from the command line and the option dialog (if requested),
+the actual application code is executed, and the status changes to <em>Running</em>.
+If the application is not terminated at the request of the user, the
+application will be done with its execution after some time. If execution
+finished without problems, it then reaches status <em>Finished</em>. If execution
+failed for some reason, it reaches status <em>Failed</em> instead. If the execution
+crashed due to internal problems, the application reaches status <em>Crashed</em>. If
+however the user <a href="#use-apps-view-termination">terminates</a> the application,
+the status is first changed to <em>Terminating</em>. Once the application has
+successfully been terminated, the status changes to <em>Terminated</em>.</p>
+</div>
+<div class="paragraph">
+<p>
+You can also view these statuses and their corresponding icons from within
+the IDE, by opening the <em>Application Status Legend</em> dialog, which is available
+via the view&#8217;s drop-down button popup menu:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./use/show_status_legend.png" alt="show status legend">
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-apps-view-termination">Termination</h4>
+<div class="paragraph">
+<p>The <em>Applications</em> view supports terminating running applications. There are
+several ways to terminate an application using the <em>Applications</em> view.</p>
+</div>
+<div class="paragraph">
+<p>When terminating an application (with a <em>Starting</em> or <em>Running</em> state), the
+application will get a <em>Terminating</em> state. Applications occasionally poll for
+termination requests. Therefore, it may take a while for the application to
+actually process the termination request. Once it has been processed, the
+application will have terminated, and the status changes to <em>Terminated</em> as
+well.</p>
+</div>
+<div class="paragraph">
+<p>Applications can&#8217;t process a termination request while a modal dialog (such as
+the option dialog) is open, or when input is requested from the console. They
+will terminate as soon as possible, after the dialog is closed, or the user has
+provided input via the console.</p>
+</div>
+<div class="paragraph">
+<p>The following buttons related to termination are available in the
+<em>Applications</em> view&#8217;s toolbar:</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Auto Terminate (<span class="image"><img src="./use/command_auto_terminate.png" alt="command auto terminate"></span>)</p>
+<div class="paragraph">
+<p>Most users will only want to have a single application running at a time,
+including application started by that application, etc. To facilitate this,
+the view provides an <em>Auto Terminate</em> feature. This feature can be enabled
+and disabled from the view&#8217;s toolbar. It is enabled by default. Your choice
+whether to enable or disable this option will be remembered, even after
+Eclipse is restarted. The feature only has an effect if the view is shown in
+at least one of the opened <a href="#use-escet-perspective">perspectives</a>.</p>
+</div>
+<div class="paragraph">
+<p>If enabled, and a new application (not started by another already running
+application) is started, all other already running applications are
+automatically terminated. The new application starts its execution
+immediately. The already running applications will start to process the
+termination request, and will terminate as soon as possible.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Terminate All (<span class="image"><img src="./use/command_terminate_all.png" alt="command terminate all"></span>)</p>
+<div class="paragraph">
+<p>The view&#8217;s toolbar contains a <em>Terminate All</em> button that can be used to
+terminate all running applications. The button is only enabled when at least
+one of the listed applications can be terminated. When clicked, all running
+applications are given a termination request, and will terminate as soon as
+possible.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Terminate (<span class="image"><img src="./use/command_terminate.png" alt="command terminate"></span>)</p>
+<div class="paragraph">
+<p>The view&#8217;s drop-down button popup menu contains a <em>Terminate</em> item that can
+be used to terminate all selected applications that are running. The item is
+only enabled when at least one of the listed applications that is selected,
+can be terminated. When clicked, all selected applications that can be
+terminated, are given a termination request, and will terminate as soon as
+possible.</p>
+</div>
+<div class="paragraph">
+<p>Even when a child application is selected, all applications in the entire
+tree, starting from the root, will be given a termination request, if not
+already terminated or having finished their execution. In other words, only
+an entire tree of related applications can be terminated.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-apps-view-removal">Removal</h4>
+<div class="paragraph">
+<p>The <em>Applications</em> view can get a bit crowded, if already terminated
+applications are not removed from the list. To keep only relevant applications,
+the <em>Applications</em> view supports removing items from the list.</p>
+</div>
+<div class="paragraph">
+<p>Only applications which have finished execution can be removed. That is, the
+root of the tree of applications needs to have a <em>Terminated</em>, <em>Finished</em>,
+<em>Failed</em>, or <em>Crashed</em> status, for the tree to be allowed to be removed. This
+prevents removing applications that are still running, which would make it
+impossible to terminate them, or observe their status.</p>
+</div>
+<div class="paragraph">
+<p>The following buttons related to removal are available in the <em>Applications</em>
+view&#8217;s toolbar:</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Auto Remove (<span class="image"><img src="./use/command_auto_remove.png" alt="command auto remove"></span>)</p>
+<div class="paragraph">
+<p>Most users will only want to only have applications listed in the view, that
+are either still running, or have just finished execution. To facilitate
+this, the view provides an <em>Auto Remove</em> feature. This feature can be enabled
+and disabled from the view&#8217;s toolbar. It is enabled by default. Your choice
+whether to enable or disable this option will be remembered, even after
+Eclipse is restarted. The feature only has an effect if the view is shown in
+at least one of the opened <a href="#use-escet-perspective">perspectives</a>.</p>
+</div>
+<div class="paragraph">
+<p>If enabled, and a new application (not started by another already running
+application) is started, all already terminated applications, will be removed
+from the list. If combined with the <em>Auto Terminate</em> feature, all other
+applications that can not be removed immediately because they are still
+running, will be removed as soon as possible, after they have been
+terminated.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove All (<span class="image"><img src="./use/command_remove_all.png" alt="command remove all"></span>)</p>
+<div class="paragraph">
+<p>The view&#8217;s drop-down button popup menu contains a <em>Remove All</em> item that can
+be used to remove all listed applications that may be removed. The item is
+only enabled when at least one of the listed applications can be removed.
+When clicked, all listed applications that can be removed, are immediately
+removed from the list.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove (<span class="image"><img src="./use/command_remove.png" alt="command remove"></span>)</p>
+<div class="paragraph">
+<p>The view&#8217;s drop-down button popup menu contains a <em>Remove</em> item that can
+be used to remove all selected applications that can be removed. The item is
+only enabled when at least one of the listed applications that is selected,
+can be removed. When clicked, all selected applications that can be
+removed, are immediately removed from the list.</p>
+</div>
+<div class="paragraph">
+<p>Even when a child application is selected, all applications in the entire
+tree, starting from the root, will be removed. In other words, only an entire
+tree of related applications can be removed, and only if all applications in
+that tree have finished execution.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="use-apps-view-expansion">Expansion</h4>
+<div class="paragraph">
+<p>When one application starts another application, they are listed in a tree,
+with the parent containing the child. When running a single application, it
+may be of interest to see which child applications are being executed by the
+parent application. However, when executing multiple applications, this may
+quickly crowd the view. It may then be better to keep all root items collapsed,
+only showing the status of the root applications. This provides an overview
+over those multiple applications.</p>
+</div>
+<div class="paragraph">
+<p>The following buttons related to expansion are available in the <em>Applications</em>
+view&#8217;s toolbar:</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Auto Expand (<span class="image"><img src="./use/command_auto_expand.png" alt="command auto expand"></span>)</p>
+<div class="paragraph">
+<p>Most users will have the <em>Auto Terminate</em> and <em>Auto Remove</em> features enabled,
+and will thus only have a single application listed. They will want to
+automatically expand a parent application, to show its children. To
+facilitate this, the view provides an <em>Auto Expand</em> feature. This feature can
+be enabled and disabled from the view&#8217;s toolbar. It is enabled by default.
+Your choice whether to enable or disable this option will be remembered, even
+after Eclipse is restarted. The feature only has an effect if the view is
+shown in at least one of the opened <a href="#use-escet-perspective">perspectives</a>.</p>
+</div>
+<div class="paragraph">
+<p>If enabled, and a parent application starts a child application, the item
+for the parent application in the view, is automatically expanded to show its
+children. If disabled, no items will be automatically expanded.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="performance-chapter-index">Resolving performance and memory problems</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>During the use of the Eclipse ESCET toolkit, you may encounter performance
+and/or memory problems. This includes slow execution, performance degradation over time,
+out-of-memory errors, etc. One way to solve such problems, is to use a
+computer that is faster and/or has more memory. If that is not an option, or
+if that doesn&#8217;t help, the following information is available to help you get
+rid of these problems:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#performance-clear-console">Clearing the console</a></p>
+</li>
+<li>
+<p><a href="#performance-reduce-console-output">Reducing console output</a></p>
+</li>
+<li>
+<p><a href="#performance-close-running-apps">Closing running applications</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings">Tweaking performance settings</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In particular, the <a href="#performance-tweak-perf-settings">Tweaking performance settings</a> section
+provides information on how to give Eclipse ESCET tools more memory. This solves the most
+common performance problems and out-of-memory errors.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="sect2">
+<h3 id="performance-clear-console">Clearing the console</h3>
+<div class="paragraph">
+<p>In the Eclipse ESCET IDE, the <em>Console</em> <a href="#use-terminology-view">view</a> displays
+the console output generated by the applications that you run. This console keeps
+all the output in memory. If the application that you run creates a lot of output,
+this can quickly fill the available memory, and lead to
+<a href="#performance-tweak-perf-settings-practical">out of memory</a> errors.</p>
+</div>
+<div class="paragraph">
+<p>By clearing the console, the output is removed and the associated memory
+becomes free for other uses. To clear the console, right click the console
+(the part of the view that contains the actual console text) and choose
+<b class="menuref">Clear</b> from the popup menu. Alternatively, click the <em>Clear Console</em>
+button (<span class="image"><img src="./performance/clear_console.png" alt="clear console"></span>) of the <em>Console</em>
+view&#8217;s toolbar.</p>
+</div>
+<div class="paragraph">
+<p>The Eclipse <em>Console</em> view does not just keep the console output of the
+currently running application or applications in memory, it also keeps the
+output of all terminated applications in memory. To look at the applications
+that you executed, click the small arrow next to the <em>Display Selected Console</em>
+icon (<span class="image"><img src="./performance/console_pages.png" alt="console pages"></span>) of the <em>Console</em>
+view&#8217;s toolbar.A list of executed applications will appear, that looks
+something like this:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/console_pages_list.png" alt="console pages list">
+</div>
+</div>
+<div class="paragraph">
+<p>In this case, four applications have been launched. The console output for the
+fourth application is currently displayed on the console, as indicated by the
+selection indicator on the left. Clicking on any of the other applications will
+activate the console for that application, and show its console output in the
+<em>Console</em> view. Clearing the console of applications that have
+terminated can free a lot of memory for other uses, if the applications
+produced a lot of console output.</p>
+</div>
+<div class="paragraph">
+<p>
+Note that instead of clearing the console after a lot of output has been
+generated, it is often better to <a href="#performance-reduce-console-output">prevent</a>
+that much output from being created in the first place.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="performance-reduce-console-output">Reducing console output</h3>
+<div class="paragraph">
+<p>Console output is expensive. Not only because of the amount of memory the
+generated console output uses, but also because the console output itself needs
+to be generated, and displayed on the console. Reducing console output can
+significantly increase the performance of our tools.</p>
+</div>
+<div class="paragraph">
+<p>Therefore, instead of <a href="#performance-clear-console">clearing the console</a>, it
+may be better to prevent that much output from being written to the console
+in the first place. If your model itself generates a lot of console output,
+consider letting it generate less output. Alternatively, if the tool you use
+generates a lot of console output, consider checking its options to see if
+you can disable certain console output.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+All Eclipse ESCET applications have an <em>Output mode</em> option (<em>General</em>
+category). Changing the value of this option from <em>Debug</em> to <em>Normal</em>,
+or from <em>Normal</em> to <em>Warning</em> may significantly reduce the amount of output
+that is written to the console. Note however that this is mostly an all or
+nothing approach. It is often much better to use application specific
+settings, or change your model, to reduce the amount of output that is
+generated, as it allows for more control over what output is or isn&#8217;t
+generated.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="performance-close-running-apps">Closing running applications</h3>
+<div class="paragraph">
+<p>One of the nice features of an the Eclipse ESCET IDE is that it allows the
+simultaneous execution of multiple applications, as well as the simultaneous
+execution of a single application on many different inputs. For instance, it
+is possible to simultaneously simulate two models using a simulator. The
+downside is that running multiple applications at the same time, costs more
+memory. Sometimes, if you forget to close an application, it can still
+consume memory, and may even still be running active computations, thus
+consuming processing power.</p>
+</div>
+<div class="sect3">
+<h4 id="performance-application-management-via-the-applications-view">Application management via the applications view</h4>
+<div class="paragraph">
+<p>The <a href="#use-apps-view">Applications view</a> can also be used observe the
+<a href="#use-apps-view-status">status</a> of running applications, and to
+<a href="#use-apps-view-termination">terminate</a> them.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-application-management-via-the-console-view">Application management via the console view</h4>
+<div class="paragraph">
+<p>The Eclipse <em>Console</em> <a href="#use-terminology-view">view</a> maintains the console
+output for all running and finished applications. To look at the applications
+that you executed, click the small arrow next to the <em>Display Selected Console</em>
+icon (<span class="image"><img src="./performance/console_pages.png" alt="console pages"></span>) of the <em>Console</em> view&#8217;s
+toolbar. A list of executed applications will appear, that looks something
+like this:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/console_pages_list.png" alt="console pages list">
+</div>
+</div>
+<div class="paragraph">
+<p>In this case, of the four applications that have been started, the second and
+fourth are still running. The console for the fourth application is currently
+displayed, as indicated by the selection indicator on the left. Clicking on any
+of the other applications will activate the console for that application,
+allowing it to be terminated, thus freeing resources for other applications.</p>
+</div>
+<div class="paragraph">
+<p>The application that is currently active in the console can be terminated at
+any time, by using the <em>Terminate</em> button
+(<span class="image"><img src="./performance/terminate_button.png" alt="terminate button"></span>),
+located at the upper right corner of the console. Note however that if the
+console does not have the focus, this button may not be visible. If the button
+is not visible, click somewhere in the console to make the button appear. If
+even then the button is still not available, it may still appear if you
+<em>Maximize</em> the console. Also note that the button has no effect
+while the application interactively asks for input from the console. However,
+once the console input is provided, and <kbd>ENTER</kbd> is pressed, the
+termination request will be processed.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="performance-tweak-perf-settings">Tweaking performance settings</h3>
+<div class="paragraph">
+<p>If you run into errors related to running out of memory, you may need to tweak
+some settings. However, even if you don&#8217;t get errors, tweaking settings can
+significantly improve performance.</p>
+</div>
+<div class="paragraph">
+<p>This page provides a lot of background information, to allow you to better
+understand the impact of the various settings. If you wish, you can skip the
+background information, and go directly to the
+<a href="#performance-tweak-perf-settings-quickdirty">Quick and dirty solution</a> section.</p>
+</div>
+<div class="paragraph">
+<p>The following information is available on this page:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#performance-tweak-perf-settings-quickdirty">Quick and dirty solution</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-managed-gc">Managed memory and garbage collection</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-types">Different types of memory</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-benefits">Benefits of increasing the available memory</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-available">Available settings</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-change">Changing memory settings</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-practical">Practical hints to solve performance and memory problems</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-heapstatus">Monitoring Eclipse heap status</a></p>
+</li>
+<li>
+<p><a href="#performance-tweak-perf-settings-jvisualvm">Monitoring with JVisualVM</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-quickdirty">Quick and dirty solution</h4>
+<div class="paragraph">
+<p>This section explains a 'quick and dirty' solution that gives Eclipse more
+memory, resolving the most common performance problems and out-of-memory
+errors.</p>
+</div>
+<div class="paragraph">
+<p>Find the <code>eclipse.ini</code> file. By default, it is located in your Eclipse
+ESCET installation directory, except for macOS, where instead it is in the
+<code>Eclipse.app/Contents/MacOS</code> directory inside the Eclipse ESCET installation
+directory. Modify the last line (usually <code>-Xmx4g</code>). Replace it by the
+following to change the maximum available memory from 4
+<a href="https://en.wikipedia.org/wiki/Gibibyte">GiB</a> to 8 GiB:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code>-Xmx8g</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Restart the Eclipse ESCET IDE or command line script to apply the new
+settings. If the instructions given here don&#8217;t fix your problem, or if
+the IDE or script will no longer start after you changed these settings,
+you should read the remainder of this page.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-managed-gc">Managed memory and garbage collection</h4>
+<div class="paragraph">
+<p>Before going into the actual settings, this section provides a little
+background on managed memory and garbage collection, to make it easier to
+understand the following sections. The information here is highly simplified,
+in order not to complicate matters too much.</p>
+</div>
+<div class="paragraph">
+<p>The Eclipse ESCET IDE and command line scripts run on
+<a href="https://en.wikipedia.org/wiki/Java_%28programming_language%29">Java</a>, a
+computer programming language. The <em>Java Virtual Machine</em> (JVM) manages all
+memory used by Eclipse, as well as the Eclipse ESCET tools. This page focuses
+on the Oracle JVM, as that is the JVM that we recommend. JVMs from other
+vendors may behave differently, and may have different settings. Also, new
+versions of the JVM often change/tweak their garbage collector, settings,
+defaults, etc. As such, the information on this page should be used to guide
+you, but may not be completely accurate.</p>
+</div>
+<div class="paragraph">
+<p>The JVM keeps track of all data that is maintained by the Eclipse ESCET tools,
+and releases (frees) the memory once it is no longer needed, so that it can
+be used to store other data. The JVM frees memory by means of a process called
+<a href="https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29">garbage collection</a>
+(GC). Garbage collection is a complex process, but generally it consists of
+locking the memory to avoid modification during garbage collection, finding the
+data that is no longer used (mark the garbage), and then freeing the memory
+associated with that data (sweep the marked garbage).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-types">Different types of memory</h4>
+<div class="paragraph">
+<p>In order to understand the memory related settings, some understanding of
+Java&#8217;s memory architecture is essential. The following figure provides an
+overview of Java&#8217;s memory architecture, and the different types of memory that
+are used:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/java_memory.png" alt="java memory">
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+The operating system (OS) has memory available, either as physical
+<a href="https://en.wikipedia.org/wiki/Random-access_memory">RAM</a>, or
+as
+<a href="https://en.wikipedia.org/wiki/Virtual_memory">virtual memory</a>.
+When Java is executed, the Java program (<code>java</code> executable on Linux and macOS,
+<code>java.exe</code> on Windows), becomes one of the running
+<a href="https://en.wikipedia.org/wiki/Process_%28computing%29">processes</a>. The
+process uses a part of the operating system&#8217;s memory to store its data. This
+memory is called the <em>Java process heap</em>. The <em>Java process heap</em> is divided
+into two parts, the <em>Java object heap</em> and <em>'Everything else'</em>. The
+<em>Java object heap</em> contains all data actually used by the running Java program,
+which in our case is the Eclipse ESCET IDE and/or Eclipse ESCET command line
+scripts. The <em>'Everything else'</em> part contains various data, mostly used by
+the JVM internally.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+Java uses a generational garbage collector. New data, called <em>objects</em> in Java,
+are created in the <em>young generation</em>, or more specifically, in its
+<em>allocation space</em> (also called <em>eden space</em>). When the young generation
+becomes full, the garbage collector will remove all garbage (no longer used
+data) using a <em>minor collection</em>, which removes garbage from the young
+generation. The garbage collector uses the survivor spaces to store the
+surviving objects. Objects that survive a few minor collections are moved to
+the <em>old generation</em>, which stores the longer living objects, as well as the
+larger objects that don&#8217;t fit in the young generation, which is usually much
+smaller than the old generation. When the old generation becomes full, the
+garbage collector performs a <em>major collection</em> removing garbage from the
+entire Java object heap, which is much more work, and thus much more costly
+than a minor collection.</p>
+</div>
+<div class="paragraph">
+<p>The <em>'Everything else'</em> part of the Java process heap contains various data
+used internally by the JVM. This includes the <em>'Metaspace'</em> with all the Java
+code of Eclipse and our own plugins, the values of constants, etc. It also
+includes the <em>native code</em>, the highly optimized code generated for the
+specific
+<a href="https://en.wikipedia.org/wiki/Computer_architecture">architecture</a>
+of your machine, that can actually be executed on your processor. Furthermore,
+it includes the
+<a href="https://en.wikipedia.org/wiki/Stack-based_memory_allocation">stacks</a>
+of all the
+<a href="https://en.wikipedia.org/wiki/Thread_%28computer_science%29">threads</a>
+that are running in parallel. There is also a part that contains the data
+maintained by the garbage collector itself, for administrative purposes. The
+'Everything else' part contains various other types of data, that are
+irrelevant for the current discussion.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-benefits">Benefits of increasing the available memory</h4>
+<div class="paragraph">
+<p>If Java runs out of available memory, our applications running in Eclipse will
+terminate with an 'out of memory' error message. In such cases, increasing the
+available memory will likely solve the problem. However, even if you don&#8217;t run
+out of memory, increasing the amount of memory that is available to Java can
+significantly improve Java&#8217;s performance.</p>
+</div>
+<div class="paragraph">
+<p>The garbage collector performs a minor collection when the young generation
+becomes 'full'. Here, 'full' doesn&#8217;t necessarily mean 100%, as Java by default
+tries to keep the heap about 40% to 70% filled. Increasing the size of the
+young generation makes it possible to allocate more new objects before the
+young generation becomes 'full'. During garbage collection, program execution
+may become halted, to ensure that memory doesn&#8217;t change during the collection
+process. The longer one can go without garbage collection, the less halting,
+and thus the greater the performance of the program.</p>
+</div>
+<div class="paragraph">
+<p>
+
+If an application uses a lot of data that lives for longer periods of time, the
+old generation may become mostly filled with data. It then becomes harder and
+harder for the garbage collector to move objects from the young generation to
+the old generation. This may be caused by
+<a href="https://en.wikipedia.org/wiki/Fragmentation_%28computing%29">fragmentation</a>,
+due to some objects from the old generation being removed by the garbage
+collector. In such cases, if the <em>gaps</em> are too small to hold the new objects,
+the old generation may need to be <em>compacted</em>, a form of
+<a href="https://en.wikipedia.org/wiki/Defragmentation">defragmentation</a>. After
+compaction, the single larger gap hopefully has more than enough free space to
+contain the new objects. The compaction process is expensive, as a lot of
+objects need to moved. If the situation gets really bad, Java may need to spend
+more time performing expensive garbage collection operations than it spends
+time on actually executing the program you&#8217;re running. By increasing the size
+of the old generation to more than the application needs, a lot more free space
+is available, reducing the need for frequent compaction, thus significantly
+increasing the performance of the application.</p>
+</div>
+<div class="paragraph">
+<p>These are just some of the reasons why increasing the amount of available
+memory can improve program execution times, even though enough memory was
+already available to complete the given task. In general, the more memory
+Java has, the better it performs.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-available">Available settings</h4>
+<div class="paragraph">
+<p>The JVM has
+<a href="https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html">way too many options</a>
+to list here, but the settings listed in this section are of particular
+practical relevance. Most of the settings affect memory sizes. Each setting is
+described using a name, a command line syntax (between parentheses), and a
+description. The command line syntax is used to specify the setting, as
+explained in the <a href="#performance-tweak-perf-settings-change">Changing memory settings</a> section.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Initial Java object heap size (<code>-Xms&lt;size&gt;</code>)</p>
+<div class="paragraph">
+<p>The size of the Java object heap when Java starts. Java will increase and/or
+decrease the size of the Java object heap as needed.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Maximum Java object heap size (<code>-Xmx&lt;size&gt;</code>)</p>
+<div class="paragraph">
+<p>The maximum size of the Java object heap. Java will increase the size of the
+Java object heap as needed, but never to more than the amount indicated by
+this setting.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Minimum percentage of free heap space (<code>-XX:MinHeapFreeRatio=&lt;n&gt;</code>)</p>
+<div class="paragraph">
+<p>Java will increase the size of the Java object heap as needed. Frequent heap
+resizing is costly. To prevent frequent resizing, the JVM allocates more
+space than it really needs. This way, a lot of new objects can be allocated
+before running out of space, which requires the heap to be increased again.</p>
+</div>
+<div class="paragraph">
+<p>This setting indicates the desired minimum percentage of free heap space
+after each garbage collection operation. This is a desired percentage only,
+and if it conflicts with other settings, it is ignored. For instance, if this
+setting is set to 40% (the default), but 80% of the maximum heap size is in
+use, only 20% free space may be allocated.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Maximum percentage of free heap space (<code>-XX:MaxHeapFreeRatio=&lt;n&gt;</code>)</p>
+<div class="paragraph">
+<p>Java will decrease the size of the Java object heap if possible, to ensure
+that Java doesn&#8217;t keep claiming memory that it no longer needs. Frequent heap
+resizing is costly. To prevent frequent resizing, the JVM allocates more
+space than it really needs. This way, a lot of new objects can be allocated
+before running out of space, which requires the heap to be increased again.</p>
+</div>
+<div class="paragraph">
+<p>This setting indicates the desired maximum percentage of free heap space
+after each garbage collection operation. The default is 70%.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Ratio of young/old generation sizes (<code>-XX:NewRatio=&lt;n&gt;</code>)</p>
+<div class="paragraph">
+<p>The ratio (1:n) of the young generation size to the old generation size. That
+is, with a ratio of 1:8, the old generation is 8 times as large as the young
+generation. In the command line syntax, the <code>8</code> is specified. The default
+value depends on the JVM that is used (Client VM vs Server VM, JVM version,
+32-bit vs 64-bit, operating system, etc), but is usually <code>4</code>, <code>8</code>, or <code>12</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Ratio of allocation/survivor space sizes (<code>-XX:SurvivorRatio=&lt;n&gt;</code>)</p>
+<div class="paragraph">
+<p>The ratio (1:n) of the survivor spaces size to the allocation space size.
+That is, with a ratio of 1:8, the allocation space is 8 times as large as the
+survivor space. In the command line syntax, the <code>8</code> is specified. The
+default value depends on the JVM that is used (Client VM vs Server VM,
+JVM version, 32-bit vs 64-bit, operating system, etc). Some of the defaults
+include <code>6</code>, <code>25</code>, and <code>32</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Use garbage collector overhead limit (<code>-XX:+UseGCOverheadLimit</code>)</p>
+<div class="paragraph">
+<p>By default, the JVM uses a policy that limits the proportion of the VM&#8217;s time
+that is spent on the garbage collector. If the limit is exceeded, the garbage
+collector has trouble doing its work (usually due to too little free memory),
+and performance is impacted so badly, that executed is practically halted.
+Instead of continuing, the JVM will issue an 'out of memory' error.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Maximum code cache size (<code>-XX:ReservedCodeCacheSize=&lt;size&gt;</code>)</p>
+<div class="paragraph">
+<p>The maximum size of the code cache for native code. The default value depends
+on the JVM that is used (Client VM vs Server VM, JVM version, 32-bit vs
+64-bit, operating system, etc), and can be anything from <code>32m</code> to <code>2048m</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Client VM vs Server VM (<code>-client</code>, <code>-server</code>)</p>
+<div class="paragraph">
+<p>The JVM can be run as either the Client VM or the Server VM. The Server VM
+performs more optimizations than the Client VM, leading to faster execution.
+However, these optimizations take time as well, making the Server VM start
+up slower than the Client VM. Note that the JVM compiles and optimizes code
+even during its execution. For longer running operations, the additional
+optimizations performed by the Server VM can make the execution significantly
+faster.</p>
+</div>
+<div class="paragraph">
+<p>The Client VM is not available on 64-bit JVMs. If the specified VM is not
+available, the setting is ignored. The default VM depends on the processor
+architecture and operating system. See Oracle&#8217;s
+<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html">Server-Class Machine Detection</a>
+page for more information.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Compile threshold (<code>-XX:CompileThreshold=&lt;n&gt;</code>)</p>
+<div class="paragraph">
+<p>By default, the JVM runs in mixed mode, which means that some code is interpreted,
+while other code is compiled to native code, which runs much faster. Since
+compilation takes time as well, compilation is only performed for often used
+code.</p>
+</div>
+<div class="paragraph">
+<p>This setting indicates the number of method (a peace of Java code)
+invocations/branches before a method is compiled for improved performance.
+The default is <code>10000</code>.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Thread stack size (<code>-Xss&lt;size&gt;</code>)</p>
+<div class="paragraph">
+<p>The size of the stack of each thread.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;size&gt;</code> part of the command line syntax is to be replaced by an actual
+size, in bytes. The size can be postfixed with a <code>k</code> or <code>K</code> for
+<a href="https://en.wikipedia.org/wiki/Kibibyte">kibibytes</a>, an <code>m</code> or <code>M</code> for
+<a href="https://en.wikipedia.org/wiki/Mebibyte">mebibytes</a>, or a <code>g</code> or <code>G</code> for
+<a href="https://en.wikipedia.org/wiki/Gibibyte">gibibytes</a>. For instance, <code>32k</code> is
+32 kibibytes, which is equal to <code>32768</code>, which is 32,768 bytes.</p>
+</div>
+<div class="paragraph">
+<p>The <code>&lt;n&gt;</code> part of the command line syntax is to be replaced by an integer
+number. The values that are allowed are option specific.</p>
+</div>
+<div class="paragraph">
+<p>The <code>+</code> part of the command line syntax indicates that the corresponding
+feature is to be enabled. Replace the <code>+</code> by a <code>-</code> to disable the feature
+instead of enabling it.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-change">Changing memory settings</h4>
+<div class="paragraph">
+<p>There are several ways to supply the command line arguments for the settings to
+Java. The easiest way to do it, when using Eclipse, is to modify the
+<code>eclipse.ini</code> file. By default, it is located in your Eclipse
+ESCET installation directory, except for macOS, where instead it is in the
+<code>Eclipse.app/Contents/MacOS</code> directory inside the Eclipse ESCET installation
+directory.</p>
+</div>
+<div class="paragraph">
+<p>Each of the settings you want to change should be added to the <code>eclipse.ini</code>
+text file, in the command line syntax. Each setting must be put on a line
+<em>by itself</em>. Furthermore, all these JVM settings must be put <em>after</em> the line
+that contains <code>-vmargs</code>. Settings on lines before the <code>-vmargs</code> line are the
+settings for the launcher that starts Eclipse, and should <em>not</em> be changed.</p>
+</div>
+<div class="paragraph">
+<p>Note that the default <code>eclipse.ini</code> file supplied with Eclipse may already
+contain some of the settings. If so, don&#8217;t add the setting again. Instead,
+change the value of the existing setting. The settings that are present by
+default, as well as their values, may change from release to release.</p>
+</div>
+<div class="paragraph">
+<p>After modifying <code>eclipse.ini</code>, restart the Eclipse ESCET IDE or command line
+script for the changes to take effect.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="sect4">
+<h5 id="performance-miscellaneous-troubleshooting">Miscellaneous troubleshooting</h5>
+<div class="paragraph">
+<p>If the <code>ECLIPSE_HOME</code> environment variable is defined, that directory is used
+instead of the default directory, to look for <code>eclipse.ini</code>. However, most
+users should not be affected by this.</p>
+</div>
+<div class="paragraph">
+<p>Using the <code>-vmargs</code> command line option replaces the similar settings from
+the <code>eclipse.ini</code> file. For most users, this will not be applicable.
+If <code>--launcher.appendVmargs</code> is specified either in the <code>eclipse.ini</code> file,
+or on the command line, the <code>-vmargs</code> settings of the command line are added
+to the <code>eclipse.ini</code> file <code>-vmargs</code> instead, instead of replacing them.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-practical">Practical hints to solve performance and memory problems</h4>
+<div class="paragraph">
+<p>
+In general, giving Java extra memory only makes it perform better. As such,
+increasing the maximum Java object heap size (<code>-Xmx</code>), is generally a good
+idea, if you have enough free memory.</p>
+</div>
+<div class="paragraph">
+<p>
+If you actually run out of memory, Java will emit a
+<code>java.lang.OutOfMemoryError</code>, with a message to indicate the type of memory
+that was insufficient. Below the most common out of memory error message are
+listed, with possible solutions:</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>java.lang.OutOfMemoryError: Java heap space</code></p>
+<div class="paragraph">
+<p>The Java object heap needs more space. Increase the maximum Java object heap
+size (<code>-Xmx</code> setting).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>java.lang.OutOfMemoryError: GC overhead limit exceeded</code></p>
+<div class="paragraph">
+<p>The 'use garbage collector overhead limit' feature is enabled, and the
+garbage collector overhead limit was exceeded. The best way to solve this,
+is to make sure the limit is not exceeded, by giving Java more memory, and
+thus making it easier for the garbage collector to do its work. Increase the
+maximum Java object heap size (<code>-Xmx</code> setting).</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, disable the 'use garbage collector overhead limit' feature
+(<code>-XX:-UseGCOverheadLimit</code> setting, note the <code>-</code> instead of the <code>+</code>).
+However, this doesn&#8217;t solve the underlying problem, as the limit will still
+be exceeded. Java will try to continue, and will either fail, or be very
+slow.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>warning: CodeCache is full. Compiler has been disabled.</code></p>
+<div class="paragraph">
+<p>This message is not a <code>java.lang.OutOfMemoryError</code>, but may still be
+printed to the console. It is usually followed by <code>warning: Try increasing
+the code cache size using -XX:ReservedCodeCacheSize=</code>. The warnings indicate
+that the code cache for native code is full. They already indicate the
+solution: increase the maximum size of the code cache
+(<code>-XX:ReservedCodeCacheSize</code> setting).</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>java.lang.OutOfMemoryError: unable to create new native thread</code></p>
+<div class="paragraph">
+<p>A new thread could not be created. The best way to solve this problem is to
+decrease the maximum Java object heap size (<code>-Xmx</code> setting), to make room
+for the 'Everything else' part of the Java memory, including the stack of the
+new thread.</p>
+</div>
+<div class="paragraph">
+<p>Alternatively, decrease the size of stacks on all threads (<code>-Xss</code> setting).
+However, decreasing the thread stack size may cause more
+<code>java.lang.StackOverflowError</code> errors, and is thus not recommended.</p>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="paragraph">
+<p>Giving the JVM too much memory (especially via the <code>-Xmx</code> setting), can make
+the JVM fail to start, or crash
+shortly after starting. This problem mostly applies to 32-bit JVMs. The JVM
+needs to reserve a contiguous region of memory, or rather a contiguous region
+of the
+<a href="https://en.wikipedia.org/wiki/Address_space">address space</a>. On 32-bit
+JVMs, at most 4 GB of space can be addressed, of which a part is already in use
+by the operating system, drivers, and other applications. Thus, requesting too
+much memory, even if it is available, may cause problems, if no contiguous
+region of address space of that size is available when starting the JVM. If you
+request too much memory, you may get a <code>Invalid maximum heap size: -Xmx****m
+The specified size exceeds the maximum representable size. Could not create the
+Java virtual machine.</code> or <code>Error occurred during initialization of VM Could
+not reserve enough space for object heap</code> error when starting the JVM. For
+64-bit JVMs, the address space is practically infinite, and this should not be
+a problem.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-heapstatus">Monitoring Eclipse heap status</h4>
+<div class="paragraph">
+<p>In Eclipse, it is possible to observe the amount of Java object heap space that
+is being used. In Eclipse, open the <em>Preferences</em> dialog, via
+<span class="menuseq"><b class="menu">Window</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Preferences</b></span>. Select the <em>General</em> category on the left, if not
+already selected. On the right, make sure the <b class="menuref">Show heap status</b> option is
+checked, and click <b class="button">OK</b> to close the dialog.</p>
+</div>
+<div class="paragraph">
+<p>The heap status should now be displayed in the bottom right corner of the
+Eclipse window:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/eclipse_heap_status1.png" alt="eclipse heap status1">
+</div>
+</div>
+<div class="paragraph">
+<p>This example shows that the Java object heap (not the Java process heap) is
+currently 147 MB in size. Of that 147 MB, 62 MB are in use. The entire graph
+(the gray background) indicates the total heap size (147 MB), while the yellow
+part indicates the used part of the heap (62 MB).</p>
+</div>
+<div class="paragraph">
+<p>Clicking on the garbage can icon, to the right of the heap status, will trigger
+a major collection cycle of the garbage collector.</p>
+</div>
+<div class="paragraph">
+<p>By right clicking on the heap status, and enabling the <em>Show Max Heap</em> option,
+the heap status shows more information:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/eclipse_heap_status2.png" alt="eclipse heap status2">
+</div>
+</div>
+<div class="paragraph">
+<p>The text still shows the amount of used heap memory (74 MB) out of the total
+size of the current heap (147 MB). The scale of the background colors however,
+is different. The entire graph (the gray background) now indicates the maximum
+heap size. The orange part indicates the current heap size. The yellow part
+still indicates the part of the heap that is in use. If the used part of the
+memory gets past the red bar, it will become red as well, to indicate that you
+are approaching the maximum allowed Java object heap size, and may need to
+increase it (<code>-Xmx</code> setting).</p>
+</div>
+<div class="paragraph">
+<p>Hover over the heap status to get the same information in a tooltip.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="performance-tweak-perf-settings-jvisualvm">Monitoring with JVisualVM</h4>
+<div class="paragraph">
+<p>The <em>Java Development Kit</em> (JDK) includes a program called JVisualVM. JVisualVM
+can be used to monitoring, troubleshoot, and profile running Java applications.</p>
+</div>
+<div class="paragraph">
+<p>To start JVisualVM:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>On Windows, go to the directory in which the JDK is installed (usually
+something like <code>C:\Program Files\Java\jdk1.8.0_55</code>. Start <code>jvisualvm.exe</code>
+from the <code>bin</code> sub-directory, by double clicking on it.</p>
+</li>
+<li>
+<p>On Linux, find the directory in which the JDK is installed (may
+vary depending on the Linux distribution that you use). Start <code>jvisualvm</code>
+from the <code>bin</code> sub-directory. You may be able to simply enter <code>jvisualvm</code>
+in a terminal window and press <kbd>ENTER</kbd>.</p>
+</li>
+<li>
+<p>On macOS, find the directory in which the JDK is installed (may vary
+depending on the Java version, and whether you use an Apple JDK or an Oracle
+JDK). A likely candidate is something like
+<code>/System/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home</code>. Launch
+the <code>jvisualvm</code> binary from the <code>bin</code> sub-directory. You may be able to
+simply enter <code>jvisualvm</code> in a terminal window and press <kbd>ENTER</kbd>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If your JDK does not contain JVisualVM, you can download it from the
+<a href="https://visualvm.github.io/">VisualVM website</a>.</p>
+</div>
+<div class="paragraph">
+<p>After you start JVisualVM for the first time, you&#8217;ll see some dialogs. Just go
+through the steps until you get to the actual application.</p>
+</div>
+<div class="paragraph">
+<p>In JVisualVM, you&#8217;ll see the currently running Java applications, for the local
+system:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/jvisualvm_pid.png" alt="jvisualvm pid">
+</div>
+</div>
+<div class="paragraph">
+<p>Sometimes JVisualVM can identify the Java applications, sometimes it can&#8217;t.
+This may also depend on you operating system, and the version of JVisualVM.
+Find the application you want to know more about and double click it. A new
+tab opens on the right. The new tab has various tabs of its own:</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><em>Overview</em>: provides various basic information, including the
+location of the JVM, its command line settings, etc.</p>
+</li>
+<li>
+<p><em>Monitor</em>: provides a quick overview of among others the CPU usage,
+GC activity, Java object heap usage, number of loaded classes, and the number
+of running threads, over time.</p>
+</li>
+<li>
+<p><em>Threads</em>: provides an overview of the running threads, and their
+status, over time. The <b class="button">Thread Dump</b> button can be used to dump the
+stack traces of all currently running threads.</p>
+</li>
+<li>
+<p><em>Sampler</em> and <em>Profiler</em>: provide CPU and memory
+<a href="https://en.wikipedia.org/wiki/Profiling_%28computer_programming%29">profiling</a>, over
+time, by using sampling and instrumentation respectively.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The <em>Monitor</em> tab can be used to determine which type of memory should be
+increased. The <em>Sampler</em> tab can be used to profile an application, and
+figure out where bottlenecks are. This information can be used
+by the developers of the application to improve the performance of the
+application, by removing those bottlenecks.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./performance/jvisualvm_sshot.png" alt="jvisualvm sshot">
+</div>
+</div>
+<div class="paragraph">
+<p>
+Via <span class="menuseq"><b class="menu">Tools</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Plugins</b></span> you can access the <em>Plugins</em> window, where you manage
+the plugins. Various plugins are available. The <em>Visual GC</em> plugin is of
+particular interest. After installing it, restart JVisualVM, or close the
+tabs of the JVMs you&#8217;re monitoring and open them again. You&#8217;ll get an extra tab
+for monitored JVMs, the <em>Visual GC</em> tab. This tab is somewhat similar to the
+<em>Monitor</em> tab, but shows more detailed information about the garbage collector,
+its various generations, etc.</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="developer-chapter-index">Eclipse ESCET development</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Thanks for your interest in Eclipse Supervisory Control Engineering Toolkit
+(Eclipse ESCET) project.</p>
+</div>
+<div class="paragraph">
+<p>For more information about the project, see:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://projects.eclipse.org/projects/technology.escet">Eclipse ESCET project home</a></p>
+</li>
+<li>
+<p><a href="https://eclipse.org/escet">Eclipse ESCET website</a></p>
+</li>
+</ul>
+</div>
+<div id="develop-dev-list" class="paragraph">
+<p>Contact the project developers via the project&#8217;s 'dev' list.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://accounts.eclipse.org/mailing-list/escet-dev">Eclipse ESCET 'dev' list</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For other means to interact with the Eclipse ESCET community and its
+developers, see the <a href="#contact-chapter-index">contact</a> section.</p>
+</div>
+<div class="paragraph">
+<p>Further topics:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#developer-development-process-chapter-index">Development process</a></p>
+</li>
+<li>
+<p><a href="#developer-contributing-chapter-index">Contributing</a></p>
+</li>
+<li>
+<p><a href="#developer-issue-tracking-chapter-index">Issue tracking</a></p>
+</li>
+<li>
+<p><a href="#developer-dev-env-setup-chapter-index">Development environment setup</a></p>
+</li>
+<li>
+<p><a href="#developer-git-repo-chapter-index">Git repository</a></p>
+</li>
+<li>
+<p><a href="#developer-coding-standards-chapter-index">Coding standards</a></p>
+</li>
+<li>
+<p><a href="#developer-building-and-testing-chapter-index">Building and testing</a></p>
+</li>
+<li>
+<p><a href="#developer-release-process-chapter-index">Release process</a></p>
+</li>
+<li>
+<p><a href="#developer-third-party-tools-chapter-index">Third party tools</a></p>
+</li>
+<li>
+<p><a href="#developer-upgrade-instructions-chapter-index">Upgrade instructions</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect2">
+<h3 id="developer-development-process-chapter-index">Development process</h3>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+If you want to contribute to the Eclipse ESCET project, please refer to
+the specific <a href="#developer-contributing-chapter-index">contributing</a> information.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The Eclipse ESCET project primarily uses GitLab for its development:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet">Eclipse ESCET GitLab</a></p>
+</li>
+</ul>
+</div>
+<div class="sect3">
+<h4 id="developer-discussion">Discussion</h4>
+<div class="paragraph">
+<p>It is often a good idea to first discuss new ideas and features with the rest
+of the project developers, i.e. the project committers and the project
+community. Discussions can take place on the project&#8217;s
+<a href="#developer-chapter-index">'dev' list</a>, especially for radical
+new ideas and new features that have not been discussed before.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-issue-tracking">Issue tracking</h4>
+<div class="paragraph">
+<p>If the project committers and the community agree that it is a good idea
+to have the new feature, an issue should be created in the
+<a href="#developer-issue-tracking-chapter-index">issue tracker</a>. For improvements
+where extensive discussion is not expected, as well as for obvious bugs, an
+issue can be created directly, without first discussing it on the 'dev' list.
+The discussion can also continue in the issue itself, once the issue is
+created.</p>
+</div>
+<div class="paragraph">
+<p>When creating an issue, take the following into account:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>An issue must be created in the issue tracker for all development, however
+small. This ensures we can link issues can commits to keep track of
+everything.</p>
+</li>
+<li>
+<p>Issues are ideally kept relatively small in scope. Bigger tasks can be split
+up into multiple issues, and follow-up issues can be created as needed. This
+allows to separate concerns, and also to work in a more agile way, e.g.:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Issues can be addressed more quickly.</p>
+</li>
+<li>
+<p>Merge requests can be reviewed more easily as they are not as big.</p>
+</li>
+<li>
+<p>Merge issues are less likely to occur, as branches have a shorter lifespan.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>If a new feature is split up into multiple issues, these can be related
+together using an epic. In such cases, add the issues to the epic to track
+the progress of the new feature using the epic.</p>
+</li>
+<li>
+<p>Attach the appropriate
+<a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/labels">predefined labels</a>
+to the issue:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Either something is broken ('Bug' label) or we want something more,
+different, better, etc ('Enhancement' label).</p>
+</li>
+<li>
+<p>Add all relevant component labels (e.g. 'Chi' and 'CIF' labels). Typically
+at least one such label should be present, but it is also possible to add
+multiple labels if the issue involves multiple components. The components
+correspond to the directories in the root of our
+<a href="#developer-git-repo-chapter-index">Git repository</a>.</p>
+</li>
+<li>
+<p>The Eclipse ESCET project committers can add the 'Help Wanted' label to an
+issue to indicate that they don&#8217;t have the time to work on the issue, and that
+help from the community is wanted.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Link the issue to any other issues, as relevant, e.g. if an issue requires
+that another issue is addressed first.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-releases-and-milestones">Releases and milestones</h4>
+<div class="paragraph">
+<p>For every release a GitLab milestone is created, to track the scope and
+progress of the release. Milestones are created for public releases as well
+as for e.g. release candidates.</p>
+</div>
+<div class="paragraph">
+<p>For every release, first the scope is discussed and agreed upon. Then, a
+GitLab milestone is created, the relevant issues are created if not yet
+present, and the issues are associated with the milestone. The issues can
+then be picked up to be addressed.</p>
+</div>
+<div class="paragraph">
+<p>See also:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/milestones">Eclipse ESCET milestones</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-working-on-issues">Working on issues</h4>
+<div class="paragraph">
+<p>The process to work on issues is as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Unassigned issues can be picked up.</p>
+</li>
+<li>
+<p>Assign yourself to the issue when you are working on an issue, such
+that others won&#8217;t start working on it as well.</p>
+</li>
+<li>
+<p>Unassign yourself if you are no longer working on an issue, don&#8217;t plan to
+continue, and the issue is not finished.</p>
+</li>
+<li>
+<p>Don&#8217;t unassign yourself after finishing the work, just close the issue.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-working-with-branches">Working with branches</h4>
+<div class="paragraph">
+<p>The Eclipse ESCET project roughly follows the
+<a href="https://nvie.com/posts/a-successful-git-branching-model/">GitFlow branching model</a>.
+The <code>master</code> branch is thus for released content only, and the current development
+status is captured in the <code>develop</code> branch.</p>
+</div>
+<div class="paragraph">
+<p>If possible, we approach the somewhat heavy GitFlow branching model in a
+practical way, reducing overhead.</p>
+</div>
+<div class="paragraph">
+<p>When creating and working with branches, consider the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Always work in a branch for the issue. That is, never commit directly to the
+<code>develop</code> branch, but always use a merge request from a feature branch.</p>
+</li>
+<li>
+<p>Branches for work on issues (feature branches) should be relatively short
+lived. This makes it easier to keep the overview, allows for more agile
+development, and reduces the chance for merge conflicts.</p>
+</li>
+<li>
+<p>The GitFlow branching model allows for sub teams that share work but don&#8217;t
+push that to 'origin' (yet). It also allows feature branches that live only
+locally on a developer&#8217;s PC and not on 'origin'. To be transparent, Eclipse
+Foundation open source projects don&#8217;t do this. We push to our GitLab server
+regularly, to ensure that the community can see what the project is working on.</p>
+</li>
+<li>
+<p>We have no strict branch naming rules. You can Let GitLab create the branch
+for the issue. For an issue with number #2 named 'Test', it will create a
+branch named <code>2-test</code>. This includes the issue number, which makes it easy to
+relate a branch to an issue, without having to look inside the branch for
+commits (if there even are any). It also includes the issue name, which is
+convenient as it indicates what the branch is about, without having to look
+up the issue.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-commits">Commits</h4>
+<div class="paragraph">
+<p>As is standard for Git commits, the first line of the commit message must be
+a short summary, and must not exceed 72 characters.</p>
+</div>
+<div class="paragraph">
+<p>For the Eclipse ESCET project, this line must start with the issue number,
+to allow GitLab to link commits to issues. For instance: <code>#1 commit summary</code>.
+In case a commit relates to multiple issues, list each of them, e.g.
+<code>#1 #2 commit summary</code>.</p>
+</div>
+<div class="paragraph">
+<p>Furthermore, all commits must adhere to the requirements as defined by the
+Eclipse Foundation:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://www.eclipse.org/projects/handbook/#resources-commit">Git Commit Records</a>
+(Eclipse Foundation Project Handbook)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If you are not an Eclipse ESCET project committer, with write access to our
+Git repository, see the information on
+<a href="#developer-contributing-chapter-index">contributing</a> to the Eclipse ESCET
+project.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-merge-requests">Merge requests</h4>
+<div class="paragraph">
+<p>Once the work on an issue is done and pushed to a branch, it must be reviewed
+before it is merged back. Reviews are done via merge requests. The process is
+as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Create a merge request for merging the branch. Typically a branch is created
+from and merged back to the <code>develop</code> branch.</p>
+</li>
+<li>
+<p>The merge request is reviewed by the Eclipse ESCET project committers.</p>
+</li>
+<li>
+<p>Improvements are made as necessary, reviewed again, etc, until the branch
+is considered to be ready to merge.</p>
+</li>
+<li>
+<p>The branch is merged and removed.</p>
+</li>
+<li>
+<p>If the branch fully addressed the associated issue or issues, it/they
+should be closed.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>If you are not an Eclipse ESCET project committer, with write access to our
+Git repository, see the information on
+<a href="#developer-contributing-chapter-index">contributing</a> to the Eclipse ESCET
+project.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-contributing-chapter-index">Contributing</h3>
+<div class="paragraph">
+<p>Thanks for your interest in Eclipse Supervisory Control Engineering Toolkit
+(Eclipse ESCET) project.</p>
+</div>
+<div class="paragraph">
+<p>It is often a good idea to first discuss your contribution with the project&#8217;s
+community and committers, before creating the actual code (e.g. patches),
+documentation, etc of your contribution. Discussions can take place via an
+<a href="#developer-issue-tracking-chapter-index">issue</a> in the issue tracker, or on
+the project&#8217;s <a href="#developer-chapter-index">'dev' list</a>.</p>
+</div>
+<div class="paragraph">
+<p>To contribute your actual contribution, e.g. code, documentation, examples,
+or anything else to the project, please first create an issue in the
+<a href="#developer-issue-tracking-chapter-index">issue tracker</a>.</p>
+</div>
+<div class="paragraph">
+<p>The easiest way to contribute the actual contribution, is to use GitLab:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Ensure you&#8217;re logged in to the Eclipse Foundation GitLab:</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org">Eclipse Foundation GitLab</a></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Clone the official Eclipse ESCET Git repository.
+You can click the 'Fork' button at the top right of the page.
+This creates a fork of the official repository under your own
+account.</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet">Official Eclipse ESCET Git repository</a></p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Make your changes in the forked repository under your own account.</p>
+</li>
+<li>
+<p>Create a merge request of those changes from the forked repository under
+your own account. As the target, select the official Eclipse ESCET repository
+from which you forked earlier. Typically, you should target the <code>develop</code>
+branch.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>Before your contribution can be accepted by the project team, you must
+electronically sign the Eclipse Contributor Agreement (ECA):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://www.eclipse.org/legal/ECA.php">Eclipse Contributor Agreement (ECA)</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Commits that are provided by non-committers must have a <code>Signed-off-by</code> field
+in the footer indicating that the author is aware of the terms by which the
+contribution has been provided to the project. The non-committer must
+additionally have an Eclipse Foundation account and must have a signed Eclipse
+Contributor Agreement (ECA) on file.</p>
+</div>
+<div class="paragraph">
+<p>For more information, including the specific format of commit messages,
+please see the Eclipse Foundation Project Handbook:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://www.eclipse.org/projects/handbook">Eclipse Foundation Project Handbook</a></p>
+</li>
+<li>
+<p><a href="https://www.eclipse.org/projects/handbook/#resources-commit">Git Commit Records</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Always start a commit message with the issue number, e.g.
+<code>#1 Some commit message</code>.</p>
+</div>
+<div class="paragraph">
+<p>A contribution by a non-committer will be reviewed by the project committers.
+This includes adherence to the project&#8217;s
+<a href="#developer-coding-standards-chapter-index">coding standards</a>. Discussions
+regarding the contribution will take place in the associated issue and/or
+merge request. If the committers agree with the contribution, they will commit
+the contribution into the project&#8217;s Git repository.</p>
+</div>
+<div class="paragraph">
+<p>Remember that contributions are always welcome, and contributions don&#8217;t have
+to be perfect. The project&#8217;s developers can help to improve your contribution.
+If you need any help, just ask the project&#8217;s developers using the issue or the
+project&#8217;s <a href="#develop-dev-list">'dev' list</a>.</p>
+</div>
+<div class="paragraph">
+<p>See for more information our
+<a href="#developer-development-process-chapter-index">development process</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-issue-tracking-chapter-index">Issue tracking</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET project uses GitLab to track ongoing development and
+issues:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/milestones">Eclipse ESCET milestones</a></p>
+</li>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/issues">Eclipse ESCET issues</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Be sure to search for existing issues before you create another one. Remember
+that contributions are always welcome!</p>
+</div>
+<div class="paragraph">
+<p>To contribute code (e.g. patches), documentation, or anything else, see the
+<a href="#developer-contributing-chapter-index">contributing</a> section.</p>
+</div>
+<div class="paragraph">
+<p>To understand how we work with issues, see our
+<a href="#developer-development-process-chapter-index">development process</a>.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-dev-env-setup-chapter-index">Development environment setup</h3>
+<div class="paragraph">
+<p>Follow these instructions to set up an Eclipse ESCET development environment.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p>Get the Eclipse Installer:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Go to <a href="https://www.eclipse.org/" class="bare">https://www.eclipse.org/</a> in a browser.</p>
+</li>
+<li>
+<p>Click on the big <b class="button">Download</b> button at the top right.</p>
+</li>
+<li>
+<p>Download Eclipse Installer, 64 bit edition, using the <b class="button">Download 64 bit</b>
+button.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p>To create a development environment for the first time:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Start Eclipse Installer x64 that you downloaded.</p>
+</li>
+<li>
+<p>Use the hamburger menu at the top right to switch to advanced mode.</p>
+</li>
+<li>
+<p>For Windows:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>When asked to keep the installer in a permanent location, choose to do so.
+Select a directory of your choosing.</p>
+</li>
+<li>
+<p>The Eclipse installer will start automatically in advanced mode, from the
+new permanent location.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>For Linux:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>The Eclipse installer will restart in advanced mode.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Continue with non-first time instructions for setting up a development
+environment.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To create a development environment for a non-first time:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In the first wizard window:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Select 'Eclipse Platform' from the big list at the top.</p>
+</li>
+<li>
+<p>Select '2020-06' for 'Product Version'.</p>
+</li>
+<li>
+<p>Select a Java 8 JDK for 'Java 1.8+ VM'.</p>
+</li>
+<li>
+<p>Choose whether you want a P2 bundle pool (recommended).</p>
+</li>
+<li>
+<p>Click <b class="button">Next</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>In the second wizard window:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Use the green '+' icon at the top right to add the Oomph setup.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>For 'Catalog', choose 'Eclipse Projects'.</p>
+</li>
+<li>
+<p>For 'Resource URIs', enter
+<code><a href="https://gitlab.eclipse.org/eclipse/escet/escet/-/raw/develop/org.eclipse.escet.setup" class="bare">https://gitlab.eclipse.org/eclipse/escet/escet/-/raw/develop/org.eclipse.escet.setup</a></code>.</p>
+</li>
+<li>
+<p>Click <b class="button">OK</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Check the checkbox for 'Eclipse ESCET', from the big list. It is under 'Eclipse
+Projects' / '&lt;User&gt;'.</p>
+</li>
+<li>
+<p>At the bottom right, select the 'develop' stream.</p>
+</li>
+<li>
+<p>Click <b class="button">Next</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>In the third wizard window:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Choose a 'Root install folder' and 'Installation folder name'.</p>
+</li>
+<li>
+<p>The development environment will be put at
+'&lt;root_installation_folder&gt;/&lt;installation_folder_name&gt;'.</p>
+</li>
+<li>
+<p>Click <b class="button">Next</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>In the fourth wizard window:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Select <b class="button">Finish</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Wait for the setup to complete and the development environment to be
+launched.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>If asked, accept any licenses and certificates.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Press <b class="button">Finish</b> in the Eclipse Installer to close the Eclipse Installer.</p>
+</li>
+<li>
+<p>Click the rotating arrows icon in the status bar (bottom right) of the
+development environment.</p>
+</li>
+<li>
+<p>Observe Oomph executing the startup tasks (such as Git clone, importing
+projects, etc).</p>
+</li>
+<li>
+<p>Wait for the startup tasks to finish successfully.</p>
+</li>
+<li>
+<p>NOTE: If you don&#8217;t open the Oomph dialog, the status bar icon icon will
+disappear when the tasks are successfully completed.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>In your new development environment, consider changing the following settings:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>For the <em>Package Explorer</em> <a href="#use-terminology-view">view</a>:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Enable the <em>Link with Editor</em> setting, using the
+<span class="image"><img src="./developer/link-with-editor.png" alt="link with editor"></span> icon.</p>
+</li>
+<li>
+<p>Enable showing resources (files/folders) with names starting with a period.
+Open the <em>View Menu</em> (<span class="image"><img src="./developer/view-menu.png" alt="view menu"></span>) and choose
+<b class="menuref">Filters&#8230;&#8203;</b>. Uncheck the <code>.* resources</code> option and click <b class="button">OK</b>.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-git-repo-chapter-index">Git repository</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET project maintains the following source code repositories:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>https://gitlab.eclipse.org/eclipse/escet/escet.git</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>These can also be accessed via a web interface:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://gitlab.eclipse.org/eclipse/escet/escet">Eclipse ESCET GitLab</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="paragraph">
+<p>The software is written in the <a href="https://www.oracle.com/java/">Java</a> programming
+language, as a collection of <a href="https://www.eclipse.org/pde/">Eclipse plugins</a>,
+and using the <a href="https://www.eclipse.org/modeling/emf/">Eclipse Modeling Framework</a>
+(EMF).</p>
+</div>
+<div class="paragraph">
+<p>For ease of programming, the <a href="https://eclipse.org">Eclipse IDE</a> is recommended.
+See also the section on
+<a href="#developer-dev-env-setup-chapter-index">setting up a development environment</a>.</p>
+</div>
+<div class="paragraph">
+<p>To contribute code (e.g. patches), documentation, or anything else, see the
+<a href="#developer-contributing-chapter-index">contributing</a> section.</p>
+</div>
+<div class="paragraph">
+<p>The way we work with our Git repository is explained as part of our
+<a href="#developer-development-process-chapter-index">development process</a>.</p>
+</div>
+<div class="sect3">
+<h4 id="developer-repository-structure">Repository structure</h4>
+<div class="paragraph">
+<p>In the Eclipse ESCET source code repository (Git repository), three layers are
+distinguished:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The top layer contains user-oriented languages for designing controllers.
+Currently there are two modeling languages in this layer,
+<a href="#intro-chapter-cif">CIF</a> and <a href="#intro-chapter-chi">Chi</a>.</p>
+<div class="paragraph">
+<p>The third language in the top layer is <a href="#intro-chapter-tooldef">ToolDef</a>, a
+cross-platform scripting language to run tests, and to automate the various
+tools that need to be executed while designing a controller.</p>
+</div>
+</li>
+<li>
+<p>The middle layer contains developer oriented support code.
+It has a language of its own, named <a href="#intro-chapter-setext">SeText</a>. This
+language implements an LALR(1) parser generator with a few twists to make it
+easy to use in a Java environment and to connect it to an Eclipse text editor.</p>
+<div class="paragraph">
+<p>The other part of the middle layer is common functionality shared between the
+languages.</p>
+</div>
+</li>
+<li>
+<p>The bottom layer is mostly configuration to attach the software to the Eclipse
+platform, including build and release engineering.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>This document describes the structure of the top and middle layers. For the
+bottom layer, standard Eclipse and Maven/Tycho tools are used, which are
+described elsewhere.</p>
+</div>
+<div class="paragraph">
+<p>The three layers are not further distinguished in the repository. Instead,
+different parts are stored in different sub-directories from the root.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-language-directories">Language directories</h4>
+<div class="paragraph">
+<p>Each language has its own subdirectory in the root, <code>/cif</code> and <code>/chi</code> for the
+<a href="#intro-chapter-cif">CIF</a> and <a href="#intro-chapter-chi">Chi</a> modeling languages,
+<code>/tooldef</code> for the <a href="#intro-chapter-tooldef">ToolDef</a> language,
+and <code>/setext</code> for the <a href="#intro-chapter-setext">SeText</a> language.</p>
+</div>
+<div class="paragraph">
+<p>Within a language directory, a directory exists for each part of the code
+(often equivalent to a plugin), with the same name as the plugin.
+The pattern of a plugin name is <code>org.eclipse.escet.&lt;language&gt;.&lt;plugin-name&gt;</code>
+where the plugin-name in different directories has the same meaning.
+A non-exhaustive list:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 20%;">
+<col style="width: 80%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Plugin name</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>documentation</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">User-oriented documentation about the language, such as a user manual or a
+reference manual.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>metamodel</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Ecore metamodel back bone of the language. Model classes for the central
+data structure that all tools of the language use.
+Often generated using modeling tools such as Sirius, but manually written
+classes exist as well.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>metamodel.java</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Generated Java constructor and walker classes for the Ecore metamodel data
+structure.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>parser</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">SeText input, and generated or manually written code to parse
+an input file and convert it to an tree of classes that can be given to the
+type checker.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>typechecker</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Implementation of the type checker to check the parsed input, and annotate
+it with derived information, resulting in an model instance that can be used
+by all tools of the language.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>io</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Text file loading, parsing, and type checking, and possibly writing result
+specifications.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>texteditor</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Code for editing source files of the language in an text Eclipse editor,
+with folding, syntax highlighting, and reporting of errors and warnings in
+the specification.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tests</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Collection of tests to check the tools for the language. Typically a set
+of input specifications, a set of expected output files, and a
+<a href="#intro-chapter-tooldef">ToolDef</a> script to run the tests. These tests can
+be seen as integration tests.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;plugin-name&gt;.tests</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Unit tests for that specific plugin.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>codegen</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Code generator to convert the input specification to a runnable model.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>runtime</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Support libraries used by the runnable model.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>tooldefs</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Interface definitions to make tools of the language available for
+<a href="#intro-chapter-tooldef">ToolDef</a>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>common</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common functionality used by many tools of the language.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Other plugin names are often tools with the same name.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="developer-middle-layer-common-functionality">Middle layer common functionality</h4>
+<div class="paragraph">
+<p>The common code between all languages is stored in the <code>/common</code> directory,
+again with full name of the plugin as sub-directory names.
+These plugins contain:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 66.6667%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Plugin name</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.app.framework</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <a href="#app-framework-chapter-index">application framework</a>.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.app.framework.appsview.ui</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The <a href="#use-apps-view">Applications view</a>. User interface of the active
+applications.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.box</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Library to generate formatted code-like text.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.eclipse.ui</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common Eclipse User Interface code.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.emf</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <em>EMF</em> code.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.emf.ecore.codegen</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Code generators from <em>Ecore</em> files.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.emf.ecore.validation</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <em>EMF</em> validation code.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.emf.ecore.xmi</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <em>EMF</em> <em>XMI</em> serialization code.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.java</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <em>Java</em> functions and classes, in particular the <em>Lists</em>, <em>Sets</em>,
+<em>Maps</em> and <em>Strings</em> classes.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.position.common</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common functions for (text-file) positions in source files.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.position.metamodel</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The Ecore metamodel for (text-file) positions in source files.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.svg</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common <em>SVG</em> library for viewing and manipulating <em>SVG</em> trees.</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.eclipse.escet.common.typechecker</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Common type checker functionality.</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-coding-standards-chapter-index">Coding standards</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET
+<a href="#developer-dev-env-setup-chapter-index">development environment</a>
+has some features that allow developing high quality contributions:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>A Java formatter profile is included. It allows to automatically
+format Java code for consistency and convenience.</p>
+</li>
+<li>
+<p>The <a href="https://checkstyle.org/eclipse-cs">Eclipse Checkstyle Plugin</a> and
+a Checkstyle configuration are included. They can be used to detect various
+other issues in Java code and other files.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For all contributions to the Eclipse ESCET project, check the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>All Java code should be formatted using the provided formatting profile.</p>
+</li>
+<li>
+<p>All contributions should be checked using the provided Checkstyle
+configuration.</p>
+</li>
+<li>
+<p>All contributions should be free of warnings and errors, when working
+with them in the Eclipse ESCET development environment.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Remember that <a href="#developer-contributing-chapter-index">contributions</a> are
+always welcome, and contributions don&#8217;t have to be perfect. The project&#8217;s
+developers can help to improve your contribution, and ensure it adheres to
+these coding standards.</p>
+</div>
+<div class="paragraph">
+<p>For any questions regarding these coding standards, please
+<a href="#developer-chapter-index">contact</a> the project&#8217;s developers.</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-building-and-testing-chapter-index">Building and testing</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET software can be built using Maven/Tycho. The build will
+build every individual plugin and feature, as well as the update site,
+product and all documentation. Manually run it in one of the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>In an Eclipse-based
+<a href="#developer-dev-env-setup-chapter-index">development environment</a>,
+select <span class="menuseq"><b class="menu">Run</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Run Configurations&#8230;&#8203;</b></span> to open the <em>Run Configurations</em>
+dialog. From the list at the left, under <em>Maven Build</em>, select the
+<em>build</em> launch configuration, and click the <b class="button">Run</b> button to run
+the build.</p>
+<div class="paragraph">
+<p>Additional launch configurations are available to build documentation
+projects separately.</p>
+</div>
+</li>
+<li>
+<p>On Windows, in a command prompt, with the root of the Git repository as
+current directory, enter <code>.\build.cmd</code> and press <kbd>ENTER</kbd>.
+This requires Maven to be available on your system (to be on your <code>PATH</code>).</p>
+</li>
+<li>
+<p>On Linux/macOS, in a shell, with the root of the Git repository as
+current directory, enter <code>./build.sh</code> and press <kbd>ENTER</kbd>.
+This requires Maven to be available on your system (to be on your <code>PATH</code>).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Builds are in certain cases also automatically executed on our build server:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://ci.eclipse.org/escet/">Eclipse ESCET Jenkins server</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Run tests in one of the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As part of the build, all tests will be performed as well.</p>
+</li>
+<li>
+<p>Launch configurations to run the integration/regression tests for a specific
+language are also available, under the <em>JUnit Plug-in Test</em> section of the
+<em>Run Configurations</em> dialog.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-release-process-chapter-index">Release process</h3>
+<div class="paragraph">
+<p>The process to release a new version of the Eclipse ESCET tools involves the
+following steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Prepare for the next release in the <code>develop</code> branch until it is ready to be
+released.</p>
+</li>
+<li>
+<p>Create a GitLab merge request from <code>develop</code> to <code>master</code>, and merge it.
+Since <code>master</code> is a protected branch for the Eclipse ESCET GitLab, a GitLab
+merge request is the only way to update it.</p>
+</li>
+<li>
+<p>Check that the build on <code>master</code> succeeds in Jenkins.</p>
+</li>
+<li>
+<p>Add a tag on the commit in <code>master</code> that is to be released. Only version
+tags with a specific syntax will be picked up by Jenkins to be released.
+For instance, use <code>v0.1</code>, <code>v0.1.1</code>, <code>v2.0</code>, etc for releases, <code>v0.1-M1</code>
+for a milestone build, or <code>v0.1-RC1</code> for a release candidate.</p>
+</li>
+<li>
+<p>Push the tag to the Eclipse ESCET GitLab. E.g. use
+<code>git push origin &lt;tagname&gt;</code> with <code>&lt;tagname&gt;</code> the name of the tag to push.</p>
+</li>
+<li>
+<p>Jenkins will automatically pick up the new tag. Log in to Jenkins and
+manually trigger a build for the tag. Jenkins will then automatically build
+and release a new version from that tag.</p>
+</li>
+<li>
+<p>All releases can be downloaded at <a href="https://download.eclipse.org/escet/" class="bare">https://download.eclipse.org/escet/</a>.
+For a version <code>v0.1</code>, the downloads will be located at
+<code>https://download.eclipse.org/escet/v0.1</code>.</p>
+<div class="paragraph">
+<p>Note that according to the Eclipse Foundation Wiki page
+<a href="https://wiki.eclipse.org/IT_Infrastructure_Doc">IT Infrastructure Doc</a>,
+"Once your files are on the <code>download.eclipse.org</code> server, they are
+immediately available to the general public. However, for release builds,
+we ask that you wait at least four hours for our mirror sites to fetch the
+new files before linking to them. It typically takes a day or two for all
+the mirror sites to synchronize with us and get new files."</p>
+</div>
+<div class="paragraph">
+<p>That same wiki page also notes that "Although you can link directly to
+<code>download.eclipse.org/yourfile.zip</code>, you can also use the <em>Find a Mirror</em>
+script [&#8230;&#8203;]. Using this script allows you to view download statistics and
+allows users to pick a nearby mirror site for their download." It further
+indicates that "P2 repositories are not normally accessed via the mirror
+selection script." The <em>Find a Mirror</em> script also transparently handles
+files moved from <code>download.eclipse.org</code> to <code>archive.eclipse.org</code>.</p>
+</div>
+</li>
+<li>
+<p>Jenkins will automatically push the website for the new release to the
+website Git repository, in a directory for the specific release. For a version
+<code>v0.1</code>, the website can be accessed at <code>https://www.eclipse.org/escet/v0.1</code>.
+It may take a few minutes for the Git repository to be synced to the webserver
+and for the website for the new version to become available.</p>
+</li>
+<li>
+<p>If the website for the new release is to be the standard visible website for
+the project (at <code><a href="https://www.eclipse.org/escet" class="bare">https://www.eclipse.org/escet</a></code>), it has to be manually
+replaced. This is to ensure that a bugfix release for an older version doesn&#8217;t
+override the standard visible website. The following steps explain how to
+'promote' a website for a specific version to become the standard visible
+website:</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Make sure you&#8217;ve uploaded your SSH public key to Eclipse Gerrit. This is
+a one-time only step. Go to <a href="https://git.eclipse.org/r/" class="bare">https://git.eclipse.org/r/</a>. Sign in using your
+Eclipse Foundation committer account. Use the gear icon at the top right to
+access your account settings. Under <em>SSH Keys</em> add your SSH public key. Also
+make note of your <em>username</em>, <em>Full name</em> and <em>Email</em> address.</p>
+</li>
+<li>
+<p>Clone the Eclipes ESCET website Git repository using
+<code>git clone ssh://&lt;username&gt;@git.eclipse.org:29418/www.eclipse.org/escet.git</code>.
+Make sure to replace <code>&lt;username&gt;</code> by your Eclipse Foundation committer
+account <em>username</em>.</p>
+</li>
+<li>
+<p>In the cloned repository, remove all files/folders in the root of the
+Git repository pertaining to the current standard visible website.
+Be sure not to remove any of the directories with websites for specific
+releases.</p>
+</li>
+<li>
+<p>Copy the files/folders from the directory with the website for the
+release that you want to make the standard visible website, and put them
+in the root of the Git repository.</p>
+</li>
+<li>
+<p>Add all changes to be committed, e.g. by using <code>git add -A</code>.</p>
+</li>
+<li>
+<p>Make sure to use the <em>Full name</em> and <em>Email</em> address of your Eclipse
+Foundation committer account. E.g. use
+<code>git config --local user.name "&lt;full_name&gt;"</code> and
+<code>git config --local user.email "&lt;email&gt;"</code>, replacing <code>&lt;full_name&gt;</code> and
+<code>&lt;email&gt;</code> by the appropriate information matching your Eclipse Foundation
+committer account.</p>
+</li>
+<li>
+<p>Commit the changes. Use as commit message
+<code>Set standard visible website to release &lt;version&gt;.</code>, replacing <code>&lt;version&gt;</code>
+by the release version that will become the new standard visible website.
+Make sure to sign off the commit to pass Eclipse Foundation automatic
+commit validation. E.g. use the following to commit the changes:
+<code>git commit -s -m "Set standard visible website to release v0.1."</code>.</p>
+</li>
+<li>
+<p>Push the changes to the Git server. E.g. use <code>git push</code>. If successful
+you should see the changes at the Git server&#8217;s web view, at
+<a href="https://git.eclipse.org/c/www.eclipse.org/escet.git/" class="bare">https://git.eclipse.org/c/www.eclipse.org/escet.git/</a>.</p>
+</li>
+<li>
+<p>It may take a few minutes for the Git repository to be synced to the
+webserver, and for the new standard visible website to become available.
+The standard visible website can be accessed at
+<code><a href="https://www.eclipse.org/escet" class="bare">https://www.eclipse.org/escet</a></code>. Depending on browser cache settings and
+other factors, it may be necessary to force refresh your browser for it
+to pick up the changes on the server.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Regularly, consider the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Remove old non-release websites.</p>
+</li>
+<li>
+<p>Remove old non-release downloads. Consider whether removing P2 update
+sites will lead to issues for users.</p>
+</li>
+<li>
+<p>Move old release downloads from <code>downloads.eclipse.org</code> to
+<code>archive.eclipse.org</code>. Consider whether moving P2 update
+sites will lead to issues for users. See for more information the
+Eclipse Foundation Wiki page
+<a href="https://wiki.eclipse.org/Equinox/p2/p2.mirrorsURL#Moving_a_repo_to_archive.eclipse.org">Moving
+a repo to archive.eclipse.org</a>.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-third-party-tools-chapter-index">Third party tools</h3>
+<div class="paragraph">
+<p>As part of development for the Eclipse ESCET project, several third party
+tools are used. They are used to e.g. run scripts, generate files, etc.</p>
+</div>
+<div class="paragraph">
+<p>The following third party tools are used to run scripts:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Bash, to run <code>.bash</code> scripts.</p>
+</li>
+<li>
+<p>GNU utilities, to use in scripts, e.g. <code>cat</code>, <code>cp</code>, <code>diff</code>, <code>dirname</code>,
+<code>find</code>, <code>grep</code>, <code>mv</code>, <code>readlink</code>, <code>rm</code>, <code>sed</code>, <code>sort</code> and <code>wc</code>.</p>
+</li>
+<li>
+<p>Perl, to run <code>.pl</code> scripts.</p>
+</li>
+<li>
+<p>Python, version 3, to run <code>.py</code> scripts.</p>
+</li>
+<li>
+<p>Shell, to run <code>.sh</code> scripts.</p>
+</li>
+<li>
+<p>Windows command prompt, to run <code>.cmd</code> scripts.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following third party tools are used to build:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Maven, to run the main build from a console.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following third party tools are used to generate/convert images:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>bbox_add.pl</code> Perl script, used in conjunction with LaTeX, obtained from
+<a href="http://www.inference.org.uk/mackay/perl/bbox_add.pl" class="bare">http://www.inference.org.uk/mackay/perl/bbox_add.pl</a>.</p>
+</li>
+<li>
+<p><code>eps2png</code> Perl script, used in conjunction with LaTeX, obtained from
+<a href="https://metacpan.org/pod/eps2png" class="bare">https://metacpan.org/pod/eps2png</a>.</p>
+</li>
+<li>
+<p>Gnuplot, to generate images.</p>
+</li>
+<li>
+<p>ImageMagic, used in conjunction with LaTeX, including <code>convert</code>.</p>
+</li>
+<li>
+<p>Inkscape, to convert <code>.svg</code> images.</p>
+</li>
+<li>
+<p>LaTeX, to generate images, including <code>dvips</code>, <code>latex</code>, <code>pdfcrop</code> and
+<code>pdflatex</code>.</p>
+</li>
+<li>
+<p>Make, run <code>Makefile</code> builds, to generate images.</p>
+</li>
+<li>
+<p>LaTeX <code>rail</code> package, including <code>rail</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following third party tools are used to build some of the
+documentation:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>LaTeX, including <code>bibtex</code> and <code>pdflatex</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The following third party tools are used to generate test classes and
+package them into a JAR file, for certain tests:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Java Development Kit (JDK), version 7 or higher, including <code>javac</code> and
+<code>jar</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Most of these tools are not needed to run a build or run the tests, as the
+generated files (e.g. images) are committed into Git.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="developer-upgrade-instructions-chapter-index">Upgrade instructions</h3>
+<div class="paragraph">
+<p>To upgrade to a new Eclipse Platform/IDE/SDK version:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Version updates</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Look up Orbit version for the new Eclipse Platform/IDE/SDK release, see
+<a href="https://download.eclipse.org/tools/orbit/downloads/" class="bare">https://download.eclipse.org/tools/orbit/downloads/</a>.</p>
+</li>
+<li>
+<p>Update Oomph setup, configuring new Eclipse and Orbit versions.</p>
+</li>
+<li>
+<p>Update <code>dev-env-setup.asciidoc</code> to match new Eclipse version.</p>
+</li>
+<li>
+<p>Update <code>org.eclipse.platform</code> version for the product feature (<code>org.eclipse.escet.product.feature</code> project).</p>
+</li>
+<li>
+<p>Update Eclipse and Orbit update site URLs in product.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>New development environment</p>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#developer-dev-env-setup-chapter-index">Set up a new development environment</a>.</p>
+</li>
+<li>
+<p>Commit target platform changes after regenerated by Oomph.</p>
+</li>
+<li>
+<p>Check workspace for any errors/warnings and address them if any.</p>
+</li>
+<li>
+<p>Check <em>New and Noteworthy</em> (release notes) for changes and adapt as necessary.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Java formatter profile</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Make a dummy change to the Eclipse ESCET Java formatter profile, and change it back.</p>
+</li>
+<li>
+<p>Compare the new configuration against the old configuration, to see if there are any new settings.</p>
+</li>
+<li>
+<p>In case of new settings, configure them as desired.</p>
+</li>
+<li>
+<p>Reformat all Java code using the new formatter profile.</p>
+</li>
+<li>
+<p>Update the formatter profile in the Oomph setup.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Java errors/warnings settings</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Check the properties of the <code>org.eclipse.escet.common.java</code> project, under <span class="menuseq"><b class="menu">Java Compiler</b>&#160;<i class="fa fa-angle-right caret"></i> <b class="menuitem">Errors/Warnings</b></span>.</p>
+</li>
+<li>
+<p>Make a dummy change and change it back.</p>
+</li>
+<li>
+<p>In case of changes to <code>*.prefs</code> files in <code>.settings</code>, configure the new settings as desired.</p>
+</li>
+<li>
+<p>Run <code>misc/java-code-style/copy_here.bash ../../common/org.eclipse.escet.common.java</code> from <code>misc/java-code-style</code>
+to copy the new settings to the central place.</p>
+</li>
+<li>
+<p>Run <code>misc/java-code-style/copy_there.bash</code> from <code>misc/java-code-style</code> to copy the new settings to all relevant
+projects.</p>
+</li>
+<li>
+<p>Force a rebuild in Eclipse and check for any warnings/errors, addressing them if any.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Validation</p>
+<div class="ulist">
+<ul>
+<li>
+<p>Run a <a href="#developer-building-and-testing-chapter-index">Maven build</a>.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To upgrade to a new Tycho version:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Update version in <code>.mvn/extensions.xml</code>.</p>
+</li>
+<li>
+<p>Update version in <code>releng/org.eclipse.escet.configuration/pom.xml</code>.</p>
+</li>
+<li>
+<p>Check release notes for changes and adapt as necessary.</p>
+</li>
+<li>
+<p>Run a <a href="#developer-building-and-testing-chapter-index">Maven build</a>.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="app-framework-chapter-index">Application framework</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The Eclipse ESCET application framework provides common functionality for
+applications within the Eclipse ESCET toolkit. The following topics explain
+the framework in more detail:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#app-framework-introduction">Introduction</a></p>
+</li>
+<li>
+<p><a href="#app-framework-standalone-vs-eclipse">Stand-alone execution versus Eclipse IDE</a></p>
+</li>
+<li>
+<p><a href="#app-framework-application-class">The Application class</a></p>
+</li>
+<li>
+<p><a href="#app-framework-exception-framework">The exception framework</a></p>
+</li>
+<li>
+<p><a href="#app-framework-exit-codes">Exit codes</a></p>
+</li>
+<li>
+<p><a href="#app-framework-io-framework">The I/O framework</a></p>
+</li>
+<li>
+<p><a href="#app-framework-option-framework">The option framework</a></p>
+</li>
+<li>
+<p><a href="#app-framework-compiler-framework">The compiler framework</a></p>
+</li>
+<li>
+<p><a href="#app-framework-implement-your-application">How to implement your own application</a></p>
+</li>
+<li>
+<p><a href="#app-framework-registration">Application registration</a></p>
+</li>
+<li>
+<p><a href="#app-framework-execution">Execution</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="app-framework-introduction">Introduction</h3>
+<div class="paragraph">
+<p>The Eclipse ESCET application framework provides common functionality for
+applications within the Eclipse ESCET toolkit. It has several goals:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Provide a uniform end-user experience, for example in the form of uniform
+option dialogs.</p>
+</li>
+<li>
+<p>Hide technical details from the end user, for example in the form of
+crash reports and user friendly error messages, instead of stack traces.</p>
+</li>
+<li>
+<p>Provide support for applications to run both as a stand-alone Java program
+(say, from the command line), as well as within the Eclipse environment.</p>
+</li>
+<li>
+<p>Provide the basic functionality needed by most applications, to reduce the
+overhead needed for developers to develop an application.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The documentation for this framework describes the issues that the application
+framework attempts to solve, and the way it solves them. It also provides
+guidance in implementing applications using the application framework.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-standalone-vs-eclipse">Stand-alone execution versus Eclipse IDE</h3>
+<div class="paragraph">
+<p>One of the goals of the application framework is to make it easier to allow
+applications to run as stand-alone Java command line applications, as well as
+run within the Eclipse IDE. The main problem faced when
+supporting general applications to run within Eclipse, is that such
+applications all run within the same instance of the Java Virtual Machine
+(JVM). In fact, a single application may have multiple instances running at
+the same time, within a single instance of the IDE. The following sections
+address the issues that arise when running within the IDE, and how the
+application framework handles them.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="app-framework-app-static-information">Application static information</h4>
+<div class="paragraph">
+<p>Within Java programs, members can be defined with the <code>static</code> modifier.
+Since multiple instances of an application may be running simultaneously,
+within a single instance of the IDE, one should avoid using static variables
+that contain information that is specific to a single instance of the
+application. For instance, assume an application that maintains an integer
+counter, used to generate unique identifiers. If defined in a class as
+follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">static</span> <span class="type">int</span> count = <span class="integer">0</span>;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>and incremented when needed, the first instance of the application will run
+just fine. Variable <code>count</code> starts at zero, and is incremented over and over
+again. When a second instance of the application starts however, the static
+variable keeps its value, as the new application is started within the same
+Eclipse instance, and thus within the same JVM. The count won&#8217;t start from
+zero, thus leading to different results for the application.</p>
+</div>
+<div class="paragraph">
+<p>The conclusion is that one should be careful to avoid static variables that
+hold information specific to an application instance.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-application-options">Application options</h4>
+<div class="paragraph">
+<p>Applications often have settings, and they are generally passed as command
+line arguments. GUI applications however, often use a dialog to configure the
+options instead. To allow applications within the application framework to
+work in both scenarios, all applications should use the option framework.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#app-framework-option-framework">option framework</a> section.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-stdin-stdout-stderr">Stdin, stdout, and stderr</h4>
+<div class="paragraph">
+<p>Command line applications generally obtain input from stdin, and write output
+to stdout and/or stderr streams. For applications running within the IDE,
+those streams are connected to the Eclipse application (IDE) as a whole, and
+not to the applications running within the IDE. To provide a uniform I/O
+interface, the application framework includes an I/O framework.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#app-framework-io-framework">I/O framework</a> section.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-guis-and-swt">Graphical User Interfaces (GUIs) and SWT</h4>
+<div class="paragraph">
+<p>The Eclipse IDE uses the Standard Widget Toolkit (SWT) for its graphical user interface
+(GUI). To be compatible with the Eclipse IDE, all GUI applications should use SWT as
+well. In order for GUI applications to work seamlessly within the Eclipse IDE as well
+as stand-alone, the application framework automatically registers the main SWT
+display thread for stand-alone applications, and uses the Eclipse SWT display
+thread when running within the Eclipse IDE. This reduces the burden of having to
+register the main SWT display threads, but also avoids blocking and other thread
+related issues.</p>
+</div>
+<div class="paragraph">
+<p>Using the <em>GUI</em> option, the GUI can be enabled or disabled. If disabled,
+headless execution mode is used, which disables creation of a SWT display
+thread, and thus disables all GUI functionality, including the option dialog.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-app-termination">Application termination</h4>
+<div class="paragraph">
+<p>Within Java, the <code>System.exit</code> method can be used to immediately terminate
+an application, by terminating the JVM. For applications running within
+the Eclipse IDE, this not only terminates the application, but the IDE as well. As
+such, the <code>System.exit</code> method should never be used in applications that
+are intended to be executed within the IDE.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-sigint">SIGINT</h4>
+<div class="paragraph">
+<p>Stand-alone applications can typically be started from a the command line
+terminal window. Pressing <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>C</kbd></span> at such a command line terminal window
+terminates the currently running application (on Unix-based systems, this
+generates a SIGINT). Applications running within the Eclipse IDE however, don&#8217;t run
+in an actual command line terminal. Instead, they run within the IDE,
+and the stdin, stdout, and stderr streams are coupled to the Eclipse console
+view. The Eclipse console view does not support termination using the
+<span class="keyseq"><kbd>Ctrl</kbd>+<kbd>C</kbd></span> key combination. Instead, <span class="keyseq"><kbd>Ctrl</kbd>+<kbd>C</kbd></span> is used to copy console output
+to the clipboard. To remedy this situation, application framework applications
+running within Eclipse get a <em>Terminate</em> button with their console within the IDE,
+to allow for easy termination.</p>
+</div>
+<div class="paragraph">
+<p>Furthermore, the application framework allows termination requests via the
+<code>AppEnv.terminate</code> method. Application framework applications and threads
+should regularly call the <code>AppEnv.isTerminationRequested</code> method to see
+whether they should terminate.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#use-apps-view-termination">termination features</a> of the
+<a href="#use-apps-view">Applications</a> <a href="#use-terminology-view">view</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-exceptions">Exceptions</h4>
+<div class="paragraph">
+<p>Exceptions are Java feature that allows applications to report error
+conditions. Exceptions can generally be divided into two categories: internal
+errors, and end-user errors. Internal errors should generally not happen,
+and make the application crash. The application framework provides crash
+reports for end users to report crashes due to internal errors. The application
+framework also provides exception classes for end-user errors, to provide
+nice error messages, instead of stack traces.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#app-framework-exception-framework">exception framework</a>
+section.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-system-properties">System properties</h4>
+<div class="paragraph">
+<p>Java uses system properties (<code>System.getProperty</code> method etc). Those
+properties are global to the entire JVM, meaning they are shared between
+applications running within the Eclipse IDE. The application framework provides
+functionality to maintain system properties on a per application basis,
+turning them into application properties. All application framework
+applications should use the <code>getProp*</code> and <code>setProp*</code> methods in the
+<code>AppEnv</code> class instead of the property related methods in the <code>System</code>
+class. This ensures that the application properties are used instead of the
+global system properties.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-filepaths-and-current-working-dir">File paths and current working directory</h4>
+<div class="paragraph">
+<p>One of the standard system properties in Java is the <code>user.dir</code> property,
+which refers to the current working directory, or more precisely, the
+directory from which the JVM was started. Java doesn&#8217;t allow changing
+the current working directory. The application framework however, maintains
+the current working directory on a per application basis. Changing the current
+working directory is also supported. Application framework applications
+should use the methods in the <code>org.eclipse.escet.common.app.framework.Paths</code>
+class to get and set the current working directory, to resolve relative paths,
+etc. These methods also allow both Windows (<code>\</code>) and Unix (<code>/</code>) separators to
+be used in paths, on all platforms, transparently.</p>
+</div>
+<div class="paragraph">
+<p>Furthermore, within the Eclipse IDE, the concept of a
+<a href="#use-terminology-workspace">workspace</a> is introduced. In
+order to allow importing of resources from other projects etc, it may be nice
+to allow end users to specify platform paths (plug-in paths or workspace
+paths). Eclipse Modeling Framework (EMF) URIs, besides local file system paths,
+provide functionality for platform URIs as well. EMF URIs can for instance be
+used to load models that are instances of an Ecore. The <code>Paths</code> class mentioned
+above features methods to create such EMF URIs, from various sources. Those
+methods also feature smart handling of <code>platform:/auto/...</code> paths, an addition to
+platform URIs, added by the application framework. Such URIs are first
+resolved in the workspace, and if they can&#8217;t be found there, they are resolved
+in the plug-ins. This allows for easier debugging, as the workspace always
+overrides the plug-ins.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-application-class">The Application class</h3>
+<div class="paragraph">
+<p>The <code>org.eclipse.escet.common.app.framework.Application&lt;T&gt;</code> class is the main
+class of the application framework. All application should inherit from this
+abstract class. The generic parameter <code>&lt;T&gt;</code> is further explained in the section
+about the <a href="#app-framework-io-framework">I/O framework</a>.</p>
+</div>
+<div class="paragraph">
+<p>The next sections introduce the specific parts of the application framework.
+After that, you&#8217;ll find a section on how to implement your own application,
+using the application framework.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-exception-framework">The exception framework</h3>
+<div class="paragraph">
+<p>The application framework contains the exception framework. Its main goal
+is to hide stack traces from end users. Exceptions can generally be divided
+into two categories: internal errors, and end-user errors.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="app-framework-enduser-exceptions">End-user exceptions</h4>
+<div class="paragraph">
+<p>All exceptions that should be presented to the end user are considered end-user
+exceptions. These messages should be written in terms that the end user should
+be able to understand. For end-user exceptions, the exception framework does
+not display stack traces (at least not by default). All end-user exceptions must
+implement the <code>org.eclipse.escet.common.app.framework.exceptions.EndUserException</code>
+interface, and may inherit from the
+<code>org.eclipse.escet.common.app.framework.exceptions.ApplicationException</code> class.
+All applications that use the application framework must satisfy these
+requirements when the error message is to be presented to end users. It is
+recommended to reuse existing application framework exceptions whenever possible.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-internal-exceptions">Internal exceptions</h4>
+<div class="paragraph">
+<p>All exceptions that are not to be presented to end users are considered to
+be internal exceptions. Internal exceptions crash the application and are
+always considered to be bugs. The application framework generates crash
+reports for internal errors, so that end users can easily report them. Also,
+stack traces are not shown on the console. They are however present in the
+crash report, along with among others information about the system, the Java
+version used, the application that crashed (name, version, etc), and if
+the OSGi framework is running, the available plug-ins etc.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-chained-excpetions">Chained exceptions</h4>
+<div class="paragraph">
+<p>Java supports the concept of <em>chained exceptions</em>. The end-user exceptions of
+the application framework support this as well. If an uncaught end-user
+exception needs to be presented to the end user, the message of the exception
+is printed to the console, prefixed with the <code>ERROR:</code> text. All the causes of
+the exception are printed as well, each on a line of their own. Those messages
+are prefixed with the <code>CAUSE:</code> text. For exceptions that provide an end-user
+readable message, only that message is printed after the <code>CAUSE:</code> text. For
+other exceptions, the simple name of the exception class, enclosed in
+parentheses, is printed between the <code>CAUSE:</code> text and the exception message.
+All end-user exceptions (the ones inheriting from the
+<code>org.eclipse.escet.common.app.framework.exceptions.ApplicationException</code> class),
+as well as all other exceptions explicitly designed as such (by implementing the
+<code>org.eclipse.escet.common.app.framework.exceptions.EndUserException</code> interface)
+are considered to provide readable messages. For other exceptions, it is
+assumed that they don&#8217;t. This includes all exceptions provided by Java itself.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-development-mode">Development mode</h4>
+<div class="paragraph">
+<p>Developers can enable the development mode option (<code>DevModeOption</code> class) to
+always get stack traces for all internal exceptions (thus for crashes, but not
+for end-user exceptions), instead of crash reports. For more information, see
+the <a href="#app-framework-option-framework">option framework</a> section.</p>
+</div>
+<div class="paragraph">
+<p>The development mode option is ideal for automated tests, where a stack trace
+on stderr is much more ideal than a crash report.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-exit-codes">Exit codes</h3>
+<div class="paragraph">
+<p>Application framework applications can terminate with the following exit codes:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>0</code>: Application finished without errors.</p>
+</li>
+<li>
+<p><code>1</code>: Application finished after reporting an error to the end user.</p>
+</li>
+<li>
+<p><code>2</code>: Application crashed after running out of memory.</p>
+</li>
+<li>
+<p><code>3</code>: Application crashed for any reason other than running out of memory.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Note that applications themselves should always return a zero exit code. The
+other exit codes are generated automatically by the exception framework when
+applicable.</p>
+</div>
+<div class="paragraph">
+<p>Any exceptions to these rules should generally be avoided, but otherwise must
+be clearly documented for end users.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-io-framework">The I/O framework</h3>
+<div class="paragraph">
+<p>To provide a uniform I/O interface, the application framework includes an
+I/O framework. This framework is sometimes also called the output framework,
+as it mainly handles output. The main goals of this framework are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Provide uniform stdin, stdout, and stderr support for applications running
+on the command line, or within the Eclipse IDE.</p>
+</li>
+<li>
+<p>Provide a general framework for output, based on output components that
+can be registered and unregistered.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="app-framework-output-components">Output components</h4>
+<div class="paragraph">
+<p>The I/O framework works with output components. All output that the application
+generates, is given to the output components. Each output component can decide
+for itself what to do with that output. All applications include at least
+a <code>StreamOutputComponent</code>, that redirects stream output to the console. For
+stand-alone applications, this means redirection to stdout and stderr. For
+application running within the Eclipse IDE, this means redirection to a
+<em>Console</em> <a href="#use-terminology-view">view</a>.</p>
+</div>
+<div class="paragraph">
+<p>Applications that only need to provide error, warning, normal, and debug
+textual output, the default output component interface (<code>IOutputComponent</code>)
+suffices. Applications that want to provide additional (typed) output, should
+create a derived interface that inherits from <code>IOutputComponent</code>, and extends
+the interface with additional callback methods. For an example of this, see
+the <code>org.eclipse.escet.cif.simulator.output.SimulatorOutputComponent</code>
+interface.</p>
+</div>
+<div class="paragraph">
+<p>The <code>OutputComponentBase</code> class can be used as a base class for output
+components. It implements the full <code>IOutputComponent</code> interface, but does
+nothing with the output that is generated by the application. Derived classes
+can easily override one or more methods to process output.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-output-provider">Output provider</h4>
+<div class="paragraph">
+<p>Each instance of an application has its own output provider. The output
+provider keeps track of the output components that are registered, and allows
+sending of output to the output components through static methods.</p>
+</div>
+<div class="paragraph">
+<p>If an application uses the default <code>IOutputComponent</code> as its output
+interface, an instance of <code>OutputProvider&lt;IOutputComponent&gt;</code> can be used.
+This will suffice for most applications. If an extended output component
+interface is defined, the <code>OutputProvider</code> class should be extended to
+provide additional static methods. For an example of this, see the
+<code>org.eclipse.escet.cif.simulator.output.SimulatorOutputComponent</code> class.</p>
+</div>
+<div class="paragraph">
+<p>For details on how and where to create an instance of the output provider for
+an application, see the section on
+<a href="#app-framework-implement-your-application">how to implement your own application</a>.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-stdout-and-stderr">Stdout and stderr</h4>
+<div class="paragraph">
+<p>Command line applications generally write output to stdout and/or stderr
+streams. For applications running within the Eclipse IDE, those streams are
+connected to the Eclipse IDE as a whole, and not to the applications
+running within Eclipse. The I/O framework solves this issue, by providing a
+uniform I/O interface.</p>
+</div>
+<div class="paragraph">
+<p>The <code>org.eclipse.escet.common.app.framework.output.OutputProvider&lt;T&gt;</code> class
+provides several static methods that can be used to generate output. Several
+forms of output are supported by default:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Error output is automatically generated by the exception framework, for
+uncaught exceptions. It is however possible to manually generate error
+output, by using the <code>OutputProvider.err</code> method. This could for instance
+be useful if multiple error messages are to be outputted.</p>
+</li>
+<li>
+<p>Warning output can be generated by applications, by using the
+<code>OutputProvider.warn</code> method. The application framework counts the number
+of warnings generated by an application, and the count can be retrieved
+using the <code>OutputProvider.getWarningCount</code> method.</p>
+</li>
+<li>
+<p>Normal output can be generated by applications, by using the
+<code>OutputProvider.out</code> method. To support structured output, the I/O
+frame maintains an indentation level, which can be increased and decreased
+one level at a time.</p>
+</li>
+<li>
+<p>Debug output can be generated by applications, by using the
+<code>OutputProvider.dbg</code> method. To support structured output, the I/O
+frame maintains an indentation level, which can be increased and decreased
+one level at a time.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>One of the default options of the application framework is the output mode
+option (<code>OutputModeOption</code> class). It can be used to control what output gets
+forwarded to the output components. For performance reasons, it may be useful
+to query whether certain output gets forwarded. The <code>OutputProvider</code> class
+provides the <code>dowarn</code>, <code>doout</code>, and <code>dodbg</code> methods for this.</p>
+</div>
+<div class="paragraph">
+<p>It should now be clear that application should never access <code>System.out</code> and
+<code>System.err</code> directly. Instead, they should use the output provider.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-stdin">Stdin</h4>
+<div class="paragraph">
+<p>There is no equivalent to the <code>OutputProvider</code> for stdin. Instead, use the
+<code>AppEnv.getStreams()</code> method to obtain the streams for the current
+application. The <code>AppEnv.getStreams().IN</code> streams can be used to read data
+from the stdin stream associated with the current application.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-buffering-flushing">Buffering and flushing</h4>
+<div class="paragraph">
+<p>The I/O framework buffers all input and output streams by default, and also
+automatically performs line based flushing for output and error streams.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-option-framework">The option framework</h3>
+<div class="paragraph">
+<p>Applications often have settings, and they are generally passed as command
+line arguments. GUI applications however, often use a dialog to configure the
+options instead. To allow applications within the application framework to
+work in both scenarios, the application framework provides the option
+framework.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect3">
+<h4 id="app-framework-option-class">The option class</h4>
+<div class="paragraph">
+<p>All options of applications that use the application framework, should be
+specified as application framework options. Each option is a derived class
+of the <code>org.eclipse.escet.common.app.framework.options.Option&lt;T&gt;</code> class.
+The generic type parameter <code>&lt;T&gt;</code> indicates that options are strongly typed
+with respect to their values.</p>
+</div>
+<div class="paragraph">
+<p>
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-cli-options-and-option-dialog">Command line options and the option dialog</h4>
+<div class="paragraph">
+<p>The option framework requires all options to work via the command line, but
+options can also support the option dialog. It is recommended for all options
+to support the option dialog. The option framework process options as follows:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>All registered options are first initialized to their default values.</p>
+</li>
+<li>
+<p>The pre-options hook for the application is fired.</p>
+</li>
+<li>
+<p>The command line options are parsed.</p>
+</li>
+<li>
+<p>If the command line options enabled the option dialog option (a standard
+application framework option that controls whether the option dialog is to
+be shown), the option dialog is shown. The option values as processed so
+far, are shown to the user in this dialog. The user can modify the options
+via the dialog and choose <b class="button">OK</b> to continue.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>If the user chose <b class="button">Cancel</b> in the option dialog, terminate the
+application.</p>
+</li>
+<li>
+<p>All registered options are reset to their default values. This also
+clears the remaining arguments option, if any.</p>
+</li>
+<li>
+<p>The options set in the dialog are parsed. This overwrites the values
+of all options.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The post-processing hook is fired for all options that have it.</p>
+</li>
+<li>
+<p>All option values are checked (validated).</p>
+</li>
+<li>
+<p>The post-options hook for the application is fired.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-option-categories">Option categories</h4>
+<div class="paragraph">
+<p>Options can be ordered into categories. Categories can be combined into a
+hierarchical structure. This allows the option dialog to show options per
+category, and allows the command line help message to show command line
+option help per category. In both cases, this adds structure to the possibly
+large amount of options, and makes it easier for end users to find the option
+they are looking for.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-instantiating-options">Instantiating options</h4>
+<div class="paragraph">
+<p>For every option, there may be at most one instance. Therefore, never use
+the constructors of options directly. Instead use the following:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java">Options.getInstance(MyOption.class)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>to get an instance of an option.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-getting-setting-option-values">Getting and setting option values</h4>
+<div class="paragraph">
+<p>Applications don&#8217;t have access to the command line arguments. The option
+framework automatically process the command line arguments based on the options
+registered for the application. Applications always retrieve the values of
+options through static methods defined in the option classes.</p>
+</div>
+<div class="paragraph">
+<p>Options are usually set via command line arguments, or via the option dialog.
+It is however also possible to set option values at run-time:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java">Options.set(MyOption.class, &lt;value&gt;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-option-processing-order">Option processing order</h4>
+<div class="paragraph">
+<p>If possible, options should not depend on the order in which they are parsed.
+If the value of one option depends on the value of another option, use the
+post-processing hook to achieve consistency.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-cli-option-syntax">Command line option syntax</h4>
+<div class="paragraph">
+<p>All options have a long form (<code>--option</code>), optionally with a value
+(<code>--option=VALUE</code>). They can also have short form (<code>-o</code>), optionally with
+a value (<code>-oVALUE</code> or <code>-o VALUE</code>). All arguments that do not start with a
+dash symbol (<code>-</code>) are considered to be the 'remaining arguments'. It is
+possible to register one option that processes those remaining arguments. Such
+special options have <code>*</code> as long option name.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-implement-new-options">Implementing your own options</h4>
+<div class="paragraph">
+<p>Simply derive from the <code>Option</code> class, and study its API to implement your own
+options. You can also look at existing options for best practices. Furthermore,
+the option framework provides several options that can be used in applications:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>BooleanOption</code>: convenience base class for boolean options.</p>
+</li>
+<li>
+<p><code>FilesOption</code>: multiple remaining arguments input file paths option.</p>
+</li>
+<li>
+<p><code>InputFileOption</code>: single remaining argument input file path option.</p>
+</li>
+<li>
+<p><code>OutputFileOption</code>: output file path option (<code>--output</code> / <code>-o</code>).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+
+
+</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-standard-options">Standard options</h4>
+<div class="paragraph">
+<p>The application framework provides several options that must be registered
+for every application:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>DevModeOption</code>: option to enable/disable development mode. Developers can
+enable this option to get stack traces in case of internal exceptions,
+instead of crash reports. See also the chapter on the exception framework.</p>
+</li>
+<li>
+<p><code>HelpOption</code>: option to show the application help text at the console.</p>
+</li>
+<li>
+<p><code>LicenseOption</code>: option to print the license text of the application at
+the console, and terminate the application.</p>
+</li>
+<li>
+<p><code>OptionDialogOption</code>: option to show the option dialog.</p>
+</li>
+<li>
+<p><code>OutputModeOption</code>: option to control the amount of output produced by the
+application. See also the <a href="#app-framework-io-framework">I/O framework</a>
+section.</p>
+</li>
+<li>
+<p><code>GuiOption</code>: option to disable the GUI (enabled headless execution mode).
+See also the section on <a href="#app-framework-guis-and-swt">GUIs and SWT</a>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>See also the section on
+<a href="#app-framework-implement-your-application">how to implement your own application</a>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-compiler-framework">The compiler framework</h3>
+<div class="paragraph">
+<p>For performance reasons, it can be better to generate and compile code at
+runtime, than to use an interpreter. The Java compiler supports this. However,
+in an Eclipse/OSGi environment, some additional effort is required to make it
+all work. The application framework contains a compiler framework in the
+<code>org.eclipse.escet.common.app.framework.javacompiler</code> package. It supports
+in-memory compilation of in-memory code, with full transparent OSGi support.
+That is, whether used from inside the Eclipse IDE, or from a stand-alone
+application, the compiler framework takes care of the details. The framework
+supports various representations of in-memory code, and can be extended with
+additional representations.</p>
+</div>
+<div class="paragraph">
+<p>The compiler framework requires the use of a Java Development Kit (JDK). A
+Java Runtime Environment (JRE) is not sufficient.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-implement-your-application">How to implement your own application</h3>
+<div class="paragraph">
+<p>This section more or less explains step by step how to implement your own
+application, by using the application framework.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Decide whether it is enough to use the <code>IOutputComponent</code> interface, or
+that you need more. See also the <a href="#app-framework-io-framework">I/O framework</a>
+section.</p>
+</li>
+<li>
+<p>Create a new class, deriving from <code>Application</code>.</p>
+</li>
+<li>
+<p>Add a <code>main</code> method to your application class. For instance:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="comment">/**
+ * Application main method.
+ *
+ * @param args The command line arguments supplied to the application.
+ */</span>
+<span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> main(<span class="predefined-type">String</span><span class="type">[]</span> args) {
+    MyApp app = <span class="keyword">new</span> MyApp();
+    app.run(args);
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This allows for standalone execution.</p>
+</div>
+</li>
+<li>
+<p>Add constructors as needed. You&#8217;ll probably want to implement some or most
+of the constructors provided by the <code>Application</code> class. In order to
+support standalone execution, the following constructor is required:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="comment">/** Constructor for the {@link MyApp} class. */</span>
+<span class="directive">public</span> MyApp() {
+    <span class="comment">// Nothing to do here.</span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In order to support the ToolDef <code>app</code> tool, which can be used to run
+application framework applications from ToolDef scripts, the following
+constructor is required:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="comment">/**
+ * Constructor for the {@link MyApp} class.
+ *
+ * @param streams The streams to use for input, output, and error streams.
+ */</span>
+<span class="directive">public</span> MyApp(AppStreams streams) {
+    <span class="local-variable">super</span>(streams);
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This constructor is also required by the <code>ChildAppStarter</code> class, to support
+starting one application framework application from another application
+framework application.</p>
+</div>
+</li>
+<li>
+<p>Implement the mandatory methods <code>getAppName</code> and <code>getAppDescription</code>.</p>
+</li>
+<li>
+<p>Implement mandatory method <code>getProvider</code>. If you use <code>IOutputComponent</code>,
+then you can implement it as follows:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">return</span> <span class="keyword">new</span> OutputProvider&lt;&gt;();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you don&#8217;t use <code>IOutputComponent</code>, return a new instance of a derived
+class of <code>OutputProvider</code> that implements the derived interface of
+<code>IOutputComponent</code>.</p>
+</div>
+</li>
+<li>
+<p>If you don&#8217;t use <code>IOutputComponent</code>, override the
+<code>getStreamOutputComponent</code> method, and return a new instance of a derived
+class of <code>StreamOutputComponent</code> that implements the derived interface of
+<code>IOutputComponent</code>. Such a class usually ignores all other output, and
+thus behaves exactly as <code>StreamOutputComponent</code>, but implements the full
+output interface of the application.</p>
+</li>
+<li>
+<p>Implement mandatory method <code>getAllOptions</code>. You&#8217;ll need to return an
+option category that wraps the actual option categories of the application.
+Use the <code>getGeneralOptionCategory</code> to obtain the default application
+options category, which must always be the first category of options for
+your application. An example of an implementation of this method:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Override</span>
+<span class="annotation">@SuppressWarnings</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">rawtypes</span><span class="delimiter">&quot;</span></span>)
+<span class="directive">protected</span> OptionCategory getAllOptions() {
+    OptionCategory generalOpts = getGeneralOptionCategory();
+
+    OptionCategory debugOpts =
+        <span class="keyword">new</span> OptionCategory(<span class="string"><span class="delimiter">&quot;</span><span class="content">Debug</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">Debugging options.</span><span class="delimiter">&quot;</span></span>, list(),
+                           list(Options.getInstance(DebugOption.class)));
+
+    OptionCategory options =
+        <span class="keyword">new</span> OptionCategory(<span class="string"><span class="delimiter">&quot;</span><span class="content">My Application Options</span><span class="delimiter">&quot;</span></span>,
+                           <span class="string"><span class="delimiter">&quot;</span><span class="content">All options for My Application.</span><span class="delimiter">&quot;</span></span>,
+                           list(generalOpts, debugOpts), list());
+
+    <span class="keyword">return</span> options;
+}</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>Implement mandatory method <code>runInternal</code> with the actual application code.</p>
+</li>
+<li>
+<p>Override optional method <code>getHelpMessageNotes</code> if applicable.</p>
+</li>
+<li>
+<p>Override optional methods <code>preOptions</code> and <code>postOptions</code> if applicable.</p>
+</li>
+<li>
+<p>Override optional method <code>getAppVersion</code> if applicable.</p>
+</li>
+</ul>
+</div>
+<div class="sect3">
+<h4 id="app-framework-runinternal-method">The runInternal method</h4>
+<div class="paragraph">
+<p>Some things to consider when implementing the <code>runInternal</code> method:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If you want to support stand-alone execution, register all Eclipse Modeling
+Framework (EMF) metamodels with the EMF metamodel registry. Also register any
+parsers, constraints, etc. For instance:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">if</span> (!Platform.isRunning()) {
+    <span class="comment">// Register languages and parsers for stand-alone execution.</span>
+    LanguageRegistry.register...(...)
+}</code></pre>
+</div>
+</div>
+</li>
+<li>
+<p>The start of the <code>runInternal</code> method is a good place to add output
+components, as all options have been fully processed at this point. Output
+components can be registered by using the application&#8217;s output provider
+(though static methods).</p>
+</li>
+<li>
+<p>The code in this method and all code directly or indirectly executed by this
+method, should regularly call the <code>AppEnv.isTerminationRequested</code> method,
+to find out whether the application should be terminated.</p>
+</li>
+<li>
+<p>For the return code of this method, always use value zero, to indicate
+successful termination. Other exit codes are automatically generated by the
+exception framework, if applicable. See also the
+<a href="#app-framework-exit-codes">exit codes</a> section.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-registration">Application registration</h3>
+<div class="paragraph">
+<p>Applications that use the application framework maintain their own data. This
+includes options, output components (via an output provider), streams, etc.
+Only a single application can be registered for each thread. Only once the
+application terminates and automatically unregisters itself, can a new
+application register itself in that thread. To run multiple applications
+in parallel, simply run them on different threads.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="app-framework-multi-threaded-apps">Multi-threaded applications</h4>
+<div class="paragraph">
+<p>All data stored for the application is wrapped in the <code>AppEnvData</code> class, and
+stored by the <code>AppEnv</code> class, on a per-thread basis. If your application uses
+multiple threads, you need to register each thread with the application
+framework. Use the <code>AppEnv.registerThread</code> method for this. This method
+requires the current application environment data as parameter, which may
+be obtained by using the <code>AppEnv.getData</code> method. To avoid managed memory
+leaks, always unregister threads once they are no longer used, by using the
+<code>AppEnv.unregisterThread</code> method.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-unit-tests">Unit tests</h4>
+<div class="paragraph">
+<p>If unit tests use methods that depend on the application being registered, then
+the unit test will need to register an application. Examples of method using
+the application framework are methods that use options, or produce output via
+the application framework. Especially for unit tests, the
+<code>AppEnv.registerSimple</code> method can be used to register a dummy application.
+This method uses a default application environment, without an actual
+application, registers a default stream output provider, sets the output mode
+to errors and warnings only (no normal or debug output), and disables
+development mode. It can be used in a unit test class as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="comment">/***/</span> <span class="annotation">@BeforeClass</span>
+<span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> oneTimeSetUp() {
+    AppEnv.registerSimple();
+}
+
+<span class="comment">/***/</span> <span class="annotation">@AfterClass</span>
+<span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> oneTimeTearDown() {
+    AppEnv.unregisterApplication();
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If any options are used, they will need to be available as well. For instance,
+one could add the following to the <code>oneTimeSetUp</code> method, or at the start of
+the actual unit test method:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java">Options.set(SomeOption.class, &lt;value&gt;);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="app-framework-running-app-from-other-app">Running an application from another application</h4>
+<div class="paragraph">
+<p>As noted above, only a single application can be registered for a single
+thread. To start one application from another application, simply run the
+second application in a fresh thread. In the new thread, do the following:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Construct the child application, using a constructor with the <code>AppStreams</code>
+argument, to pass along the streams from the parent application.</p>
+</li>
+<li>
+<p>Set the current working directory to the current working directory of the
+parent application.</p>
+</li>
+<li>
+<p>Obtain the Eclipse IDE console (if any) from the parent application, and couple
+it the child application.</p>
+</li>
+<li>
+<p>Run the child application.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>After the child application thread finishes, make sure you:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Restore the coupling between the Eclipse IDE console (if any) and the parent
+application.</p>
+</li>
+<li>
+<p>If the child application finished due to a termination request, request
+termination for the parent application.</p>
+</li>
+<li>
+<p>Decide what to do with the exit code of the child application. If it is
+non-zero, you&#8217;ll probably want to terminate the parent application.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To make it easier to follow this approach, the <code>ChildAppStarter.exec</code>
+methods can be used.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="app-framework-execution">Execution</h3>
+<div class="paragraph">
+<p>Application framework applications can be executed in the following ways:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>As plain Java application, from the command line.</p>
+<div class="paragraph">
+<p>Using the <em>GUI</em> option, the application can be executed either with full GUI
+support, or as headless application.</p>
+</div>
+<div class="paragraph">
+<p>The OSGi framework will not be running, and the Eclipse workbench will not
+be available.</p>
+</div>
+</li>
+<li>
+<p>As application within the Eclipse IDE, with full GUI support.</p>
+<div class="paragraph">
+<p>The OSGi framework will be running, and the Eclipse workbench will be
+available.</p>
+</div>
+</li>
+<li>
+<p>As headless Eclipse application.</p>
+<div class="paragraph">
+<p>Using the <em>GUI</em> option, the application can be executed either with full GUI
+support, or as headless application.</p>
+</div>
+<div class="paragraph">
+<p>The OSGi framework will be running, but the Eclipse workbench will not be
+available.</p>
+</div>
+<div class="paragraph">
+<p>The <code>org.eclipse.escet.common.app.framework.AppEclipseApplication</code> application
+can be provided to the <code>-application</code> command line argument of Eclipse to
+start any application framework application. This functionality is
+implemented by the
+<code>org.eclipse.escet.common.app.framework.AppEclipseApplication</code> which
+provides a generic implementation of Eclipse&#8217;s <code>IApplication</code> interface
+that supports execution of any application framework application.</p>
+</div>
+<div class="paragraph">
+<p>The following command line arguments are expected:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The name of the plug-in (OSGi bundle) that provides the application.</p>
+</li>
+<li>
+<p>The full/absolute name of the Java class that implements the application.
+Must extend the <code>Application</code> class and have a parameterless constructor.</p>
+</li>
+<li>
+<p>The remaining command line arguments are the command line arguments for
+the application itself.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="release-notes-chapter-index">Eclipse ESCET release notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The release notes for the releases of the Eclipse ESCET tools,
+as part of the Eclipse ESCET project, are listed below in reverse
+chronological order.</p>
+</div>
+<div class="sect2">
+<h3 id="version-0-1-unreleased">Version 0.1 (unreleased)</h3>
+<div class="paragraph">
+<p>The first release of the Eclipse ESCET project and toolkit.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="contact-chapter-index">Contact information</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Thanks for your interest in Eclipse Supervisory Control Engineering Toolkit
+(Eclipse ESCET) project.</p>
+</div>
+<div class="paragraph">
+<p>You can interact with the Eclipse ESCET community and its developers in
+various ways:</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><a href="https://www.eclipse.org/forums/index.php/f/527/">Eclipse ESCET forum</a></dt>
+<dd>
+<p>If you have any questions regarding the Eclipse ESCET project, any of its
+tools, or how to use them, feel free to ask them on the project forum.</p>
+</dd>
+<dt class="hdlist1"><a href="#developer-issue-tracking-chapter-index">Issue tracking</a></dt>
+<dd>
+<p>If you wish to browse existing issues or report new ones, then see the
+issue tracking section for more information.</p>
+</dd>
+<dt class="hdlist1"><a href="#developer-chapter-index">Developer information</a></dt>
+<dd>
+<p>If you specifically want to contact the Eclipse ESCET developers concerning
+development related activities, want to contribute to the Eclipse ESCET
+project, or want to browse the source code, then see the developer
+information.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="legal-chapter-index">Legal</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The material in this documentation is
+Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
+Eclipse, and the Eclipse Logo are registered trademarks of the
+Eclipse Foundation. Other names may be trademarks of their
+respective owners.</p>
+</div>
+<div class="paragraph">
+<p><strong>License</strong></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Foundation makes available all content in this document
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the MIT License. A copy of the MIT License
+is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>. For purposes of the
+MIT License, "Software" will mean the Content.</p>
+</div>
+<div class="paragraph">
+<p>If you did not receive this Content directly from the Eclipse Foundation,
+the Content is being redistributed by another party ("Redistributor") and
+different terms and conditions may apply to your use of any object code in
+the Content. Check the Redistributor&#8217;s license that was provided with the
+Content. If no such license exists, contact the Redistributor. Unless
+otherwise indicated below, the terms and conditions of the MIT License
+still apply to any source code in the Content and such source code may be
+obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
+pre.CodeRay{background:#f7f7f8}
+.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
+.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
+.CodeRay .line-numbers strong{color:#000}
+table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.CodeRay td{vertical-align:top;line-height:inherit}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.code{padding:0 0 0 .75em}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+  messageStyle: "none",
+  tex2jax: {
+    inlineMath: [["\\(", "\\)"]],
+    displayMath: [["\\[", "\\]"]],
+    ignoreClass: "nostem|nolatexmath"
+  },
+  asciimath2jax: {
+    delimiters: [["\\$", "\\$"]],
+    ignoreClass: "nostem|noasciimath"
+  },
+  TeX: { equationNumbers: { autoNumber: "none" } }
+})
+MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
+  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
+    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
+      data.math.root.display = "block"
+    }
+    return data
+  })
+})
+</script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+
+<div id="footer">
+<div id="footer-text">
+<a href="https://www.eclipse.org">Eclipse Home</a>
+|
+<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
+|
+<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
+|
+<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
+|
+<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/v0.1-M1/escet/performance/clear_console.png b/v0.1-M1/escet/performance/clear_console.png
new file mode 100644
index 0000000..be1948b
--- /dev/null
+++ b/v0.1-M1/escet/performance/clear_console.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/console_pages.png b/v0.1-M1/escet/performance/console_pages.png
new file mode 100644
index 0000000..77965da
--- /dev/null
+++ b/v0.1-M1/escet/performance/console_pages.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/console_pages_list.png b/v0.1-M1/escet/performance/console_pages_list.png
new file mode 100644
index 0000000..144d1ea
--- /dev/null
+++ b/v0.1-M1/escet/performance/console_pages_list.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/eclipse_heap_status1.png b/v0.1-M1/escet/performance/eclipse_heap_status1.png
new file mode 100644
index 0000000..e995af9
--- /dev/null
+++ b/v0.1-M1/escet/performance/eclipse_heap_status1.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/eclipse_heap_status2.png b/v0.1-M1/escet/performance/eclipse_heap_status2.png
new file mode 100644
index 0000000..eebfe6e
--- /dev/null
+++ b/v0.1-M1/escet/performance/eclipse_heap_status2.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/java_memory.png b/v0.1-M1/escet/performance/java_memory.png
new file mode 100644
index 0000000..5924e06
--- /dev/null
+++ b/v0.1-M1/escet/performance/java_memory.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/java_memory.png.svg b/v0.1-M1/escet/performance/java_memory.png.svg
new file mode 100644
index 0000000..264d5a9
--- /dev/null
+++ b/v0.1-M1/escet/performance/java_memory.png.svg
@@ -0,0 +1,407 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="800"
+   height="370"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="java_memory.png.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3683"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         id="path3689"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3701"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="496.31697"
+     inkscape:cy="78.648691"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1912"
+     inkscape:window-height="1111"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-682.36218)">
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.99999994000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2816"
+       width="779"
+       height="29"
+       x="10.499998"
+       y="692.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="400.24219"
+       y="713.40125"
+       id="text3590"><tspan
+         sodipodi:role="line"
+         id="tspan3592"
+         x="400.24219"
+         y="713.40125"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Operating System (OS) memory (RAM, virtual memory)</tspan></text>
+    <rect
+       y="772.86218"
+       x="10.499998"
+       height="29"
+       width="779"
+       id="rect2831"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.99999994000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2833"
+       y="793.40125"
+       x="401.10547"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="793.40125"
+         x="401.10547"
+         id="tspan2835"
+         sodipodi:role="line">Java process heap (java/java.exe)</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2837"
+       width="569"
+       height="29"
+       x="10.499999"
+       y="852.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="295.85156"
+       y="873.40125"
+       id="text2839"><tspan
+         sodipodi:role="line"
+         id="tspan2841"
+         x="295.85156"
+         y="873.40125"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Java object heap</tspan></text>
+    <rect
+       y="852.86218"
+       x="590.5"
+       height="29"
+       width="199"
+       id="rect2843"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2845"
+       y="873.40125"
+       x="690"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="873.40125"
+         x="690"
+         id="tspan2847"
+         sodipodi:role="line">'Everything else'</tspan></text>
+    <rect
+       y="932.86218"
+       x="10.499999"
+       height="29"
+       width="119"
+       id="rect2849"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2851"
+       y="953.40515"
+       x="70.882812"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="953.40515"
+         x="70.882812"
+         id="tspan2853"
+         sodipodi:role="line">Young gen.</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2855"
+       width="108.99999"
+       height="29"
+       x="380.5"
+       y="932.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="435.08203"
+       y="953.28015"
+       id="text2857"><tspan
+         sodipodi:role="line"
+         id="tspan2859"
+         x="435.08203"
+         y="953.28015"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Metaspace</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.99999994000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2861"
+       width="229"
+       height="29"
+       x="140.49998"
+       y="932.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="255.23827"
+       y="953.40125"
+       id="text2863"><tspan
+         sodipodi:role="line"
+         id="tspan2865"
+         x="255.23827"
+         y="953.40125"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Old generation</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2867"
+       width="329"
+       height="29"
+       x="10.499999"
+       y="1012.8622" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="175.36328"
+       y="1033.3065"
+       id="text2869"><tspan
+         sodipodi:role="line"
+         id="tspan2871"
+         x="175.36328"
+         y="1033.3065"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Allocation space</tspan></text>
+    <rect
+       y="1012.8622"
+       x="350.5"
+       height="29"
+       width="139"
+       id="rect2873"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2875"
+       y="1033.3065"
+       x="419.89856"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="1033.3065"
+         x="419.89856"
+         id="tspan2877"
+         sodipodi:role="line">Survivor spaces</tspan></text>
+    <rect
+       y="932.86218"
+       x="500.5"
+       height="29"
+       width="108.99999"
+       id="rect2879"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2881"
+       y="953.32703"
+       x="554.64062"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="953.32703"
+         x="554.64062"
+         id="tspan2883"
+         sodipodi:role="line">Native code</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:0.99999994000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2885"
+       width="69"
+       height="29"
+       x="620.5"
+       y="932.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="654.86719"
+       y="953.32703"
+       id="text2887"><tspan
+         sodipodi:role="line"
+         id="tspan2889"
+         x="654.86719"
+         y="953.32703"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Stacks</tspan></text>
+    <rect
+       y="932.86218"
+       x="700.5"
+       height="29"
+       width="39"
+       id="rect2891"
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       id="text2893"
+       y="953.27625"
+       x="719.99219"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       xml:space="preserve"><tspan
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans"
+         y="953.27625"
+         x="719.99219"
+         id="tspan2895"
+         sodipodi:role="line">GC</tspan></text>
+    <rect
+       style="fill:#b4b4b4;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2897"
+       width="39"
+       height="29"
+       x="750.5"
+       y="932.86218" />
+    <text
+       xml:space="preserve"
+       style="font-size:16px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="770.01172"
+       y="953.47937"
+       id="text2899"><tspan
+         sodipodi:role="line"
+         id="tspan2901"
+         x="770.01172"
+         y="953.47937"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">...</tspan></text>
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 10,722.36218 480,0 300,50 -780,0 0,-50 z"
+       id="rect4875"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path4878"
+       d="m 10,802.36218 575,0 -5,50 -570,0 0,-50 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 10,882.36218 140,0 -20,50 -120,0 0,-50 z"
+       id="path4880"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path4882"
+       d="m 10,962.36218 100,0 230,50.00002 -330,0 0,-50.00002 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 585,802.36218 205,0 0,50 -200,0 -5,-50 z"
+       id="path4884" />
+    <path
+       id="path4886"
+       d="m 150,882.36218 430,0 -210,50 -230,0 10,-50 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 590,882.36218 40,0 -140,50 -110,0 210,-50 z"
+       id="path4888"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path4890"
+       d="m 630,882.36218 40,0 -60,50 -110,0 130,-50 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 670,882.36218 40,0 -20,50 -70,0 50,-50 z"
+       id="path4892"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path4894"
+       d="m 710,882.36218 40,0 -10,50 -40,0 10,-50 z"
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 750,882.36218 40,0 0,50 -40,0 0,-50 z"
+       id="path4896" />
+    <path
+       style="fill:#dcdcdc;fill-opacity:1;stroke:none"
+       d="m 110,962.36218 20,0 360,50.00002 -140,0 -240,-50.00002 z"
+       id="path4898"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+</svg>
diff --git a/v0.1-M1/escet/performance/jvisualvm_pid.png b/v0.1-M1/escet/performance/jvisualvm_pid.png
new file mode 100644
index 0000000..06d08f5
--- /dev/null
+++ b/v0.1-M1/escet/performance/jvisualvm_pid.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/jvisualvm_sshot.png b/v0.1-M1/escet/performance/jvisualvm_sshot.png
new file mode 100644
index 0000000..e8d3820
--- /dev/null
+++ b/v0.1-M1/escet/performance/jvisualvm_sshot.png
Binary files differ
diff --git a/v0.1-M1/escet/performance/terminate_button.png b/v0.1-M1/escet/performance/terminate_button.png
new file mode 100644
index 0000000..f07119b
--- /dev/null
+++ b/v0.1-M1/escet/performance/terminate_button.png
Binary files differ
diff --git a/v0.1-M1/escet/use/apps_view.png b/v0.1-M1/escet/use/apps_view.png
new file mode 100644
index 0000000..9bc16a9
--- /dev/null
+++ b/v0.1-M1/escet/use/apps_view.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_app_status_legend.png b/v0.1-M1/escet/use/command_app_status_legend.png
new file mode 100644
index 0000000..71defe0
--- /dev/null
+++ b/v0.1-M1/escet/use/command_app_status_legend.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_auto_expand.png b/v0.1-M1/escet/use/command_auto_expand.png
new file mode 100644
index 0000000..c1d07f1
--- /dev/null
+++ b/v0.1-M1/escet/use/command_auto_expand.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_auto_remove.png b/v0.1-M1/escet/use/command_auto_remove.png
new file mode 100644
index 0000000..58e171c
--- /dev/null
+++ b/v0.1-M1/escet/use/command_auto_remove.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_auto_terminate.png b/v0.1-M1/escet/use/command_auto_terminate.png
new file mode 100644
index 0000000..aa0ce66
--- /dev/null
+++ b/v0.1-M1/escet/use/command_auto_terminate.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_remove.png b/v0.1-M1/escet/use/command_remove.png
new file mode 100644
index 0000000..4f4b001
--- /dev/null
+++ b/v0.1-M1/escet/use/command_remove.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_remove_all.png b/v0.1-M1/escet/use/command_remove_all.png
new file mode 100644
index 0000000..97d5291
--- /dev/null
+++ b/v0.1-M1/escet/use/command_remove_all.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_terminate.png b/v0.1-M1/escet/use/command_terminate.png
new file mode 100644
index 0000000..8ab7a91
--- /dev/null
+++ b/v0.1-M1/escet/use/command_terminate.png
Binary files differ
diff --git a/v0.1-M1/escet/use/command_terminate_all.png b/v0.1-M1/escet/use/command_terminate_all.png
new file mode 100644
index 0000000..ced551c
--- /dev/null
+++ b/v0.1-M1/escet/use/command_terminate_all.png
Binary files differ
diff --git a/v0.1-M1/escet/use/model_with_error.png b/v0.1-M1/escet/use/model_with_error.png
new file mode 100644
index 0000000..78c229b
--- /dev/null
+++ b/v0.1-M1/escet/use/model_with_error.png
Binary files differ
diff --git a/v0.1-M1/escet/use/perspectives.png b/v0.1-M1/escet/use/perspectives.png
new file mode 100644
index 0000000..234271f
--- /dev/null
+++ b/v0.1-M1/escet/use/perspectives.png
Binary files differ
diff --git a/v0.1-M1/escet/use/show_status_legend.png b/v0.1-M1/escet/use/show_status_legend.png
new file mode 100644
index 0000000..85ec494
--- /dev/null
+++ b/v0.1-M1/escet/use/show_status_legend.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_crashed.png b/v0.1-M1/escet/use/status_crashed.png
new file mode 100644
index 0000000..65963c2
--- /dev/null
+++ b/v0.1-M1/escet/use/status_crashed.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_failed.png b/v0.1-M1/escet/use/status_failed.png
new file mode 100644
index 0000000..0e16959
--- /dev/null
+++ b/v0.1-M1/escet/use/status_failed.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_finished.png b/v0.1-M1/escet/use/status_finished.png
new file mode 100644
index 0000000..8082604
--- /dev/null
+++ b/v0.1-M1/escet/use/status_finished.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_running.png b/v0.1-M1/escet/use/status_running.png
new file mode 100644
index 0000000..a8f403c
--- /dev/null
+++ b/v0.1-M1/escet/use/status_running.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_starting.png b/v0.1-M1/escet/use/status_starting.png
new file mode 100644
index 0000000..5e705df
--- /dev/null
+++ b/v0.1-M1/escet/use/status_starting.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_terminated.png b/v0.1-M1/escet/use/status_terminated.png
new file mode 100644
index 0000000..45a6aab
--- /dev/null
+++ b/v0.1-M1/escet/use/status_terminated.png
Binary files differ
diff --git a/v0.1-M1/escet/use/status_terminating.png b/v0.1-M1/escet/use/status_terminating.png
new file mode 100644
index 0000000..0e9a823
--- /dev/null
+++ b/v0.1-M1/escet/use/status_terminating.png
Binary files differ
diff --git a/v0.1-M1/index.html b/v0.1-M1/index.html
new file mode 100644
index 0000000..927fe5f
--- /dev/null
+++ b/v0.1-M1/index.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <title>Eclipse ESCET website</title>
+    <style>
+        tr, td {
+            padding: 0;
+            margin: 0;
+        }
+        td a {
+            margin-right: 10px;
+        }
+    </style>
+</head>
+<body>
+
+<p><strong>Eclipse Supervisory Control Engineering Toolkit (Eclipse ESCET™)</strong></p>
+
+<p>Version: v0.1-M1</p>
+
+<p>
+<table>
+<tr>
+<td><a href="escet">Eclipse ESCET website</a></td>
+<td>The website and documentation for the Eclipse ESCET project and its tools.</td>
+</tr>
+<tr>
+<td><a href="chi">Chi website</a></td>
+<td>The website and documentation for the Chi language and tools.</td></tr>
+<tr>
+<td><a href="cif">CIF website</a></td>
+<td>The website and documentation for the CIF language and tools.</td></tr>
+<tr>
+<td><a href="setext">SeText website</a></td>
+<td>The website and documentation for the SeText language and tools.</td></tr>
+<tr>
+<td><a href="tooldef">ToolDef website</a></td>
+<td>The website and documentation for the ToolDef language and tools.</td></tr>
+</table>
+</p>
+
+</body>
+</html>
diff --git a/v0.1-M1/setext/.git_keep_empty_dir b/v0.1-M1/setext/.git_keep_empty_dir
new file mode 100644
index 0000000..4e99800
--- /dev/null
+++ b/v0.1-M1/setext/.git_keep_empty_dir
@@ -0,0 +1,11 @@
+################################################################################
+# Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# This program and the accompanying materials are made available under the terms
+# of the MIT License which is available at https://opensource.org/licenses/MIT
+#
+# SPDX-License-Identifier: MIT
+################################################################################# 
diff --git a/v0.1-M1/setext/eclipse-escet-incubation-setext-manual.pdf b/v0.1-M1/setext/eclipse-escet-incubation-setext-manual.pdf
new file mode 100644
index 0000000..f0b9500
--- /dev/null
+++ b/v0.1-M1/setext/eclipse-escet-incubation-setext-manual.pdf
Binary files differ
diff --git a/v0.1-M1/setext/eclipse-incubation.png b/v0.1-M1/setext/eclipse-incubation.png
new file mode 100644
index 0000000..5fccef5
--- /dev/null
+++ b/v0.1-M1/setext/eclipse-incubation.png
Binary files differ
diff --git a/v0.1-M1/setext/index.html b/v0.1-M1/setext/index.html
new file mode 100644
index 0000000..4c70eae
--- /dev/null
+++ b/v0.1-M1/setext/index.html
@@ -0,0 +1,1534 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation">
+<title>SeText documentation (Incubation)</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+:not(pre)>code.nobreak{word-wrap:normal}
+:not(pre)>code.nowrap{white-space:nowrap}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<style>
+.menu, .submenu, .menuitem, .menuref {
+    background-color: Menu;
+}
+
+.button {
+    border: 1px solid ButtonFace;
+    /*
+    Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
+    border: 2px outset ButtonFace;
+    background-color: ButtonFace;
+    */
+    padding-left: 0.5ex;
+    padding-right: 0.5ex;
+    font-weight: normal;
+    font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
+    white-space: nowrap;
+}
+.button:before {
+    content: none !important;
+}
+.button:after {
+    content: none !important;
+}
+
+#footer-text, #footer-text a {
+    color: rgba(255,255,255,.8)
+}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<h1>SeText documentation (Incubation)</h1>
+<div class="details">
+<span id="author" class="author">Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation</span><br>
+<span id="revnumber">version 0.1.0.20210126-175926</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#setext-readme-lexical-syntax">SeText lexical syntax</a></li>
+<li><a href="#setext-readme-specifying-lexical-syntax">Specifying lexical syntax using SeText</a></li>
+<li><a href="#setext-readme-regular-expressions">Regular expressions</a></li>
+<li><a href="#setext-readme-terminal-descriptions">Terminal descriptions</a></li>
+<li><a href="#setext-readme-imports">Imports</a></li>
+<li><a href="#setext-readme-scanner-hooks">Scanner hooks</a></li>
+<li><a href="#setext-readme-specifying-grammars">Specifying grammars using SeText</a></li>
+<li><a href="#setext-readme-parser-hooks">Parser hooks</a></li>
+<li><a href="#setext-readme-usage-hints">Usage hints</a></li>
+<li><a href="#setext-readme-generated-scanners-parsers">Generated scanners/parsers</a></li>
+<li><a href="#setext-readme-using-in-an-eclipse-plugin-project">Using SeText in an Eclipse Plug-in Project</a></li>
+<li><a href="#setext-readme-limitations-issues">Limitations and issues</a></li>
+<li><a href="#setext-readme-release-notes">Release notes</a>
+<ul class="sectlevel2">
+<li><a href="#version-0-1-unreleased">Version 0.1 (unreleased)</a></li>
+</ul>
+</li>
+<li><a href="#setext-readme-legal">Legal</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>SeText is a textual syntax specification language and associated scanner/parser
+generator. It can be used to specify the syntax of a language, and automatically
+generate a scanner and LALR(1) parser(s).</p>
+</div>
+<div class="paragraph">
+<p>SeText is one of the tools of the
+<a href="https://eclipse.org/escet">Eclipse ESCET&#8482; project</a>.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The Eclipse ESCET project, including the SeText language and toolset,
+is currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>For the purpose of this document, it is assumed that the reader is familiar
+with scanner/parser generators (for example <em>yacc</em>/<em>bison</em> and <em>lex</em>/<em>flex</em>),
+scanner and LALR(1) parser technology (including regular expressions and BNF
+notation), and understands the limitations of the LALR(1) algorithm.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+You can <a href="eclipse-escet-incubation-setext-manual.pdf">download this manual</a>
+as a PDF as well.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The following topics are discussed:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#setext-readme-lexical-syntax">SeText lexical syntax</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-specifying-lexical-syntax">Specifying lexical syntax using SeText</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-regular-expressions">Regular expressions</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-terminal-descriptions">Terminal descriptions</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-imports">Imports</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-scanner-hooks">Scanner hooks</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-specifying-grammars">Specifying grammars using SeText</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-parser-hooks">Parser hooks</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-usage-hints">Usage hints</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-generated-scanners-parsers">Generated scanners/parsers</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-using-in-an-eclipse-plugin-project">Using SeText in an Eclipse Plug-in Project</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-limitations-issues">Limitations and issues</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-release-notes">Release notes</a></p>
+</li>
+<li>
+<p><a href="#setext-readme-legal">Legal</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-lexical-syntax">SeText lexical syntax</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>SeText supports the following comments:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Everything after <code>//</code> until the end of the line is a comment.</p>
+</li>
+<li>
+<p>Everything from <code>/*</code> up to the next <code>*/</code>, possibly spanning multiple
+lines, is a comment.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>SeText keywords may be used by escaping them with a <code>$</code> character.</p>
+</div>
+<div class="paragraph">
+<p>Whitespace (spaces, tabs, and new lines) are essentially ignored.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-specifying-lexical-syntax">Specifying lexical syntax using SeText</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Terminals can be specified as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@terminals:
+  @keywords Operators = and or;
+  @keywords Functions = log sin cos tan;
+end
+
+@terminals:
+  IDTK = &quot;$?[a-zA-Z_][a-zA-Z0-9_]*&quot; {scanID};
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Here we specified two groups of terminals. The first group specifies two
+keyword (sub-)groups, named <code>Operators</code> and <code>Functions</code>. For these keywords
+(<code>and</code>, <code>or</code>, <code>log</code>, etc), terminals are created (<code>ANDKW</code>, <code>ORKW</code>,
+<code>LOGKW</code>, etc). Furthermore, the keyword group names (<code>Operators</code> and
+<code>Functions</code>) may be used as non-terminals in the grammar, to recognize
+exactly one of the keyword terminals created for that keyword group.</p>
+</div>
+<div class="paragraph">
+<p>The second group specifies an <code>IDTK</code> terminal, defined by a regular
+expression (see below). The <code>{scanID}</code> part indicates that the resulting
+tokens should be passed to the <code>scanID</code> method in the hooks class (see
+below), to allow post-processing. Post-processing methods are also allowed
+for keyword identifiers, such as <code>sin</code> and <code>cos</code> in the example.</p>
+</div>
+<div class="paragraph">
+<p>SeText generated scanners use longest match when recognizing tokens. If two
+or more terminals recognize the same longest match, priorities are used to
+resolve the conflict. For the example above, the first group of terminals has
+priority over the second group, thus giving the keywords priority over the
+identifiers. That is, <code>@terminals</code> groups listed earlier in the specification
+have higher priority than <code>@terminals</code> groups listed later in the
+specification. If two terminals accept the same input, and they are defined
+within the same group (they have the same priority), then the specification
+is invalid.</p>
+</div>
+<div class="paragraph">
+<p>It is also possible to use scanner states:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@terminals:
+  &quot;//.*&quot;;
+  &quot;/\*&quot; -&gt; BLOCK_COMMENT;
+  @eof;
+end
+
+@terminals BLOCK_COMMENT:
+  &quot;\*/&quot; -&gt;;
+  &quot;.&quot;;
+  &quot;\n&quot;;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first group of terminals is for the default state, as no state name is
+specified. Single line comments (<code>// ...</code>) are detected using the first
+regular expression. This expression is not given a name, and can thus not be
+used in parser rules.</p>
+</div>
+<div class="paragraph">
+<p>The second regular expression detects the start of block comments (<code>/*</code>)
+and switches the scanner to the <code>BLOCK_COMMENT</code> state.</p>
+</div>
+<div class="paragraph">
+<p>The second group of terminals is detected only when the scanner is in the
+<code>BLOCK_COMMENT</code> state, as indicated by the <code>BLOCK_COMMENT</code> state name after
+the <code>@terminals</code> keyword. Everything except for the end of the comment is
+ignored (no name for the terminals, and no new scanner state). The end of
+block comments (<code>*/</code>) makes the scanner go back to the default scanner
+state (arrow without state name).</p>
+</div>
+<div class="paragraph">
+<p>The <code>@eof</code> terminal indicates that end-of-file is allowed in a scanner
+state (in this case, the default scanner state).</p>
+</div>
+<div class="paragraph">
+<p>For every scanner, the name of the Java class to generate should be specified,
+as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@scanner some.package.SomeScanner;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The scanner class must not be a generic class. Imports (see below) can be used
+to shorten the specification of the Java class name.</p>
+</div>
+<div class="paragraph">
+<p>Shortcuts can be used for reuse of regular expressions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@shortcut identifier = &quot;$?[a-zA-Z_][a-zA-Z0-9_]*&quot;;
+
+@terminals:
+  ID2TK = &quot;{identifier}.{identifier}&quot;;
+  ID3TK = &quot;{identifier}.{identifier}.{identifier}&quot;;
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is possible to use shortcuts in other shortcuts, as long as a shortcut is
+defined before its use.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-regular-expressions">Regular expressions</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Regular expressions are enclosed in double quotes. Within them, the following
+are supported:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>a</code> for character <code>a</code>, for any <code>a</code> (special characters need escaping).</p>
+</li>
+<li>
+<p><code>\n</code> for the new line character (Unicode U+0A).</p>
+</li>
+<li>
+<p><code>\r</code> for the carriage return character (Unicode U+0D).</p>
+</li>
+<li>
+<p><code>\t</code> for the tab character (Unicode U+09).</p>
+</li>
+<li>
+<p><code>\a</code> for character <code>a</code>, for any <code>a</code> (especially useful for escaping
+special characters).</p>
+</li>
+<li>
+<p><code>\\</code> for character <code>\</code> (escaped).</p>
+</li>
+<li>
+<p><code>\"</code> for character <code>"</code> (escaped).</p>
+</li>
+<li>
+<p><code>(x)</code> for regular expression <code>x</code> (allows for grouping).</p>
+</li>
+<li>
+<p><code>xy</code> for regular expression <code>x</code> followed by regular expression <code>y</code>.</p>
+</li>
+<li>
+<p><code>x*</code> for zero or more times regular expression <code>x</code>.</p>
+</li>
+<li>
+<p><code>x+</code> for one or more times regular expression <code>x</code>.</p>
+</li>
+<li>
+<p><code>x?</code> for zero or one times regular expression <code>x</code>.</p>
+</li>
+<li>
+<p><code>.</code> for any ASCII character except <code>\n</code> (new line, Unicode U+0A).</p>
+</li>
+<li>
+<p><code>x|y</code> for either regular expression <code>x</code> or regular expression <code>y</code>
+(but not both).</p>
+</li>
+<li>
+<p><code>[abc]</code> for exactly one of the characters <code>a</code>, <code>b</code> or <code>c</code>.</p>
+</li>
+<li>
+<p><code>[a-z]</code> for exactly one of the characters <code>a</code>, <code>b</code>, &#8230;&#8203;, or <code>z</code>.
+This notation is called a character class. Note that the ranges of
+characters are based on their ASCII character codes.</p>
+</li>
+<li>
+<p><code>[^a]</code> for any ASCII character except for character <code>a</code>. This notation
+is called a negated character class.</p>
+</li>
+<li>
+<p><code>{s}</code> for the regular expression defined by shortcut <code>s</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>To include special characters, they must always be escaped, wherever they
+occur in the regular expression. For instance, regular expression <code>[a\^]</code>
+recognizes either character <code>a</code> or character <code>^</code> (but not both). Here
+the <code>^</code> character is escaped, as it is a special character (it may be used
+at the beginning of a character class to invert the character class).</p>
+</div>
+<div class="paragraph">
+<p>New lines are not allowed in the regular expressions themselves. Obviously,
+it is possible to detect new lines using regular expressions.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-terminal-descriptions">Terminal descriptions</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Terminals can be given an end user readable description (just before the
+semicolon), for use in parser error messages:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@terminals:
+  @keywords Operators = and            // &quot;and&quot;
+                        or;            // &quot;or&quot;
+  IDTK   = &quot;[a-z]+&quot; [an identifier];   // an identifier
+  ID2TK  = &quot;[A-Z]+&quot; [ an identifier ]; // an identifier
+  ASNGTK = &quot;:=&quot;;                       // &quot;:=&quot;
+  @eof;                                // end-of-file
+  X = &quot;[abc]&quot;;                         // X
+  &quot;[def]&quot;;                             // no description</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Keyword literals (<code>ANDTK</code> and <code>ORTK</code> in the example above) have the
+keywords surrounded by double quotes as default description. Similarly,
+terminals defined by regular expressions without choice (no character classes,
+star operators, etc) and using only 'graphical' characters (no control
+characters, end-of-file, new lines, etc) also have the literal text that they
+match (surrounded by double quotes) as default description (see <code>ASGNTK</code> in
+the example above). The end-of-file token has <code>end-of-file</code> as default
+description. Keywords that don&#8217;t have a description and don&#8217;t have default
+descriptions as described above, get the name of the terminal as description
+(see <code>X</code> in the example above). If they don&#8217;t have a name, they have no
+description.</p>
+</div>
+<div class="paragraph">
+<p>Nameless terminals are not used by the parser, and therefore do not require a
+description. The end-of-file terminal has a default description, and can not be
+given a custom description. Giving a terminal a custom description if it
+already has a default description, leads to a warning.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-imports">Imports</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Java classes/types can be specified in SeText specifications using their fully
+quantified names, optionally with generic type parameters:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">java.util.String
+java.util.List
+java.util.List&lt;java.util.String&gt;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>but it is also possible to use imports:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@import java.util.String;
+@import java.util.String as string;
+@import java.util;
+@import java.util as u;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The first import imports <code>java.util.String</code> as <code>String</code>. The second
+imports the same type as <code>string</code>. The third import imports the <code>java.util</code>
+package as <code>util</code>. The fourth import imports that same package as <code>u</code>.
+After these imports, the following all refer to the <code>java.util.String</code> Java
+type/class:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">java.util.String
+util.String
+u.String
+String
+string</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is also possible to import generic types, with their type parameters
+instantiated:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@import java.util.List&lt;java.util.String&gt; as stringList</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>allowing <code>stringList</code> to be used as a short form for
+<code>java.util.List&lt;java.util.String&gt;</code>.</p>
+</div>
+<div class="paragraph">
+<p>Note that it is not possible to use imports to shorten other imports.</p>
+</div>
+<div class="paragraph">
+<p>Finally, note that Java types where the first part of the identifier (the
+part before any dot) does not refer to an import, are considered absolute.
+This means that any Java type name not containing a dot, and not referring to
+an import, is also considered absolute, and thus refers to a class with that
+name, in the default package.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-scanner-hooks">Scanner hooks</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>As indicated above, the following SeText specification:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@terminals:
+  IDTK = &quot;$?[a-zA-Z_][a-zA-Z0-9_]*&quot; {scanID};
+end</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>defines a terminal <code>IDTK</code>, which if recognized, is passed to a <code>scanID</code>
+method for post-processing. If such a call back hook method is specified,
+a (non-generic) hooks class is required. It can be specified as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@hooks some.package.SomeHooks;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>As for all Java types, imports can be used. For this example, the
+<code>some.package.SomeHooks</code> class must have a default (parameterless)
+constructor, and an instance method with the following signature:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> scanID(Token token);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where the <code>Token</code> class is the <code>org.eclipse.escet.setext.runtime.Token</code> class. The
+method may perform in-place modifications to the <code>text</code> field of the
+<code>token</code> parameter.</p>
+</div>
+<div class="paragraph">
+<p>It is allowed to throw <code>org.eclipse.escet.setext.runtime.exceptions.SyntaxException</code>
+exceptions in the hooks methods.</p>
+</div>
+<div class="paragraph">
+<p>Note that each generated scanner has an inner interface named <code>Hooks</code> that
+defines all the required call back hook methods. The hooks class must implement
+the interface. This does not apply to scanners that don&#8217;t have any terminals
+with call back hooks.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-specifying-grammars">Specifying grammars using SeText</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>All SeText grammars start with one or more start symbols:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@main  Program    : some.package.ProgramParser;
+@start Expression : some.package.ExpressionParser;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This specifies two start symbols, the non-terminals <code>Program</code> and
+<code>Expression</code>. Each start symbol further specifies the parser class that
+should be generated for that start symbol. Once again, imports are allowed,
+and the classes must be non-generic.</p>
+</div>
+<div class="paragraph">
+<p>There are two types of start symbols:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>regular start symbols (<code>@start</code> keyword)</p>
+</li>
+<li>
+<p>main start symbols (<code>@main</code> keyword)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The main start symbols are exactly the same as the regular ones, except that
+they must cover the entire grammar. That is, all non-terminals must be
+reachable from each of the main start symbols. There is no such restriction
+for regular start symbols.</p>
+</div>
+<div class="paragraph">
+<p>The non-terminals and rules (or productions) can be specified using a BNF
+like syntax, as follows:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">{java.util.List&lt;some.package.SomeClass&gt;}
+NonTerm : /* empty */
+        | NonTerm2
+        | NonTerm NonTerm2
+        | NonTerm3 @PLUSTK NonTerm3 SEMICOLTK
+        ;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This example specifies a non-terminal named <code>NonTerm</code>. Once reduced, the
+call back hooks for this non-terminal must result in a Java object of type
+<code>java.util.List&lt;some.package.SomeClass&gt;</code>. Here, both generic types and
+imports are allowed.</p>
+</div>
+<div class="paragraph">
+<p>The non-terminal is defined by four rules (or productions). The first rule
+is empty, as clarified by the comment. The comment is obviously not required.
+The second rule consists of a single non-terminal <code>NonTerm2</code>, etc.</p>
+</div>
+<div class="paragraph">
+<p>Each non-terminal rule gives rise to a call back hook method. The parameters of
+that method are determined by the symbols that make up that rule. That is,
+all non-terminal are always passed to the call back hook method. Terminals
+are only passed to the method if they are prefixed with a <code>@</code> character.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-parser-hooks">Parser hooks</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For parsers, a hooks class must always be specified. The scanner and all
+parsers share a single (non-generic) hooks class. The following specification
+(from which we omit the scanner part):</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="setext">@hooks some.package.SomeHooks;
+
+@import some.package.ast;
+
+@main Expression : some.package.ExpressionParser;
+
+{ast.Expression}
+Expression : /* empty */
+           | Expression @PLUSTK Literal
+           | Expression MINUSTK Literal
+           ;
+
+{ast.Literal}
+Literal : @IDTK
+        | PITK
+        ;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>requires a <code>some.package.SomeHooks</code> Java class, with a default
+(parameterless) constructor, and five methods, with the following signatures:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression1();
+
+<span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression2(<span class="predefined-type">Expression</span> e1, Token t2, Literal l3);
+
+<span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression3(<span class="predefined-type">Expression</span> e1, Literal l3);
+
+<span class="directive">public</span> Literal parseLiteral1(Token t1);
+
+<span class="directive">public</span> Literal parseLiteral2();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The return types are determined by the non-terminals. The names of the methods
+are formed from the text <code>parse</code>, the name of the non-terminal, and number
+of the rule, within the non-terminal. Note that all numbers have equal length.
+For instance <code>01</code>, <code>02</code>, <code>03</code>, &#8230;&#8203;, <code>12</code>. The parameters consist of
+all the non-terminals that make up the , as well and those terminals with a
+<code>@</code> before them. The types of the non-terminal parameters are the types of
+the corresponding non-terminals. For terminals, the type is the
+<code>org.eclipse.escet.setext.runtime.Token</code> class. The parameter names are formed from
+their types (first character of the simple name of the class, in lower case),
+followed by the number of the symbol in the rule, without any <code>0</code> prefixes.
+All numbers start counting at one (<code>1</code>).</p>
+</div>
+<div class="paragraph">
+<p>Note that each generated parser has an inner interface named <code>Hooks</code> that
+defines all the required call back hook methods. The hooks class must implement
+the interface(s). This interface specifies one additional method, which all
+parser hooks classes must implement:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> setParser&lt;<span class="predefined-type">Parser</span>&lt;?&gt; parser);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>where the <code>Parser&lt;?&gt;</code> class is the <code>org.eclipse.escet.setext.runtime.Parser</code> class.
+This method is provided to allow hooks classes access to the parser that
+creates the hooks class, and its source information. For more information,
+see the <code>getSource</code> method of the <code>Parser</code> class.</p>
+</div>
+<div class="paragraph">
+<p>An implementation of a hooks class for this example could look like this:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">some.package</span>;
+
+<span class="keyword">import</span> <span class="include">org.eclipse.escet.setext.runtime.Parser</span>;
+<span class="keyword">import</span> <span class="include">org.eclipse.escet.setext.runtime.Token</span>;
+<span class="keyword">import</span> <span class="include">some.package.ast.Expression</span>;
+<span class="keyword">import</span> <span class="include">some.package.ast.Literal</span>;
+
+<span class="directive">public</span> <span class="type">class</span> <span class="class">SomeHooks</span> <span class="directive">implements</span> ExpressionParser.Hooks {
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span class="type">void</span> setParser(<span class="predefined-type">Parser</span>&lt;?&gt; parser) {
+        <span class="comment">// No need to store this...</span>
+    }
+
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression1() {
+        <span class="keyword">return</span> <span class="predefined-constant">null</span>; <span class="comment">// Do something more useful here...</span>
+    }
+
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression2(<span class="predefined-type">Expression</span> e1, Token t2, Literal l3) {
+        <span class="keyword">return</span> <span class="predefined-constant">null</span>; <span class="comment">// Do something more useful here...</span>
+    }
+
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span class="predefined-type">Expression</span> parseExpression3(<span class="predefined-type">Expression</span> e1, Literal l3) {
+        <span class="keyword">return</span> <span class="predefined-constant">null</span>; <span class="comment">// Do something more useful here...</span>
+    }
+
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> Literal parseLiteral1(Token t1) {
+        <span class="keyword">return</span> <span class="predefined-constant">null</span>; <span class="comment">// Do something more useful here...</span>
+    }
+
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> Literal parseLiteral2() {
+        <span class="keyword">return</span> <span class="predefined-constant">null</span>; <span class="comment">// Do something more useful here...</span>
+    }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>It is allowed to throw <code>org.eclipse.escet.setext.runtime.exceptions.SyntaxException</code>
+exceptions in the hooks methods. Furthermore, it is allowed to add fold regions
+to the parser (which then needs to be stored as it is provided via the
+<code>setParser</code> hook method), using the <code>addFoldRange</code> methods of the
+<code>org.eclipse.escet.setext.runtime.Parser</code> class.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-usage-hints">Usage hints</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Here are some hints on using SeText:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>It is recommended to name the generated and hooks classes, using the
+following convention: <code>XyzScanner</code>, <code>XyzParser</code>, <code>XyzHooks</code>, for
+the scanner, parser, and hooks classes of a language <code>Xyz</code> or <code>XYZ</code>.
+For parsers for a part of a language, it is recommended to name the
+generated parsers <code>XyzPartParser</code>, for non-terminal <code>Part</code> of language
+<code>Xyz</code> or <code>XYZ</code>. Following these naming conventions ensures consistency
+in the naming of the classes.</p>
+</li>
+<li>
+<p>It is recommended to import the packages that contain the classes used
+as the types of the non-terminals. For instance, import the expressions
+package <code>some.long.package.name.expressions</code> as <code>expressions</code> or
+<code>exprs</code>, and then use <code>{exprs.SomeClass}</code> as the type for a
+non-terminal, instead of <code>{some.long.package.name.expressions.SomeClass}</code>.
+Importing the package instead of the individual classes reduces the number
+of imports, and also avoids conflicts between non-terminals names and
+class names. For standard Java types, however, it is recommended to import
+the full type. For instance, import <code>java.lang.String</code> or
+<code>java.util.List</code>.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-generated-scanners-parsers">Generated scanners/parsers</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The generated scanners and parsers depend on the <code>org.eclipse.escet.setext.runtime</code>
+and <code>org.eclipse.escet.common.java</code> plug-ins. Generated scanners and parsers inherit
+from the <code>org.eclipse.escet.setext.runtime.Scanner</code> class and
+<code>org.eclipse.escet.setext.runtime.Parser</code> class respectively. Look at those classes for
+the public API of generated scanners/parsers, as it should be fairly
+self-explanatory.</p>
+</div>
+<div class="paragraph">
+<p>Besides the scanner and parser(s), debug output is generated from which the
+scanner and parser(s) can be analyzed. In particular, the debug output for
+the parsers makes it possible to find out the details about conflicts in the
+grammar. Furthermore, a skeleton is generated for the hooks class.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-using-in-an-eclipse-plugin-project">Using SeText in an Eclipse Plug-in Project</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For a new language, follow these steps:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Create a <em>Plug-in Project</em> in Eclipse.</p>
+</li>
+<li>
+<p>Add the <code>org.eclipse.escet.common.java</code> and <code>org.eclipse.escet.setext.runtime</code> plug-ins to
+the <em>Required plug-ins</em> in the project&#8217;s manifest. Also add any plug-ins
+that define the classes that you will be referring to in the SeText
+specification.</p>
+</li>
+<li>
+<p>Create the Java package where your scanner, parser(s) and hooks classes
+are to be stored.</p>
+</li>
+<li>
+<p>Create a text file ending with <code>.setext</code> in that same package. Fill the
+specification, and save it.</p>
+</li>
+<li>
+<p>Right click the file in the <em>Project Explorer</em> or <em>Package Explorer</em>,
+and choose the <em>Generate Parser(s)</em> action. Alternatively, right click
+the text editor for the SeText specification and choose the same action.</p>
+</li>
+<li>
+<p>Observe how the files are generated. Make sure the console is free of
+warnings and errors.</p>
+</li>
+<li>
+<p>Copy the hooks class skeleton (extension <code>.skeleton</code> to extension
+<code>.java</code>), and implement the hooks.</p>
+</li>
+<li>
+<p>You are ready to use the scanner and parser(s).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>After changes to the SeText specification:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Regenerate the code, as before.</p>
+</li>
+<li>
+<p>If a <code>Hooks</code> interface has changed, update the hooks class.</p>
+</li>
+<li>
+<p>You are ready to use the modified scanner and parser(s).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>It may be a good idea to put the <code>.skeleton</code> file in a version control
+system. That way, after regeneration, you can ask for a diff. You then
+know what has changed, and how you need to update the hooks class.</p>
+</div>
+<div class="paragraph">
+<p>Also note that if a generated <code>Hooks</code> interface changes after a regeneration,
+Java will report errors for methods not yet present in the hook class.
+Similarly, Java will complain about changed method signatures, and methods that
+no longer exist in the <code>Hooks</code> interface (and thus have invalid <code>@Override</code>
+annotations in the hooks class).</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-limitations-issues">Limitations and issues</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The following limitations currently apply:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>SeText only allows for the specification of scanners that accept ASCII
+input.</p>
+</li>
+<li>
+<p>SeText currently assumes UTF-8 encoded files. If the input file is actually
+encoded using a different encoding, scanner exceptions may indicate the
+wrong character.</p>
+</li>
+<li>
+<p>SeText does not support grammars with conflicts (shift/reduce,
+reduce/reduce, accept/reduce).</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-release-notes">Release notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The release notes for the releases of SeText and the associated tools, as
+part of the Eclipse ESCET project, are listed below in reverse chronological
+order.</p>
+</div>
+<div class="sect2">
+<h3 id="version-0-1-unreleased">Version 0.1 (unreleased)</h3>
+<div class="paragraph">
+<p>The first release of SeText as part of the Eclipse ESCET project.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="setext-readme-legal">Legal</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The material in this documentation is
+Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
+Eclipse, and the Eclipse Logo are registered trademarks of the
+Eclipse Foundation. Other names may be trademarks of their
+respective owners.</p>
+</div>
+<div class="paragraph">
+<p><strong>License</strong></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Foundation makes available all content in this document
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the MIT License. A copy of the MIT License
+is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>. For purposes of the
+MIT License, "Software" will mean the Content.</p>
+</div>
+<div class="paragraph">
+<p>If you did not receive this Content directly from the Eclipse Foundation,
+the Content is being redistributed by another party ("Redistributor") and
+different terms and conditions may apply to your use of any object code in
+the Content. Check the Redistributor&#8217;s license that was provided with the
+Content. If no such license exists, contact the Redistributor. Unless
+otherwise indicated below, the terms and conditions of the MIT License
+still apply to any source code in the Content and such source code may be
+obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
+pre.CodeRay{background:#f7f7f8}
+.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
+.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
+.CodeRay .line-numbers strong{color:#000}
+table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.CodeRay td{vertical-align:top;line-height:inherit}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.code{padding:0 0 0 .75em}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+  messageStyle: "none",
+  tex2jax: {
+    inlineMath: [["\\(", "\\)"]],
+    displayMath: [["\\[", "\\]"]],
+    ignoreClass: "nostem|nolatexmath"
+  },
+  asciimath2jax: {
+    delimiters: [["\\$", "\\$"]],
+    ignoreClass: "nostem|noasciimath"
+  },
+  TeX: { equationNumbers: { autoNumber: "none" } }
+})
+MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
+  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
+    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
+      data.math.root.display = "block"
+    }
+    return data
+  })
+})
+</script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+
+<div id="footer">
+<div id="footer-text">
+<a href="https://www.eclipse.org">Eclipse Home</a>
+|
+<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
+|
+<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
+|
+<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
+|
+<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/v0.1-M1/tooldef/eclipse-escet-incubation-tooldef-manual.pdf b/v0.1-M1/tooldef/eclipse-escet-incubation-tooldef-manual.pdf
new file mode 100644
index 0000000..daaaeb9
--- /dev/null
+++ b/v0.1-M1/tooldef/eclipse-escet-incubation-tooldef-manual.pdf
Binary files differ
diff --git a/v0.1-M1/tooldef/eclipse-incubation.png b/v0.1-M1/tooldef/eclipse-incubation.png
new file mode 100644
index 0000000..5fccef5
--- /dev/null
+++ b/v0.1-M1/tooldef/eclipse-incubation.png
Binary files differ
diff --git a/v0.1-M1/tooldef/favicon.png b/v0.1-M1/tooldef/favicon.png
new file mode 100644
index 0000000..d394f09
--- /dev/null
+++ b/v0.1-M1/tooldef/favicon.png
Binary files differ
diff --git a/v0.1-M1/tooldef/index.html b/v0.1-M1/tooldef/index.html
new file mode 100644
index 0000000..1646574
--- /dev/null
+++ b/v0.1-M1/tooldef/index.html
@@ -0,0 +1,6477 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation">
+<link rel="icon" type="image/png" href="favicon.png">
+<title>ToolDef documentation (Incubation)</title>
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
+<style>
+/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
+/* Uncomment @import statement to use as custom stylesheet */
+/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
+article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
+audio,video{display:inline-block}
+audio:not([controls]){display:none;height:0}
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
+a{background:none}
+a:focus{outline:thin dotted}
+a:active,a:hover{outline:0}
+h1{font-size:2em;margin:.67em 0}
+abbr[title]{border-bottom:1px dotted}
+b,strong{font-weight:bold}
+dfn{font-style:italic}
+hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
+mark{background:#ff0;color:#000}
+code,kbd,pre,samp{font-family:monospace;font-size:1em}
+pre{white-space:pre-wrap}
+q{quotes:"\201C" "\201D" "\2018" "\2019"}
+small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-.5em}
+sub{bottom:-.25em}
+img{border:0}
+svg:not(:root){overflow:hidden}
+figure{margin:0}
+fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}
+button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
+button,input{line-height:normal}
+button,select{text-transform:none}
+button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+textarea{overflow:auto;vertical-align:top}
+table{border-collapse:collapse;border-spacing:0}
+*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
+html,body{font-size:100%}
+body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
+a:hover{cursor:pointer}
+img,object,embed{max-width:100%;height:auto}
+object,embed{height:100%}
+img{-ms-interpolation-mode:bicubic}
+.left{float:left!important}
+.right{float:right!important}
+.text-left{text-align:left!important}
+.text-right{text-align:right!important}
+.text-center{text-align:center!important}
+.text-justify{text-align:justify!important}
+.hide{display:none}
+img,object,svg{display:inline-block;vertical-align:middle}
+textarea{height:auto;min-height:50px}
+select{width:100%}
+.center{margin-left:auto;margin-right:auto}
+.stretch{width:100%}
+.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
+div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
+a{color:#2156a5;text-decoration:underline;line-height:inherit}
+a:hover,a:focus{color:#1d4b8f}
+a img{border:0}
+p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
+p aside{font-size:.875em;line-height:1.35;font-style:italic}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
+h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
+h1{font-size:2.125em}
+h2{font-size:1.6875em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
+h4,h5{font-size:1.125em}
+h6{font-size:1em}
+hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
+em,i{font-style:italic;line-height:inherit}
+strong,b{font-weight:bold;line-height:inherit}
+small{font-size:60%;line-height:inherit}
+code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
+ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
+ul,ol{margin-left:1.5em}
+ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
+ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
+ul.square{list-style-type:square}
+ul.circle{list-style-type:circle}
+ul.disc{list-style-type:disc}
+ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
+dl dt{margin-bottom:.3125em;font-weight:bold}
+dl dd{margin-bottom:1.25em}
+abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
+abbr{text-transform:none}
+blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
+blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
+blockquote cite::before{content:"\2014 \0020"}
+blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
+blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
+@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
+h1{font-size:2.75em}
+h2{font-size:2.3125em}
+h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
+h4{font-size:1.4375em}}
+table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
+table thead,table tfoot{background:#f7f8f7}
+table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
+table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
+table tr.even,table tr.alt{background:#f8f8f7}
+table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
+h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
+h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
+.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
+.clearfix::after,.float-group::after{clear:both}
+:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
+:not(pre)>code.nobreak{word-wrap:normal}
+:not(pre)>code.nowrap{white-space:nowrap}
+pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
+pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
+pre>code{display:block}
+pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
+em em{font-style:normal}
+strong strong{font-weight:400}
+.keyseq{color:rgba(51,51,51,.8)}
+kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
+.keyseq kbd:first-child{margin-left:0}
+.keyseq kbd:last-child{margin-right:0}
+.menuseq,.menuref{color:#000}
+.menuseq b:not(.caret),.menuref{font-weight:inherit}
+.menuseq{word-spacing:-.02em}
+.menuseq b.caret{font-size:1.25em;line-height:.8}
+.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
+b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
+b.button::before{content:"[";padding:0 3px 0 2px}
+b.button::after{content:"]";padding:0 2px 0 3px}
+p a>code:hover{color:rgba(0,0,0,.9)}
+#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
+#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
+#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
+#content{margin-top:1.25em}
+#content::before{content:none}
+#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
+#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
+#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
+#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
+#header .details span:first-child{margin-left:-.125em}
+#header .details span.email a{color:rgba(0,0,0,.85)}
+#header .details br{display:none}
+#header .details br+span::before{content:"\00a0\2013\00a0"}
+#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
+#header .details br+span#revremark::before{content:"\00a0|\00a0"}
+#header #revnumber{text-transform:capitalize}
+#header #revnumber::after{content:"\00a0"}
+#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
+#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
+#toc>ul{margin-left:.125em}
+#toc ul.sectlevel0>li>a{font-style:italic}
+#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
+#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
+#toc li{line-height:1.3334;margin-top:.3334em}
+#toc a{text-decoration:none}
+#toc a:active{text-decoration:underline}
+#toctitle{color:#7a2518;font-size:1.2em}
+@media screen and (min-width:768px){#toctitle{font-size:1.375em}
+body.toc2{padding-left:15em;padding-right:0}
+#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
+#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
+#toc.toc2>ul{font-size:.9em;margin-bottom:0}
+#toc.toc2 ul ul{margin-left:0;padding-left:1em}
+#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
+body.toc2.toc-right{padding-left:0;padding-right:15em}
+body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
+@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
+#toc.toc2{width:20em}
+#toc.toc2 #toctitle{font-size:1.375em}
+#toc.toc2>ul{font-size:.95em}
+#toc.toc2 ul ul{padding-left:1.25em}
+body.toc2.toc-right{padding-left:0;padding-right:20em}}
+#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
+#content #toc>:first-child{margin-top:0}
+#content #toc>:last-child{margin-bottom:0}
+#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
+#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
+#content{margin-bottom:.625em}
+.sect1{padding-bottom:.625em}
+@media screen and (min-width:768px){#content{margin-bottom:1.25em}
+.sect1{padding-bottom:1.25em}}
+.sect1:last-child{padding-bottom:0}
+.sect1+.sect1{border-top:1px solid #e7e7e9}
+#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
+#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
+#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
+#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
+#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
+details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
+details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
+.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
+table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
+.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
+.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
+.admonitionblock>table td.icon{text-align:center;width:80px}
+.admonitionblock>table td.icon img{max-width:none}
+.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
+.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
+.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
+.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
+.exampleblock>.content>:first-child{margin-top:0}
+.exampleblock>.content>:last-child{margin-bottom:0}
+.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
+.sidebarblock>:first-child{margin-top:0}
+.sidebarblock>:last-child{margin-bottom:0}
+.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
+.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
+.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
+@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
+@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
+.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
+.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
+.listingblock>.content{position:relative}
+.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
+.listingblock:hover code[data-lang]::before{display:block}
+.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
+.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
+.listingblock pre.highlightjs{padding:0}
+.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
+.listingblock pre.prettyprint{border-width:0}
+.prettyprint{background:#f7f7f8}
+pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
+pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
+pre.prettyprint li code[data-lang]::before{opacity:1}
+pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
+table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
+table.linenotable td.code{padding-left:.75em}
+table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
+pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
+pre.pygments .lineno::before{content:"";margin-right:-.125em}
+.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
+.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
+.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
+.quoteblock blockquote{margin:0;padding:0;border:0}
+.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
+.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
+.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
+.verseblock{margin:0 1em 1.25em}
+.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
+.verseblock pre strong{font-weight:400}
+.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
+.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
+.quoteblock .attribution br,.verseblock .attribution br{display:none}
+.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
+.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
+.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
+.quoteblock.abstract{margin:0 1em 1.25em;display:block}
+.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
+.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
+.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
+.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
+.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
+table.tableblock{max-width:100%;border-collapse:separate}
+p.tableblock:last-child{margin-bottom:0}
+td.tableblock>.content>:last-child{margin-bottom:-1.25em}
+td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
+table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
+table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
+table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
+table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
+table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
+table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
+table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
+table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
+table.frame-all{border-width:1px}
+table.frame-sides{border-width:0 1px}
+table.frame-topbot,table.frame-ends{border-width:1px 0}
+table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
+th.halign-left,td.halign-left{text-align:left}
+th.halign-right,td.halign-right{text-align:right}
+th.halign-center,td.halign-center{text-align:center}
+th.valign-top,td.valign-top{vertical-align:top}
+th.valign-bottom,td.valign-bottom{vertical-align:bottom}
+th.valign-middle,td.valign-middle{vertical-align:middle}
+table thead th,table tfoot th{font-weight:bold}
+tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
+tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
+p.tableblock>code:only-child{background:none;padding:0}
+p.tableblock{font-size:1em}
+ol{margin-left:1.75em}
+ul li ol{margin-left:1.5em}
+dl dd{margin-left:1.125em}
+dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
+ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
+ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
+ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
+ul.unstyled,ol.unstyled{margin-left:0}
+ul.checklist{margin-left:.625em}
+ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
+ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
+ul.inline>li{margin-left:1.25em}
+.unstyled dl dt{font-weight:400;font-style:normal}
+ol.arabic{list-style-type:decimal}
+ol.decimal{list-style-type:decimal-leading-zero}
+ol.loweralpha{list-style-type:lower-alpha}
+ol.upperalpha{list-style-type:upper-alpha}
+ol.lowerroman{list-style-type:lower-roman}
+ol.upperroman{list-style-type:upper-roman}
+ol.lowergreek{list-style-type:lower-greek}
+.hdlist>table,.colist>table{border:0;background:none}
+.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
+td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
+td.hdlist1{font-weight:bold;padding-bottom:1.25em}
+.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
+.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
+.colist td:not([class]):first-child img{max-width:none}
+.colist td:not([class]):last-child{padding:.25em 0}
+.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
+.imageblock.left{margin:.25em .625em 1.25em 0}
+.imageblock.right{margin:.25em 0 1.25em .625em}
+.imageblock>.title{margin-bottom:0}
+.imageblock.thumb,.imageblock.th{border-width:6px}
+.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
+.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
+.image.left{margin-right:.625em}
+.image.right{margin-left:.625em}
+a.image{text-decoration:none;display:inline-block}
+a.image object{pointer-events:none}
+sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
+sup.footnote a,sup.footnoteref a{text-decoration:none}
+sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
+#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
+#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
+#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
+#footnotes .footnote:last-of-type{margin-bottom:0}
+#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
+.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
+.gist .file-data>table td.line-data{width:99%}
+div.unbreakable{page-break-inside:avoid}
+.big{font-size:larger}
+.small{font-size:smaller}
+.underline{text-decoration:underline}
+.overline{text-decoration:overline}
+.line-through{text-decoration:line-through}
+.aqua{color:#00bfbf}
+.aqua-background{background:#00fafa}
+.black{color:#000}
+.black-background{background:#000}
+.blue{color:#0000bf}
+.blue-background{background:#0000fa}
+.fuchsia{color:#bf00bf}
+.fuchsia-background{background:#fa00fa}
+.gray{color:#606060}
+.gray-background{background:#7d7d7d}
+.green{color:#006000}
+.green-background{background:#007d00}
+.lime{color:#00bf00}
+.lime-background{background:#00fa00}
+.maroon{color:#600000}
+.maroon-background{background:#7d0000}
+.navy{color:#000060}
+.navy-background{background:#00007d}
+.olive{color:#606000}
+.olive-background{background:#7d7d00}
+.purple{color:#600060}
+.purple-background{background:#7d007d}
+.red{color:#bf0000}
+.red-background{background:#fa0000}
+.silver{color:#909090}
+.silver-background{background:#bcbcbc}
+.teal{color:#006060}
+.teal-background{background:#007d7d}
+.white{color:#bfbfbf}
+.white-background{background:#fafafa}
+.yellow{color:#bfbf00}
+.yellow-background{background:#fafa00}
+span.icon>.fa{cursor:default}
+a span.icon>.fa{cursor:inherit}
+.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
+.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
+.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
+.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
+.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
+.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
+.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
+.conum[data-value] *{color:#fff!important}
+.conum[data-value]+b{display:none}
+.conum[data-value]::after{content:attr(data-value)}
+pre .conum[data-value]{position:relative;top:-.125em}
+b.conum *{color:inherit!important}
+.conum:not([data-value]):empty{display:none}
+dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
+h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
+p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
+p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
+p{margin-bottom:1.25rem}
+.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
+.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
+.print-only{display:none!important}
+@page{margin:1.25cm .75cm}
+@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
+html{font-size:80%}
+a{color:inherit!important;text-decoration:underline!important}
+a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
+a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
+abbr[title]::after{content:" (" attr(title) ")"}
+pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
+thead{display:table-header-group}
+svg{max-width:100%}
+p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
+h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
+#toc,.sidebarblock,.exampleblock>.content{background:none!important}
+#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
+body.book #header{text-align:center}
+body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
+body.book #header .details{border:0!important;display:block;padding:0!important}
+body.book #header .details span:first-child{margin-left:0!important}
+body.book #header .details br{display:block}
+body.book #header .details br+span::before{content:none!important}
+body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
+body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
+.listingblock code[data-lang]::before{display:block}
+#footer{padding:0 .9375em}
+.hide-on-print{display:none!important}
+.print-only{display:block!important}
+.hide-for-print{display:none!important}
+.show-for-print{display:inherit!important}}
+@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
+.sect1{padding:0!important}
+.sect1+.sect1{border:0}
+#footer{background:none}
+#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
+@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
+</style>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+<style>
+.menu, .submenu, .menuitem, .menuref {
+    background-color: Menu;
+}
+
+.button {
+    border: 1px solid ButtonFace;
+    /*
+    Styling too similar to a real button is considered bad practice, see https://github.com/asciidoctor/asciidoctor/issues/1881#issuecomment-250702085
+    border: 2px outset ButtonFace;
+    background-color: ButtonFace;
+    */
+    padding-left: 0.5ex;
+    padding-right: 0.5ex;
+    font-weight: normal;
+    font-family: "Segoe UI","Open Sans","DejaVu Sans",sans-serif;
+    white-space: nowrap;
+}
+.button:before {
+    content: none !important;
+}
+.button:after {
+    content: none !important;
+}
+
+#footer-text, #footer-text a {
+    color: rgba(255,255,255,.8)
+}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<h1>ToolDef documentation (Incubation)</h1>
+<div class="details">
+<span id="author" class="author">Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation</span><br>
+<span id="revnumber">version 0.1.0.20210126-175926</span>
+</div>
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#introduction-chapter-index">Introduction</a></li>
+<li><a href="#lang-ref-chapter-index">Language reference</a>
+<ul class="sectlevel2">
+<li><a href="#lang-ref-syntax">Syntax</a>
+<ul class="sectlevel3">
+<li><a href="#lang-ref-syntax-lexical">Lexical syntax</a></li>
+<li><a href="#lang-ref-syntax-grammar">Grammar</a></li>
+</ul>
+</li>
+<li><a href="#lang-ref-built-in-tools-and-operators">Built-in tools and operators</a>
+<ul class="sectlevel3">
+<li><a href="#lang-ref-builtins-operators">Built-in operators</a></li>
+<li><a href="#lang-ref-builtins-data">Built-in data tools</a></li>
+<li><a href="#lang-ref-builtins-io">Built-in I/O tools</a></li>
+<li><a href="#lang-ref-builtins-generic">Built-in generic tools</a></li>
+<li><a href="#lang-ref-builtins-path">Built-in path tools</a></li>
+<li><a href="#lang-ref-builtins-file">Built-in file tools</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a href="#tools-chapter-index">Tooling</a>
+<ul class="sectlevel2">
+<li><a href="#tools-command-line">Command line</a></li>
+<li><a href="#tools-eclipse-ide">Eclipse IDE</a></li>
+</ul>
+</li>
+<li><a href="#release-notes-chapter-index">ToolDef release notes</a>
+<ul class="sectlevel2">
+<li><a href="#version-0-1-unreleased">Version 0.1 (unreleased)</a></li>
+</ul>
+</li>
+<li><a href="#legal-chapter-index">Legal</a></li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="paragraph">
+<p>ToolDef is a cross-platform and machine-independent scripting language.
+It supports command line execution, but is also available as plug-in for
+the <a href="https://eclipse.org">Eclipse</a> IDE, providing an integrated development
+experience.</p>
+</div>
+<div class="paragraph">
+<p>ToolDef is one of the tools of the
+<a href="https://eclipse.org/escet">Eclipse ESCET&#8482; project</a>.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-warning" title="Warning"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>The Eclipse ESCET project, including the ToolDef language and toolset,
+is currently in the
+<a href="https://wiki.eclipse.org/Development_Resources/Process_Guidelines/What_is_Incubation">Incubation Phase</a>.</p>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="./eclipse-incubation.png" alt="eclipse incubation" width="300"></span></p>
+</div>
+</td>
+</tr>
+</table>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+You can <a href="eclipse-escet-incubation-tooldef-manual.pdf">download this manual</a>
+as a PDF as well.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>The documentation consists of:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-chapter-index">ToolDef language reference manual</a></p>
+</li>
+<li>
+<p><a href="#tools-chapter-index">ToolDef tool manual</a></p>
+</li>
+<li>
+<p><a href="#release-notes-chapter-index">ToolDef release notes</a></p>
+</li>
+<li>
+<p><a href="#legal-chapter-index">Legal information</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Some screenshots of ToolDef editing and execution:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./screenshot_ide.png" alt="screenshot ide">
+</div>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="./screenshot_cmdline.png" alt="screenshot cmdline">
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="introduction-chapter-index">Introduction</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>The ToolDef language features the following concepts:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Simple and intuitive syntax makes it easy to writing scripts.</p>
+</li>
+<li>
+<p>A large number of built-in data types, including booleans, integers, longs,
+doubles, strings, lists, sets, maps, tuples, and objects.</p>
+</li>
+<li>
+<p>Static typing allows to catch simple mistakes.</p>
+</li>
+<li>
+<p>The type system is compatible with <a href="http://oracle.com/java">Java</a>,
+allowing easy integration with existing Java code.</p>
+</li>
+<li>
+<p>A large library of useful built-in operators and tools, including tools to
+write to the console, to start applications or execute other ToolDef scripts,
+to manipulate paths, to interact with files and directories, and to
+manipulate data of the various supported data types.</p>
+</li>
+<li>
+<p>Easy to extend with new tools, written in ToolDef itself, or in
+<a href="http://oracle.com/java">Java</a>.</p>
+</li>
+<li>
+<p>Tools can be parameterized with types.</p>
+</li>
+<li>
+<p>Tools can be overloaded.</p>
+</li>
+<li>
+<p>Tools can have optional parameters.</p>
+</li>
+<li>
+<p>Tools can have a variable number of arguments.</p>
+</li>
+<li>
+<p>Tool invocations can use both positional and named arguments.</p>
+</li>
+<li>
+<p>Tools can return a single value, multiple values, or no values at all.</p>
+</li>
+<li>
+<p>Automatic type widening.</p>
+</li>
+<li>
+<p>Type declarations allow for reuse.</p>
+</li>
+<li>
+<p>Value semantics for ease of use.</p>
+</li>
+<li>
+<p>The usual imperative statements, including assignments, tool invocation,
+<code>if</code> statement, <code>for</code> statement, <code>while</code> statement, <code>return</code>
+statement, <code>exit</code> statement, <code>break</code> statement, and <code>continue</code>
+statement.</p>
+</li>
+<li>
+<p>Powerful assignment statement, including partial variable assignment, and
+multi-assignments.</p>
+</li>
+<li>
+<p>Variable declarations as statements, allowing variables to be declared in
+the middle of scripts, or in scopes, such as in bodies of <code>for</code> statements.</p>
+</li>
+<li>
+<p>Powerful <code>for</code> statement, allowing tuple unpacking, and iteration over
+values of various data types.</p>
+</li>
+<li>
+<p>A powerful import mechanism, allowing reuse of scripts, tools, and code.</p>
+</li>
+<li>
+<p>A registered library mechanism, allowing easy importing of libraries of
+tools.</p>
+</li>
+<li>
+<p>Platform independent path handling, allowing a single script with relative
+paths to be executed on Window, Linux, and Mac OS X.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For more information, see also the <a href="#lang-ref-chapter-index">language reference</a> documentation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="paragraph">
+<p>The ToolDef tooling features:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Platform and machine independent execution of ToolDef scripts, on Microsoft
+Windows, Linux, and Mac OS X.</p>
+</li>
+<li>
+<p>Command line execution.</p>
+</li>
+<li>
+<p>Tight integration with the <a href="https://eclipse.org">Eclipse</a> IDE.</p>
+</li>
+<li>
+<p>User-friendly error messages.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>For more information, see also the <a href="#tools-chapter-index">tool</a> documentation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="lang-ref-chapter-index">Language reference</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The documentation in this language reference manual serves as reference.
+It is not intended to be read from beginning to end, but more to look up
+specific information when needed. The reference documentation generally
+provides detailed and complete information, but this information may not
+always be presented in the most accessible way.</p>
+</div>
+<div class="paragraph">
+<p>The information is divided into categories. The following categories and
+information is part of the language reference documentation:</p>
+</div>
+<div class="paragraph">
+<p><em>Syntax</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-syntax-lexical">Lexical syntax</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-syntax-grammar">Grammar</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><em>Built-in tools and operators</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-operators">Built-in operators</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data">Built-in data tools</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-io">Built-in I/O tools</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-generic">Built-in generic tools</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path">Built-in path tools</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file">Built-in file tools</a></p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="lang-ref-syntax">Syntax</h3>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-syntax-lexical">Lexical syntax</h4>
+<div class="paragraph">
+<p>This page describes the ToolDef lexical syntax.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-keywords">Keywords</h5>
+<div class="paragraph">
+<p><em>General</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">as          else        if          map         tool
+bool        end         import      null        true
+break       exit        in          object      tuple
+continue    false       int         return      type
+double      for         list        set         while
+elif        from        long        string</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Operators</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">and         div         mod         not         or</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Built-in data tools</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">abs         enumerate      log         reverse       str
+ceil        floor          lower       round         strdup
+contains    fmt            ltrim       rtrim         subset
+del         indexof        max         size          trim
+delidx      join           min         sorted        upper
+empty       keys           pow         split         values
+endswith    lastindexof    range       sqrt
+entries     ln             replace     startswith</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Built-in I/O tools</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">err         errln       out         outln</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Built-in generic tools</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">app         exec        tooldef</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Built-in path tools</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">abspath     dirname
+basename    fileext
+chdir       hasfileext
+chfileext   pathjoin
+curdir      scriptpath</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><em>Built-in file tools</em></p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">cpdir       filenewer   isfile      readlines
+cpfile      filesize    mkdir       rmdir
+diff        find        mvdir       rmfile
+exists      isdir       mvfile      writefile</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-terminals">Terminals</h5>
+<div class="paragraph">
+<p>Besides the keyword terminals listed above, ToolDef features several other
+terminals:</p>
+</div>
+<div class="paragraph">
+<p>
+
+
+
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>IDENTIFIERTK</code></dt>
+<dd>
+<p>An identifier. Defined by the regular expression:
+<code>[$]?[a-zA-Z_][a-zA-Z0-9_]*</code>. They thus consist of letters, numbers
+and underscore characters (<code>_</code>). Identifiers may not start with a
+numeric digit. Keywords take priority over identifiers. To use a
+keyword as an identifier, prefix it with a <code>$</code> character.
+The <code>$</code> is not part of the identifier name.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">apple       // identifier
+bear        // identifier
+int         // keyword
+$int        // identifier 'int' (override keyword priority with $)</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>RELATIVENAMETK</code></dt>
+<dd>
+<p>A name. Defined by the regular expression:
+<code>[$]?[a-zA-Z_][a-zA-Z0-9_]*(\.[$]?[a-zA-Z_][a-zA-Z0-9_]*)+</code>.
+It thus consists of two or more <code>IDENTIFIERTK</code> joined together
+with periods (<code>.</code>).</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">some_library.some_tool</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>NUMBERTK</code></dt>
+<dd>
+<p>An integer literal. Defined by the regular expression: <code>0|[1-9][0-9]*</code>.
+Integers thus consist of numeric digits. Only for the number <code>0</code> may an
+integer literal start with <code>0</code>. E.g. <code>02</code> is invalid.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">0
+1
+123</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>DOUBLETK</code></dt>
+<dd>
+<p>A double literal. Defined by the regular expression:
+<code>(0|[1-9][0-9]*)(\.[0-9]+|(\.[0-9]+)?[eE][\-\+]?[0-9]+)</code>.
+Simple double literals consist of an integer literal followed by
+a period (<code>.</code>) and some numeric digits. Double literals using scientific
+notation start with either an integer literal or a simple double literal.
+They then contain either an <code>e</code> or <code>E</code>, followed by the exponent.
+The exponent consists of numeric digits, optionally preceded by <code>+</code> or <code>-</code>.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">0.0
+1e5
+1E+03
+1.05e-78</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>STRINGTK</code></dt>
+<dd>
+<p>A string literal. Defined by the regular expression:
+<code>\"([^\\\"\n]|\\[nt\\\"])*\"</code>. String literals are enclosed in double
+quotes (<code>"</code>). String literals must be on a single line and must thus not
+include new line characters (<code>\n</code>, Unicode U+0A). To include a double quote
+(<code>"</code>) in a string literal, it must be escaped as <code>\"</code>. Since a
+backslash (<code>\</code>) serves as escape character, to include a backslash in a string
+literal it must be escaped as <code>\\</code>. To include a tab character in a string
+literal, use <code>\t</code>. To include a newline in a string literal, use <code>\n</code>.</p>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">&quot;hello world&quot;
+&quot;first line\nsecond line&quot;</code></pre>
+</div>
+</div>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-whitespace">Whitespace</h5>
+<div class="paragraph">
+<p>ToolDef supports spaces, tabs, and new line characters as whitespace.
+Whitespace is ignored (except in string literals), but can be used to separate
+tokens as well as for layout purposes. The use of tab characters is allowed,
+but should be avoided if possible, as layout will be different for text
+editors with different tab settings. You may generally format a ToolDef
+script as you see fit, and start on a new line when desired.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">// Normal layout.
+int x = 5;
+
+// Alternative layout.
+int
+  x    =
+    5
+  ;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+
+</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-comments">Comments</h5>
+<div class="paragraph">
+<p>ToolDef features two types of comments. Single line comments start with
+<code>//</code> and end at end of the line. Multi line comments start with <code>/*</code> and
+end at <code>*/</code>. Comments are ignored.</p>
+</div>
+<div class="paragraph">
+<p>Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">int x = 5; // Single line comment.
+
+int /* some comment */ x = /* some
+  more comments
+  and some more
+ end of the multi line comment */ 5;</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-syntax-grammar">Grammar</h4>
+<div class="paragraph">
+<p>Below, the <a href="http://en.wikipedia.org/wiki/Formal_grammar">grammar</a> of the
+ToolDef language is shown, in a form closely resembling
+<a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form">Backus-Naur Form</a>
+(BNF). The <code>Script</code>
+<a href="http://en.wikipedia.org/wiki/Nonterminal_symbol">non-terminal</a> is the
+<a href="http://en.wikipedia.org/wiki/Start_symbol_(formal_languages)">start symbol</a>
+of the grammar. Text between quotes are terminals. Names using only upper case
+letters are defined in the <a href="#lang-ref-syntax-lexical">lexical syntax</a>. The
+remaining names are the non-terminals of the grammar.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="bnf">Script : /* empty */
+       | Decls
+       ;
+
+Decls : Decl
+      | Decls Decl
+      ;
+
+Decl : Import
+     | &quot;type&quot; TypeDecls &quot;;&quot;
+     | &quot;tool&quot; IDENTIFIERTK OptTypeParams ToolParameters &quot;:&quot; OptStatements &quot;end&quot;
+     | &quot;tool&quot; Types IDENTIFIERTK OptTypeParams ToolParameters &quot;:&quot; OptStatements &quot;end&quot;
+     | Statement
+     ;
+
+Import : &quot;import&quot; STRINGTK &quot;;&quot;
+       | &quot;import&quot; STRINGTK &quot;as&quot; IDENTIFIERTK &quot;;&quot;
+       | &quot;import&quot; Name &quot;;&quot;
+       | &quot;import&quot; Name &quot;as&quot; IDENTIFIERTK &quot;;&quot;
+       | &quot;import&quot; Name &quot;:&quot; Name &quot;;&quot;
+       | &quot;import&quot; Name &quot;:&quot; Name &quot;as&quot; IDENTIFIERTK &quot;;&quot;
+       | &quot;from&quot; STRINGTK &quot;import&quot; ImportParts &quot;;&quot;
+       ;
+
+ImportParts : &quot;*&quot;
+            | IDENTIFIERTK
+            | IDENTIFIERTK &quot;as&quot; IDENTIFIERTK
+            | ImportParts &quot;,&quot; &quot;*&quot;
+            | ImportParts &quot;,&quot; IDENTIFIERTK
+            | ImportParts &quot;,&quot; IDENTIFIERTK &quot;as&quot; IDENTIFIERTK
+            ;
+
+TypeDecls : TypeDecl
+          | TypeDecls &quot;,&quot; TypeDecl
+          ;
+
+TypeDecl : IDENTIFIERTK &quot;=&quot; Type
+         ;
+
+OptTypeParams : /* empty */
+              | &quot;&lt;&quot; Names &quot;&gt;&quot;
+              ;
+
+ToolParameters : &quot;(&quot; &quot;)&quot;
+               | &quot;(&quot; ToolParams &quot;)&quot;
+               ;
+
+ToolParams : Type ToolParam
+           | Type &quot;...&quot; ToolParam
+           | ToolParams &quot;,&quot; Type ToolParam
+           | ToolParams &quot;,&quot; Type &quot;...&quot; ToolParam
+           ;
+
+ToolParam : IDENTIFIERTK
+          | IDENTIFIERTK &quot;=&quot; Expression
+          ;
+
+OptStatements : /* empty */
+              | OptStatements Statement
+              ;
+
+Statement : Type VarDecls &quot;;&quot;
+          | &quot;while&quot; Expression &quot;:&quot; OptStatements &quot;end&quot;
+          | &quot;while&quot; Expression &quot;::&quot; Statement
+          | &quot;for&quot; AddressableDecls &quot;in&quot; Expression &quot;:&quot; OptStatements &quot;end&quot;
+          | &quot;for&quot; AddressableDecls &quot;in&quot; Expression &quot;::&quot; Statement
+          | &quot;if&quot; Expression &quot;:&quot; OptStatements OptElifStatements OptElseStatement &quot;end&quot;
+          | &quot;if&quot; Expression &quot;::&quot; Statement
+          | &quot;break&quot; &quot;;&quot;
+          | &quot;continue&quot; &quot;;&quot;
+          | Addressables &quot;=&quot; Expressions &quot;;&quot;
+          | &quot;return&quot; &quot;;&quot;
+          | &quot;return&quot; Expressions &quot;;&quot;
+          | ToolInvokeExpression &quot;;&quot;
+          | &quot;exit&quot; &quot;;&quot;
+          | &quot;exit&quot; Expression &quot;;&quot;
+          ;
+
+VarDecls : VarDecl
+         | VarDecls &quot;,&quot; VarDecl
+         ;
+
+VarDecl : IDENTIFIERTK
+        | IDENTIFIERTK &quot;=&quot; Expression
+        ;
+
+OptElifStatements : /* empty */
+                  | OptElifStatements &quot;elif&quot; Expression &quot;:&quot; OptStatements
+                  ;
+
+OptElseStatement : /* empty */
+                 | &quot;else&quot; OptStatements
+                 ;
+
+AddressableDecls : AddressableDecl
+                 | AddressableDecls &quot;,&quot; AddressableDecl
+                 ;
+
+AddressableDecl : IDENTIFIERTK
+                | &quot;(&quot; AddressableDecl &quot;,&quot; AddressableDecls &quot;)&quot;
+                ;
+
+Addressables : Addressable
+             | Addressables &quot;,&quot; Addressable
+             ;
+
+Addressable : IDENTIFIERTK
+            | IDENTIFIERTK Projections
+            | &quot;(&quot; Addressable &quot;,&quot; Addressables &quot;)&quot;
+            ;
+
+Projections : Projection
+            | Projections Projection
+            ;
+
+Projection : &quot;[&quot; Expression &quot;]&quot;
+           ;
+
+Types : Type
+      | Types &quot;,&quot; Type
+      ;
+
+Type : &quot;bool&quot;
+     | &quot;bool&quot; &quot;?&quot;
+     | &quot;int&quot;
+     | &quot;int&quot; &quot;?&quot;
+     | &quot;long&quot;
+     | &quot;long&quot; &quot;?&quot;
+     | &quot;double&quot;
+     | &quot;double&quot; &quot;?&quot;
+     | &quot;string&quot;
+     | &quot;string&quot; &quot;?&quot;
+     | &quot;list&quot; Type
+     | &quot;list&quot; &quot;?&quot; Type
+     | &quot;set&quot; Type
+     | &quot;set&quot; &quot;?&quot; Type
+     | &quot;map&quot; &quot;(&quot; Type &quot;:&quot; Type &quot;)&quot;
+     | &quot;map&quot; &quot;?&quot; &quot;(&quot; Type &quot;:&quot; Type &quot;)&quot;
+     | &quot;tuple&quot; &quot;(&quot; Type &quot;,&quot; Types &quot;)&quot;
+     | &quot;tuple&quot; &quot;?&quot; &quot;(&quot; Type &quot;,&quot; Types &quot;)&quot;
+     | &quot;object&quot;
+     | &quot;object&quot; &quot;?&quot;
+     | Name
+     ;
+
+Expressions : Expression
+            | Expressions &quot;,&quot; Expression
+            ;
+
+OptExpression : /* empty */
+              | Expression
+              ;
+
+Expression : AndExpression
+           | Expression &quot;or&quot; AndExpression
+           ;
+
+AndExpression : CompareExpression
+              | AndExpression &quot;and&quot; CompareExpression
+              ;
+
+CompareExpression : AddExpression
+                  | CompareExpression &quot;&lt;&quot; AddExpression
+                  | CompareExpression &quot;&lt;=&quot; AddExpression
+                  | CompareExpression &quot;==&quot; AddExpression
+                  | CompareExpression &quot;!=&quot; AddExpression
+                  | CompareExpression &quot;&gt;=&quot; AddExpression
+                  | CompareExpression &quot;&gt;&quot; AddExpression
+                  ;
+
+AddExpression : MulExpression
+              | AddExpression &quot;-&quot; MulExpression
+              | AddExpression &quot;+&quot; MulExpression
+              ;
+
+MulExpression : UnaryExpression
+              | MulExpression &quot;*&quot; UnaryExpression
+              | MulExpression &quot;/&quot; UnaryExpression
+              | MulExpression &quot;div&quot; UnaryExpression
+              | MulExpression &quot;mod&quot; UnaryExpression
+              ;
+
+UnaryExpression : ProjExpression
+                | &quot;-&quot; UnaryExpression
+                | &quot;+&quot; UnaryExpression
+                | &quot;not&quot; UnaryExpression
+                ;
+
+ProjExpression : ExpressionFactor
+               | ProjExpression &quot;[&quot; Expression &quot;]&quot;
+               | ProjExpression &quot;[&quot; OptExpression &quot;:&quot; OptExpression &quot;]&quot;
+               ;
+
+ExpressionFactor : &quot;true&quot;
+                 | &quot;false&quot;
+                 | NUMBERTK
+                 | DOUBLETK
+                 | &quot;null&quot;
+                 | STRINGTK
+                 | &quot;&lt;&quot; Type &quot;&gt;&quot; ExpressionFactor
+                 | &quot;[&quot; &quot;]&quot;
+                 | &quot;[&quot; Expressions OptComma &quot;]&quot;
+                 | &quot;{&quot; &quot;}&quot;
+                 | &quot;{&quot; Expressions OptComma &quot;}&quot;
+                 | &quot;{&quot; MapEntries OptComma &quot;}&quot;
+                 | &quot;(&quot; Expression &quot;,&quot; Expressions OptComma &quot;)&quot;
+                 | &quot;(&quot; Expression &quot;)&quot;
+                 | ToolInvokeExpression
+                 | Name
+                 ;
+
+MapEntries : Expression &quot;:&quot; Expression
+           | MapEntries &quot;,&quot; Expression &quot;:&quot; Expression
+           ;
+
+ToolInvokeExpression : ToolRef &quot;(&quot; ToolArgs OptComma &quot;)&quot;
+                     | ToolRef &quot;(&quot; &quot;)&quot;
+                     ;
+
+ToolRef : BuiltInTool
+        | Name
+        ;
+
+BuiltInTool : BuiltInIoTool
+            | BuiltInGenericTool
+            | BuiltInPathTool
+            | BuiltInFileTool
+            | BuiltInDataTool
+            ;
+
+ToolArgs : Expression
+         | IDENTIFIERTK &quot;=&quot; Expression
+         | ToolArgs &quot;,&quot; Expression
+         | ToolArgs &quot;,&quot; IDENTIFIERTK &quot;=&quot; Expression
+         ;
+
+Names : Name
+      | Names &quot;,&quot; Name
+      ;
+
+Name : IDENTIFIERTK
+     | RELATIVENAMETK
+     ;
+
+OptComma : /* empty */
+         | &quot;,&quot;
+         ;
+
+BuiltInIoTool : &quot;err&quot;
+              | &quot;errln&quot;
+              | &quot;out&quot;
+              | &quot;outln&quot;
+              ;
+
+BuiltInGenericTool : &quot;app&quot;
+                   | &quot;exec&quot;
+                   | &quot;tooldef&quot;
+                   ;
+
+BuiltInPathTool : &quot;abspath&quot;
+                | &quot;basename&quot;
+                | &quot;chdir&quot;
+                | &quot;chfileext&quot;
+                | &quot;curdir&quot;
+                | &quot;dirname&quot;
+                | &quot;fileext&quot;
+                | &quot;hasfileext&quot;
+                | &quot;pathjoin&quot;
+                | &quot;scriptpath&quot;
+                ;
+
+BuiltInFileTool : &quot;cpdir&quot;
+                | &quot;cpfile&quot;
+                | &quot;diff&quot;
+                | &quot;exists&quot;
+                | &quot;filenewer&quot;
+                | &quot;filesize&quot;
+                | &quot;find&quot;
+                | &quot;isdir&quot;
+                | &quot;isfile&quot;
+                | &quot;mkdir&quot;
+                | &quot;mvdir&quot;
+                | &quot;mvfile&quot;
+                | &quot;readlines&quot;
+                | &quot;rmdir&quot;
+                | &quot;rmfile&quot;
+                | &quot;writefile&quot;
+                ;
+
+BuiltInDataTool : &quot;abs&quot;
+                | &quot;ceil&quot;
+                | &quot;contains&quot;
+                | &quot;del&quot;
+                | &quot;delidx&quot;
+                | &quot;empty&quot;
+                | &quot;endswith&quot;
+                | &quot;entries&quot;
+                | &quot;enumerate&quot;
+                | &quot;floor&quot;
+                | &quot;fmt&quot;
+                | &quot;indexof&quot;
+                | &quot;join&quot;
+                | &quot;keys&quot;
+                | &quot;lastindexof&quot;
+                | &quot;ln&quot;
+                | &quot;log&quot;
+                | &quot;lower&quot;
+                | &quot;ltrim&quot;
+                | &quot;max&quot;
+                | &quot;min&quot;
+                | &quot;pow&quot;
+                | &quot;range&quot;
+                | &quot;replace&quot;
+                | &quot;reverse&quot;
+                | &quot;round&quot;
+                | &quot;rtrim&quot;
+                | &quot;size&quot;
+                | &quot;sorted&quot;
+                | &quot;split&quot;
+                | &quot;sqrt&quot;
+                | &quot;startswith&quot;
+                | &quot;str&quot;
+                | &quot;strdup&quot;
+                | &quot;subset&quot;
+                | &quot;trim&quot;
+                | &quot;upper&quot;
+                | &quot;values&quot;
+                ;</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="lang-ref-built-in-tools-and-operators">Built-in tools and operators</h3>
+<div class="sect3">
+<h4 id="lang-ref-builtins-operators">Built-in operators</h4>
+<div class="paragraph">
+<p>This page describes the built-in operators:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-operators-not">not</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-and">and</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-or">or</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-plus-unary">+ (unary)</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-dash-unary">- (unary)</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-plus-binary">+ (binary)</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-dash-binary">- (binary)</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-star">*</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-slash">/</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-div">div</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-mod">mod</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-lt">&lt;</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-le">&lt;=</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-gt">></a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-ge">>=</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-eq">==</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-operators-ne">!=</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The signatures of the operators are given using tool headers, to show the name
+of the operator, the types of the arguments, and the type of the resulting
+value. Operators however, can not be used by means of tool invocations.
+Operators with one argument are put directly before the argument (e.g.
+<code>not true</code>, <code>-5</code>), while operators with two arguments are put between the
+arguments (e.g. <code>true and false</code>, <code>1 + 3</code>).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-not">not operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool not(bool arg)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the logical inverse of a boolean value.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>arg</code></dt>
+<dd>
+<p>The boolean value.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The logical inverse result.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-and">and operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool  and(bool left, bool right)
+tool set T and&lt;T&gt;(set T left, set T right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the conjunction of two boolean values, or the intersection of two sets.
+For boolean values, the operator uses short circuit evaluation. That is, the
+<code>right</code> argument is only evaluated if necessary, i.e. only if the <code>left</code>
+argument evaluates to <code>true</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first boolean value or set.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second boolean value or set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The conjunction or intersection result.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-or">or operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool  or(bool left, bool right)
+tool set T or&lt;T&gt;(set T left, set T right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the disjunction of two boolean values, or the union of two sets.
+For boolean values, the operator uses short circuit evaluation. That is, the
+<code>right</code> argument is only evaluated if necessary, i.e. only if the <code>left</code>
+argument evaluates to <code>false</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first boolean value or set.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second boolean value or set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The disjunction or union result.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-plus-unary">+ operator (unary)</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    +(int arg)
+tool long   +(long arg)
+tool double +(double arg)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the unary plus of an integer, long, or double value. This is
+essentially the
+<a href="http://en.wikipedia.org/wiki/Identity_function">identity function</a>.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>arg</code></dt>
+<dd>
+<p>The integer, long, or double value.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The integer, long, or double value.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-plus-binary">+ operator (binary)</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int      +(int left, int right)
+tool long     +(long left, long right)
+tool double   +(double left, double right)
+tool string   +(string left, string right)
+tool list T   +&lt;T&gt;(list T left, list T right)
+tool map(K:V) +&lt;K, V&gt;(map(K:V) left, map(K:V) right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the addition of two integer, long, or double numbers, the concatenation
+of two strings or lists, or the update of a first map with the entries of a
+second map. For two maps, essentially, the entries of the first map are
+overwritten by the entries of the second map, while entries for new keys are
+added.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number, string, list, or map.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number, string, list, or map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The addition, concatenation, or map update result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow (for integer, long, and double numbers
+only).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-dash-unary">- operator (unary)</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    -(int arg)
+tool long   -(long arg)
+tool double -(double arg)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the negation of an integer, long, or double value.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>arg</code></dt>
+<dd>
+<p>The integer, long, or double value.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The negation result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-dash-binary">- operator (binary)</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int      -(int left, int right)
+tool long     -(long left, long right)
+tool double   -(double left, double right)
+tool set T    -&lt;T&gt;(set T left, set T right)
+tool map(K:V) -&lt;K, V&gt;(map(K:V) left, list K right)
+tool map(K:V) -&lt;K, V&gt;(map(K:V) left, set K right)
+tool map(K:V) -&lt;K, V, V2&gt;(map(K:V) left, map(K:V2) right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the subtraction of two integer, long, or double numbers, the set
+difference of two sets, the map with the keys from the list removed from it,
+the map with the keys from the set removed from it, or the first map with the
+keys from the second map removed from it.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number, the first set, or the (first) map.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number, the (second) set, the list, or
+the second map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The subtraction, set difference, or map removal result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow (for integer, long, and double numbers
+only).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-star">* operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    *(int left, int right)
+tool long   *(long left, long right)
+tool double *(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the multiplication of two integer, long, or double numbers.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The multiplication result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-slash">/ operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool double /(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the division of two double numbers.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The division result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow or division by zero.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-div">div operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int  div(int left, int right)
+tool long div(long left, long right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the integer division of two integer or long numbers.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer or long number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer or long number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The integer division result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow or division by zero.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-mod">mod operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int  mod(int left, int right)
+tool long mod(long left, long right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the modulus of two integer or long numbers.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer or long number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer or long number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The modulus result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in division by zero.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-lt">&lt; operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool &lt;(int left, int right)
+tool bool &lt;(long left, long right)
+tool bool &lt;(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first integer, long, or double number is less than the
+second integer, long, or double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first number is less than the second number, <code>false</code>
+otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-le">&lt;= operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool &lt;=(int left, int right)
+tool bool &lt;=(long left, long right)
+tool bool &lt;=(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first integer, long, or double number is less than or equal
+to the second integer, long, or double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first number is less than or equal to the second number,
+<code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-gt">> operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool &gt;(int left, int right)
+tool bool &gt;(long left, long right)
+tool bool &gt;(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first integer, long, or double number is greater than the
+second integer, long, or double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first number is greater than the second number, <code>false</code>
+otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-ge">>= operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool &gt;=(int left, int right)
+tool bool &gt;=(long left, long right)
+tool bool &gt;=(double left, double right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first integer, long, or double number is greater than or
+equal to the second integer, long, or double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first integer, long, or double number.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first number is greater than or equal to the second number,
+<code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-eq">== operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool ==&lt;T&gt;(T left, T right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first value is equal to the second value.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the values.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first value. May be <code>null</code>.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second value. May be <code>null</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first value is equal to the second value, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-operators-ne">!= operator</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool !=&lt;T&gt;(T left, T right)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first value is unequal to the second value.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the values.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Arguments</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>left</code></dt>
+<dd>
+<p>The first value. May be <code>null</code>.</p>
+</dd>
+<dt class="hdlist1"><code>right</code></dt>
+<dd>
+<p>The second value. May be <code>null</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first value is unequal to the second value, <code>false</code>
+otherwise.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-builtins-data">Built-in data tools</h4>
+<div class="paragraph">
+<p>This page describes the built-in data tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-data-abs">abs</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-ceil">ceil</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-contains">contains</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-del">del</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-delidx">delidx</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-empty">empty</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-endswith">endswith</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-entries">entries</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-enumerate">enumerate</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-floor">floor</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-fmt">fmt</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-indexof">indexof</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-join">join</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-keys">keys</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-lastindexof">lastindexof</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-ln">ln</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-log">log</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-lower">lower</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-ltrim">ltrim</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-max">max</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-min">min</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-pow">pow</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-range">range</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-replace">replace</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-reverse">reverse</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-round">round</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-rtrim">rtrim</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-size">size</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-sorted">sorted</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-split">split</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-sqrt">sqrt</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-startswith">startswith</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-str">str</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-strdup">strdup</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-subset">subset</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-trim">trim</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-upper">upper</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-data-values">values</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-abs">abs tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    abs(int x)
+tool long   abs(long x)
+tool double abs(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the absolute value of an integer, long, or double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The integer, long, or double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The absolute value.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow (for integer and long numbers only).</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-ceil">ceil tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool long ceil(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given double number rounded to a whole long number, towards
+positive infinity.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The double number rounded to a whole long number, towards positive infinity.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-contains">contains tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool contains(string whole, string part)
+tool bool contains&lt;T&gt;(list T $list, T elem)
+tool bool contains&lt;T&gt;(set T $set, T elem)
+tool bool contains&lt;K,V&gt;(map(K:V) $map, K key)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether a given string is contained in another given string, a given
+value is contained in a given list, a given value is contained in a given set,
+or a given value is a key of a given map.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list or set.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>whole</code>, <code>list</code>, <code>set</code>, <code>map</code></dt>
+<dd>
+<p>The whole string, the list, the set, or the map.</p>
+</dd>
+<dt class="hdlist1"><code>part</code>, <code>elem</code>, <code>key</code></dt>
+<dd>
+<p>The part string (potentially contained in the whole string), or the value
+(potential element of the list or set, or potential key of the map).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the part string is contained in the whole string, if the value is
+contained in the list, if the value is contained in the set, or if the value is
+a key of the map, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-del">del tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list T   del&lt;T&gt;(list T $list, T elem)
+tool set T    del&lt;T&gt;(set T $set, T elem)
+tool map(K:V) del&lt;K,V&gt;(map(K:V) $map, K key)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given list with all occurrences of the given element removed from
+it, the given set with the given element removed from it, or the given map
+with the given entry with the given key removed from it. If the element or key
+does not exist, the list, set or map is returned unmodified.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list or set.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>list</code>, <code>set</code>, <code>map</code></dt>
+<dd>
+<p>The list, set, or map.</p>
+</dd>
+<dt class="hdlist1"><code>elem</code>, <code>key</code></dt>
+<dd>
+<p>The element or key to remove. May be <code>null</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The list with all occurrences of the element removed from it, the set with the
+element removed from it, or the map with the entry with the given key removed
+from it.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-delidx">delidx tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list T delidx&lt;T&gt;(list T $list, int index)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Removes an element from a list, and returns the list without that element.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>list</code></dt>
+<dd>
+<p>The list.</p>
+</dd>
+<dt class="hdlist1"><code>index</code></dt>
+<dd>
+<p>The 0-based index into the list of the element to remove. Negative indices
+are allowed, and count from the right.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The list with the element removed from it.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the index is out of bounds for the list.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-empty">empty tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool empty(string x)
+tool bool empty&lt;T&gt;(list T x)
+tool bool empty&lt;T&gt;(set T x)
+tool bool empty&lt;K,V&gt;(map(K:V) x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether a given string, list, set, or map is empty (no characters,
+elements, or entries).</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list or set.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The string, list, set, or map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the given string, list, set, or map is empty, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-endswith">endswith tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool endswith(string whole, string suffix)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first given string ends with the second given string. For
+an empty suffix, always returns <code>true</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>whole</code></dt>
+<dd>
+<p>The first given string.</p>
+</dd>
+<dt class="hdlist1"><code>suffix</code></dt>
+<dd>
+<p>The second given string.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first given string ends with the second given string, <code>false</code>
+otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-entries">entries tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list tuple(K, V) entries&lt;K,V&gt;(map(K:V) $map)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns a list with 2-tuples of keys and values for all entries of the given
+map.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>map</code></dt>
+<dd>
+<p>The map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The list with 2-tuples of keys and values for all entries of the given map.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-enumerate">enumerate tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list tuple(int, T) enumerate&lt;T&gt;(list T $list)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns a list with 2-tuples of 0-based indices and elements for all elements
+of the given list.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>list</code></dt>
+<dd>
+<p>The list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The list with 2-tuples of 0-based indices and elements for all elements of the
+given list.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-floor">floor tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool long floor(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given double number rounded to a whole long number, towards
+negative infinity.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The double number rounded to a whole long number, towards negative infinity.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-fmt">fmt tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string fmt(string pattern, object?... args)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Formats a text based on a pattern and arguments.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#lang-ref-builtins-data-str">str</a> tool, as <code>str(value)</code> is
+equal to <code>fmt("%s", value)</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The format pattern.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The arguments.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The formatted text.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the format pattern is invalid.</p>
+</li>
+<li>
+<p>If the format pattern and arguments don&#8217;t match.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-indexof">indexof tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int indexof(string whole, string part)
+tool int indexof(string whole, string part, int offset)
+tool int indexof&lt;T&gt;(list T $list, T elem)
+tool int indexof&lt;T&gt;(list T $list, T elem, int offset)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the 0-based index of the first occurrence of the second given string
+or value, in the first given string or list. The tool looks for an occurrence
+from left to right of the first given string or elements of the first given
+list. If an offset is given, the tool only looks for an occurrence at or after
+that 0-based offset. If no offset is not given, the tool starts looking at the
+first (left most) character or list element.</p>
+</div>
+<div class="paragraph">
+<p>Returns <code>-1</code> if the second given string or value doesn&#8217;t occur in the first
+given string or list, at or after the 0-based offset if given, or at all if
+no offset is given. For an empty second string, always returns <code>0</code> if no
+offset is given. For an empty second string, if an offset is given, always
+returns the offset, unless there is no character at the given offset, in which
+<code>-1</code> is always returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>whole</code>, <code>list</code></dt>
+<dd>
+<p>The first given string, or the list.</p>
+</dd>
+<dt class="hdlist1"><code>part</code>, <code>elem</code></dt>
+<dd>
+<p>The second given string, or the value.</p>
+</dd>
+<dt class="hdlist1"><code>offset</code></dt>
+<dd>
+<p>The optional 0-based offset.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The 0-based index of the first occurrence, at or after the given offset if
+given, or <code>-1</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-join">join tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string join(string... texts)
+tool string join(list string texts)
+tool string join(list string texts, string separator)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given texts joined together. They can be joined without any
+separator, or using a given separator.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>texts</code></dt>
+<dd>
+<p>The texts to join.</p>
+</dd>
+<dt class="hdlist1"><code>separator</code></dt>
+<dd>
+<p>The optional separator text to use.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The joined texts.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-keys">keys tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool set K keys&lt;K,V&gt;(map(K:V) $map)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns a set with the keys of the given map.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>map</code></dt>
+<dd>
+<p>The map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The set with the keys of the map.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-lastindexof">lastindexof tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int lastindexof(string whole, string part)
+tool int lastindexof(string whole, string part, int offset)
+tool int lastindexof&lt;T&gt;(list T $list, T elem)
+tool int lastindexof&lt;T&gt;(list T $list, T elem, int offset)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the 0-based index of the last occurrence of the second given string
+or value, in the first given string or list. The tool looks for an occurrence
+from left to right of the first given string or elements of the first given
+list. If an offset is given, the tool only looks for an occurrence at or before
+that 0-based offset. If no offset is not given, the tool starts looking at the
+first (left most) character or list element.</p>
+</div>
+<div class="paragraph">
+<p>Returns <code>-1</code> if the second given string or value doesn&#8217;t occur in the first
+given string or list, at or before the 0-based offset if given, or at all if
+no offset is given. For an empty second string, always returns the size of the
+first given string, if no offset is given. For an empty second string, if an
+offset is given, always returns the offset, unless there is no character at the
+given offset, in which <code>-1</code> is always returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>whole</code>, <code>list</code></dt>
+<dd>
+<p>The first given string, or the list.</p>
+</dd>
+<dt class="hdlist1"><code>part</code>, <code>elem</code></dt>
+<dd>
+<p>The second given string, or the value.</p>
+</dd>
+<dt class="hdlist1"><code>offset</code></dt>
+<dd>
+<p>The optional 0-based offset.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The 0-based index of the last occurrence, at or before the given offset if
+given, or <code>-1</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-ln">ln tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool double ln(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the natural logarithm of a double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The natural logarithm of the double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the double number is not positive.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-log">log tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool double log(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the logarithm (base 10) of a double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The logarithm (base 10) of the double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the double number is not positive.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-lower">lower tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string lower(string text)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given text, converted to lower case. Uses a US English locale.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text, in lower case.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-ltrim">ltrim tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string ltrim(string text)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given text with whitespace at the left/start of the text removed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text with whitespace at the left/start of the text removed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-max">max tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    max(int... x)
+tool long   max(long... x)
+tool double max(double... x)
+tool int    max(list int x)
+tool long   max(list long x)
+tool double max(list double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the maximum of some integer, long, or double numbers. If no numbers are
+given, the minimum representable finite integer, long, or double value is
+returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The integer, long, or double numbers.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The maximum number.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-min">min tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int    min(int... x)
+tool long   min(long... x)
+tool double min(double... x)
+tool int    min(list int x)
+tool long   min(list long x)
+tool double min(list double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the minimum of some integer, long, or double numbers. If no numbers are
+given, the maximum representable finite integer, long, or double value is
+returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The integer, long, or double numbers.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The minimum number.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-pow">pow tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool double pow(double base, double exponent)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the exponentiation (power) of two double numbers.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>base</code></dt>
+<dd>
+<p>The base double number.</p>
+</dd>
+<dt class="hdlist1"><code>exponent</code></dt>
+<dd>
+<p>The exponent double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The exponentiation result.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in double overflow, or <code>NaN</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-range">range tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list int range(int count)
+tool list int range(int begin, int $end)
+tool list int range&lt;T&gt;(list T $list)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns a list of numbers representing the range <code>[0..count-1]</code>,
+<code>[begin..end]</code>, or <code>[0..size(list)-1]</code>. That is, for <code>count</code> = <code>5</code> the
+list <code>[0, 1, 2, 3, 4]</code> is returned, for <code>begin</code> = <code>-3</code> and <code>end</code> =
+<code>2</code> the list <code>[-3, -2, -1, 0, 1, 2]</code> is returned, and for a <code>list</code> with
+<code>5</code> elements the list <code>[0, 1, 2, 3, 4]</code> is returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>count</code></dt>
+<dd>
+<p>The number of elements in the resulting list. Negative counts are treated as
+zero.</p>
+</dd>
+<dt class="hdlist1"><code>begin</code></dt>
+<dd>
+<p>The lower bound of the range.</p>
+</dd>
+<dt class="hdlist1"><code>end</code></dt>
+<dd>
+<p>The upper bound of the range.</p>
+</dd>
+<dt class="hdlist1"><code>list</code></dt>
+<dd>
+<p>The list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The range <code>[0..count-1]</code>, <code>[begin..end]</code>, or <code>[0..size(list)-1]</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-replace">replace tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string replace(string text, string oldtext, string newtext)
+tool list T replace&lt;T&gt;(list T $list, T oldelem, T newelem)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the string or list with old sub strings or elements replaced by new
+text or elements. For strings, the replacement proceeds from the beginning of
+the string to the end. That is, replacing <code>"aa"</code> with <code>"b"</code> in the string
+<code>"aaa"</code> will result in <code>"ba"</code> rather than <code>"ab"</code>. For lists, the
+replacement is performed for all matching old elements.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code>, <code>list</code></dt>
+<dd>
+<p>The text (string) or list in which to replace text or elements.</p>
+</dd>
+<dt class="hdlist1"><code>oldtext</code>, <code>oldelem</code></dt>
+<dd>
+<p>The text (sub string) or element to replace. For list elements, it may be
+<code>null</code>.</p>
+</dd>
+<dt class="hdlist1"><code>newtext</code>, <code>newelem</code></dt>
+<dd>
+<p>The replacement text or element. For list elements, it may be <code>null</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text or list with all replacements applied.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-reverse">reverse tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string reverse(string text)
+tool list T reverse&lt;T&gt;(list T $list)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the reverse of the given string or list.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code>, <code>list</code></dt>
+<dd>
+<p>The string or list.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The reverse string or list.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-round">round tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool long round(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given double number rounded to the closest whole long number, with
+ties being rounded toward positive infinity.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The rounded number.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the operation results in overflow.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-rtrim">rtrim tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string rtrim(string text)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given text with whitespace at the right/end of the text removed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text with whitespace at the right/end of the text removed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-size">size tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int size(string x)
+tool int size&lt;T&gt;(list T x)
+tool int size&lt;T&gt;(set T x)
+tool int size&lt;K,V&gt;(map(K:V) x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the size (number of characters, elements, or entries) of the given
+string, list, set, or map.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list or set.</p>
+</dd>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The string, list, set, or map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The size.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-sorted">sorted tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list T sorted&lt;T&gt;(list T $list)
+tool list T sorted&lt;T&gt;(set T $set)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given list, or the given set as a list, with the elements sorted in
+ascending order.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the list or set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>list</code></dt>
+<dd>
+<p>The list.</p>
+</dd>
+<dt class="hdlist1"><code>set</code></dt>
+<dd>
+<p>The set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The sorted list.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-split">split tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list string split(string text, string? separator = null, bool removeEmpty = true)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Splits the given text at all non-overlapping occurrences of the given
+separator.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text to split.</p>
+</dd>
+<dt class="hdlist1"><code>separator</code></dt>
+<dd>
+<p>The separator text. May be empty or <code>null</code> to split on whitespace.</p>
+</dd>
+<dt class="hdlist1"><code>removeEmpty</code></dt>
+<dd>
+<p>Whether to remove empty parts (in case the text starts or ends with the
+separator, or in case the text contains consecutive separators), or not.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The parts of the original text resulting from splitting the original text at
+the separators.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-sqrt">sqrt tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool double sqrt(double x)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the square root of a double number.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>x</code></dt>
+<dd>
+<p>The double number.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The square root.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the double number is negative.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-startswith">startswith tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool startswith(string whole, string prefix)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first given string starts with the second given string. For
+an empty prefix, always returns <code>true</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>whole</code></dt>
+<dd>
+<p>The first given string.</p>
+</dd>
+<dt class="hdlist1"><code>prefix</code></dt>
+<dd>
+<p>The second given string.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first given string starts with the second given string,
+<code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-str">str tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string str(object? value)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Converts the given value into a textual representation, closely resembling the
+ToolDef syntax.</p>
+</div>
+<div class="paragraph">
+<p>Values of type <code>string</code> as returned as provided. Values of type <code>string</code>
+included in containers such as lists are escaped and surrounded by double
+quotes, as in the ToolDef syntax.</p>
+</div>
+<div class="paragraph">
+<p>See also the <a href="#lang-ref-builtins-data-fmt">fmt</a> tool, as <code>str(value)</code> is
+equal to <code>fmt("%s", value)</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>value</code></dt>
+<dd>
+<p>The value to convert to a textual representation.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The textual representation.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-strdup">strdup tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string strdup(string text, int count)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Duplicates a string a given number of times.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The string to duplicate.</p>
+</dd>
+<dt class="hdlist1"><code>count</code></dt>
+<dd>
+<p>The number of times that the input string should occur in the output.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The concatenation of <code>count</code> times the <code>text</code>.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the count is negative.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-subset">subset tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool subset&lt;T&gt;(set T part, set T whole)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns whether the first given set is a subset (proper subset or equal) of the
+second given set.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>T</code></dt>
+<dd>
+<p>The type of the elements of the sets.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>part</code></dt>
+<dd>
+<p>The first set.</p>
+</dd>
+<dt class="hdlist1"><code>whole</code></dt>
+<dd>
+<p>The second set.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the first given set is a subset of the second given set, <code>false</code>
+otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-trim">trim tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string trim(string text)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given text with whitespace at the left/start and right/end of the
+text removed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text with whitespace at the left/start and right/end of the text removed.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-upper">upper tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string upper(string text)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the given text, converted to upper case. Uses a US English locale.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>text</code></dt>
+<dd>
+<p>The text.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The text, in upper case.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-data-values">values tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool set V values&lt;K,V&gt;(map(K:V) $map)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns a set with the values of the given map.</p>
+</div>
+<div class="paragraph">
+<p><em>Type parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>K</code></dt>
+<dd>
+<p>The type of the keys of the map.</p>
+</dd>
+<dt class="hdlist1"><code>V</code></dt>
+<dd>
+<p>The type of the values of the map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>map</code></dt>
+<dd>
+<p>The map.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The set with the values of the map.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-builtins-io">Built-in I/O tools</h4>
+<div class="paragraph">
+<p>This page describes the built-in I/O tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-io-out">out</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-io-err">err</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-io-outln">outln</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-io-errln">errln</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-io-out">out tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool out(string pattern, object?... args)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Prints <a href="#lang-ref-builtins-data-fmt">formatted text</a> (based on a
+pattern and arguments) to the standard output stream (stdout).</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The format pattern.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The arguments.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the format pattern is invalid.</p>
+</li>
+<li>
+<p>If the format pattern and arguments don&#8217;t match.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-io-err">err tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool err(string pattern, object?... args)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Prints <a href="#lang-ref-builtins-data-fmt">formatted text</a> (based on a
+pattern and arguments) to the standard error stream (stderr).</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The format pattern.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The arguments.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the format pattern is invalid.</p>
+</li>
+<li>
+<p>If the format pattern and arguments don&#8217;t match.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-io-outln">outln tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool outln(string pattern = &quot;&quot;, object?... args)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Prints <a href="#lang-ref-builtins-data-fmt">formatted text</a> (based on a
+pattern and arguments) to the standard output stream (stdout), printing an
+additional new line at the end.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The format pattern.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The arguments.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the format pattern is invalid.</p>
+</li>
+<li>
+<p>If the format pattern and arguments don&#8217;t match.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-io-errln">errln tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool errln(string pattern = &quot;&quot;, object?... args)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Prints <a href="#lang-ref-builtins-data-fmt">formatted text</a> (based on a
+pattern and arguments) to the standard error stream (stderr), printing an
+additional new line at the end.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The format pattern.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The arguments.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the format pattern is invalid.</p>
+</li>
+<li>
+<p>If the format pattern and arguments don&#8217;t match.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-builtins-generic">Built-in generic tools</h4>
+<div class="paragraph">
+<p>This page describes the built-in generic tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-generic-app">app</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-generic-exec">exec</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-generic-tooldef">tooldef</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-generic-app">app tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int app(string? plugin, string classname, string... args,        string stdin = &quot;-&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)
+tool int app(string? plugin, string classname, list string args = [], string stdin = &quot;-&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Executes an application framework application.</p>
+</div>
+<div class="paragraph">
+<p>The application is specified as a Java class that extends the
+<code>org.eclipse.escet.common.app.framework.Application</code> class. It should have a constructor
+that accepts one parameter, of type <code>org.eclipse.escet.common.app.framework.io.AppStreams</code>.</p>
+</div>
+<div class="paragraph">
+<p>The application is started within the current Java interpreter, in a new
+thread. If executed from Eclipse, the class is loaded using the class loader
+of the given bundle (if provided), otherwise, it is loaded using the default
+class loader. In the latter case, the class should be in the class path.</p>
+</div>
+<div class="paragraph">
+<p>Note that this tool is only machine independent and platform independent, as
+long as the applications that are executed, are machine independent and
+platform independent as well.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>plugin</code></dt>
+<dd>
+<p>The name of the plug-in (OSGi bundle) in which to resolve the application
+class. If the Java application is executed from Eclipse, then the class is
+loaded by the class loader of this bundle, otherwise it is resolved using the
+default class loader. May be <code>null</code> to always use the default class loader.</p>
+</dd>
+<dt class="hdlist1"><code>classname</code></dt>
+<dd>
+<p>The absolute name of the Java class to execute as application.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The command line arguments of the application to execute. Each argument
+string is parsed to zero or more actual arguments. It is possible to use a
+single string with all arguments (where the arguments themselves are
+separated by spaces), comma separated strings for each of the arguments (each
+string has one argument), or a mix of those.</p>
+<div class="paragraph">
+<p>In argument strings, individual arguments are separated by whitespace
+(spaces, tabs, new lines, etc). The whitespace itself is ignored, and only
+serves as separation. To include whitespace in an argument, the argument (or
+a part of it), may be quoted, by putting it between double quotes (<code>"</code>) or
+single quotes (<code>'</code>). Characters may be escaped by prefixing them with a
+backslash (<code>\</code>). This is particularly useful for single/double quotes, and
+escape characters, and can also be used to escape spaces. Escapes work the
+same inside of quoted parts as they do outside of quoted parts.</p>
+</div>
+</dd>
+<dt class="hdlist1"><code>stdin</code></dt>
+<dd>
+<p>Specify whether to have a standard input (stdin) stream and where the input
+comes from. Use <code>""</code> to not have a stdin stream, <code>"-"</code> to use the stdin
+stream of the ToolDef interpreter, or otherwise an absolute or relative local
+file system path of the file from which to read the standard input. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stdout</code></dt>
+<dd>
+<p>Specify whether to have a standard output (stdout) stream and where to write
+the standard output. Use <code>""</code> to not have a stdout stream, <code>"-"</code> to use
+the stdout stream of the ToolDef interpreter, or otherwise an absolute or
+relative local file system path of the file to which to write the standard
+output. May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stderr</code></dt>
+<dd>
+<p>Specify whether to have a standard error (stderr) stream and where to write
+the standard error output. Use <code>""</code> to not have a stderr stream, <code>"-"</code>
+to use the stderr stream of the ToolDef interpreter, or otherwise an absolute
+or relative local file system path of the file to which to write the standard
+error output. May contain both <code>\</code> and <code>/</code> as path separators. Is ignored
+when the standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>appendOut</code></dt>
+<dd>
+<p>Whether to append to the stdout file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored when standard output is not written to a file.</p>
+</dd>
+<dt class="hdlist1"><code>appendErr</code></dt>
+<dd>
+<p>Whether to append to the stderr file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored if standard error output is not written to a file. Is also ignored
+when standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>errToOut</code></dt>
+<dd>
+<p>Whether to redirect the standard error stream to the standard output stream
+(<code>true</code>) or use separate streams (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>ignoreNonZeroExitCode</code></dt>
+<dd>
+<p>Whether to ignore non-zero exit codes (<code>true</code>) or consider them as errors
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The application exit code. See the application framework documentation for a
+description of the exit codes.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the class loader can not be obtained.</p>
+</li>
+<li>
+<p>If the class can not be found or loaded.</p>
+</li>
+<li>
+<p>If the class is not an application framework application.</p>
+</li>
+<li>
+<p>If an appropriate constructor is not available.</p>
+</li>
+<li>
+<p>If an instance of the application class can not be constructed.</p>
+</li>
+<li>
+<p>If parsing of the command line arguments fails.</p>
+</li>
+<li>
+<p>If the application fails to execute due to its thread being interrupted.</p>
+</li>
+<li>
+<p>If the application exits with a non-zero exit code and non-zero exit codes
+are not ignored.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-generic-exec">exec tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int exec(string cmd, string... args,        string stdin = &quot;&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)
+tool int exec(string cmd, list string args = [], string stdin = &quot;&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Executes a system command or external application as a sub process.</p>
+</div>
+<div class="paragraph">
+<p>This tool should be avoided if possible, as it is in general not guaranteed to
+be cross platform and machine independent. Commands and external applications
+may not be available on all systems, or may have different behavior on
+different systems.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>cmd</code></dt>
+<dd>
+<p>The name of the command or the absolute or relative local file system path of
+the external application to execute, using platform specific new line
+characters.</p>
+</dd>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The command line arguments of the command or external application to execute.
+Each argument string is parsed to zero or more actual arguments. It is
+possible to use a single string with all arguments (where the arguments
+themselves are separated by spaces), comma separated strings for each of the
+arguments (each string has one argument), or a mix of those.</p>
+<div class="paragraph">
+<p>In argument strings, individual arguments are separated by whitespace
+(spaces, tabs, new lines, etc). The whitespace itself is ignored, and only
+serves as separation. To include whitespace in an argument, the argument (or
+a part of it), may be quoted, by putting it between double quotes (<code>"</code>) or
+single quotes (<code>'</code>). Characters may be escaped by prefixing them with a
+backslash (<code>\</code>). This is particularly useful for single/double quotes, and
+escape characters, and can also be used to escape spaces. Escapes work the
+same inside of quoted parts as they do outside of quoted parts.</p>
+</div>
+</dd>
+<dt class="hdlist1"><code>stdin</code></dt>
+<dd>
+<p>Specify whether to have a standard input (stdin) stream and where the input
+comes from. Use <code>""</code> to not have a stdin stream, <code>"-"</code> to use the stdin
+stream of the ToolDef interpreter, or otherwise an absolute or relative local
+file system path of the file from which to read the standard input. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stdout</code></dt>
+<dd>
+<p>Specify whether to have a standard output (stdout) stream and where to write
+the standard output. Use <code>""</code> to not have a stdout stream, <code>"-"</code> to use
+the stdout stream of the ToolDef interpreter, or otherwise an absolute or
+relative local file system path of the file to which to write the standard
+output. May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stderr</code></dt>
+<dd>
+<p>Specify whether to have a standard error (stderr) stream and where to write
+the standard error output. Use <code>""</code> to not have a stderr stream, <code>"-"</code>
+to use the stderr stream of the ToolDef interpreter, or otherwise an absolute
+or relative local file system path of the file to which to write the standard
+error output. May contain both <code>\</code> and <code>/</code> as path separators. Is ignored
+when the standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>appendOut</code></dt>
+<dd>
+<p>Whether to append to the stdout file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored when standard output is not written to a file.</p>
+</dd>
+<dt class="hdlist1"><code>appendErr</code></dt>
+<dd>
+<p>Whether to append to the stderr file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored if standard error output is not written to a file. Is also ignored
+when standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>errToOut</code></dt>
+<dd>
+<p>Whether to redirect the standard error stream to the standard output stream
+(<code>true</code>) or use separate streams (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>ignoreNonZeroExitCode</code></dt>
+<dd>
+<p>Whether to ignore non-zero exit codes (<code>true</code>) or consider them as errors
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The exit code resulting from the execution of the command or external
+application.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If parsing of the command line arguments fails.</p>
+</li>
+<li>
+<p>If ToolDef fails to execution the command or external application.</p>
+</li>
+<li>
+<p>If execution results in a non-zero exit code and non-zero exit codes are not
+ignored.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-generic-tooldef">tooldef tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool int tooldef(string... args,        string stdin = &quot;-&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)
+tool int tooldef(list string args = [], string stdin = &quot;-&quot;, string stdout = &quot;-&quot;, string stderr = &quot;-&quot;, bool appendOut = false, bool appendErr = false, bool errToOut = false, bool ignoreNonZeroExitCode = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Executes a ToolDef script. Waits for that script to finish its execution before
+continuing with the current script.</p>
+</div>
+<div class="paragraph">
+<p>The script is executed within the current Java interpreter, in a new thread,
+using a new ToolDef interpreter.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>args</code></dt>
+<dd>
+<p>The command line arguments for the ToolDef interpreter, including the path to
+the script to execute. Each argument string is parsed to zero or more actual
+arguments. It is possible to use a single string with all arguments (where
+the arguments themselves are separated by spaces), comma separated strings
+for each of the arguments (each string has one argument), or a mix of those.</p>
+<div class="paragraph">
+<p>In argument strings, individual arguments are separated by whitespace
+(spaces, tabs, new lines, etc). The whitespace itself is ignored, and only
+serves as separation. To include whitespace in an argument, the argument (or
+a part of it), may be quoted, by putting it between double quotes (<code>"</code>) or
+single quotes (<code>'</code>). Characters may be escaped by prefixing them with a
+backslash (<code>\</code>). This is particularly useful for single/double quotes, and
+escape characters, and can also be used to escape spaces. Escapes work the
+same inside of quoted parts as they do outside of quoted parts.</p>
+</div>
+</dd>
+<dt class="hdlist1"><code>stdin</code></dt>
+<dd>
+<p>Specify whether to have a standard input (stdin) stream and where the input
+comes from. Use <code>""</code> to not have a stdin stream, <code>"-"</code> to use the stdin
+stream of the ToolDef interpreter, or otherwise an absolute or relative local
+file system path of the file from which to read the standard input. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stdout</code></dt>
+<dd>
+<p>Specify whether to have a standard output (stdout) stream and where to write
+the standard output. Use <code>""</code> to not have a stdout stream, <code>"-"</code> to use
+the stdout stream of the ToolDef interpreter, or otherwise an absolute or
+relative local file system path of the file to which to write the standard
+output. May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>stderr</code></dt>
+<dd>
+<p>Specify whether to have a standard error (stderr) stream and where to write
+the standard error output. Use <code>""</code> to not have a stderr stream, <code>"-"</code>
+to use the stderr stream of the ToolDef interpreter, or otherwise an absolute
+or relative local file system path of the file to which to write the standard
+error output. May contain both <code>\</code> and <code>/</code> as path separators. Is ignored
+when the standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>appendOut</code></dt>
+<dd>
+<p>Whether to append to the stdout file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored when standard output is not written to a file.</p>
+</dd>
+<dt class="hdlist1"><code>appendErr</code></dt>
+<dd>
+<p>Whether to append to the stderr file (<code>true</code>) or overwrite it (<code>false</code>).
+Is ignored if standard error output is not written to a file. Is also ignored
+when standard error stream is redirected to the standard output stream.</p>
+</dd>
+<dt class="hdlist1"><code>errToOut</code></dt>
+<dd>
+<p>Whether to redirect the standard error stream to the standard output stream
+(<code>true</code>) or use separate streams (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>ignoreNonZeroExitCode</code></dt>
+<dd>
+<p>Whether to ignore non-zero exit codes (<code>true</code>) or consider them as errors
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The ToolDef interpreter exit code, i.e. the exit code of the script.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If parsing of the command line arguments fails.</p>
+</li>
+<li>
+<p>If the application fails to execute due to its thread being interrupted.</p>
+</li>
+<li>
+<p>If execution results in a non-zero exit code and non-zero exit codes are not
+ignored.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-builtins-path">Built-in path tools</h4>
+<div class="paragraph">
+<p>This page describes the built-in I/O tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-path-abspath">abspath</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-basename">basename</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-chdir">chdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-chfileext">chfileext</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-curdir">curdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-dirname">dirname</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-fileext">fileext</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-hasfileext">hasfileext</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-pathjoin">pathjoin</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-path-scriptpath">scriptpath</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-abspath">abspath tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string abspath(string path)
+tool string abspath(string path, string workdir)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns an absolute local file system path, given an absolute or relative local
+file system path.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path. May contain both <code>\</code> and
+<code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>workdir</code></dt>
+<dd>
+<p>The optional absolute local file system path of the working directory against
+which to resolve relative paths. May contain both <code>\</code> and <code>/</code> as path
+separators. If not specified, relative paths are resolved against the
+<a href="#lang-ref-builtins-path-curdir">current working directory</a>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The absolute local file system path. The path contains separators for the
+current platform.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-basename">basename tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string basename(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the base name of the given absolute or relative local file system path.
+The base name of a file or directory is the name of that file or directory. In
+other words, returns the last part of the given path.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path to the file or directory for
+which to return the base name. May contain both <code>\</code> and <code>/</code> as path
+separators. Must not end with <code>\</code> or <code>/</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The base name.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the path ends with <code>\</code> or <code>/</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-chdir">chdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool chdir(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Changes the <a href="#lang-ref-builtins-path-curdir">current working directory</a> to
+the directory referred to by the given path.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path to the new current working
+directory. Relative paths are resolved against the
+<a href="#lang-ref-builtins-path-curdir">current working directory</a>. May contain
+both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the given path does not exist.</p>
+</li>
+<li>
+<p>If the given path refers to a file rather than a directory.</p>
+</li>
+<li>
+<p>If it can not be determined whether the given path refers to a file or a
+directory.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-chfileext">chfileext tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string chfileext(string path, string? oldext = null, string? newext = null)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Modifies a path such that it ends with a new extension, removing an old
+extension if it exists.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path to modify. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>oldext</code></dt>
+<dd>
+<p>The old extension that can be removed (case insensitive, no . at the
+start). Use <code>null</code> to not remove an old extension.</p>
+</dd>
+<dt class="hdlist1"><code>newext</code></dt>
+<dd>
+<p>The new extension to use (case sensitive, no . at the start). Use
+<code>null</code> to not add a new extension.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The changed path, ending with the new extension (if any).</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-curdir">curdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string curdir()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the script execution&#8217;s current working directory, as an absolute local
+file system path. The path contains separators for the current platform.</p>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The script execution&#8217;s current working directory.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-dirname">dirname tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string dirname(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the absolute directory path of the directory that contains the given
+file or directory.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute local file system path that refers to a file or directory. May
+contain both <code>\</code> and <code>/</code> as path separators. Must not end with <code>\</code> or <code>/</code>.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The absolute directory path of the directory that contains the given file or
+directory. May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the given path is not an absolute local file system path.</p>
+</li>
+<li>
+<p>If the given path ends with <code>\</code> or <code>/</code>.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-fileext">fileext tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string fileext(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the file extension of the given file, or <code>""</code> if the file has no file
+extension.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path to the file. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The file extension, or <code>""</code>.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-hasfileext">hasfileext tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool hasfileext(string path, string ext)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Does the given file have the given file extension?</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path to the file. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>ext</code></dt>
+<dd>
+<p>The file extension to check for (case sensitive, no <code>.</code> at the start).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the  file has the given file extension, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-pathjoin">pathjoin tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string pathjoin(string... paths)
+tool string pathjoin(list string paths)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Joins paths together. If no paths are given, an empty string is returned. If
+one path is given, the path is returned.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>paths</code></dt>
+<dd>
+<p>The paths to join together. The first path may be an absolute or relative
+local file system path. The remaining paths must be relative local file
+system paths. All paths may contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The joined path. The path contains separators for the current platform.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-path-scriptpath">scriptpath tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool string scriptpath()</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the absolute local file system path to the script being executed. The
+path contains separators for the current platform.</p>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The absolute local file system path to the script being executed.</p>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="lang-ref-builtins-file">Built-in file tools</h4>
+<div class="paragraph">
+<p>This page describes the built-in I/O tools:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="#lang-ref-builtins-file-cpfile">cpfile</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-cpdir">cpdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-diff">diff</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-exists">exists</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-filenewer">filenewer</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-filesize">filesize</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-find">find</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-isdir">isdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-isfile">isfile</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-mkdir">mkdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-mvfile">mvfile</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-mvdir">mvdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-readlines">readlines</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-rmfile">rmfile</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-rmdir">rmdir</a></p>
+</li>
+<li>
+<p><a href="#lang-ref-builtins-file-writefile">writefile</a></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-cpfile">cpfile tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool cpfile(string source, string target, bool overwrite = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Copies a file from a source location to a target location.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>source</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the source file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>target</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the target file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>overwrite</code></dt>
+<dd>
+<p>Whether to overwrite the target file if it already exists.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the source file does not exist.</p>
+</li>
+<li>
+<p>If the source is a directory rather than a file.</p>
+</li>
+<li>
+<p>If it can not be determined whether the source path refers to a file or a
+directory.</p>
+</li>
+<li>
+<p>If the target file exists and overwriting is not allowed.</p>
+</li>
+<li>
+<p>If the target file exists and overwriting is allowed, but the target refers
+to a directory rather than a file.</p>
+</li>
+<li>
+<p>If the target file exists and overwriting is allowed, but it can not be
+determined whether the target path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If copying the file failed due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-cpdir">cpdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool cpdir(string source, string target)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Copies a directory from a source location to a target location. All files and
+directories in the source directory are copied recursively.</p>
+</div>
+<div class="paragraph">
+<p>If the operation fails, part of the operation may have already been performed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>source</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the source directory. All
+files and directories in the source directory are copied recursively. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>target</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the target directory. This
+is the directory in which the contents of the source directory are copied.
+The source directory itself is not copied, only the files and directories
+contained in the source directory. May contain both <code>\</code> and <code>/</code> as path
+separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the source directory does not exist.</p>
+</li>
+<li>
+<p>If the source is a file rather than a directory.</p>
+</li>
+<li>
+<p>If it can not be determined whether the source path refers to a file or a
+directory.</p>
+</li>
+<li>
+<p>If the target directory already exists.</p>
+</li>
+<li>
+<p>If the target directory doesn&#8217;t exist, but one of the ancestors is not a
+directory.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) fails.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) encounters a file system cycle (due to
+symbolic links).</p>
+</li>
+<li>
+<p>If a file or (sub-)directory could not be copied due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-diff">diff tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool diff(string file1, string file2, string output = &quot;-&quot;, bool missingAsEmpty = false, bool warnOnDiff = false, bool failOnDiff = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Computes the differences between two files.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>file1</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the first file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>file2</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the second file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>output</code></dt>
+<dd>
+<p>Specify whether/where to write a unified diff if the files differ. Use <code>""</code>
+to not write a unified diff, <code>"-"</code> to write the unified diff to the
+standard output stream (stdout), or otherwise an absolute or relative local
+file system path of the file to which to write the unified diff. May contain
+both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>missingAsEmpty</code></dt>
+<dd>
+<p>Treat a missing first/second file as empty (<code>true</code>) or as an error
+(<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>warnOnDiff</code></dt>
+<dd>
+<p>Emit a warning for differing files (<code>true</code>) or not (<code>false</code>). If a
+warning is emitted to the standard error stream (stderr), the unified diff
+(if enabled) is printed first.</p>
+</dd>
+<dt class="hdlist1"><code>failOnDiff</code></dt>
+<dd>
+<p>Treat differing files as an error (<code>true</code>) or not (<code>false</code>). If an error
+is emitted, the unified diff (if enabled) and warning (if enabled) are
+printed first.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the files differ, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If either the first or second file doesn&#8217;t exist and <code>missingAsEmpty</code> is
+disabled.</p>
+</li>
+<li>
+<p>If the first or second file is not a file but a directory.</p>
+</li>
+<li>
+<p>If it can not be determined whether the first or second path refers to a file
+or a directory.</p>
+</li>
+<li>
+<p>If an I/O error occurs.</p>
+</li>
+<li>
+<p>If the <code>out</code> file exists but is a directory rather than a regular file.</p>
+</li>
+<li>
+<p>If the <code>out</code> file does not exist but cannot be created.</p>
+</li>
+<li>
+<p>If the <code>out</code> file cannot be opened for writing for any other reason.</p>
+</li>
+<li>
+<p>If an I/O error occurs while writing to the <code>out</code> file.</p>
+</li>
+<li>
+<p>If the <code>out</code> file can not be closed.</p>
+</li>
+<li>
+<p>If the files differ and <code>failOnDiff</code> is enabled.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-exists">exists tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool exists(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Does a file or directory with the given path exist?</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file or directory. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the file or directory exists, <code>false</code> otherwise.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-filenewer">filenewer tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool filenewer(string path, string refpath,       bool allowNonExisting = false, bool sameAsNewer = true)
+tool bool filenewer(string path, string... refpaths,   bool allowNonExisting = false, bool sameAsNewer = true)
+tool bool filenewer(string path, list string refpaths, bool allowNonExisting = false, bool sameAsNewer = true)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Checks whether a file is newer (was modified at a later date/time) than some
+reference file(s).</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file for which to
+check whether it is newer than the reference file(s). May contain both <code>\</code>
+and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>refpath</code>, <code>refpaths</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the reference file(s). May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>allowNonExisting</code></dt>
+<dd>
+<p>Whether to allow the first file to not exist (<code>true</code>) or consider it an
+error if the first file does not exist (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>sameAsNewer</code></dt>
+<dd>
+<p>Whether to treat files with the same last change date as being the same
+(<code>false</code>) or as newer (<code>true</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>false</code> if the first file does not exist (if allowed by enabling
+<code>allowNonExisting</code>), if the first file is older than any the reference files,
+or if the first file has the same last change date as any of the reference
+files and <code>sameAsNewer</code> is disabled. <code>true</code> if the first file is newer than
+all of the reference files, if the first file has the same last change date as
+some the reference files and <code>sameAsNewer</code> is enabled and is newer than all
+of the other reference files, or if the first file has the same last change
+date as all the reference files and <code>sameAsNewer</code> is enabled.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the first file does not exist and <code>allowNonExisting</code> is disabled.</p>
+</li>
+<li>
+<p>If any of the reference files does not exist.</p>
+</li>
+<li>
+<p>If any of the files is a directory rather than a file.</p>
+</li>
+<li>
+<p>If for any of the paths it can not be determined whether the path refers to a
+file or a directory.</p>
+</li>
+<li>
+<p>If the last change date/time of any of the files can not be determined.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-filesize">filesize tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool long filesize(string path, bool missingAsZero = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Returns the size of the file, in bytes.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>missingAsZero</code></dt>
+<dd>
+<p>Whether to return 0 if the file does not exist (<code>true</code>) or consider it
+an error if the file does not exist (<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The size of the file in bytes, or <code>0</code> if the file is missing and
+<code>missingAsZero</code> is enabled.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the file does not exist and <code>missingAsZero</code> is disabled.</p>
+</li>
+<li>
+<p>If the file is a directory rather than a file.</p>
+</li>
+<li>
+<p>If it can not be determined whether the path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If the size of the file can not be determined due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-find">find tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list string find(string path, string pattern = &quot;*&quot;, bool recursive = true, bool files = true, bool dirs = true)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Searches a directory for files and/or directories matching a pattern.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the directory in which to
+search. The directory itself is never returned. May contain both <code>\</code> and
+<code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>pattern</code></dt>
+<dd>
+<p>The pattern to use to match files/directories. Is a
+<a href="https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob">Java NIO glob</a>
+pattern, that is matched against single file names or single directory names,
+and never against paths. Pattern <code>"*"</code> matches all files and directories.</p>
+</dd>
+<dt class="hdlist1"><code>recursive</code></dt>
+<dd>
+<p>Whether to recursively look in sub-directories.</p>
+</dd>
+<dt class="hdlist1"><code>files</code></dt>
+<dd>
+<p>Whether to match files.</p>
+</dd>
+<dt class="hdlist1"><code>dirs</code></dt>
+<dd>
+<p>Whether to match directories.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The local file system paths of the matched files and directories, relative
+against the given root directory from which searching started.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the given directory is not found.</p>
+</li>
+<li>
+<p>If the given directory is a file rather than a directory.</p>
+</li>
+<li>
+<p>If the can not be determined whether the given path refers to a file or a
+directory.</p>
+</li>
+<li>
+<p>If the pattern is invalid.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) fails.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) encounters a file system cycle (due to
+symbolic links).</p>
+</li>
+<li>
+<p>If the operation fails due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-isdir">isdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool isdir(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Does a directory with the given path exist?</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the directory. May contain
+both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the directory exists, <code>false</code> if it doesn&#8217;t exist or is not a
+directory.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-isfile">isfile tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool isfile(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Does a file with the given path exist?</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file. May contain
+both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the file exists, <code>false</code> if it doesn&#8217;t exist or is not a file.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-mkdir">mkdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool mkdir(string path, bool force = false, bool parents = true)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Creates the given directory, and optionally its parents as needed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the directory to create.
+May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>force</code></dt>
+<dd>
+<p>Whether to skip creating the directory if it already exists (<code>true</code>) or
+fail if it already exists (<code>false</code>).</p>
+</dd>
+<dt class="hdlist1"><code>parents</code></dt>
+<dd>
+<p>Whether to allow creating parents as needed (<code>true</code>) or fail if the parent
+directory does not exist (<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the directory already exists and <code>force</code> is disabled.</p>
+</li>
+<li>
+<p>If creating the directory or any of its parents fails, due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-mvfile">mvfile tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool mvfile(string source, string target, bool overwrite = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Moves a file from a source location to a target location. This can be used to
+rename a file and/or move it to another directory.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>source</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the source file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>target</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the target file. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>overwrite</code></dt>
+<dd>
+<p>Whether to overwrite the target file if it already exists.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the source file does not exist.</p>
+</li>
+<li>
+<p>If the source is a directory rather than a file.</p>
+</li>
+<li>
+<p>If it can not be determined whether the source path refers to a file or a
+directory.</p>
+</li>
+<li>
+<p>If the target file exist and overwriting is not allowed.</p>
+</li>
+<li>
+<p>If the target file exists and overwriting is allowed, but the target refers
+to a directory rather than a file.</p>
+</li>
+<li>
+<p>If the target file exists and overwriting is allowed, but it can not be
+determined whether the target path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If moving the file fails due to an I/O error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-mvdir">mvdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool mvdir(string source, string target)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Moves a directory from a source location to a target location. The directory
+and all files and directories in it are moved recursively.</p>
+</div>
+<div class="paragraph">
+<p>The operation is implemented as a copy from source to target, followed by a
+remove of the source. If the operation fails, part of the operation may have
+already been performed.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>source</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the source directory. The
+directory itself and all files and directories in it are moved recursively.
+May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>target</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the target directory. This
+is the directory into which the contents of the source directory are moved.
+May contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the source directory does not exist.</p>
+</li>
+<li>
+<p>If the source is a file rather than a directory.</p>
+</li>
+<li>
+<p>If it can not be determined whether the source path refers to a file or a
+directory.</p>
+</li>
+<li>
+<p>If the target directory already exists.</p>
+</li>
+<li>
+<p>If the target directory doesn&#8217;t exist but one of the ancestors is not a
+directory.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) fails.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) encounters a file system cycle (due to
+symbolic links).</p>
+</li>
+<li>
+<p>If a file or (sub-)directory can not be copied or removed, due to an I/O
+error.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-readlines">readlines tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool list string readlines(string path)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Read lines of text from a file.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file to read. May
+contain both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p>The lines of text from the file.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the file does not exist.</p>
+</li>
+<li>
+<p>If the path refers to a directory rather than a file.</p>
+</li>
+<li>
+<p>If it can not be determined whether the path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If for some other reason can not be opened for reading.</p>
+</li>
+<li>
+<p>If an I/O error occurs.</p>
+</li>
+<li>
+<p>If the file can not be closed.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-rmfile">rmfile tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool rmfile(string path, bool force = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Removes a file.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>force</code></dt>
+<dd>
+<p>Whether to ignore non-existing files (<code>true</code>) or consider it an error
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the file was removed, <code>false</code> if it could not be removed because
+it did not exist and force is enabled.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the file does not exist and <code>force</code> is disabled.</p>
+</li>
+<li>
+<p>If the file is a directory rather than a file.</p>
+</li>
+<li>
+<p>If it can not be determined whether the path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If an I/O error occurs.</p>
+</li>
+<li>
+<p>If the file can not be removed for some other reason.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-rmdir">rmdir tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool bool rmdir(string path, bool force = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Removes a directory, recursively.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the directory. May contain
+both <code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>force</code></dt>
+<dd>
+<p>Whether to ignore non-existing directories (<code>true</code>) or consider it an error
+(<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Returns</em></p>
+</div>
+<div class="paragraph">
+<p><code>true</code> if the directory was removed, <code>false</code> if it could not be removed
+because it did not exist and <code>force</code> is enabled.</p>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the directory does not exist and <code>force</code> is disabled.</p>
+</li>
+<li>
+<p>If the directory is a file rather than a directory.</p>
+</li>
+<li>
+<p>If it can not be determined whether the path refers to a file or a directory.</p>
+</li>
+<li>
+<p>If an I/O error occurs.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) fails.</p>
+</li>
+<li>
+<p>If walking the directory (recursively) encounters a file system cycle (due to
+symbolic links).</p>
+</li>
+<li>
+<p>If the directory or one of its sub-files or sub-directories can not be
+removed for some other reason.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="lang-ref-builtins-file-writefile">writefile tool</h5>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="tooldef">tool writefile(string path, string text,       bool append = false)
+tool writefile(string path, list string lines, bool append = false)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Writes text to a file.</p>
+</div>
+<div class="paragraph">
+<p><em>Parameters</em></p>
+</div>
+<div class="dlist">
+<dl>
+<dt class="hdlist1"><code>path</code></dt>
+<dd>
+<p>The absolute or relative local file system path of the file. May contain both
+<code>\</code> and <code>/</code> as path separators.</p>
+</dd>
+<dt class="hdlist1"><code>text</code>, <code>lines</code></dt>
+<dd>
+<p>The text or lines of text to write to the file.</p>
+</dd>
+<dt class="hdlist1"><code>append</code></dt>
+<dd>
+<p>Whether to append the lines text to the file if it already exists (<code>true</code>),
+or overwrite the file if it already exists (<code>false</code>).</p>
+</dd>
+</dl>
+</div>
+<div class="paragraph">
+<p><em>Runtime errors</em></p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>If the path exists but is a directory rather than a regular file.</p>
+</li>
+<li>
+<p>If the file does not exist, but cannot be created.</p>
+</li>
+<li>
+<p>If the file can not be opened for writing for any other reason.</p>
+</li>
+<li>
+<p>If writing to the file fails due to an I/O error.</p>
+</li>
+<li>
+<p>If closing the file fails.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="tools-chapter-index">Tooling</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Below you can find general information on how to use the ToolDef tooling,
+both on the command line, and in the <a href="https://eclipse.org">Eclipse</a> IDE.</p>
+</div>
+<div class="paragraph">
+<p>To start using the ToolDef tooling, create a <code>.tooldef</code> file. See the
+<a href="#lang-ref-chapter-index">language reference</a> documentation for more
+information on the syntax.</p>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+<div class="sect2">
+<h3 id="tools-command-line">Command line</h3>
+<div class="paragraph">
+<p>To execute a ToolDef script on the command line, use the <code>tooldef</code>
+executable. To start executing a ToolDef script, enter
+something like this on the command line:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="shell">tooldef some_script.tooldef</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+
+Additional options are available, to influence how the script is executed. For
+details, execute the ToolDef interpreter with the <code>--help</code> or <code>-h</code> command
+line option:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="shell">tooldef --help</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>
+</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="tools-eclipse-ide">Eclipse IDE</h3>
+<div class="paragraph">
+<p>
+
+To execute a ToolDef script in the Eclipse IDE, right click the file or an
+open text editor for the script, and choose <b class="menuref">Execute ToolDef</b>.
+Alternatively, choose <b class="menuref">Execute ToolDef&#8230;&#8203;</b> to first shown an option
+dialog, where several options that influence how the script is executed, before
+actually executing the script.</p>
+</div>
+<div class="paragraph">
+<p>It is also possible to start executing a script by pressing <kbd>F10</kbd>, while
+a <code>.tooldef</code> file is selected or an open text for such a file has the focus.
+Finally, clicking the corresponding toolbar icon
+(<span class="image"><img src="./tools/tooldef_icon.png" alt="tooldef icon"></span>) has the same effect.</p>
+</div>
+<div class="paragraph">
+<p>Execution of ToolDef script can be manually terminated by means of the
+termination features of the <em>Applications</em> view.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="release-notes-chapter-index">ToolDef release notes</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The release notes for the releases of ToolDef and the associated tools, as
+part of the Eclipse ESCET project, are listed below in reverse chronological
+order.</p>
+</div>
+<div class="sect2">
+<h3 id="version-0-1-unreleased">Version 0.1 (unreleased)</h3>
+<div class="paragraph">
+<p>The first release of ToolDef as part of the Eclipse ESCET project.</p>
+</div>
+<div class="paragraph">
+<p></p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="legal-chapter-index">Legal</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>The material in this documentation is
+Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation.</p>
+</div>
+<div class="paragraph">
+<p>Eclipse ESCET and ESCET are trademarks of the Eclipse Foundation.
+Eclipse, and the Eclipse Logo are registered trademarks of the
+Eclipse Foundation. Other names may be trademarks of their
+respective owners.</p>
+</div>
+<div class="paragraph">
+<p><strong>License</strong></p>
+</div>
+<div class="paragraph">
+<p>The Eclipse Foundation makes available all content in this document
+("Content"). Unless otherwise indicated below, the Content is provided to you
+under the terms and conditions of the MIT License. A copy of the MIT License
+is available at <a href="https://opensource.org/licenses/MIT" class="bare">https://opensource.org/licenses/MIT</a>. For purposes of the
+MIT License, "Software" will mean the Content.</p>
+</div>
+<div class="paragraph">
+<p>If you did not receive this Content directly from the Eclipse Foundation,
+the Content is being redistributed by another party ("Redistributor") and
+different terms and conditions may apply to your use of any object code in
+the Content. Check the Redistributor&#8217;s license that was provided with the
+Content. If no such license exists, contact the Redistributor. Unless
+otherwise indicated below, the terms and conditions of the MIT License
+still apply to any source code in the Content and such source code may be
+obtained at <a href="http://www.eclipse.org" class="bare">http://www.eclipse.org</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
+pre.CodeRay{background:#f7f7f8}
+.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
+.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
+.CodeRay .line-numbers strong{color:#000}
+table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
+table.CodeRay td{vertical-align:top;line-height:inherit}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.code{padding:0 0 0 .75em}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+<script type="text/x-mathjax-config">
+MathJax.Hub.Config({
+  messageStyle: "none",
+  tex2jax: {
+    inlineMath: [["\\(", "\\)"]],
+    displayMath: [["\\[", "\\]"]],
+    ignoreClass: "nostem|nolatexmath"
+  },
+  asciimath2jax: {
+    delimiters: [["\\$", "\\$"]],
+    ignoreClass: "nostem|noasciimath"
+  },
+  TeX: { equationNumbers: { autoNumber: "none" } }
+})
+MathJax.Hub.Register.StartupHook("AsciiMath Jax Ready", function () {
+  MathJax.InputJax.AsciiMath.postfilterHooks.Add(function (data, node) {
+    if ((node = data.script.parentNode) && (node = node.parentNode) && node.classList.contains('stemblock')) {
+      data.math.root.display = "block"
+    }
+    return data
+  })
+})
+</script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_HTMLorMML"></script>
+<!--
+  Copyright (c) 2010, 2020 Contributors to the Eclipse Foundation
+
+  See the NOTICE file(s) distributed with this work for additional
+  information regarding copyright ownership.
+
+  This program and the accompanying materials are made available under the terms
+  of the MIT License which is available at https://opensource.org/licenses/MIT
+
+  SPDX-License-Identifier: MIT
+-->
+
+<div id="footer">
+<div id="footer-text">
+<a href="https://www.eclipse.org">Eclipse Home</a>
+|
+<a href="https://www.eclipse.org/legal/privacy.php">Privacy Policy</a>
+|
+<a href="https://www.eclipse.org/legal/termsofuse.php">Terms of Use</a>
+|
+<a href="https://www.eclipse.org/legal/copyright.php">Copyright Agent</a>
+|
+<a href="https://www.eclipse.org/legal">Eclipse Legal</a>
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/v0.1-M1/tooldef/lang-ref/syntax/tooldef.bnf b/v0.1-M1/tooldef/lang-ref/syntax/tooldef.bnf
new file mode 100644
index 0000000..e6d0694
--- /dev/null
+++ b/v0.1-M1/tooldef/lang-ref/syntax/tooldef.bnf
@@ -0,0 +1,328 @@
+Script : /* empty */
+       | Decls
+       ;
+
+Decls : Decl
+      | Decls Decl
+      ;
+
+Decl : Import
+     | "type" TypeDecls ";"
+     | "tool" IDENTIFIERTK OptTypeParams ToolParameters ":" OptStatements "end"
+     | "tool" Types IDENTIFIERTK OptTypeParams ToolParameters ":" OptStatements "end"
+     | Statement
+     ;
+
+Import : "import" STRINGTK ";"
+       | "import" STRINGTK "as" IDENTIFIERTK ";"
+       | "import" Name ";"
+       | "import" Name "as" IDENTIFIERTK ";"
+       | "import" Name ":" Name ";"
+       | "import" Name ":" Name "as" IDENTIFIERTK ";"
+       | "from" STRINGTK "import" ImportParts ";"
+       ;
+
+ImportParts : "*"
+            | IDENTIFIERTK
+            | IDENTIFIERTK "as" IDENTIFIERTK
+            | ImportParts "," "*"
+            | ImportParts "," IDENTIFIERTK
+            | ImportParts "," IDENTIFIERTK "as" IDENTIFIERTK
+            ;
+
+TypeDecls : TypeDecl
+          | TypeDecls "," TypeDecl
+          ;
+
+TypeDecl : IDENTIFIERTK "=" Type
+         ;
+
+OptTypeParams : /* empty */
+              | "<" Names ">"
+              ;
+
+ToolParameters : "(" ")"
+               | "(" ToolParams ")"
+               ;
+
+ToolParams : Type ToolParam
+           | Type "..." ToolParam
+           | ToolParams "," Type ToolParam
+           | ToolParams "," Type "..." ToolParam
+           ;
+
+ToolParam : IDENTIFIERTK
+          | IDENTIFIERTK "=" Expression
+          ;
+
+OptStatements : /* empty */
+              | OptStatements Statement
+              ;
+
+Statement : Type VarDecls ";"
+          | "while" Expression ":" OptStatements "end"
+          | "while" Expression "::" Statement
+          | "for" AddressableDecls "in" Expression ":" OptStatements "end"
+          | "for" AddressableDecls "in" Expression "::" Statement
+          | "if" Expression ":" OptStatements OptElifStatements OptElseStatement "end"
+          | "if" Expression "::" Statement
+          | "break" ";"
+          | "continue" ";"
+          | Addressables "=" Expressions ";"
+          | "return" ";"
+          | "return" Expressions ";"
+          | ToolInvokeExpression ";"
+          | "exit" ";"
+          | "exit" Expression ";"
+          ;
+
+VarDecls : VarDecl
+         | VarDecls "," VarDecl
+         ;
+
+VarDecl : IDENTIFIERTK
+        | IDENTIFIERTK "=" Expression
+        ;
+
+OptElifStatements : /* empty */
+                  | OptElifStatements "elif" Expression ":" OptStatements
+                  ;
+
+OptElseStatement : /* empty */
+                 | "else" OptStatements
+                 ;
+
+AddressableDecls : AddressableDecl
+                 | AddressableDecls "," AddressableDecl
+                 ;
+
+AddressableDecl : IDENTIFIERTK
+                | "(" AddressableDecl "," AddressableDecls ")"
+                ;
+
+Addressables : Addressable
+             | Addressables "," Addressable
+             ;
+
+Addressable : IDENTIFIERTK
+            | IDENTIFIERTK Projections
+            | "(" Addressable "," Addressables ")"
+            ;
+
+Projections : Projection
+            | Projections Projection
+            ;
+
+Projection : "[" Expression "]"
+           ;
+
+Types : Type
+      | Types "," Type
+      ;
+
+Type : "bool"
+     | "bool" "?"
+     | "int"
+     | "int" "?"
+     | "long"
+     | "long" "?"
+     | "double"
+     | "double" "?"
+     | "string"
+     | "string" "?"
+     | "list" Type
+     | "list" "?" Type
+     | "set" Type
+     | "set" "?" Type
+     | "map" "(" Type ":" Type ")"
+     | "map" "?" "(" Type ":" Type ")"
+     | "tuple" "(" Type "," Types ")"
+     | "tuple" "?" "(" Type "," Types ")"
+     | "object"
+     | "object" "?"
+     | Name
+     ;
+
+Expressions : Expression
+            | Expressions "," Expression
+            ;
+
+OptExpression : /* empty */
+              | Expression
+              ;
+
+Expression : AndExpression
+           | Expression "or" AndExpression
+           ;
+
+AndExpression : CompareExpression
+              | AndExpression "and" CompareExpression
+              ;
+
+CompareExpression : AddExpression
+                  | CompareExpression "<" AddExpression
+                  | CompareExpression "<=" AddExpression
+                  | CompareExpression "==" AddExpression
+                  | CompareExpression "!=" AddExpression
+                  | CompareExpression ">=" AddExpression
+                  | CompareExpression ">" AddExpression
+                  ;
+
+AddExpression : MulExpression
+              | AddExpression "-" MulExpression
+              | AddExpression "+" MulExpression
+              ;
+
+MulExpression : UnaryExpression
+              | MulExpression "*" UnaryExpression
+              | MulExpression "/" UnaryExpression
+              | MulExpression "div" UnaryExpression
+              | MulExpression "mod" UnaryExpression
+              ;
+
+UnaryExpression : ProjExpression
+                | "-" UnaryExpression
+                | "+" UnaryExpression
+                | "not" UnaryExpression
+                ;
+
+ProjExpression : ExpressionFactor
+               | ProjExpression "[" Expression "]"
+               | ProjExpression "[" OptExpression ":" OptExpression "]"
+               ;
+
+ExpressionFactor : "true"
+                 | "false"
+                 | NUMBERTK
+                 | DOUBLETK
+                 | "null"
+                 | STRINGTK
+                 | "<" Type ">" ExpressionFactor
+                 | "[" "]"
+                 | "[" Expressions OptComma "]"
+                 | "{" "}"
+                 | "{" Expressions OptComma "}"
+                 | "{" MapEntries OptComma "}"
+                 | "(" Expression "," Expressions OptComma ")"
+                 | "(" Expression ")"
+                 | ToolInvokeExpression
+                 | Name
+                 ;
+
+MapEntries : Expression ":" Expression
+           | MapEntries "," Expression ":" Expression
+           ;
+
+ToolInvokeExpression : ToolRef "(" ToolArgs OptComma ")"
+                     | ToolRef "(" ")"
+                     ;
+
+ToolRef : BuiltInTool
+        | Name
+        ;
+
+BuiltInTool : BuiltInIoTool
+            | BuiltInGenericTool
+            | BuiltInPathTool
+            | BuiltInFileTool
+            | BuiltInDataTool
+            ;
+
+ToolArgs : Expression
+         | IDENTIFIERTK "=" Expression
+         | ToolArgs "," Expression
+         | ToolArgs "," IDENTIFIERTK "=" Expression
+         ;
+
+Names : Name
+      | Names "," Name
+      ;
+
+Name : IDENTIFIERTK
+     | RELATIVENAMETK
+     ;
+
+OptComma : /* empty */
+         | ","
+         ;
+
+BuiltInIoTool : "err"
+              | "errln"
+              | "out"
+              | "outln"
+              ;
+
+BuiltInGenericTool : "app"
+                   | "exec"
+                   | "tooldef"
+                   ;
+
+BuiltInPathTool : "abspath"
+                | "basename"
+                | "chdir"
+                | "chfileext"
+                | "curdir"
+                | "dirname"
+                | "fileext"
+                | "hasfileext"
+                | "pathjoin"
+                | "scriptpath"
+                ;
+
+BuiltInFileTool : "cpdir"
+                | "cpfile"
+                | "diff"
+                | "exists"
+                | "filenewer"
+                | "filesize"
+                | "find"
+                | "isdir"
+                | "isfile"
+                | "mkdir"
+                | "mvdir"
+                | "mvfile"
+                | "readlines"
+                | "rmdir"
+                | "rmfile"
+                | "writefile"
+                ;
+
+BuiltInDataTool : "abs"
+                | "ceil"
+                | "contains"
+                | "del"
+                | "delidx"
+                | "empty"
+                | "endswith"
+                | "entries"
+                | "enumerate"
+                | "floor"
+                | "fmt"
+                | "indexof"
+                | "join"
+                | "keys"
+                | "lastindexof"
+                | "ln"
+                | "log"
+                | "lower"
+                | "ltrim"
+                | "max"
+                | "min"
+                | "pow"
+                | "range"
+                | "replace"
+                | "reverse"
+                | "round"
+                | "rtrim"
+                | "size"
+                | "sorted"
+                | "split"
+                | "sqrt"
+                | "startswith"
+                | "str"
+                | "strdup"
+                | "subset"
+                | "trim"
+                | "upper"
+                | "values"
+                ;
diff --git a/v0.1-M1/tooldef/screenshot_cmdline.png b/v0.1-M1/tooldef/screenshot_cmdline.png
new file mode 100644
index 0000000..8bbdcbf
--- /dev/null
+++ b/v0.1-M1/tooldef/screenshot_cmdline.png
Binary files differ
diff --git a/v0.1-M1/tooldef/screenshot_ide.png b/v0.1-M1/tooldef/screenshot_ide.png
new file mode 100644
index 0000000..5747e64
--- /dev/null
+++ b/v0.1-M1/tooldef/screenshot_ide.png
Binary files differ
diff --git a/v0.1-M1/tooldef/tools/tooldef_icon.png b/v0.1-M1/tooldef/tools/tooldef_icon.png
new file mode 100644
index 0000000..d394f09
--- /dev/null
+++ b/v0.1-M1/tooldef/tools/tooldef_icon.png
Binary files differ