diff options
Diffstat (limited to 'documentation/advanced')
46 files changed, 12432 insertions, 0 deletions
diff --git a/documentation/advanced/advanced-architecture.asciidoc b/documentation/advanced/advanced-architecture.asciidoc new file mode 100644 index 0000000000..437c6f4a1d --- /dev/null +++ b/documentation/advanced/advanced-architecture.asciidoc @@ -0,0 +1,298 @@ +--- +title: Advanced Application Architectures +order: 10 +layout: page +--- + +[[advanced.architecture]] += Advanced Application Architectures + +In this section, we continue from the basic application architectures described +in +<<dummy/../../../framework/application/application-architecture#application.architecture,"Building +the UI">> and discuss some of the more advanced patterns that are often used in +Vaadin applications. + +[[advanced.architecture.layering]] +== Layered Architectures + +Layered architectures, where each layer has a clearly distinct responsibility, +are probably the most common architectures. Typically, applications follow at +least a three-layer architecture: + +* User interface (or presentation) layer +* Domain layer +* Data store layer + +Such an architecture starts from a __domain model__, which defines the data +model and the "business logic" of the application, typically as beans or POJOs. +A user interface is built on top of the domain model, in our context with the +Vaadin Framework. The Vaadin user interface could be bound directly to the data +model through the Vaadin Data Model, described in +<<dummy/../../../framework/datamodel/datamodel-overview.asciidoc#datamodel.overview,"Binding +Components to Data">>. Beneath the domain model lies a data store, such as a +relational database. The dependencies between the layers are restricted so that +a higher layer may depend on a lower one, but never the other way around. + +[[figure.advanced.architecture.layering]] +.Three-Layer Architecture +image::img/three-layer-architecture-hi.png[] + +An __application layer__ (or __service layer__) is often distinguished from the +domain layer, offering the domain logic as a service, which can be used by the +user interface layer, as well as for other uses. In Java EE development, +Enterprise JavaBeans (EJBs) are typically used for building this layer. + +An __infrastructure layer__ (or __data access layer__) is often distinguished +from the data store layer, with a purpose to abstract the data store. For +example, it could involve a persistence solution such as JPA and an EJB +container. This layer becomes relevant with Vaadin when binding Vaadin +components to data with the JPAContainer, as described in +<<dummy/../../../framework/jpacontainer/jpacontainer-overview.asciidoc#jpacontainer.overview,"Vaadin +JPAContainer">>. + + +[[advanced.architecture.mvp]] +== Model-View-Presenter Pattern + +The Model-View-Presenter (MVP) pattern is one of the most common patterns in +developing large applications with Vaadin. It is similar to the older +Model-View-Controller (MVC) pattern, which is not as meaningful in Vaadin +development. Instead of an implementation-aware controller, there is an +implementation-agnostic presenter that operates the view through an interface. +The view does not interact directly with the model. This isolates the view +implementation better than in MVC and allows easier unit testing of the +presenter and model. + +[[figure.advanced.architecture.mvp]] +.Model-View-Presenter Pattern +image::img/mvp-pattern-hi.png[] + +<<figure.advanced.architecture.mvp>> illustrates the MVP pattern with a simple +calculator. The domain model is realized in the [classname]#Calculator# class, +which includes a data model and some model logic operations. The +[classname]#CalculatorViewImpl# is a Vaadin implementation of the view, defined +in the [interfacename]#CalculatorView# interface. The +[classname]#CalculatorPresenter# handles the user interface logic. User +interaction events received in the view are translated into +implementation-independent events for the presenter to handle (the view +implementation could also just call the presenter). + +Let us first look how the model and view are bound together by the presenter in +the following example: + + +[source, java] +---- + +// Create the model and the Vaadin view implementation +CalculatorModel model = new CalculatorModel(); +CalculatorViewImpl view = new CalculatorViewImpl(); + +// The presenter binds the model and view together +new CalculatorPresenter(model, view); + +// The view implementation is a Vaadin component +layout.addComponent(view); +---- + +You could add the view anywhere in a Vaadin application, as it is a composite +component. + +[[advanced.architecture.mvp.model]] +=== The Model + +Our business model is quite simple, with one value and a number of operations +for manipulating it. + + +[source, java] +---- +/** The model **/ +class CalculatorModel { + private double value = 0.0; + + public void clear() { + value = 0.0; + } + + public void add(double arg) { + value += arg; + } + + public void multiply(double arg) { + value *= arg; + } + + public void divide(double arg) { + if (arg != 0.0) + value /= arg; + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = value; + } +} +---- + + +[[advanced.architecture.mvp.view]] +=== The View + +The purpose of the view in MVP is to display data and receive user interaction. +It relays the user interaction to the presenter in an fashion that is +independent of the view implementation, that is, no Vaadin events. It is defined +as a UI framework interface that can have multiple implementations. + + +[source, java] +---- +interface CalculatorView { + public void setDisplay(double value); + + interface CalculatorViewListener { + void buttonClick(char operation); + } + public void addListener(CalculatorViewListener listener); +} +---- + +The are design alternatives for the view. It could receive the listener in its +constructor, or it could just know the presenter. Here, we forward button clicks +as an implementation-independent event. + +As we are using Vaadin, we make a Vaadin implementation of the interface as +follows: + + +[source, java] +---- +class CalculatorViewImpl extends CustomComponent + implements CalculatorView, ClickListener { + private Label display = new Label("0.0"); + + public CalculatorViewImpl() { + GridLayout layout = new GridLayout(4, 5); + + // Create a result label that spans over all + // the 4 columns in the first row + layout.addComponent(display, 0, 0, 3, 0); + + // The operations for the calculator in the order + // they appear on the screen (left to right, top + // to bottom) + String[] operations = new String[] { + "7", "8", "9", "/", "4", "5", "6", + "*", "1", "2", "3", "-", "0", "=", "C", "+" }; + + // Add buttons and have them send click events + // to this class + for (String caption: operations) + layout.addComponent(new Button(caption, this)); + + setCompositionRoot(layout); + } + + public void setDisplay(double value) { + display.setValue(Double.toString(value)); + } + + /* Only the presenter registers one listener... */ + List<CalculatorViewListener> listeners = + new ArrayList<CalculatorViewListener>(); + + public void addListener(CalculatorViewListener listener) { + listeners.add(listener); + } + + /** Relay button clicks to the presenter with an + * implementation-independent event */ + @Override + public void buttonClick(ClickEvent event) { + for (CalculatorViewListener listener: listeners) + listener.buttonClick(event.getButton() + .getCaption().charAt(0)); + } +} +---- + + +[[advanced.architecture.mvp.presenter]] +=== The Presenter + +The presenter in MVP is a middle-man that handles all user interaction logic, +but in an implementation-independent way, so that it doesn't actually know +anything about Vaadin. It shows data in the view and receives user interaction +back from it. + + +[source, java] +---- +class CalculatorPresenter + implements CalculatorView.CalculatorViewListener { + CalculatorModel model; + CalculatorView view; + + private double current = 0.0; + private char lastOperationRequested = 'C'; + + public CalculatorPresenter(CalculatorModel model, + CalculatorView view) { + this.model = model; + this.view = view; + + view.setDisplay(current); + view.addListener(this); + } + + @Override + public void buttonClick(char operation) { + // Handle digit input + if ('0' <= operation && operation <= '9') { + current = current * 10 + + Double.parseDouble("" + operation); + view.setDisplay(current); + return; + } + + // Execute the previously input operation + switch (lastOperationRequested) { + case '+': + model.add(current); + break; + case '-': + model.add(-current); + break; + case '/': + model.divide(current); + break; + case '*': + model.multiply(current); + break; + case 'C': + model.setValue(current); + break; + } // '=' is implicit + + lastOperationRequested = operation; + + current = 0.0; + if (operation == 'C') + model.clear(); + view.setDisplay(model.getValue()); + } +} +---- + +In the above example, we held some state information in the presenter. +Alternatively, we could have had an intermediate controller between the +presenter and the model to handle the low-level button logic. + + + + + diff --git a/documentation/advanced/advanced-cdi.asciidoc b/documentation/advanced/advanced-cdi.asciidoc new file mode 100644 index 0000000000..d5d135ca1f --- /dev/null +++ b/documentation/advanced/advanced-cdi.asciidoc @@ -0,0 +1,997 @@ +--- +title: Vaadin CDI Add-on +order: 17 +layout: page +--- + +[[advanced.cdi]] += Vaadin CDI Add-on + +((("Contexts and Dependency Injection", id="term.advanced.cdi.cdilong", range="startofrange"))) + + +((("CDI", id="term.advanced.cdi.cdi", range="startofrange"))) + + +((("Vaadin CDI Add-on", id="term.advanced.cdi.cdiaddon", range="startofrange"))) + + +Vaadin CDI add-on makes it easier to use contexts and dependency injection (CDI) +in Vaadin applications. CDI is a Java EE feature especially targeted for web +applications, which have well-defined contextual scopes, such as sessions, +views, requests, and so forth. The lifecycle of objects, such as beans, can be +managed by binding their lifecycles to such contexts. Vaadin CDI enables these +features with two additional kinds of Vaadin-specific contextual scopes: UIs and +navigation views. + +To learn more about Vaadin CDI, the link:[Vaadin CDI Tutorial] gives a hands-on +introduction. The source code of the CDI Tutorial demo is available for browsing +or cloning at https://github.com/vaadin-samples/cdi-tutorial. + +[[advanced.cdi.cdi]] +== CDI Overview + +Contexts and dependency injection, defined in the JSR-299 standard, is a Java EE +feature that, through a set of services, helps in improving application +architecture by decoupling the management of service object lifecycles from +client objects using them. The lifecycle of objects stored in a CDI container is +defined by a context. The managed objects or beans are accessed using dependency +injection. + +CDI builds on the Java concept of beans, but with somewhat different definition +and requirements. + +Regarding general CDI topics, such as use of qualifiers, interceptors, +decorators, event notifications, and other CDI features, we refer you to CDI +documentation. + +ifdef::web[] +* link:http://jaxenter.com/tutorial-introduction-to-cdi-contexts-and-dependency-injection-for-java-ee-jsr-299-104536.html[Introduction +to CDI]. Pete Muir and Mark Struberg, JAXenter. + +* link:http://docs.jboss.org/weld/reference/latest/en-US/html_single/[Weld - CDI +Reference Implementation] + +* link:http://cdi-spec.org/[CDI Specification] + +* link:https://vaadin.com/wiki?p_p_id=36&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=row-1&p_p_col_pos=1&p_p_col_count=3&p_r_p_185834411_title=Vaadin+CDI&p_r_p_185834411_nodeName=vaadin.com+wiki&_36_struts_action=%2Fwiki%2Fview[Vaadin +CDI Tutorial] + +endif::web[] + +[[advanced.cdi.cdi.injection]] +=== Dependency Injection + +__Dependency injection__ is a way to pass dependencies (service objects) to +dependent objects (clients) by injecting them in member variables or initializer +parameters, instead of managing the lifecycle in the clients or passing them +explicitly as parameters. In CDI, injection of a service object to a client is +specified by the [classname]#@Inject# annotation. + +For example, if we have a UI view that depends on user data, we could inject the +data in the client as follows: + + +[source, java] +---- +public class MainView extends CustomComponent implements View { + @Inject + User user; + + ... + @Override + public void enter(ViewChangeEvent event) { + greeting.setValue("Hello, " + user.getName()); + } +} +---- + +In addition to injecting managed beans with the annotation, you can query for +them from the bean manager. + + +[[advanced.cdi.cdi.contexts]] +=== Contexts and Scopes + +__Contexts__ in CDI are services that manage the lifecycle of objects and handle +their injection. Generally speaking, a context is a situation in which an +instance is used with a unique identity. Such objects are essentially +"singletons" in the context. While conventional singletons are application-wide, +objects managed by a CDI container can be "singletons" in a more narrow +__scope__: a user session, a particular UI instance associated with the session, +a view within the UI, or even just a single request. Such a context defines the +lifecycle of the object: its creation, use, and finally its destruction. + +As a very typical example in a web application, you would have a user data +object associated with a user session. + + +[source, java] +---- +@SessionScoped +public class User { + private String name; + + public void setName(String name) {this.name = name;} + public String getName() {return name;} +} +---- + +Now, when you need to refer to the user, you can use CDI injection to inject the +session-scoped "singleton" to a member variable or a constructor parameter. + + +[source, java] +---- +public class MainView extends CustomComponent implements View { + @Inject + User user; + + ... + + @Override + public void enter(ViewChangeEvent event) { + greeting.setValue("Hello, " + user.getName()); + } +} +---- + + + +[[advanced.cdi.installation]] +== Installing Vaadin CDI Add-on + +Vaadin CDI requires a Java EE 7 compatible servlet container, such as Glassfish +or Apache TomEE Web Profile, as mentioned for the reference toolchain in +<<dummy/../../../framework/getting-started/getting-started-environment#getting-started.environment,"Setting +up the Development Environment">>. + +To install the Vaadin CDI add-on, either define it as an Ivy or Maven dependency +or download it from the Vaadin Directory add-on page at +<<,vaadin.com/directory#addon/vaadin-cdi>>. See +<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using +Vaadin Add-ons">> for general instructions for installing and using Vaadin +add-ons. + +The Ivy dependency is as follows: + +[subs="normal"] +---- + <dependency org="com.vaadin" name="vaadin-cdi" + rev="[replaceable]#latest.release#"/> +---- +The Maven dependency is as follows: + +[subs="normal"] +---- + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-cdi</artifactId> + <version>[replaceable]#LATEST#</version> + </dependency> + <dependency> + <groupId>javax.enterprise</groupId> + <artifactId>cdi-api</artifactId> + <version>[replaceable]#1.2#</version> + </dependency> +---- + +[[advanced.cdi.peparing]] +== Preparing Application for CDI + +A Vaadin application that uses CDI must have a file named [filename]#beans.xml# +in the [filename]#WEB-INF# directory. The file can be completely empty (it has +content only in certain limited situations), but it must be present. + +The application should not have a servlet extending [classname]#VaadinServlet#, +as Vaadin servlet has its own [classname]#VaadinCDIServlet# that is deployed +automatically. If you need multiple servlets or need to customize the Vaadin CDI +servlet, see <<advanced.cdi.deployment>>. + + +[[advanced.cdi.cdiui]] +== Injecting a UI with [classname]#@CDIUI# + +((("[classname]#@CDIUI#", id="term.advanced.cdi.cdiui", range="startofrange"))) + + +Vaadin CDI offers an easier way to instantiate UIs and to define the URL mapping +for them than the usual ways described in +<<dummy/../../../framework/application/application-environment#application.environment,"Deploying +an Application">>. To define a UI class that should be instantiated for a given +URL, you simply need to annotate the class with [classname]#@CDIUI#. It takes an +optional URL path as parameter. + + +[source, java] +---- +@CDIUI("myniceui") +@Theme("valo") +public class MyNiceUI extends UI { + ... +---- + +Giving empty UI path maps the UI to the root of the application context. + + +[source, java] +---- +@CDIUI("") +---- + +If the optional UI path is not given, the path is determined automatically from +the class name by removing a possible "-UI" suffix in the class name, making it +lower-case, and for capitalized letters, a hyphen is added. For example, a UI +with class name [classname]#MyNiceUI# would have path [literal]#++my-nice++#. +The URL consists of the server address, application context, and the UI path. +For example, when running a Vaadin application in a development workstation, you +would have URL such as http://localhost:8080/myproject/my-nice. + +UI path mappings are reported in the server log during deployment. + +See <<advanced.cdi.deployment>> for how to handle servlet URL mapping of CDI UIs +when working with multiple servlets in the same web application. + +(((range="endofrange", startref="term.advanced.cdi.cdiui"))) + +[[advanced.cdi.scopes]] +== Scopes + +((("CDI", "scopes", id="term.advanced.cdi.scopes", range="startofrange"))) + + +As in programming languages, where a variable name refers to a unique object +within the scope of the variable, a CDI scope is a context in which an object +has unique identity. In CDI, objects to be injected are identified by their type +and any qualifiers they may have. The scope can be defined as an annotation to +the service class as follows: + + +[source, java] +---- +@SessionScoped +public class User { + ... +---- + +CDI defines a number of scopes. Note that the standard CDI scopes are defined +under the [package]#javax.enterprise.context# package and Vaadin CDI scopes +under [package]#com.vaadin.cdi#, while JSF scopes are defined in +[package]#javax.faces.bean#. + +[[advanced.cdi.scopes.ui]] +=== UI Scope + +UI-scoped beans are uniquely identified within a UI instance, that is, a browser +window or tab. + +Vaadin CDI provides two annotations for the UI scope, differing in how they +enable proxies, as explained later. + +[classname]#@UIScoped#([package]#com.vaadin.cdi#):: ((("[classname]#@UIScoped#", id="term.advanced.cdi.scopes.uiscoped", range="startofrange"))) + + ++ +Injection with this annotation will create a direct reference to the bean rather +than a proxy. There are some limitations when not using proxies. Circular +references (injecting A to B and B to A) will not work, and neither do CDI +interceptors and decorators. + +(((range="endofrange", startref="term.advanced.cdi.scopes.uiscoped"))) +[classname]#@NormalUIScoped#([package]#com.vaadin.cdi#):: As [classname]#@UIScoped#, but injecting a managed bean having this annotation +injects a proxy for the bean instead of a direct reference. This is the normal +behaviour with CDI, as many CDI features utilize the proxy. + + + +Defining a CDI view (annotated with [classname]#@CDIView# as described later) as +[classname]#@UIScoped# makes the view retain the same instance when the user +navigates away and back to the view. + + +[[advanced.cdi.scopes.view]] +=== View Scopes + +The lifecycle of a view-scoped bean starts when the user navigates to a view +referring to the object and ends when the user navigates out of the view (or +when the UI is closed or expires). + +Vaadin CDI provides two annotations for the view scope, differing in how they +enable proxies, as explained later. + +[classname]#@ViewScoped#([package]#com.vaadin.cdi#):: Injection with this annotation will create a direct reference to the bean rather +than a proxy. There are some limitations when not using proxies. Circular +references (injecting A to B and B to A) will not work, and neither do CDI +interceptors and decorators. + +[classname]#@NormalViewScoped#([package]#com.vaadin.cdi#):: As [classname]#@NormalScoped#, except that injecting with this annotation will +create a proxy for the contextual instance rather than provide the contextual +instance itself. See the explanation of proxies below. + + + + +[[advanced.cdi.scopes.cdi]] +=== Standard CDI Scopes + +[classname]#@ApplicationScoped#:: ((("[classname]#@ApplicationScoped#", id="term.advanced.cdi.scopes.applicationscoped", range="startofrange"))) + + ++ +Application-scoped beans are shared by all servlets in the web application, and +are essentially equal to singletons.//TODO This is just a guess - is it +true? +Note that referencing application-scoped beans is not thread-safe and access +must be synchronized. + +(((range="endofrange", startref="term.advanced.cdi.scopes.applicationscoped"))) +[classname]#@SessionScoped#:: ((("[classname]#@SessionScoped#", id="term.advanced.cdi.scopes.sessionscoped", range="startofrange"))) + + ++ +The lifecycle and visibility of session-scoped beans is bound to a HTTP or user +session, which in Vaadin applications is associated with the +[classname]#VaadinSession# (see +<<dummy/../../../framework/application/application-lifecycle#application.lifecycle.session,"User +Session">>). This is a very typical scope to store user data, as is done in many +examples in this section, or database connections. The lifecycle of +session-scoped beans starts when a user opens the page for a UI in the browser, +and ends when the session expires after the last UI in the session is closed. + +(((range="endofrange", startref="term.advanced.cdi.scopes.sessionscoped"))) + + + +[[advanced.cdi.scopes.proxies]] +=== Proxies vs Direct References + +CDI uses proxy objects to enable many of the CDI features, by hooking into +message-passing from client to service beans. Under the hood, a proxy is an +instance of an automatically generated class that extends the proxied bean type, +so communicating through a proxy occurs transparently, as it has the same +polymorphic type as the actual bean. Whether proxying is enabled or not is +defined in the scope: CDI scopes are either __normal scopes__, which can be +proxied, or __pseudoscopes__, which use direct references to injected beans. + +The proxying mechanism creates some requirements for injecting objects in normal +scope: + +* The objects may not be primitive types or arrays + +* The bean class must not be final + +* The bean class must not have final methods + + +Beans annotated with [classname]#@UIScoped# or [classname]#@ViewScoped# use a +pseudoscope, and are therefore injected with direct references to the bean +instances, while [classname]#@NormalUIScoped# and [classname]#@NormalViewScoped# +beans will use a proxy for communicating with the beans. + +When using proxies, be aware that it is not guaranteed that the +[methodname]#hashCode()# or [methodname]#equals()# will match when comparing a +proxy to its underlying instance. It is imperative to be aware of this when, for +example, adding proxies to a [interfacename]#Collection#. + +You should avoid using normal scopes with Vaadin components, as proxies may not +work correctly within the Vaadin framework. If Vaadin CDI plugin detects such +use, it displays a warning such as the following: + + +---- +INFO: The following Vaadin components are injected +into normal scoped contexts: + @NormalUIScoped org.example.User +This approach uses proxy objects and has not been +extensively tested with the framework. Please report +any unexpected behavior. Switching to a pseudo-scoped +context may also resolve potential issues. +---- + + +(((range="endofrange", startref="term.advanced.cdi.scopes"))) + +[[advanced.cdi.deployment]] +== Deploying CDI UIs and Servlets + +Vaadin CDI hooks into Vaadin framework by using a special +[classname]#VaadinCDIServlet#. As described earlier, you do not need to map an +URL path to a UI, as it is handled by Vaadin CDI. However, in the following, we +go through some cases where you need to customize the servlet or use CDI with +non-CDI servlets and UIs in a web application. + +[[advanced.cdi.deployment.urlmapping]] +=== Defining Servlet Root with [classname]#@URLMapping# + +CDI UIs are managed by a CDI servlet ( [classname]#VaadinCDIServlet#), which is +by default mapped to the root of the application context. For example, if the +name of a CDI UI is " [literal]#++my-cdi++#" and application context is +[literal]#++/myproject++#, the UI would by default have URL " +[literal]#++/myproject/my-cdi++#". If you do not want to have the servlet mapped +to context root, you can use the [classname]#@URLMapping# annotation to map all +CDI UIs to a sub-path. The annotation must be given to only one CDI UI, usually +the one with the default ("") path. + +For example, if we have a root UI and another: + + +[source, java] +---- +@CDIUI("") // At CDI servlet root +@URLMapping("mycdiuis") // Define CDI Servlet root +public class MyCDIRootUI extends UI {...} + +@CDIUI("another") +public class AnotherUI extends UI {...} +---- + +These two UIs would have URLs /myproject/mycdiuis and +/myproject/mycdiuis/another, respectively. + +You can also map the CDI servlet to another URL in servlet definition in +[filename]#web.xml#, as described the following. + + +[[advanced.cdi.servlets.mixing]] +=== Mixing With Other Servlets + +The [classname]#VaadinCDIServlet# is normally used as the default servlet, but +if you have other servlets in the application, such as for non-CDI UIs, you need +to define the CDI servlet explicitly in the [filename]#web.xml#. You can map the +servlet to any URL path, but perhaps typically, you define it as the default +servlet as follows, and map the other servlets to other URL paths: + +[subs="normal"] +---- +<web-app> + ... + + <servlet> + <servlet-name>Default</servlet-name> + <servlet-class> + com.vaadin.cdi.internal.VaadinCDIServlet + </servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>Default</servlet-name> + <url-pattern>[replaceable]#/mycdiuis/*#</url-pattern> + </servlet-mapping> + + <servlet-mapping> + <servlet-name>Default</servlet-name> + <url-pattern>/VAADIN/*</url-pattern> + </servlet-mapping> +</web-app> +---- +With such a setting, paths to CDI UIs would have base path +[filename]#/myapp/mycdiuis#, to which the (optional) UI path would be appended. +The [filename]#/VAADIN/*# only needs to be mapped to the servlet if there are no +other Vaadin servlets. + + +[[advanced.cdi.servlets.custom]] +=== Custom Servlets + +When customizing the Vaadin servlet, as outlined in +<<dummy/../../../framework/application/application-lifecycle#application.lifecycle.servlet-service,"Vaadin +Servlet, Portlet, and Service">>, you simply need to extend +[classname]#com.vaadin.cdi.internal.VaadinCDIServlet# instead of +[classname]#com.vaadin.servlet.VaadinServlet#. + +The custom servlet must not have [classname]#@WebServlet# annotation or +[classname]#@VaadinServletConfiguration#, as you would normally with a Vaadin +servlet, as described in +<<dummy/../../../framework/application/application-environment#application.environment,"Deploying +an Application">>. + + + +ifdef::web[] +[[advanced.cdi.navigation]] +== View Navigation + +Vaadin CDI extends the navigation framework in Vaadin, described in +<<dummy/../../../framework/advanced/advanced-navigator#advanced.navigator,"Navigating +in an Application">>. It manages CDI views with a special view provider and +enables view scoping. + +[[advanced.cdi.navigation.ui]] +=== Preparing the UI + +You can define navigation for any single-component container, as described in +<<dummy/../../../framework/advanced/advanced-navigator#advanced.navigator.navigating,"Setting +Up for Navigation">>, but typically you set up navigation for the entire UI +content. To use Vaadin CDI views, you need to inject a +[classname]#CDIViewProvider# in the UI and add it as a provider for the +navigator. + + +[source, java] +---- +@CDIUI("mycdiui") +public class MyCDIUI extends UI { + @Inject + CDIViewProvider viewProvider; + + @Override + protected void init(VaadinRequest request) { + Navigator navigator = new Navigator(this, this); + navigator.addProvider(viewProvider); + + // Navigate to start view + navigator.navigateTo(""); + } +} +---- + + +[[advanced.cdi.navigation.view]] +=== The View + +A view managed by Vaadin CDI only needs to have the [classname]#@CDIView# +annotation. + + +[source, java] +---- +@CDIView("main") +public class MainView extends CustomComponent implements View { + ... +---- + +The annotation can have the following optional paramers: + +value (optional):: Specifies the view name by which it can be accessed programmatically and by the +URI fragment. + + ++ +[source, java] +---- +@CDIView("main") +---- ++ +If other optional parameters are given, the value must be given by the named +[parameter]#value# parameter. + ++ +If the view name is not given, it is derived from the class name by removing a +possible "View" suffix, making it lower case, and using a dash ("-") to separate +words originally denoted by capital letters. Thereby, a view class such as +[classname]#MyFunnyView# would have name " [literal]#++my-funny++#". + +supportsParameters:: Specifies whether view parameters can be passed to the view as a suffix to the +name in the navigation state, that is, in the form of +[literal]#++viewname+viewparameters++#. The view name is merely a prefix and +there is no separator nor format for the parameters, but those are left for the +view to handle. The parameter support mode is disabled by default. + + ++ +[source, java] +---- +@CDIView(value="myview", supportsParameters=true) +---- ++ +You could then navigate to the state with a URI fragment such as +[literal]#++#!myview/someparameter++# or programmatically with: + + ++ +[source, java] +---- +getUI().getNavigator().navigateTo("myview/someparameter"); +---- ++ +The [methodname]#enter()# method of the view gets the URI fragment as parameter +as is and can interpret it in any application-defined way. + ++ +Note that in this mode, matching a navigation state to a view is done by the +prefix of the fragment! Thereby, no other views may start with the name of the +view as prefix. For example, if the view name is " [literal]#++main++#", you +must not have a view named " [literal]#++maintenance++#". + +uis:: If the application has multiple UIs that use [classname]#CDIViewProvider#, you +can use this parameter to specify which UIs can show the view. + + ++ +[source, java] +---- +@CDIView(value="myview", uis={MyCDIUI.class}) +---- ++ +If the list contains [parameter]#UI.class#, the view is available to all UIs. + + ++ +[source, java] +---- +@CDIView(value="myview", uis={UI.class}) +---- + + +In the following, we have a login view that accesses a session-scoped user +object. Here, we use a constant to define the view name, so that we can use the +constant when navigating to it. + + +[source, java] +---- +@CDIView(LoginView.VIEWNAME) +public class LoginView extends CustomComponent + implements View { + public final static String VIEWNAME = ""; + + // Here we inject to the constructor and actually do + // not store the injected object to use it later + @Inject + public LoginView(User user) { + VerticalLayout layout = new VerticalLayout(); + + // An input field for editing injected data + BeanItem<User> item = new BeanItem<User>(user); + TextField username = new TextField("User name", + item.getItemProperty("name")); + username.setNullRepresentation(""); + layout.addComponent(username); + + // Login button (authentication omitted) / Java 8 + layout.addComponent(new Button("Login", e -> + getUI().getNavigator(). + navigateTo(MainView.VIEWNAME))); + + setCompositionRoot(layout); + } + + @Override + public void enter(ViewChangeEvent event) {} +} +---- + +You could now navigate to the view from any other view in the UI with: + + +[source, java] +---- +getUI().getNavigator().navigateTo(LoginView.VIEWNAME); +---- + + +endif::web[] + +ifdef::web[] +[[advanced.cdi.events]] +== CDI Events + +((("CDI", "events", id="term.advanced.cdi.events", range="startofrange"))) + + +CDI events can be used for many purposes in Vaadin applications, such as passing +messages between different parts of a view, between views, between UIs, or +between users. Some cases require special consideration, such as when +communicating between UIs and how injected components should be scoped. + +[[advanced.cdi.events.intro]] +=== Observing Events + +Let us consider a case where changes in one part of the UI (or view) require +updating other parts of the UI. This is typical in master-detail views, for +updating the master view after editing details, or when handling input from a +sub-window. While you can handle such a situation with a custom call-back +listener, CDI event mechanism simplifies the task. + +Let us consider the following simple UI containing two panels. The input panel +will send events, which are received by other parts of the UI, in this case a +display panel. The panels need to be injected to enable CDI event passing in +them. + + +[source, java] +---- +@CDIUI("cdievents") +@Theme("valo") +public class CDIEventUI extends UI { + @Inject + InputPanel inputPanel; + + @Inject + DisplayPanel displayPanel; + + @Override + protected void init(VaadinRequest request) { + Layout content = + new HorizontalLayout(inputPanel, displayPanel); + setContent(content); + } +} +---- + +Now, let us look closer at the sending panel. To send messages, it needs to +inject a [classname]#javax.enterprise.event.Event# object. As we are injecting +the event to a component class, we need to specify the full package name to +avoid confusion with Vaadin [classname]#Component.Event#. + + +[source, java] +---- +class InputPanel extends Panel { + @Inject + private javax.enterprise.event.Event<MyEvent> event; + + public InputPanel() { + super("Input"); + + TextField editor = new TextField(); + Button save = new Button("Save", e -> // Java 8 + event.fire(new MyEvent(editor.getValue()))); + + setContent(new VerticalLayout(editor, save)); + } +} +---- + +Firing an event is done with the [methodname]#fire()# method on the injected +event object. In our example, the event is as follows: + + +[source, java] +---- +public class MyEvent implements Serializable { + private String text; + + public MyEvent(String text) { + this.text = text; + } + + public String getName() { + return text; + } +} +---- + +The event is received by any method (in an injected object) marked by +[classname]#@Observes# annotation for the event parameter to observe the event +type. + + +[source, java] +---- +@UIScoped +class DisplayPanel extends Panel { + Label display = new Label("-nothing to display-"); + + public DisplayPanel() { + super("Display"); + setContent(display); + } + + void myEventObserver(@Observes MyEvent event) { + display.setValue("Observed: " + event.getName()); + } +} +---- + +Such a component that observes events from other components must be scoped to +the UI or view, as otherwise it will be request-scoped and a new instance is +created for receiving each event. + +The UI with interaction is shown in <<figure.advanced.cdi.events.intro>>. + +[[figure.advanced.cdi.events.intro]] +.Observing CDI Events +image::img/cdi-events-observing.png[] + +Any injection qualifiers defined for the event object in the sender are matched +in the observers, which feature we will use later to avoid receiving unwanted +events. + + +[[advanced.cdi.events.broadcasting]] +=== Communicating Between UIs + +((("broadcasting", id="term.advanced.cdi.events.broadcasting", range="startofrange"))) + + +CDI events are not propagated to inactive contexts, and only the context of the +currently processed UI is active. Further, as explained in +<<dummy/../../../framework/advanced/advanced-push#advanced.push.running,"Accessing +UI from Another Thread">>, other Vaadin UIs may not be accessed without proper +synchronization, as their requests are processed concurrently in different +server threads. Therefore, you need to pass the events through an +application-scoped messaging service and synchronize the access to other UIs by +using the [methodname]#access()# method. + +In +<<dummy/../../../framework/advanced/advanced-push#advanced.push.pusharound,"Broadcasting +to Other Users">> we looked into how to pass messages to all other UIs using a +broadcasting service. In that example, we used static variables and methods to +store references and to access the service. With CDI, we can let the context +manage its lifecycle, access it by injection, and pass messages by CDI events. +By scoping the messaging service to application, we essentially make it a +singleton. + + +[source, java] +---- +@ApplicationScoped +public class CDIBroadcaster implements Serializable { +---- + +As we can not let CDI deliver the messages, the messaging service needs to keep +book of the messaging clients (UIs) waiting to receive messages. + + +[source, java] +---- + private Collection<UI> uis = new HashSet<UI>(); + + public synchronized void register(UI listener) { + uis.add(listener); + } + + public synchronized void unregister(UI listener) { + uis.remove(listener); + } +---- + +The main logic of the messaging service is to observe messages and fire them in +the recipient UIs. As we are broadcasting to all UIs here, we again use an +executor service to execute the code. To lock on the session when accessing the +UIs, we use the [methodname]#access()# method. + + +[source, java] +---- + // Inject event to be fired + @Inject + private javax.enterprise.event.Event<BroadcastMessage> + messageEvent; + + ExecutorService executorService = + Executors.newSingleThreadExecutor(); + + // Observe messages (only from clients) + @SuppressWarnings("unused") + private synchronized void observeMessage( + @Observes @OriginalSender + final BroadcastMessage message) { + for (final UI listener: uis) + executorService.execute(() -> + listener.access(()-> + messageEvent.fire(message))); + } +} +---- + +Here we use a [classname]#@OriginalSender# qualifier to receive events only from +a client (original sender), not from the messaging service itself, which would +cause an infinite event loop. The qualifier is defined as follows: + +((("CDI", "qualifiers"))) + +[source, java] +---- +@Qualifier +@Retention(RUNTIME) +@Target({PARAMETER, FIELD}) +public @interface OriginalSender {} +---- + +The message type is a simple POJO as follows: + + +[source, java] +---- +public class BroadcastMessage { + private String text; + private Object sender; // For checking if sent by self + + ... constructor, getters, and setters ... +} +---- + +Let us take a look at the UI class, which manages both the messaging service and +the client components. The UI just needs to register itself in the messaging +service and build the UI, including the UI components doing messaging. We could, +of course, do that also at view level. + +((("[classname]#@Push#"))) + +[source, java] +---- +@CDIUI("cdichat") +@Push +public class CDIChatUI extends UI { + @Inject + CDIBroadcaster broadcaster; + + @Inject + ChatBox chatbox; + + @Override + protected void init(VaadinRequest request) { + setContent(chatbox); + + // Register to receive broadcasts + broadcaster.register(this); + } + + // Must also unregister when the UI expires or is closed + @Override + public void detach() { + broadcaster.unregister(this); + super.detach(); + } +} +---- + +Now for an actual messaging client, we look at the chat box component. Most of +the UI code is omitted from the example. As noted earlier, the component +receiving events must be scoped to the UI, to avoid creation of invalid +instances. + +((("[classname]#@UIScoped#"))) + +[source, java] +---- +@UIScoped +class ChatBox extends CustomComponent { + VerticalLayout messages = new VerticalLayout(); + + public ChatBox(CDIChatUI cdiChatUI) { + ... build the composite ... + + TextField input = new TextField(); + + Button send = new Button("Send", e -> { // Java 8 + // Broadcast the input + broadcast(input.getValue()); + addMessage(input.getValue()); // Add to self + }); + ... + } + + @Inject + @OriginalSender + private javax.enterprise.event.Event<BroadcastMessage> + messageEvent; + + // Sends a message + private void broadcast(String msg) { + messageEvent.fire(new BroadcastMessage(msg, this)); + } + + // Receives messages + @SuppressWarnings("unused") + private void observeMessage( + @Observes BroadcastMessage event) { + if (event.getSender() != this) + addMessage(event.getText()); + } + + private void addMessage(String msg) { + messages.addComponent(new Label(msg)); + } +} +---- + +((("CDI", "qualifiers"))) +Note that the client object is completely unaware of the fact that the messages +are delivered through a messaging service; we have successfully decoupled the +messaging logic required by Vaadin UIs from the component. Only the requirement +for using the event qualifier remains (notice that its use is not checked at +compile time). + +(((range="endofrange", startref="term.advanced.cdi.events.broadcasting"))) + +(((range="endofrange", startref="term.advanced.cdi.events"))) +endif::web[] + +(((range="endofrange", startref="term.advanced.cdi.cdilong"))) +(((range="endofrange", startref="term.advanced.cdi.cdi"))) +(((range="endofrange", startref="term.advanced.cdi.cdiaddon"))) + + diff --git a/documentation/advanced/advanced-debug.asciidoc b/documentation/advanced/advanced-debug.asciidoc new file mode 100644 index 0000000000..9a0d8d7ba8 --- /dev/null +++ b/documentation/advanced/advanced-debug.asciidoc @@ -0,0 +1,208 @@ +--- +title: Debug Mode and Window +order: 3 +layout: page +--- + +[[advanced.debug]] += Debug Mode and Window + +Vaadin applications can be run in two modes: __debug mode__ and __production +mode__. The debug mode, which is on by default, enables a number of built-in +debug features for Vaadin developers: + +* Debug Window +* Display debug information in the Debug Window and server console +* On-the-fly compilation of Sass themes + +[[advanced.debug.mode]] +== Enabling the Debug Mode + +The debug mode is enabled and production mode disabled by default in the UI +templates created with the Eclipse plugin or the Maven archetypes. The debug +mode can be enabled by giving a [parameter]#productionMode=false# parameter to +the Vaadin servlet configuration: + +[subs="normal"] +---- +@VaadinServletConfiguration( + productionMode = **false**, + ui = **MyprojectUI.class**) +---- +Or with a context parameter in the [filename]#web.xml# deployment descriptor: + +[subs="normal"] +---- +<context-param> + <description>Vaadin production mode</description> + <param-name>productionMode</param-name> + <param-value>**false**</param-value> +</context-param> +---- +Enabling the production mode disables the debug features, thereby preventing +users from easily inspecting the inner workings of the application from the +browser. + + +[[advanced.debug.open]] +== Opening the Debug Window + +Running an application in the debug mode enables the client-side Debug Window in +the browser. You can open the Debug Window by adding " ?debug" parameter to the +URL of the UI, for example, http://localhost:8080/myapp/?debug. The Debug Window +has buttons for controlling the debugging features and a scrollable log of debug +messages. + +[[]] +.Debug Window +image::img/debug-window-annotated-hi.png[] + +The functionalities are described in detail in the subsequent sections. You can +move the window by dragging it from the title bar and resize it from the +corners. The [guibutton]#Minimize# button minimizes the debug window in the +corner of the browser window, and the [guibutton]#Close# button closes it. + +If you use the Firebug plugin for Firefox or the Developer Tools console in +Chrome, the log messages will also be printed to the Firebug console. In such a +case, you may want to enable client-side debugging without showing the Debug +Window with " ?debug=quiet" in the URL. In the quiet debug mode, log messages +will only be printed to the console of the browser debugger. + + +[[advanced.debug.log]] +== Debug Message Log + +The debug message log displays client-side debug messages, with time counter in +milliseconds. The control buttons allow you to clear the log, reset the timer, +and lock scrolling. + +[[]] +.Debug Message Log +image::img/debug-log-hi.png[] + +[[advanced.debug.log.custom]] +=== Logging to Debug Window + +You can take advantage of the debug mode when developing client-side components, +by using the standard Java [classname]#Logger# to write messages to the log. The +messages will be written to the debug window and Firebug console. No messages +are written if the debug window is not open or if the application is running in +production mode. + + + +[[advanced.debug.info]] +== General Information + +The [guilabel]#General information about the application(s)# tab displays +various information about the UI, such as version numbers of the client and +servlet engine, and the theme. If they do not match, you may need to compile the +widget set or theme. + +[[]] +.General Information +image::img/debug-info.png[] + + +[[advanced.debug.hierarchy]] +== Inspecting Component Hierarchy + +The [guilabel]#Component Hierarchy# tab has several sub-modes that allow +debugging the component tree in various ways. + +[[advanced.debug.hierarchy.tree]] +=== Connector Hierarchy Tree + +The [guibutton]#Show the connector hierarchy tree# button displays the +client-side connector hierarchy. As explained in +<<dummy/../../../framework/gwt/gwt-overview.asciidoc#gwt.overview,"Integrating +with the Server-Side">>, client-side widgets are managed by connectors that +handle communication with the server-side component counterparts. The connector +hierarchy therefore corresponds with the server-side component tree, but the +client-side widget tree and HTML DOM tree have more complexity. + +[[]] +.Connector Hierarchy Tree +image::img/debug-hierarchy-tree.png[] + +Clicking on a connector highlights the widget in the UI. + + +[[advanced.debug.hierarchy.inspect]] +=== Inspecting a Component + +The [guibutton]#Select a component in the page to inspect it# button lets you +select a component in the UI by clicking it and display its client-side +properties. + +To view the HTML structure and CSS styles in more detail, you can use Firebug in +Firefox, or the Developer Tools in Chrome, as described in +<<dummy/../../../framework/getting-started/getting-started-environment#getting-started.environment.firefox,"Firefox +and Firebug">>. Firefox also has a built-in feature for inspecting HTML and CSS. + + +[[advanced.debug.hierarchy.analyze]] +=== Analyzing Layout Problems + +The [guilabel]#Check layouts for potential problems# button analyzes the +currently visible UI and makes a report of possible layout related problems. All +detected layout problems are displayed in the log and also printed to the +console. + +[[]] +.Debug Window Showing the Result of Layout Analysis. +image::img/debug-window-analyze-layouts.png[] + +Clicking on a reported problem highlights the component with the problem in the +UI. + +The most common layout problem is caused by placing a component that has a +relative size inside a container (layout) that has undefined size in the +particular direction (height or width). For example, adding a +[classname]#Button# with 100% width inside a [classname]#VerticalLayout# with +undefined width. In such a case, the error would look as shown in +<<dummy/../../../framework//-overview.asciidoc#figure.advanced.debug.hierarchy.analyze,"">>. + +[classname]#CustomLayout# components can not be analyzed in the same way as +other layouts. For custom layouts, the button analyzes all contained +relative-sized components and checks if any relative dimension is calculated to +zero so that the component will be invisible. The error log will display a +warning for each of these invisible components. It would not be meaningful to +emphasize the component itself as it is not visible, so when you select such an +error, the parent layout of the component is emphasized if possible. + + +[[advanced.debug.hierarchy.used]] +=== Displaying Used Connectors + +The last button, [guibutton]#Show used connectors and how to optimize widget +set#, displays a list of all currently visible connectors. It also generates a +connector bundle loader factory, which you can use to optimize the widget set so +that it only contains the widgets actually used in the UI. Note, however, that +it only lists the connectors visible in the current UI state, and you usually +have more connectors than that. + + + +[[advanced.debug.communication]] +== Communication Log + +The [guilabel]#Communication# tab displays all server requests. You can unfold +the requests to view details, such as the connectors involved. Clicking on a +connector highlights the corresponding element in the UI. + +You can use Firebug or Developer Tools in Firefox or Chrome, respectively, to +get more detailed information about the requests and responses. + + +[[advanced.debug.devmodes]] +== Debug Modes + +The [guilabel]#Menu# tab in the window opens a sub-menu to select various +settings. Here you can also launch the GWT SuperDevMode, as described in +<<dummy/../../../framework/clientside/clientside-debugging#clientside.debugging,"Debugging +Client-Side Code">>. + + + + diff --git a/documentation/advanced/advanced-dragndrop.asciidoc b/documentation/advanced/advanced-dragndrop.asciidoc new file mode 100644 index 0000000000..69335c6369 --- /dev/null +++ b/documentation/advanced/advanced-dragndrop.asciidoc @@ -0,0 +1,567 @@ +--- +title: Drag and Drop +order: 12 +layout: page +--- + +[[advanced.dragndrop]] += Drag and Drop + +((("Drag and Drop", id="term.advanced.dragndrop", range="startofrange"))) + + +Dragging an object from one location to another by grabbing it with mouse, +holding the mouse button pressed, and then releasing the button to "drop" it to +the other location is a common way to move, copy, or associate objects. For +example, most operating systems allow dragging and dropping files between +folders or dragging a document on a program to open it. In Vaadin, it is +possible to drag and drop components and parts of certain components. + +Dragged objects, or __transferables__, are essentially data objects. You can +drag and drop rows in [classname]#Table# and nodes in [classname]#Tree# +components, either within or between the components. You can also drag entire +components by wrapping them inside [classname]#DragAndDropWrapper#. + +Dragging starts from a __drag source__, which defines the transferable. +Transferables implement the [classname]#Transferable# interfaces. For trees and +tables, which are bound to [classname]#Container# data sources, a node or row +transferable is a reference to an [classname]#Item# in the Vaadin Data Model. +Dragged components are referenced with a [classname]#WrapperTransferable#. +Starting dragging does not require any client-server communication, you only +need to enable dragging. All drag and drop logic occurs in two operations: +determining ( __accepting__) where dropping is allowed and actually dropping. +Drops can be done on a __drop target__, which implements the +[classname]#DropTarget# interface. Three components implement the interface: +[classname]#Tree#, [classname]#Table#, and [classname]#DragAndDropWrapper#. +These accept and drop operations need to be provided in a __drop handler__. +Essentially all you need to do to enable drag and drop is to enable dragging in +the drag source and implement the [methodname]#getAcceptCriterion()# and +[methodname]#drop()# methods in the [classname]#DropHandler# interface. + +The client-server architecture of Vaadin causes special requirements for the +drag and drop functionality. The logic for determining where a dragged object +can be dropped, that is, __accepting__ a drop, should normally be done on the +client-side, in the browser. Server communications are too slow to have much of +such logic on the server-side. The drag and drop feature therefore offers a +number of ways to avoid the server communications to ensure a good user +experience. + +[[advanced.dragndrop.drophandler]] +== Handling Drops + +Most of the user-defined drag and drop logic occurs in a __drop handler__, which +is provided by implementing the [methodname]#drop()# method in the +[classname]#DropHandler# interface. A closely related definition is the drop +accept criterion, which is defined in the [methodname]#getAcceptCriterion()# +method in the same interface. It is described in +<<advanced.dragndrop.acceptcriteria>> later. + +The [methodname]#drop()# method gets a [classname]#DragAndDropEvent# as its +parameters. The event object provides references to two important object: +[classname]#Transferable# and [classname]#TargetDetails#. + +A [classname]#Transferable# contains a reference to the object (component or +data item) that is being dragged. A tree or table item is represented as a +[classname]#TreeTransferable# or [classname]#TableTransferable# object, which +carries the item identifier of the dragged tree or table item. These special +transferables, which are bound to some data in a container, are +[classname]#DataBoundTransferable#. Dragged components are represented as +[classname]#WrapperTransferable# objects, as the components are wrapped in a +[classname]#DragAndDropWrapper#. + +The [classname]#TargetDetails# object provides information about the exact +location where the transferable object is being dropped. The exact class of the +details object depends on the drop target and you need to cast it to the proper +subclass to get more detailed information. If the target is selection component, +essentially a tree or a table, the [classname]#AbstractSelectTargetDetails# +object tells the item on which the drop is being made. For trees, the +[classname]#TreeTargetDetails# gives some more details. For wrapped components, +the information is provided in a [classname]#WrapperDropDetails# object. In +addition to the target item or component, the details objects provide a __drop +location__. For selection components, the location can be obtained with the +[methodname]#getDropLocation()# and for wrapped components with +[methodname]#verticalDropLocation()# and [methodname]#horizontalDropLocation()#. +The locations are specified as either [classname]#VerticalDropLocation# or +[classname]#HorizontalDropLocation# objects. The drop location objects specify +whether the transferable is being dropped above, below, or directly on (at the +middle of) a component or item. + +Dropping on a [classname]#Tree#, [classname]#Table#, and a wrapped component is +explained further in the following sections. + + +[[advanced.dragndrop.treedrop]] +== Dropping Items On a [classname]#Tree# + +You can drag items from, to, or within a [classname]#Tree#. Making tree a drag +source requires simply setting the drag mode with [methodname]#setDragMode()#. +[classname]#Tree# currently supports only one drag mode, +[literal]#++TreeDragMode.NODE++#, which allows dragging single tree nodes. While +dragging, the dragged node is referenced with a [classname]#TreeTransferable# +object, which is a [classname]#DataBoundTransferable#. The tree node is +identified by the item ID of the container item. + +When a transferable is dropped on a tree, the drop location is stored in a +[classname]#TreeTargetDetails# object, which identifies the target location by +item ID of the tree node on which the drop is made. You can get the item ID with +[methodname]#getItemIdOver()# method in +[classname]#AbstractSelectTargetDetails#, which the +[classname]#TreeTargetDetails# inherits. A drop can occur directly on or above +or below a node; the exact location is a [classname]#VerticalDropLocation#, +which you can get with the [methodname]#getDropLocation()# method. + +In the example below, we have a [classname]#Tree# and we allow reordering the +tree items by drag and drop. + + +[source, java] +---- +final Tree tree = new Tree("Inventory"); +tree.setContainerDataSource(TreeExample.createTreeContent()); +layout.addComponent(tree); + +// Expand all items +for (Iterator<?> it = tree.rootItemIds().iterator(); it.hasNext();) + tree.expandItemsRecursively(it.next()); + +// Set the tree in drag source mode +tree.setDragMode(TreeDragMode.NODE); + +// Allow the tree to receive drag drops and handle them +tree.setDropHandler(new DropHandler() { + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + + public void drop(DragAndDropEvent event) { + // Wrapper for the object that is dragged + Transferable t = event.getTransferable(); + + // Make sure the drag source is the same tree + if (t.getSourceComponent() != tree) + return; + + TreeTargetDetails target = (TreeTargetDetails) + event.getTargetDetails(); + + // Get ids of the dragged item and the target item + Object sourceItemId = t.getData("itemId"); + Object targetItemId = target.getItemIdOver(); + + // On which side of the target the item was dropped + VerticalDropLocation location = target.getDropLocation(); + + HierarchicalContainer container = (HierarchicalContainer) + tree.getContainerDataSource(); + + // Drop right on an item -> make it a child + if (location == VerticalDropLocation.MIDDLE) + tree.setParent(sourceItemId, targetItemId); + + // Drop at the top of a subtree -> make it previous + else if (location == VerticalDropLocation.TOP) { + Object parentId = container.getParent(targetItemId); + container.setParent(sourceItemId, parentId); + container.moveAfterSibling(sourceItemId, targetItemId); + container.moveAfterSibling(targetItemId, sourceItemId); + } + + // Drop below another item -> make it next + else if (location == VerticalDropLocation.BOTTOM) { + Object parentId = container.getParent(targetItemId); + container.setParent(sourceItemId, parentId); + container.moveAfterSibling(sourceItemId, targetItemId); + } + } +}); +---- + +[[advanced.dragndrop.treedrop.criteria]] +=== Accept Criteria for Trees + +[classname]#Tree# defines some specialized accept criteria for trees. + +[classname]#TargetInSubtree#(client-side):: Accepts if the target item is in the specified sub-tree. The sub-tree is specified by the item ID of the root of the sub-tree in the constructor. The second constructor includes a depth parameter, which specifies how deep from the given root node are drops accepted. Value [literal]#++-1++# means infinite, that is, the entire sub-tree, and is therefore the same as the simpler constructor. +[classname]#TargetItemAllowsChildren#(client-side):: Accepts a drop if the tree has [methodname]#setChildrenAllowed()# enabled for the target item. The criterion does not require parameters, so the class is a singleton and can be acquired with [methodname]#Tree.TargetItemAllowsChildren.get()#. For example, the following composite criterion accepts drops only on nodes that allow children, but between all nodes: ++ +[source, java] +---- +return new Or (Tree.TargetItemAllowsChildren.get(), new Not(VerticalLocationIs.MIDDLE)); +---- + +[classname]#TreeDropCriterion#(server-side):: Accepts drops on only some items, which as specified by a set of item IDs. You must extend the abstract class and implement the [methodname]#getAllowedItemIds()# to return the set. While the criterion is server-side, it is lazy-loading, so that the list of accepted target nodes is loaded only once from the server for each drag operation. See <<advanced.dragndrop.acceptcriteria>> for an example. + + +In addition, the accept criteria defined in [classname]#AbstractSelect# are +available for a [classname]#Tree#, as listed in +<<advanced.dragndrop.acceptcriteria>>. + + + +[[advanced.dragndrop.tabledrop]] +== Dropping Items On a [classname]#Table# + +You can drag items from, to, or within a [classname]#Table#. Making table a drag +source requires simply setting the drag mode with [methodname]#setDragMode()#. +[classname]#Table# supports dragging both single rows, with +[literal]#++TableDragMode.ROW++#, and multiple rows, with +[literal]#++TableDragMode.MULTIROW++#. While dragging, the dragged node or nodes +are referenced with a [classname]#TreeTransferable# object, which is a +[classname]#DataBoundTransferable#. Tree nodes are identified by the item IDs of +the container items. + +When a transferable is dropped on a table, the drop location is stored in a +[classname]#AbstractSelectTargetDetails# object, which identifies the target row +by its item ID. You can get the item ID with [methodname]#getItemIdOver()# +method. A drop can occur directly on or above or below a row; the exact location +is a [classname]#VerticalDropLocation#, which you can get with the +[methodname]#getDropLocation()# method from the details object. + +[[advanced.dragndrop.tabledrop.criteria]] +=== Accept Criteria for Tables + +[classname]#Table# defines one specialized accept criterion for tables. + +[classname]#TableDropCriterion#(server-side):: Accepts drops only on (or above or below) items that are specified by a set of item IDs. You must extend the abstract class and implement the [methodname]#getAllowedItemIds()# to return the set. While the criterion is server-side, it is lazy-loading, so that the list of accepted target items is loaded only once from the server for each drag operation. + + + + +[[advanced.dragndrop.acceptcriteria]] +== Accepting Drops + +((("Drag and Drop", "Accept Criteria", id="term.advanced.dragndrop.acceptcriteria", range="startofrange"))) + + +You can not drop the objects you are dragging around just anywhere. Before a +drop is possible, the specific drop location on which the mouse hovers must be +__accepted__. Hovering a dragged object over an accepted location displays an +__accept indicator__, which allows the user to position the drop properly. As +such checks have to be done all the time when the mouse pointer moves around the +drop targets, it is not feasible to send the accept requests to the server-side, +so drops on a target are normally accepted by a client-side __accept +criterion__. + +A drop handler must define the criterion on the objects which it accepts to be +dropped on the target. The criterion needs to be provided in the +[classname]#getAcceptCriterion()# method of the [classname]#DropHandler# +interface. A criterion is represented in an [classname]#AcceptCriterion# object, +which can be a composite of multiple criteria that are evaluated using logical +operations. There are two basic types of criteria: __client-side__ and +__server-side criteria__. The various built-in criteria allow accepting drops +based on the identity of the source and target components, and on the __data +flavor__ of the dragged objects. + +To allow dropping any transferable objects, you can return a universal accept +criterion, which you can get with [methodname]#AcceptAll.get()#. + + +[source, java] +---- +tree.setDropHandler(new DropHandler() { + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + ... +---- + +[[advanced.dragndrop.acceptcriteria.client-side]] +=== Client-Side Criteria + +The __client-side criteria__, which inherit the +[classname]#ClientSideCriterion#, are verified on the client-side, so server +requests are not needed for verifying whether each component on which the mouse +pointer hovers would accept a certain object. + +The following client-side criteria are define in +[package]#com.vaadin.event.dd.acceptcriterion#: + +[classname]#AcceptAll#:: Accepts all transferables and targets. +[classname]#And#:: Performs the logical AND operation on two or more client-side criteria; accepts the transferable if all the given sub-criteria accept it. +[classname]#ContainsDataFlavour#:: The transferable must contain the defined data flavour. +[classname]#Not#:: Performs the logical NOT operation on a client-side criterion; accepts the transferable if and only if the sub-criterion does not accept it. +[classname]#Or#:: Performs the logical OR operation on two or more client-side criteria; accepts the transferable if any of the given sub-criteria accepts it. +[classname]#SourceIs#:: Accepts all transferables from any of the given source components +[classname]#SourceIsTarget#:: Accepts the transferable only if the source component is the same as the target. This criterion is useful for ensuring that items are dragged only within a tree or a table, and not from outside it. +[classname]#TargetDetailIs#:: Accepts any transferable if the target detail, such as the item of a tree node or table row, is of the given data flavor and has the given value. + + +In addition, target components such as [classname]#Tree# and [classname]#Table# +define some component-specific client-side accept criteria. See +<<advanced.dragndrop.treedrop>> for more details. + +[classname]#AbstractSelect# defines the following criteria for all selection +components, including [classname]#Tree# and [classname]#Table#. + +[classname]#AcceptItem#:: Accepts only specific items from a specific selection component. The selection component, which must inherit [classname]#AbstractSelect#, is given as the first parameter for the constructor. It is followed by a list of allowed item identifiers in the drag source. +[classname]#AcceptItem.ALL#:: Accepts all transferables as long as they are items. +[classname]#TargetItemIs#:: Accepts all drops on the specified target items. The constructor requires the target component ( [classname]#AbstractSelect#) followed by a list of allowed item identifiers. +[classname]#VerticalLocationIs.MIDDLE#,[classname]#TOP#, and[classname]#BOTTOM#:: The three static criteria accepts drops on, above, or below an item. For example, you could accept drops only in between items with the following: +[source, java] +---- +public AcceptCriterion getAcceptCriterion() { + return new Not(VerticalLocationIs.MIDDLE); +} +---- + + + + + +[[advanced.dragndrop.acceptcriteria.server-side]] +=== Server-Side Criteria + +The __server-side criteria__ are verified on the server-side with the +[methodname]#accept()# method of the [classname]#ServerSideCriterion# class. +This allows fully programmable logic for accepting drops, but the negative side +is that it causes a very large amount of server requests. A request is made for +every target position on which the pointer hovers. This problem is eased in many +cases by the component-specific lazy loading criteria +[classname]#TableDropCriterion# and [classname]#TreeDropCriterion#. They do the +server visit once for each drag and drop operation and return all accepted rows +or nodes for current [classname]#Transferable# at once. + +The [methodname]#accept()# method gets the drag event as a parameter so it can +perform its logic much like in [methodname]#drop()#. + + +[source, java] +---- +public AcceptCriterion getAcceptCriterion() { + // Server-side accept criterion that allows drops on any other + // location except on nodes that may not have children + ServerSideCriterion criterion = new ServerSideCriterion() { + public boolean accept(DragAndDropEvent dragEvent) { + TreeTargetDetails target = (TreeTargetDetails) + dragEvent.getTargetDetails(); + + // The tree item on which the load hovers + Object targetItemId = target.getItemIdOver(); + + // On which side of the target the item is hovered + VerticalDropLocation location = target.getDropLocation(); + if (location == VerticalDropLocation.MIDDLE) + if (! tree.areChildrenAllowed(targetItemId)) + return false; // Not accepted + + return true; // Accept everything else + } + }; + return criterion; +} +---- + +The server-side criteria base class [classname]#ServerSideCriterion# provides a +generic [methodname]#accept()# method. The more specific +[classname]#TableDropCriterion# and [classname]#TreeDropCriterion# are +conveniency extensions that allow definiting allowed drop targets as a set of +items. They also provide some optimization by lazy loading, which reduces server +communications significantly. + + +[source, java] +---- +public AcceptCriterion getAcceptCriterion() { + // Server-side accept criterion that allows drops on any + // other tree node except on node that may not have children + TreeDropCriterion criterion = new TreeDropCriterion() { + @Override + protected Set<Object> getAllowedItemIds( + DragAndDropEvent dragEvent, Tree tree) { + HashSet<Object> allowed = new HashSet<Object>(); + for (Iterator<Object> i = + tree.getItemIds().iterator(); i.hasNext();) { + Object itemId = i.next(); + if (tree.hasChildren(itemId)) + allowed.add(itemId); + } + return allowed; + } + }; + return criterion; +} +---- + + +[[advanced.dragndrop.acceptcriteria.indicators]] +=== Accept Indicators + +When a dragged object hovers on a drop target, an __accept indicator__ is +displayed to show whether or not the location is accepted. For +[parameter]#MIDDLE# location, the indicator is a box around the target (tree +node, table row, or component). For vertical drop locations, the accepted +locations are shown as horizontal lines, and for horizontal drop locations as +vertical lines. + +For [classname]#DragAndDropWrapper# drop targets, you can disable the accept +indicators or __drag hints__ with the [parameter]#no-vertical-drag-hints#, +[parameter]#no-horizontal-drag-hints#, and [parameter]#no-box-drag-hints# +styles. You need to add the styles to the __layout that contains__ the wrapper, +not to the wrapper itself. + + +[source, java] +---- +// Have a wrapper +DragAndDropWrapper wrapper = new DragAndDropWrapper(c); +layout.addComponent(wrapper); + +// Disable the hints +layout.addStyleName("no-vertical-drag-hints"); +layout.addStyleName("no-horizontal-drag-hints"); +layout.addStyleName("no-box-drag-hints"); +---- + + +(((range="endofrange", startref="term.advanced.dragndrop.acceptcriteria"))) + +[[advanced.dragndrop.dragging]] +== Dragging Components + +Dragging a component requires wrapping the source component within a +[classname]#DragAndDropWrapper#. You can then allow dragging by putting the +wrapper (and the component) in drag mode with [methodname]#setDragStartMode()#. +The method supports two drag modes: [parameter]#DragStartMode.WRAPPER# and +[parameter]#DragStartMode.COMPONENT#, which defines whether the entire wrapper +is shown as the drag image while dragging or just the wrapped component. + + +[source, java] +---- +// Have a component to drag +final Button button = new Button("An Absolute Button"); + +// Put the component in a D&D wrapper and allow dragging it +final DragAndDropWrapper buttonWrap = new DragAndDropWrapper(button); +buttonWrap.setDragStartMode(DragStartMode.COMPONENT); + +// Set the wrapper to wrap tightly around the component +buttonWrap.setSizeUndefined(); + +// Add the wrapper, not the component, to the layout +layout.addComponent(buttonWrap, "left: 50px; top: 50px;"); +---- + +The default height of [classname]#DragAndDropWrapper# is undefined, but the +default width is 100%. If you want to ensure that the wrapper fits tightly +around the wrapped component, you should call [methodname]#setSizeUndefined()# +for the wrapper. Doing so, you should make sure that the wrapped component does +not have a relative size, which would cause a paradox. + +Dragged components are referenced in the [classname]#WrapperTransferable#. You +can get the reference to the dragged component with +[methodname]#getDraggedComponent()#. The method will return [literal]#++null++# +if the transferable is not a component. Also HTML 5 drags (see later) are held +in wrapper transferables. + + +[[advanced.dragndrop.drop-on-component]] +== Dropping on a Component + +Drops on a component are enabled by wrapping the component in a +[classname]#DragAndDropWrapper#. The wrapper is an ordinary component; the +constructor takes the wrapped component as a parameter. You just need to define +the [classname]#DropHandler# for the wrapper with +[methodname]#setDropHandler()#. + +In the following example, we allow moving components in an absolute layout. +Details on the drop handler are given later. + + +[source, java] +---- +// A layout that allows moving its contained components +// by dragging and dropping them +final AbsoluteLayout absLayout = new AbsoluteLayout(); +absLayout.setWidth("100%"); +absLayout.setHeight("400px"); + +... put some (wrapped) components in the layout ... + +// Wrap the layout to allow handling drops +DragAndDropWrapper layoutWrapper = + new DragAndDropWrapper(absLayout); + +// Handle moving components within the AbsoluteLayout +layoutWrapper.setDropHandler(new DropHandler() { + public AcceptCriterion getAcceptCriterion() { + return AcceptAll.get(); + } + + public void drop(DragAndDropEvent event) { + ... + } +}); +---- + +[[advanced.dragndrop.drop-on-component.details]] +=== Target Details for Wrapped Components + +The drop handler receives the drop target details in a +[classname]#WrapperTargetDetails# object, which implements the +[classname]#TargetDetails# interface. + + +[source, java] +---- +public void drop(DragAndDropEvent event) { + WrapperTransferable t = + (WrapperTransferable) event.getTransferable(); + WrapperTargetDetails details = + (WrapperTargetDetails) event.getTargetDetails(); +---- + +The wrapper target details include a [classname]#MouseEventDetails# object, +which you can get with [methodname]#getMouseEvent()#. You can use it to get the +mouse coordinates for the position where the mouse button was released and the +drag ended. Similarly, you can find out the drag start position from the +transferable object (if it is a [classname]#WrapperTransferable#) with +[methodname]#getMouseDownEvent()#. + + +[source, java] +---- +// Calculate the drag coordinate difference +int xChange = details.getMouseEvent().getClientX() + - t.getMouseDownEvent().getClientX(); +int yChange = details.getMouseEvent().getClientY() + - t.getMouseDownEvent().getClientY(); + +// Move the component in the absolute layout +ComponentPosition pos = + absLayout.getPosition(t.getSourceComponent()); +pos.setLeftValue(pos.getLeftValue() + xChange); +pos.setTopValue(pos.getTopValue() + yChange); +---- + +You can get the absolute x and y coordinates of the target wrapper with +[methodname]#getAbsoluteLeft()# and [methodname]#getAbsoluteTop()#, which allows +you to translate the absolute mouse coordinates to coordinates relative to the +wrapper. Notice that the coordinates are really the position of the wrapper, not +the wrapped component; the wrapper reserves some space for the accept +indicators. + +The [methodname]#verticalDropLocation()# and +[methodname]#horizontalDropLocation()# return the more detailed drop location in +the target. + + + +[[advanced.dragndrop.external]] +== Dragging Files from Outside the Browser + +The [classname]#DragAndDropWrapper# allows dragging files from outside the +browser and dropping them on a component wrapped in the wrapper. Dropped files +are automatically uploaded to the application and can be acquired from the +wrapper with [methodname]#getFiles()#. The files are represented as +[classname]#Html5File# objects as defined in the inner class. You can define an +upload [classname]#Receiver# to receive the content of a file to an +[classname]#OutputStream#. + +Dragging and dropping files to browser is supported in HTML 5 and requires a +compatible browser, such as Mozilla Firefox 3.6 or newer. + + +(((range="endofrange", startref="term.advanced.dragndrop"))) + + diff --git a/documentation/advanced/advanced-embedding.asciidoc b/documentation/advanced/advanced-embedding.asciidoc new file mode 100644 index 0000000000..ca2ccd3a0e --- /dev/null +++ b/documentation/advanced/advanced-embedding.asciidoc @@ -0,0 +1,460 @@ +--- +title: Embedding UIs in Web Pages +order: 2 +layout: page +--- + +[[advanced.embedding]] += Embedding UIs in Web Pages + +Many web sites are not all Vaadin, but Vaadin UIs are used only for specific +functionalities. In practice, many web applications are a mixture of dynamic web +pages, such as JSP, and Vaadin UIs embedded in such pages. + +Embedding Vaadin UIs in web pages is easy and there are several different ways +to embed them. One is to have a [literal]#++<div>++# placeholder for the UI and +load the Vaadin Client-Side Engine with some simple JavaScript code. Another +method is even easier, which is to simply use the [literal]#++<iframe>++# +element. Both of these methods have advantages and disadvantages. One +disadvantage of the [literal]#++<iframe>++# method is that the size of the +[literal]#++<iframe>++# element is not flexible according to the content while +the [literal]#++<div>++# method allows such flexibility. The following sections +look closer into these two embedding methods. + +[[advanced.embedding.div]] +== Embedding Inside a [literal]#++div++# Element + +You can embed one or more Vaadin UIs inside a web page with a method that is +equivalent to loading the initial page content from the Vaadin servlet in a +non-embedded UI. Normally, the [classname]#VaadinServlet# generates an initial +page that contains the correct parameters for the specific UI. You can easily +configure it to load multiple Vaadin UIs in the same page. They can have +different widget sets and different themes. + +Embedding an UI requires the following basic tasks: + +* Set up the page header +* Include a GWT history frame in the page +* Call the [filename]#vaadinBootstrap.js# file +* Define the [literal]#++<div>++# element for the UI +* Configure and initialize the UI + +Notice that you can view the loader page for the UI easily by opening the UI in +a web browser and viewing the HTML source code of the page. You could just copy +and paste the embedding code from the page, but some modifications and +additional settings are required, mainly related to the URLs that have to be +made relative to the page instead of the servlet URL. + +ifdef::web[] +[[advanced.embedding.div.head]] +=== The Head Matter + +The HTML page in which the Vaadin UI is embedded should be a valid HTML 5 +document. The content of the head element is largely up to you. The character +encoding must be UTF-8. Some meta declarations are necessary for compatibility. +You can also set the page favicon in the head element. + +[subs="normal"] +---- +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" + content="text/html; charset=UTF-8" /> + <meta http-equiv="X-UA-Compatible" + content="IE=9;chrome=1" /> + + <title>[replaceable]#This is my Embedding Page#</title> + + <!-- Set up the favicon from the Vaadin theme --> + <link rel="shortcut icon" type="image/vnd.microsoft.icon" + href="/VAADIN/themes/[replaceable]#reindeer#/favicon.ico" /> + <link rel="icon" type="image/vnd.microsoft.icon" + href="/VAADIN/themes/[replaceable]#reindeer#/favicon.ico" /> + </head> +---- +endif::web[] + +ifdef::web[] +[[advanced.embedding.div.body]] +=== The Body Matter + +The page content must include some Vaadin-related definitions before you can +embed Vaadin UIs in it. + +The [filename]#vaadinBootstrap.js# script makes definitions for starting up the +UI. It must be called before initializing the UI. The source path must be +relative to the path of the embedding page. + +[subs="normal"] +---- +<body> + <script type="text/javascript" + src="[replaceable]#./#VAADIN/vaadinBootstrap.js"></script> +---- +The bootstrap script is served by the Vaadin servlet from inside the +[filename]#vaadin-server# JAR. + +Vaadin, or more precisely GWT, requires an invisible history frame, which is +used for tracking the page or fragment history in the browser. + + +[source, html] +---- + <iframe tabindex="-1" id="__gwt_historyFrame" + style="position: absolute; width: 0; height: 0; + border: 0; overflow: hidden" + src="javascript:false"></iframe> +---- + +endif::web[] + +ifdef::web[] +[[advanced.embedding.div.div]] +=== UI Placeholder Element + +A Vaadin UI is embedded in a placeholder [literal]#++<div>++# element. It should +have the following features: + +* The [literal]#++<div>++# element must have an [literal]#++id++# attribute, which must be a unique ID in the page, normally something that identifies the servlet of the UI uniquely. +* It must have at least the [literal]#++v-app++# style class. +* it should have a nested [literal]#++<div>++# element with [literal]#++v-app-loading++# style class. This is a placeholder for the loading indicator that is displayed while the UI is being loaded. +* It should also contain a [literal]#++<noscript>++# element that is shown if the browser does not support JavaScript or it has been disabled. The content of the element should instruct the use to enable JavaScript in the browser. + +The placeholder element can include style settings, typically a width and +height. If the sizes are not defined, the UI will have an undefined size in the +particular dimension, which must be in accordance with the sizing of the UI +components. + +For example: + +[subs="normal"] +---- +<div style="[replaceable]#width: 300px; border: 2px solid green;#" + id="helloworldui" class="v-app"> + <div class="v-app-loading"></div> + <noscript>[replaceable]#You have to enable javascript in your browser to# + [replaceable]#use an application built with Vaadin.#</noscript> +</div> +---- +endif::web[] + +ifdef::web[] +[[advanced.embedding.div.init]] +=== Initializing the UI + +The UI is loaded by calling the [literal]#++initApplication()++# method for the +[literal]#++vaadin++# object defined in the bootstrap script. Before calling it, +you should check that the bootstrap script was loaded properly. + +[subs="normal"] +---- +<script type="text/javascript">//<![CDATA[ + if (!window.vaadin) + alert("[replaceable]#Failed to load the bootstrap JavaScript:#"+ + "[replaceable]#VAADIN/vaadinBootstrap.js#"); +---- +The [literal]#++initApplication()++# takes two parameters. The first parameter +is the UI identifier, exactly as given as the [literal]#++id++# attribute of the +placeholder element. The second parameter is an associative map that contains +parameters for the UI. + +The map must contain the following items: + +[parameter]#browserDetailsUrl#:: This should be the URL path (relative to the embedding page) to the Vaadin +servlet of the UI. It is used by the bootstrap to communicate browser details. A +trailing slash may be needed in some cases. + ++ +Notice that this parameter is not included in the loader page generated by the +servlet, because in that case, it can default to the current URL. + +[parameter]#serviceUrl#:: This is used for server requests after initial loading and should be same as for +[parameter]#browserDetailsUrl#. The two parameters are redundant and either may +be removed in +future.+ +//Bug +#10122 + +[parameter]#widgetset#:: This should be the exact class name of the widget set for the UI, that is, without the [filename]#.gwt.xml# file name extension. If the UI has no custom widget set, you can use the [classname]#com.vaadin.DefaultWidgetSet#. +[parameter]#theme#:: Name of the theme, such as one of the built-in themes ( [literal]#++reindeer++#, [literal]#++runo++#, or [literal]#++chameleon++#) or a custom theme. It must exist under the [filename]#VAADIN/themes# folder. +[parameter]#versionInfo#:: This parameter is itself an associative map that can contain two parameters: [parameter]#vaadinVersion# contains the version number of the Vaadin version used by the application. The [parameter]#applicationVersion# parameter contains the version of the particular application. The contained parameters are optional, but the [parameter]#versionInfo# parameter itself is not. +[parameter]#vaadinDir#:: Relative path to the [filename]#VAADIN# directory. It is relative to the URL of the embedding page. +[parameter]#heartbeatInterval#:: The [parameter]#hearbeatInterval# parameter defines the frequency of the keep-alive hearbeat for the UI in seconds, as described in <<dummy/../../../framework/application/application-lifecycle#application.lifecycle.ui-expiration,"UI Expiration">>. +[parameter]#debug#:: The parameter defines whether the debug window, as described in <<dummy/../../../framework/advanced/advanced-debug#advanced.debug,"Debug Mode and Window">>, is enabled. +[parameter]#standalone#:: This parameter should be [parameter]#false# when embedding. The parameter defines whether the UI is rendered on its own in the browser window or in some context. A standalone UI may do things that might interfere with other parts of the page, such as change the page title and request focus when it is loaded. When embedding, the UI is not standalone. +[parameter]#authErrMsg#,[parameter]#comErrMsg#, and[parameter]#sessExpMsg#:: These three parameters define the client-side error messages for authentication error, communication error, and session expiration, respectively. The parameters are associative maps themselves and must contain two key-value pairs: [parameter]#message#, which should contain the error text in HTML, and [parameter]#caption#, which should be the error caption. + + +For example: + +[subs="normal"] +---- + vaadin.initApplication("[replaceable]#helloworldui#", { + "browserDetailsUrl": "[replaceable]#helloworld#/", + "serviceUrl": "[replaceable]#helloworld#/", + "widgetset": "[replaceable]#com.example.MyWidgetSet#", + "theme": "[replaceable]#mytheme#", + "versionInfo": {"vaadinVersion": "[replaceable]#7.0.0#"}, + "vaadinDir": "[replaceable]#VAADIN/#", + "heartbeatInterval": [replaceable]#300#, + "debug": [replaceable]#true#, + "standalone": false, + "authErrMsg": { + "message": "[replaceable]#Take note of any unsaved data, "+ "and <u>click here<\/u> to continue.#", + "caption": "Authentication problem" + }, + "comErrMsg": { + "message": "[replaceable]#Take note of any unsaved data, "+ "and <u>click here<\/u> to continue.#", + "caption": "Communication problem" + }, + "sessExpMsg": { + "message": "[replaceable]#Take note of any unsaved data, "+ "and <u>click here<\/u> to continue.#", + "caption": "Session Expired" + } + });//]]> +</script> +---- +Notice that many of the parameters are normally deployment parameters, specified +in the deployment descriptor, as described in +<<dummy/../../../framework/application/application-environment#application.environment.parameters,"Other +Servlet Configuration Parameters">>. + +endif::web[] + +ifdef::web[] +[[advanced.embedding.div.summary]] +=== Summary of Div Embedding + +Below is a complete example of embedding an UI in a [literal]#++<div>++# +element. + + +[source, html] +---- +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Type" + content="text/html; charset=UTF-8" /> + <meta http-equiv="X-UA-Compatible" + content="IE=9;chrome=1" /> + + <title>Embedding a Vaadin Application in HTML Page</title> + + <!-- Set up the favicon from the Vaadin theme --> + <link rel="shortcut icon" type="image/vnd.microsoft.icon" + href="/VAADIN/themes/reindeer/favicon.ico" /> + <link rel="icon" type="image/vnd.microsoft.icon" + href="/VAADIN/themes/reindeer/favicon.ico" /> +</head> + +<body> + <!-- Loads the Vaadin widget set, etc. --> + <script type="text/javascript" + src="VAADIN/vaadinBootstrap.js"></script> + + <!-- GWT requires an invisible history frame. It is --> + <!-- needed for page/fragment history in the browser. --> + <iframe tabindex="-1" id="__gwt_historyFrame" + style="position: absolute; width: 0; height: 0; + border: 0; overflow: hidden" + src="javascript:false"></iframe> + + <h1>Embedding a Vaadin UI</h1> + + <p>This is a static web page that contains an embedded Vaadin + application. It's here:</p> + + <!-- So here comes the div element in which the Vaadin --> + <!-- application is embedded. --> + <div style="width: 300px; border: 2px solid green;" + id="helloworld" class="v-app"> + + <!-- Optional placeholder for the loading indicator --> + <div class=" v-app-loading"></div> + + <!-- Alternative fallback text --> + <noscript>You have to enable javascript in your browser to + use an application built with Vaadin.</noscript> + </div> + + <script type="text/javascript">//<![CDATA[ + if (!window.vaadin) + alert("Failed to load the bootstrap JavaScript: "+ + "VAADIN/vaadinBootstrap.js"); + + /* The UI Configuration */ + vaadin.initApplication("helloworld", { + "browserDetailsUrl": "helloworld/", + "serviceUrl": "helloworld/", + "widgetset": "com.example.MyWidgetSet", + "theme": "mytheme", + "versionInfo": {"vaadinVersion": "7.0.0"}, + "vaadinDir": "VAADIN/", + "heartbeatInterval": 300, + "debug": true, + "standalone": false, + "authErrMsg": { + "message": "Take note of any unsaved data, "+ + "and <u>click here<\/u> to continue.", + "caption": "Authentication problem" + }, + "comErrMsg": { + "message": "Take note of any unsaved data, "+ + "and <u>click here<\/u> to continue.", + "caption": "Communication problem" + }, + "sessExpMsg": { + "message": "Take note of any unsaved data, "+ + "and <u>click here<\/u> to continue.", + "caption": "Session Expired" + } + });//]] > + </script> + + <p>Please view the page source to see how embedding works.</p> +</body> +</html> +---- + +endif::web[] + + +[[advanced.embedding.iframe]] +== Embedding Inside an [literal]#++iframe++# Element + +Embedding a Vaadin UI inside an [literal]#++<iframe>++# element is even easier +than the method described above, as it does not require definition of any Vaadin +specific definitions. + +You can embed an UI with an element such as the following: + +[subs="normal"] +---- +<iframe src="[replaceable]#/myapp/myui#"></iframe> +---- +The [literal]#++<iframe>++# elements have several downsides for embedding. One +is that their size of is not flexible depending on the content of the frame, but +the content must be flexible to accommodate in the frame. You can set the size +of an [literal]#++<iframe>++# element with [literal]#++height++# and +[literal]#++width++# attributes. Other issues arise from themeing and +communication with the frame content and the rest of the page. + +Below is a complete example of using the [literal]#++<iframe>++# to embed two +applications in a web page. + + +[source, html] +---- +<!DOCTYPE html> +<html> + <head> + <title>Embedding in IFrame</title> + </head> + + <body style="background: #d0ffd0;"> + <h1>This is a HTML page</h1> + <p>Below are two Vaadin applications embedded inside + a table:</p> + + <table align="center" border="3"> + <tr> + <th>The Calculator</th> + <th>The Color Picker</th> + </tr> + <tr valign="top"> + <td> + <iframe src="/vaadin-examples/Calc" height="200" + width="150" frameborder="0"></iframe> + </td> + <td> + <iframe src="/vaadin-examples/colorpicker" + height="330" width="400" + frameborder="0"></iframe> + </td> + </tr> + </table> + </body> +</html> +---- + +The page will look as shown in <<figure.embedding.iframe>> below. + +[[figure.embedding.iframe]] +.Vaadin Applications Embedded Inside IFrames +image::img/embedding3.png[] + +You can embed almost anything in an iframe, which essentially acts as a browser +window. However, this creates various problems. The iframe must have a fixed +size, inheritance of CSS from the embedding page is not possible, and neither is +interaction with JavaScript, which makes mashups impossible, and so on. Even +bookmarking with URI fragments will not work. + +Note also that websites can forbid iframe embedding by specifying an +[literal]#++X-Frame-Options: SAMEORIGIN++# header in the HTTP response. + + +ifdef::web[] +[[advanced.embedding.xs]] +== Cross-Site Embedding with the Vaadin XS Add-on + +__The XS add-on is currently not available for Vaadin 7.__ + +In the previous sections, we described the two basic methods for embedding +Vaadin applications: in a [literal]#++<div>++# element and in an +[literal]#++<iframe>++#. One problem with div embedding is that it does not work +between different Internet domains, which is a problem if you want to have your +website running in one server and your Vaadin application in another. The +security model in browsers effectively prevents such cross-site embedding of +Ajax applications by enforcing the __same origin policy__ for XmlHttpRequest +calls, even if the server is running in the same domain but different port. +While iframe is more permissive, allowing embedding almost anything in anywhere, +it has many disadvantanges, as described earlier. + +The Vaadin XS (Cross-Site) add-on works around the limitation in div embedding +by using JSONP-style communication instead of the standard XmlHttpRequests. + +Embedding is done simply with: + + +[source, html] +---- + <script src="http://demo.vaadin.com/xsembed/getEmbedJs" + type="text/javascript"></script> +---- + +This includes an automatically generated embedding script in the page, thereby +making embedding effortless. + +This assumes that the main layout of the application has undefined height. If +the height is 100%, you have to wrap it inside an element with a defined height. +For example: + + +[source, html] +---- + <div style="height: 500px;"> + <script src="http://demo.vaadin.com/xsembed/getEmbedJs" + type="text/javascript"></script> +</div> +---- + +It is possible to restrict where the application can be embedded by using a +whitelist. The add-on also encrypts the client-server communication, which is +more important for embedded applications than usual. + +You can get the Vaadin XS add-on from Vaadin Directory. It is provided as a Zip +package. Download and extract the installation package to a local folder. +Instructions for installation and further information is given in the +[filename]#README.html# file in the package. + +Some restrictions apply. You can have only one embedded application in one page. +Also, some third-party libraries may interfere with the communication. Other +notes are given in the README. + +endif::web[] + + + diff --git a/documentation/advanced/advanced-gae.asciidoc b/documentation/advanced/advanced-gae.asciidoc new file mode 100644 index 0000000000..0547f2f134 --- /dev/null +++ b/documentation/advanced/advanced-gae.asciidoc @@ -0,0 +1,71 @@ +--- +title: Google App Engine Integration +order: 7 +layout: page +--- + +[[advanced.gae]] += Google App Engine Integration + +__This section is not yet fully updated to Vaadin 7.__ + +Vaadin includes support to run Vaadin applications in the Google App Engine +(GAE). The most essential requirement for GAE is the ability to serialize the +application state. Vaadin applications are serializable through the +[classname]#java.io.Serializable# interface. + +To run as a GAE application, an application must use +[classname]#GAEVaadinServlet# instead of [classname]#VaadinServlet#, and of +course implement the [classname]#java.io.Serializable# interface for all +persistent classes. You also need to enable session support in +[filename]#appengine-web.xml# with: + + +[source, xml] +---- +<sessions-enabled>true</sessions-enabled> +---- + +The Vaadin Project wizard can create the configuration files needed for GAE +deployment. See +<<dummy/../../../framework/getting-started/getting-started-first-project#getting-started.first-project.creation,"Creating +the Project">>. When the Google App Engine deployment configuration is selected, +the wizard will create the project structure following the GAE Servlet +convention instead of the regular Servlet convention. The main differences are: + +* Source directory: [filename]#src/main/java# +* Output directory: [filename]#war/WEB-INF/classes# +* Content directory: [filename]#war# + +== Rules and Limitations + +Running Vaadin applications in Google App Engine has the following rules and +limitations: + +* Avoid using the session for storage, usual App Engine limitations apply (no +synchronization, that is, it is unreliable). + +* Vaadin uses memcache for mutex, the key is of the form +[parameter]#_vmutex<sessionid>#. + +* The Vaadin [classname]#WebApplicationContext# class is serialized separately +into memcache and datastore; the memcache key is [parameter]#_vac<sessionid># +and the datastore entity kind is [parameter]#_vac# with identifiers of the type +[parameter]#_vac<sessionid>#. + +* __Do not__ update the application state when serving an +[classname]#ConnectorResource# (such as [classname]#ClassResource#. +[methodname]#getStream()#). + +* __Avoid__ (or be very careful when) updating application state in a +[classname]#TransactionListener# - it is called even when the application is not +locked and won't be serialized (such as with [classname]#ConnectorResource#), +and changes can therefore be lost (it should be safe to update things that can +be safely discarded later, that is, valid only for the current request). + +* The application remains locked during uploads - a progress bar is not possible. + + + + + diff --git a/documentation/advanced/advanced-global.asciidoc b/documentation/advanced/advanced-global.asciidoc new file mode 100644 index 0000000000..94b822235a --- /dev/null +++ b/documentation/advanced/advanced-global.asciidoc @@ -0,0 +1,234 @@ +--- +title: Accessing Session-Global Data +order: 15 +layout: page +--- + +[[advanced.global]] += Accessing Session-Global Data + +__This section is mostly up-to-date with Vaadin 7, but has some information +which still needs to be updated.__ + +Applications typically need to access some objects from practically all user +interface code, such as a user object, a business data model, or a database +connection. This data is typically initialized and managed in the UI class of +the application, or in the session or servlet. + +For example, you could hold it in the UI class as follows: + + +[source, java] +---- +class MyUI extends UI { + UserData userData; + + public void init() { + userData = new UserData(); + } + + public UserData getUserData() { + return userData; + } +} +---- + +Vaadin offers two ways to access the UI object: with [methodname]#getUI()# +method from any component and the global [methodname]#UI.getCurrent()# method. + +The [methodname]#getUI()# works as follows: + + +[source, java] +---- +data = ((MyUI)component.getUI()).getUserData(); +---- + +This does not, however work in many cases, because it requires that the +components are attached to the UI. That is not the case most of the time when +the UI is still being built, such as in constructors. + + +[source, java] +---- +class MyComponent extends CustomComponent { + public MyComponent() { + // This fails with NullPointerException + Label label = new Label("Country: " + + getUI().getLocale().getCountry()); + + setCompositionRoot(label); + } +} +---- + +The global access methods for the currently served servlet, session, and UI +allow an easy way to access the data: + + +[source, java] +---- +data = ((MyUI) UI.getCurrent()).getUserData(); +---- + +[[advanced.global.passing.problem]] +== The Problem + +The basic problem in accessing session-global data is that the +[methodname]#getUI()# method works only after the component has been attached to +the application. Before that, it returns [parameter]#null#. This is the case in +constructors of components, such as a [classname]#CustomComponent#: + +Using a static variable or a singleton implemented with such to give a global +access to user session data is not possible, because static variables are global +in the entire web application, not just the user session. This can be handy for +communicating data between the concurrent sessions, but creates a problem within +a session. + +The data would be shared by all users and be reinitialized every time a new user +opens the application. + + +[[advanced.global.passing.solutions-overview]] +== Overview of Solutions + +To get the application object or any other global data, you have the following +solutions: + +* Pass a reference to the global data as a parameter + +* Initialize components in [methodname]#attach()# method + +* Initialize components in the [methodname]#enter()# method of the navigation view +(if using navigation) + +* Store a reference to global data using the __ThreadLocal Pattern__ + + +Each solution is described in the following sections. + + +[[advanced.global.passing]] +== Passing References Around + +You can pass references to objects as parameters. This is the normal way in +object-oriented programming. + + +[source, java] +---- +class MyApplication extends Application { + UserData userData; + + public void init() { + Window mainWindow = new Window("My Window"); + setMainWindow(mainWindow); + + userData = new UserData(); + + mainWindow.addComponent(new MyComponent(this)); + } + + public UserData getUserData() { + return userData; + } +} + +class MyComponent extends CustomComponent { + public MyComponent(MyApplication app) { + Label label = new Label("Name: " + + app.getUserData().getName()); + + setCompositionRoot(label); + } +} +---- + +If you need the reference in other methods, you either have to pass it again as +a parameter or store it in a member variable. + +The problem with this solution is that practically all constructors in the +application need to get a reference to the application object, and passing it +further around in the classes is another hard task. + + +[[advanced.global.attach]] +== Overriding [methodname]#attach()# + +The [methodname]#attach()# method is called when the component is attached to +the UI through containment hierarchy. The [methodname]#getUI()# method always +works. + + +[source, java] +---- +class MyComponent extends CustomComponent { + public MyComponent() { + // Must set a dummy root in constructor + setCompositionRoot(new Label("")); + } + + @Override + public void attach() { + Label label = new Label("Name: " + + ((MyUI)component.getUI()) + .getUserData().getName()); + + setCompositionRoot(label); + } +} +---- + +While this solution works, it is slightly messy. You may need to do some +initialization in the constructor, but any construction requiring the global +data must be done in the [methodname]#attach()# method. Especially, +[classname]#CustomComponent# requires that the +[methodname]#setCompositionRoot()# method is called in the constructor. If you +can't create the actual composition root component in the constructor, you need +to use a temporary dummy root, as is done in the example above. + +Using [methodname]#getUI()# also needs casting if you want to use methods +defined in your UI class. + + +[[advanced.global.threadlocal]] +== ThreadLocal Pattern + +((("ThreadLocal pattern", id="term.advanced.global.threadlocal", range="startofrange"))) + + +Vaadin uses the ThreadLocal pattern for allowing global access to the +[classname]#UI#, and [classname]#Page# objects of the currently processed server +request with a static [methodname]#getCurrent()# method in all the respective +classes. This section explains why the pattern is used in Vaadin and how it +works. You may also need to reimplement the pattern for some purpose. + +The ThreadLocal pattern gives a solution to the global access problem by solving +two sub-problems of static variables. + +As the first problem, assume that the servlet container processes requests for +many users (sessions) sequentially. If a static variable is set in a request +belonging one user, it could be read or re-set by the next incoming request +belonging to another user. This can be solved by setting the global reference at +the beginning of each HTTP request to point to data of the current user, as +illustrated in Figure <<figure.advanced.global.threadlocal.sequentiality>>. + +[[figure.advanced.global.threadlocal.sequentiality]] +.Switching a static (or ThreadLocal) reference during sequential processing of requests +image::img/threadlocal-sequentiality-hi.png[] + +The second problem is that servlet containers typically do thread pooling with +multiple worker threads that process requests. Therefore, setting a static +reference would change it in all threads running concurrently, possibly just +when another thread is processing a request for another user. The solution is to +store the reference in a thread-local variable instead of a static. You can do +so by using the [classname]#ThreadLocal# class in Java for the switch reference. + +[[figure.advanced.global.threadlocal.concurrency]] +.Switching [classname]#ThreadLocal# references during concurrent processing of requests +image::img/threadlocal-concurrency-hi.png[] + +(((range="endofrange", startref="term.advanced.global.threadlocal"))) + + + diff --git a/documentation/advanced/advanced-javascript.asciidoc b/documentation/advanced/advanced-javascript.asciidoc new file mode 100644 index 0000000000..6e9cbc45e5 --- /dev/null +++ b/documentation/advanced/advanced-javascript.asciidoc @@ -0,0 +1,109 @@ +--- +title: JavaScript Interaction +order: 14 +layout: page +--- + +[[advanced.javascript]] += JavaScript Interaction + +Vaadin supports two-direction JavaScript calls from and to the server-side. This +allows interfacing with JavaScript code without writing client-side integration +code. + +[[advanced.javascript.calling]] +== Calling JavaScript + +You can make JavaScript calls from the server-side with the +[methodname]#execute()# method in the [classname]#JavaScript# class. You can get +a [classname]#JavaScript# instance from the current [classname]#Page# object +with [methodname]#getJavaScript()#.//TODO Check that the API is +so. + + +[source, java] +---- +// Execute JavaScript in the currently processed page +Page.getCurrent().getJavaScript().execute("alert('Hello')"); +---- + +The [classname]#JavaScript# class itself has a static shorthand method +[methodname]#getCurrent()# to get the instance for the currently processed page. + + +[source, java] +---- +// Shorthand +JavaScript.getCurrent().execute("alert('Hello')"); +---- + +The JavaScript is executed after the server request that is currently processed +returns. If multiple JavaScript calls are made during the processing of the +request, they are all executed sequentially after the request is done. Hence, +the JavaScript execution does not pause the execution of the server-side +application and you can not return values from the JavaScript. + + +[[advanced.javascript.callback]] +== Handling JavaScript Function Callbacks + +You can make calls with JavaScript from the client-side to the server-side. This +requires that you register JavaScript call-back methods from the server-side. +You need to implement and register a [classname]#JavaScriptFunction# with +[methodname]#addFunction()# in the current [classname]#JavaScript# object. A +function requires a name, with an optional package path, which are given to the +[methodname]#addFunction()#. You only need to implement the [methodname]#call()# +method to handle calls from the client-side JavaScript. + + +[source, java] +---- + +JavaScript.getCurrent().addFunction("com.example.foo.myfunc", + new JavaScriptFunction() { + @Override + public void call(JsonArray arguments) { + Notification.show("Received call"); + } +}); + +Link link = new Link("Send Message", new ExternalResource( + "javascript:com.example.foo.myfunc()")); +---- + +Parameters passed to the JavaScript method on the client-side are provided in a +[classname]#JSONArray# passed to the [methodname]#call()# method. The parameter +values can be acquired with the [methodname]#get()# method by the index of the +parameter, or any of the type-casting getters. The getter must match the type of +the passed parameter, or an exception is thrown. + + +[source, java] +---- +JavaScript.getCurrent().addFunction("com.example.foo.myfunc", + new JavaScriptFunction() { + @Override + public void call(JsonArray arguments) { + try { + String message = arguments.getString(0); + int value = arguments.getInt(1); + Notification.show("Message: " + message + + ", value: " + value); + } catch (Exception e) { + Notification.show("Error: " + e.getMessage()); + } + } +}); + +Link link = new Link("Send Message", new ExternalResource( + "javascript:com.example.foo.myfunc(prompt('Message'), 42)")); +---- + +The function callback mechanism is the same as the RPC mechanism used with +JavaScript component integration, as described in +<<dummy/../../../framework/gwt/gwt-javascript#gwt.javascript.rpc,"RPC from +JavaScript to Server-Side">>. + + + + diff --git a/documentation/advanced/advanced-logging.asciidoc b/documentation/advanced/advanced-logging.asciidoc new file mode 100644 index 0000000000..12200d32ee --- /dev/null +++ b/documentation/advanced/advanced-logging.asciidoc @@ -0,0 +1,137 @@ +--- +title: Logging +order: 13 +layout: page +--- + +[[advanced.logging]] += Logging + +(((, id="term.advanced.logging", range="startofrange"))) + + +You can do logging in Vaadin application using the standard +[package]#java.util.logging# facilities. Configuring logging is as easy as +putting a file named [filename]#logging.properties# in the default package of +your Vaadin application ( [filename]#src# in an Eclipse project or +[filename]#src/main/java# or [filename]#src/main/resources# in a Maven project). +This file is read by the [classname]#Logger# class when a new instance of it is +initialize. + +[[advanced.logging.tomcat]] +== Logging in Apache Tomcat + +For logging Vaadin applications deployed in Apache Tomcat, you do not need to do +anything special to log to the same place as Tomcat itself. If you need to write +the Vaadin application related messages elsewhere, just add a custom +[filename]#logging.properties# file to the default package of your Vaadin +application. + +If you would like to pipe the log messages through another logging solution, see +<<advanced.logging.slf4j>> below. + + +[[advanced.logging.liferay]] +== Logging in Liferay + +Liferay mutes logging through [package]#java.util.logging# by default. In order +to enable logging, you need to add a [filename]#logging.properties# file of your +own to the default package of your Vaadin application. This file should define +at least one destination where to save the log messages. + +You can also log through SLF4J, which is used in and bundled with Liferay. +Follow the instructions in <<advanced.logging.slf4j>>. + + +[[advanced.logging.slf4j]] +== Piping to Log4j using SLF4J + +((("Log4j"))) +((("SLF4J"))) +Piping output from [package]#java.util.logging# to Log4j is easy with SLF4J ( +http://slf4j.org/). The basic way to go about this is to add the SLF4J JAR file +as well as the [filename]#jul-to-slf4j.jar# file, which implements the bridge +from [package]#java.util.logging#, to SLF4J. You will also need to add a third +logging implementation JAR file, that is, [filename]#slf4j-log4j12-x.x.x.jar#, +to log the actual messages using Log4j. For more info on this, please visit the +SLF4J site. + +In order to get the [package]#java.util.logging# to SLF4J bridge installed, you +need to add the following snippet of code to your [classname]#UI# class at the +very top://TODO: Sure it's UI class and not the +servlet? + + +[source, java] +---- + static { + SLF4JBridgeHandler.install(); + } +---- + +This will make sure that the bridge handler is installed and working before +Vaadin starts to process any logging calls. + + +[WARNING] +.Please note! +==== +This can seriously impact on the cost of disabled logging statements (60-fold +increase) and a measurable impact on enabled log statements (20% overall +increase). However, Vaadin doesn't log very much, so the effect on performance +will be negligible. + +==== + + + + +[[advanced.logging.core]] +== Using Logger + +You can do logging with a simple pattern where you register a static logger +instance in each class that needs logging, and use this logger wherever logging +is needed in the class. For example: + + +[source, java] +---- +public class MyClass { + private final static Logger logger = + Logger.getLogger(MyClass.class.getName()); + + public void myMethod() { + try { + // do something that might fail + } catch (Exception e) { + logger.log(Level.SEVERE, "FAILED CATASTROPHICALLY!", e); + } + } +} +---- + +((("static"))) +((("memory +leak"))) +((("PermGen"))) +Having a [literal]#++static++# logger instance for each class needing logging +saves a bit of memory and time compared to having a logger for every logging +class instance. However, it could cause the application to leak PermGen memory +with some application servers when redeploying the application. The problem is +that the [classname]#Logger# may maintain hard references to its instances. As +the [classname]#Logger# class is loaded with a classloader shared between +different web applications, references to classes loaded with a per-application +classloader would prevent garbage-collecting the classes after redeploying, +hence leaking memory. As the size of the PermGen memory where class object are +stored is fixed, the leakage will lead to a server crash after many +redeployments. The issue depends on the way how the server manages classloaders, +on the hardness of the back-references, and may also be different between Java 6 +and 7. So, if you experience PermGen issues, or want to play it on the safe +side, you should consider using non-static [classname]#Logger# instances.//As +discussed in Forum thread 1175841 +(24.2.2012). + + +(((range="endofrange", startref="term.advanced.logging"))) + + diff --git a/documentation/advanced/advanced-navigator.asciidoc b/documentation/advanced/advanced-navigator.asciidoc new file mode 100644 index 0000000000..a03c05367f --- /dev/null +++ b/documentation/advanced/advanced-navigator.asciidoc @@ -0,0 +1,289 @@ +--- +title: Navigating in an Application +order: 9 +layout: page +--- + +[[advanced.navigator]] += Navigating in an Application + +Plain Vaadin applications do not have normal web page navigation as they usually +run on a single page, as all Ajax applications do. Quite commonly, however, +applications have different views between which the user should be able to +navigate. The [classname]#Navigator# in Vaadin can be used for most cases of +navigation. Views managed by the navigator automatically get a distinct URI +fragment, which can be used to be able to bookmark the views and their states +and to go back and forward in the browser history. + +[[advanced.navigator.navigating]] +== Setting Up for Navigation + +The [classname]#Navigator# class manages a collection of __views__ that +implement the [interfacename]#View# interface. The views can be either +registered beforehand or acquired from a __view provider__. When registering, +the views must have a name identifier and be added to a navigator with +[methodname]#addView()#. You can register new views at any point. Once +registered, you can navigate to them with [methodname]#navigateTo()#. + +[classname]#Navigator# manages navigation in a component container, which can be +either a [interfacename]#ComponentContainer# (most layouts) or a +[interfacename]#SingleComponentContainer# ( [classname]#UI#, [classname]#Panel#, +or [classname]#Window#). The component container is managed through a +[interfacename]#ViewDisplay#. Two view displays are defined: +[classname]#ComponentContainerViewDisplay# and +[classname]#SingleComponentContainerViewDisplay#, for the respective component +container types. Normally, you can let the navigator create the view display +internally, as we do in the example below, but you can also create it yourself +to customize it. + +Let us consider the following UI with two views: start and main. Here, we define +their names with enums to be typesafe. We manage the navigation with the UI +class itself, which is a [interfacename]#SingleComponentContainer#. + + +[source, java] +---- +public class NavigatorUI extends UI { + Navigator navigator; + protected static final String MAINVIEW = "main"; + + @Override + protected void init(VaadinRequest request) { + getPage().setTitle("Navigation Example"); + + // Create a navigator to control the views + navigator = new Navigator(this, this); + + // Create and register the views + navigator.addView("", new StartView()); + navigator.addView(MAINVIEW, new MainView()); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.navigator.basic[on-line example, window="_blank"]. + +The [classname]#Navigator# automatically sets the URI fragment of the +application URL. It also registers a [interfacename]#URIFragmentChangedListener# +in the page + +ifdef::web[] +(see <<dummy/../../../framework/advanced/advanced-urifu#advanced.urifu,"Managing +URI +Fragments">>) +endif::web[] + to show the view identified by the URI fragment if entered or navigated to in +the browser. This also enables browser navigation history in the application. + +[[advanced.navigator.navigating.viewprovider]] +=== View Providers + +You can create new views dynamically using a __view provider__ that implements +the [interfacename]#ViewProvider# interface. A provider is registered in +[classname]#Navigator# with [methodname]#addProvider()#. + +The [methodname]#ClassBasedViewProvider# is a view provider that can dynamically +create new instances of a specified view class based on the view name. + +The [methodname]#StaticViewProvider# returns an existing view instance based on +the view name. The [methodname]#addView()# in [classname]#Navigator# is actually +just a shorthand for creating a static view provider for each registered view. + + +[[advanced.navigator.navigating.viewchangelistener]] +=== View Change Listeners + +You can handle view changes also by implementing a +[interfacename]#ViewChangeListener# and adding it to a [classname]#Navigator#. +When a view change occurs, a listener receives a [classname]#ViewChangeEvent# +object, which has references to the old and the activated view, the name of the +activated view, as well as the fragment parameters. + + + +[[advanced.navigator.view]] +== Implementing a View + +Views can be any objects that implement the [interfacename]#View# interface. +When the [methodname]#navigateTo()# is called for the navigator, or the +application is opened with the URI fragment associated with the view, the +navigator switches to the view and calls its [methodname]#enter()# method. + +To continue with the example, consider the following simple start view that just +lets the user to navigate to the main view. It only pops up a notification when +the user navigates to it and displays the navigation button. + + +[source, java] +---- +/** A start view for navigating to the main view */ +public class StartView extends VerticalLayout implements View { + public StartView() { + setSizeFull(); + + Button button = new Button("Go to Main View", + new Button.ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + navigator.navigateTo(MAINVIEW); + } + }); + addComponent(button); + setComponentAlignment(button, Alignment.MIDDLE_CENTER); + } + + @Override + public void enter(ViewChangeEvent event) { + Notification.show("Welcome to the Animal Farm"); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.navigator.basic[on-line example, window="_blank"]. + +You can initialize the view content in the constructor, as was done in the +example above, or in the [methodname]#enter()# method. The advantage with the +latter method is that the view is attached to the view container as well as to +the UI at that time, which is not the case in the constructor. + + +[[advanced.navigator.urifragment]] +== Handling URI Fragment Path + +URI fragment part of a URL is the part after a hash [literal]#++#++# character. +Is used for within-UI URLs, because it is the only part of the URL that can be +changed with JavaScript from within a page without reloading the page. The URLs +with URI fragments can be used for hyperlinking and bookmarking, as well as +browser history, just like any other URLs. In addition, an exclamation mark +[literal]#++#!++# after the hash marks that the page is a stateful AJAX page, +which can be crawled by search engines. Crawling requires that the application +also responds to special URLs to get the searchable content. URI fragments are +managed by [classname]#Page#, which provides a low-level API. + +URI fragments can be used with [classname]#Navigator# in two ways: for +navigating to a view and to a state within a view. The URI fragment accepted by +[methodname]#navigateTo()# can have the view name at the root, followed by +fragment parameters after a slash (" [literal]#++/++#"). These parameters are +passed to the [methodname]#enter()# method in the [interfacename]#View#. + +In the following example, we implement within-view navigation. Here we use the +following declarative design for the view: + + +[source, html] +---- +<v-vertical-layout size-full> + <v-horizontal-layout size-full :expand> + <v-panel caption="List of Equals" height-full width-auto> + <v-vertical-layout _id="menuContent" width-auto margin/> + </v-panel> + + <v-panel _id="equalPanel" caption="An Equal" size-full :expand/> + </v-horizontal-layout> + + <v-button _id="logout">Logout</v-button> +</v-vertical-layout> +---- + +The view's logic code would be as follows: + + +[source, java] +---- +/** Main view with a menu (with declarative layout design) */ +@DesignRoot +public class MainView extends VerticalLayout implements View { + // Menu navigation button listener + class ButtonListener implements Button.ClickListener { + String menuitem; + public ButtonListener(String menuitem) { + this.menuitem = menuitem; + } + + @Override + public void buttonClick(ClickEvent event) { + // Navigate to a specific state + navigator.navigateTo(MAINVIEW + "/" + menuitem); + } + } + + VerticalLayout menuContent; + Panel equalPanel; + Button logout; + + public MainView() { + Design.read(this); + + menuContent.addComponent(new Button("Pig", + new ButtonListener("pig"))); + menuContent.addComponent(new Button("Cat", + new ButtonListener("cat"))); + menuContent.addComponent(new Button("Dog", + new ButtonListener("dog"))); + menuContent.addComponent(new Button("Reindeer", + new ButtonListener("reindeer"))); + menuContent.addComponent(new Button("Penguin", + new ButtonListener("penguin"))); + menuContent.addComponent(new Button("Sheep", + new ButtonListener("sheep"))); + + // Allow going back to the start + logout.addClickListener(event -> // Java 8 + navigator.navigateTo("")); + } + + @DesignRoot + class AnimalViewer extends VerticalLayout { + Label watching; + Embedded pic; + Label back; + + public AnimalViewer(String animal) { + Design.read(this); + + watching.setValue("You are currently watching a " + + animal); + pic.setSource(new ThemeResource( + "img/" + animal + "-128px.png")); + back.setValue("and " + animal + + " is watching you back"); + } + } + + @Override + public void enter(ViewChangeEvent event) { + if (event.getParameters() == null + || event.getParameters().isEmpty()) { + equalPanel.setContent( + new Label("Nothing to see here, " + + "just pass along.")); + return; + } else + equalPanel.setContent(new AnimalViewer( + event.getParameters())); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.navigator.basic[on-line example, window="_blank"]. + +The animal sub-view would have the following declarative design: + + +[source, html] +---- +<v-vertical-layout size-full> + <v-label _id="watching" size-auto :middle :center/> + <v-embedded _id="pic" :middle :center :expand/> + <v-label _id="back" size-auto :middle :center/> +</v-vertical-layout> +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.navigator.basic[on-line example, window="_blank"]. + +The main view is shown in <<figure.advanced.navigator.mainview>>. At this point, +the URL would be [literal]#++http://localhost:8080/myapp#!main/reindeer++#. + +[[figure.advanced.navigator.mainview]] +.Navigator Main View +image::img/navigator-mainview.png[] + + + + diff --git a/documentation/advanced/advanced-printing.asciidoc b/documentation/advanced/advanced-printing.asciidoc new file mode 100644 index 0000000000..9ed39eced1 --- /dev/null +++ b/documentation/advanced/advanced-printing.asciidoc @@ -0,0 +1,181 @@ +--- +title: Printing +order: 6 +layout: page +--- + +[[advanced.printing]] += Printing + +((("printing", id="term.advanced.printing", range="startofrange"))) + + +Vaadin does not have any special support for printing. There are two basic ways +to print - in a printer controlled by the application server or by the user from +the web browser. Printing in the application server is largely independent of +the UI, you just have to take care that printing commands do not block server +requests, possibly by running the print commands in another thread. + +((("[methodname]#print()#", id="term.advanced.printing.print", +range="startofrange"))) + + +((("JavaScript", "[methodname]#print()#", +id="term.advanced.printing.JavaScript.print", +range="startofrange"))) + + +For client-side printing, most browsers support printing the web page. You can +either print the current or a special print page that you open. The page can be +styled for printing with special CSS rules, and you can hide unwanted elements. +You can also print other than Vaadin UI content, such as HTML or PDF. + +[[advanced.printing.browserwindow]] +== Printing the Browser Window + +Vaadin does not have special support for launching the printing in browser, but +you can easily use the JavaScript [methodname]#print()# method that opens the +print window of the browser. + +((("JavaScript", "[methodname]#execute()#"))) + +[source, java] +---- +Button print = new Button("Print This Page"); +print.addClickListener(new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + // Print the current page + JavaScript.getCurrent().execute("print();"); + } +}); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.printing.this[on-line example, window="_blank"]. + +The button in the above example would print the current page, including the +button itself. You can hide such elements in CSS, as well as otherwise style the +page for printing. Style definitions for printing are defined inside a +[literal]#++@media print {}++# block in CSS. + + +[[advanced.printing.opening]] +== Opening a Print Window + +You can open a browser window with a special UI for print content and +automatically launch printing the content. + + +[source, java] +---- +public static class PrintUI extends UI { + @Override + protected void init(VaadinRequest request) { + // Have some content to print + setContent(new Label( + "<h1>Here's some dynamic content</h1>\n" + + "<p>This is to be printed.</p>", + ContentMode.HTML)); + + // Print automatically when the window opens + JavaScript.getCurrent().execute( + "setTimeout(function() {" + + " print(); self.close();}, 0);"); + } +} +... + +// Create an opener extension +BrowserWindowOpener opener = + new BrowserWindowOpener(PrintUI.class); +opener.setFeatures("height=200,width=400,resizable"); + +// A button to open the printer-friendly page. +Button print = new Button("Click to Print"); +opener.extend(print); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.printing.open[on-line example, window="_blank"]. + +How the browser opens the window, as an actual (popup) window or just a tab, +depends on the browser. After printing, we automatically close the window with +JavaScript [methodname]#close()# call. + +(((range="endofrange", startref="term.advanced.printing.print"))) +(((range="endofrange", startref="term.advanced.printing.JavaScript.print"))) + +[[advanced.printing.pdf]] +== Printing PDF + +((("PDF"))) +To print content as PDF, you need to provide the downloadable content as a +static or a dynamic resource, such as a [classname]#StreamResource#. + +You can let the user open the resource using a [classname]#Link# component, or +some other component with a [classname]#PopupWindowOpener# extension. When such +a link or opener is clicked, the browser opens the PDF in the browser, in an +external viewer (such as Adobe Reader), or lets the user save the document. + +It is crucial to notice that clicking a [classname]#Link# or a +[classname]#PopupWindowOpener# is a client-side operation. If you get the +content of the dynamic PDF from the same UI state, you can not have the link or +opener enabled, as then clicking it would not get the current UI content. +Instead, you have to create the resource object before the link or opener are +clicked. This usually requires a two-step operation, or having the print +operation available in another view. + + +[source, java] +---- +// A user interface for a (trivial) data model from which +// the PDF is generated. +final TextField name = new TextField("Name"); +name.setValue("Slartibartfast"); + +// This has to be clicked first to create the stream resource +final Button ok = new Button("OK"); + +// This actually opens the stream resource +final Button print = new Button("Open PDF"); +print.setEnabled(false); + +ok.addClickListener(new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + // Create the PDF source and pass the data model to it + StreamSource source = + new MyPdfSource((String) name.getValue()); + + // Create the stream resource and give it a file name + String filename = "pdf_printing_example.pdf"; + StreamResource resource = + new StreamResource(source, filename); + + // These settings are not usually necessary. MIME type + // is detected automatically from the file name, but + // setting it explicitly may be necessary if the file + // suffix is not ".pdf". + resource.setMIMEType("application/pdf"); + resource.getStream().setParameter( + "Content-Disposition", + "attachment; filename="+filename); + + // Extend the print button with an opener + // for the PDF resource + BrowserWindowOpener opener = + new BrowserWindowOpener(resource); + opener.extend(print); + + name.setEnabled(false); + ok.setEnabled(false); + print.setEnabled(true); + } +}); + +layout.addComponent(name); +layout.addComponent(ok); +layout.addComponent(print); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.printing.pdfgeneration[on-line example, window="_blank"]. + + +(((range="endofrange", startref="term.advanced.printing"))) + + diff --git a/documentation/advanced/advanced-push.asciidoc b/documentation/advanced/advanced-push.asciidoc new file mode 100644 index 0000000000..df9279c6bb --- /dev/null +++ b/documentation/advanced/advanced-push.asciidoc @@ -0,0 +1,417 @@ +--- +title: Server Push +order: 16 +layout: page +--- + +[[advanced.push]] += Server Push + +When you need to update a UI from another UI, possibly of another user, or from +a background thread running in the server, you usually want to have the update +show immediately, not when the browser happens to make the next server request. +For this purpose, you can use __server push__ that sends the data to the browser +immediately. Push is based on a client-server connection, usually a WebSocket +connection, that the client establishes and the server can then use to send +updates to the client. + +The server-client communication is done by default with a WebSocket connection +if the browser and the server support it. If not, Vaadin will fall back to a +method supported by the browser. Vaadin Push uses a custom build of the +link:https://github.com/Atmosphere/atmosphere[Atmosphere framework] for +client-server communication. + +[[advanced.push.installation]] +== Installing the Push Support + +The server push support in Vaadin requires the separate Vaadin Push library. It +is included in the installation package as [filename]#vaadin-push.jar#. + +[[advanced.push.installation.ivy]] +=== Retrieving with Ivy + +With Ivy, you can get it with the following declaration in the +[filename]#ivy.xml#: + + +[source, xml] +---- +<dependency org="com.vaadin" name="vaadin-push" + rev="&vaadin.version;" conf="default->default"/> +---- + +In some servers, you may need to exlude a [literal]#++sl4j++# dependency as +follows: + + +[source, xml] +---- +<dependency org="com.vaadin" name="vaadin-push" + rev="&vaadin.version;" conf="default->default"> + <exclude org="org.slf4j" name="slf4j-api"/> +</dependency> +---- + +Pay note that the Atmosphere library is a bundle, so if you retrieve the +libraries with Ant, for example, you need to retrieve +[literal]#++type="jar,bundle"++#. + + +[[advanced.push.installation.maven]] +=== Retrieving with Maven + +In Maven, you can get the push library with the following dependency in the POM: + + +[source, xml] +---- +<dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-push</artifactId> + <version>${vaadin.version}</version> +</dependency> +---- + + + +[[advanced.push.enabling]] +== Enabling Push for a UI + +To enable server push, you need to define the push mode either in the deployment +descriptor or with the [classname]#@Push# annotation for the UI. + +[[advanced.push.enabling.pushmode]] +=== Push Modes + +You can use server push in two modes: [literal]#++automatic++# and +[literal]#++manual++#. The automatic mode pushes changes to the browser +automatically after access() finishes. With the manual mode, you can do the push +explicitly with [methodname]#push()#, which allows more flexibility. + + +[[advanced.push.enabling.pushmode]] +=== The [classname]#@Push# annotation + +You can enable server push for a UI with the [classname]#@Push# annotation as +follows. It defaults to automatic mode ( [parameter]#PushMode.AUTOMATIC#). + + +[source, java] +---- +@Push +public class PushyUI extends UI { +---- + +To enable manual mode, you need to give the [parameter]#PushMode.MANUAL# +parameter as follows: + + +[source, java] +---- +@Push(PushMode.MANUAL) +public class PushyUI extends UI { +---- + + +[[advanced.push.enabling.servlet]] +=== Servlet Configuration + +You can enable the server push and define the push mode also in the servlet +configuration with the [parameter]#pushmode# parameter for the servlet in the +[filename]#web.xml# deployment descriptor. If you use a Servlet 3.0 compatible +server, you also want to enable asynchronous processing with the +[literal]#++async-supported++# parameter. Note the use of Servlet 3.0 schema in +the deployment descriptor. + + +[subs="normal"] +---- +<?xml version="1.0" encoding="UTF-8"?> +<web-app + id="WebApp_ID" version="**3.0**" + xmlns="**http://java.sun.com/xml/ns/javaee**" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="**http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd**"> + <servlet> + <servlet-name>Pushy UI</servlet-name> + <servlet-class> + com.vaadin.server.VaadinServlet</servlet-class> + + <init-param> + <param-name>UI</param-name> + <param-value>**com.example.my.PushyUI**</param-value> + </init-param> + + <!-- Enable server push --> + <init-param> + <param-name>pushmode</param-name> + <param-value>**automatic**</param-value> + </init-param> + <async-supported>**true**</async-supported> + </servlet> +</web-app> +---- + +[[advanced.push.running]] +== Accessing UI from Another Thread + +Making changes to a [classname]#UI# object from another thread and pushing them +to the browser requires locking the user session when accessing the UI. +Otherwise, the UI update done from another thread could conflict with a regular +event-driven update and cause either data corruption or deadlocks. Because of +this, you may only access an UI using the [methodname]#access()# method, which +locks the session to prevent conflicts. It takes a [interfacename]#Runnable# +which it executes as its parameter. + +For example: + + +[source, java] +---- +ui.access(new Runnable() { + @Override + public void run() { + series.add(new DataSeriesItem(x, y)); + } +}); +---- + +In Java 8, where a parameterless lambda expression creates a runnable, you could +simply write: + + +[source, java] +---- +ui.access(() -> + series.add(new DataSeriesItem(x, y))); +---- + +If the push mode is [literal]#++manual++#, you need to push the pending UI +changes to the browser explicitly with the [methodname]#push()# method. + + +[source, java] +---- +ui.access(new Runnable() { + @Override + public void run() { + series.add(new DataSeriesItem(x, y)); + ui.push(); + } +}); +---- + +Below is a complete example of a case where we make UI changes from another +thread. + + +[source, java] +---- +public class PushyUI extends UI { + Chart chart = new Chart(ChartType.AREASPLINE); + DataSeries series = new DataSeries(); + + @Override + protected void init(VaadinRequest request) { + chart.setSizeFull(); + setContent(chart); + + // Prepare the data display + Configuration conf = chart.getConfiguration(); + conf.setTitle("Hot New Data"); + conf.setSeries(series); + + // Start the data feed thread + new FeederThread().start(); + } + + class FeederThread extends Thread { + int count = 0; + + @Override + public void run() { + try { + // Update the data for a while + while (count < 100) { + Thread.sleep(1000); + + access(new Runnable() { + @Override + public void run() { + double y = Math.random(); + series.add( + new DataSeriesItem(count++, y), + true, count > 10); + } + }); + } + + // Inform that we have stopped running + access(new Runnable() { + @Override + public void run() { + setContent(new Label("Done!")); + } + }); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.push.simple[on-line example, window="_blank"]. + +When sharing data between UIs or user sessions, you need to consider the +message-passing mechanism more carefully, as explained next. + + +[[advanced.push.pusharound]] +== Broadcasting to Other Users + +Broadcasting messages to be pushed to UIs in other user sessions requires having +some sort of message-passing mechanism that sends the messages to all UIs that +register as recipients. As processing server requests for different UIs is done +concurrently in different threads of the application server, locking the threads +properly is very important to avoid deadlock situations. + +[[advanced.push.pusharound.broadcaster]] +=== The Broadcaster + +The standard pattern for sending messages to other users is to use a +__broadcaster__ singleton that registers the UIs and broadcasts messages to them +safely. To avoid deadlocks, it is recommended that the messages should be sent +through a message queue in a separate thread. Using a Java +[classname]#ExecutorService# running in a single thread is usually the easiest +and safest way. + + +[source, java] +---- +public class Broadcaster implements Serializable { + static ExecutorService executorService = + Executors.newSingleThreadExecutor(); + + public interface BroadcastListener { + void receiveBroadcast(String message); + } + + private static LinkedList<BroadcastListener> listeners = + new LinkedList<BroadcastListener>(); + + public static synchronized void register( + BroadcastListener listener) { + listeners.add(listener); + } + + public static synchronized void unregister( + BroadcastListener listener) { + listeners.remove(listener); + } + + public static synchronized void broadcast( + final String message) { + for (final BroadcastListener listener: listeners) + executorService.execute(new Runnable() { + @Override + public void run() { + listener.receiveBroadcast(message); + } + }); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.push.pusharound[on-line example, window="_blank"]. + +In Java 8, you could use lambda expressions for the listeners instead of the +interface, and a parameterless expression to create the runnable: + + +[source, java] +---- +for (final Consumer<String> listener: listeners) + executorService.execute(() -> + listener.accept(message)); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.push.pusharound[on-line example, window="_blank"]. + + +[[advanced.push.pusharound.receiving]] +=== Receiving Broadcasts + +The receivers need to implement the receiver interface and register to the +broadcaster to receive the broadcasts. A listener should be unregistered when +the UI expires. When updating the UI in a receiver, it should be done safely as +described earlier, by executing the update through the [methodname]#access()# +method of the UI. + + +[source, java] +---- +@Push +public class PushAroundUI extends UI + implements Broadcaster.BroadcastListener { + + VerticalLayout messages = new VerticalLayout(); + + @Override + protected void init(VaadinRequest request) { + ... build the UI ... + + // Register to receive broadcasts + Broadcaster.register(this); + } + + // Must also unregister when the UI expires + @Override + public void detach() { + Broadcaster.unregister(this); + super.detach(); + } + + @Override + public void receiveBroadcast(final String message) { + // Must lock the session to execute logic safely + access(new Runnable() { + @Override + public void run() { + // Show it somehow + messages.addComponent(new Label(message)); + } + }); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.push.pusharound[on-line example, window="_blank"]. + + +[[advanced.push.pusharound.sending]] +=== Sending Broadcasts + +To send broadcasts with a broadcaster singleton, such as the one described +above, you would only need to call the [methodname]#broadcast()# method as +follows. + + +[source, java] +---- +final TextField input = new TextField(); +sendBar.addComponent(input); + +Button send = new Button("Send"); +send.addClickListener(new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + // Broadcast the message + Broadcaster.broadcast(input.getValue()); + + input.setValue(""); + } +}); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.push.pusharound[on-line example, window="_blank"]. + + + + + diff --git a/documentation/advanced/advanced-requesthandler.asciidoc b/documentation/advanced/advanced-requesthandler.asciidoc new file mode 100644 index 0000000000..df991bc5cd --- /dev/null +++ b/documentation/advanced/advanced-requesthandler.asciidoc @@ -0,0 +1,96 @@ +--- +title: Request Handlers +order: 4 +layout: page +--- + +[[advanced.requesthandler]] += Request Handlers + +Request handlers are useful for catching request parameters or generating +dynamic content, such as HTML, images, PDF, or other content. You can provide +HTTP content also with stream resources, as described in +<<dummy/../../../framework/application/application-resources#application.resources.stream,"Stream +Resources">>. The stream resources, however, are only usable from within a +Vaadin application, such as in an [classname]#Image# component. Request handlers +allow responding to HTTP requests made with the application URL, including GET +or POST parameters. You could also use a separate servlet to generate dynamic +content, but a request handler is associated with the user session and it can +easily access data associated with the session and the user. + +To handle requests, you need to implement the [interfacename]#RequestHandler# +interface. The [methodname]#handleRequest()# method gets the session, request, +and response objects as parameters. + +If the handler writes a response, it must return [literal]#++true++#. This stops +running other possible request handlers. Otherwise, it should return +[literal]#++false++# so that another handler could return a response. +Eventually, if no other handler writes a response, a UI will be created and +initialized. + +In the following example, we catch requests for a sub-path in the URL for the +servlet and write a plain text response. The servlet path consists of the +context path and the servlet (sub-)path. Any additional path is passed to the +request handler in the [parameter]#pathInfo# of the request. For example, if the +full path is [filename]#/myapp/myui/rhexample#, the path info will be +[filename]#/rhexample#. Also, request parameters are available. + + +[source, java] +---- +// A request handler for generating some content +VaadinSession.getCurrent().addRequestHandler( + new RequestHandler() { + @Override + public boolean handleRequest(VaadinSession session, + VaadinRequest request, + VaadinResponse response) + throws IOException { + if ("/rhexample".equals(request.getPathInfo())) { + // Generate a plain text document + response.setContentType("text/plain"); + response.getWriter().append( + "Here's some dynamically generated content.\n"); + response.getWriter().format(Locale.ENGLISH, + "Time: %Tc\n", new Date()); + + // Use shared session data + response.getWriter().format("Session data: %s\n", + session.getAttribute("mydata")); + + return true; // We wrote a response + } else + return false; // No response was written + } +}); +---- + +A request handler can be used by embedding it in a page or opening a new page +with a link or a button. In the following example, we pass some data to the +handler through a session attribute. + + +[source, java] +---- +// Input some shared data in the session +TextField dataInput = new TextField("Some data"); +dataInput.addValueChangeListener(event -> + VaadinSession.getCurrent().setAttribute("mydata", + event.getProperty().getValue())); +dataInput.setValue("Here's some"); + +// Determine the base path for the servlet +String servletPath = VaadinServlet.getCurrent() + .getServletContext().getContextPath() + + "/book"; // Servlet + +// Display the page in a pop-up window +Link open = new Link("Click to Show the Page", + new ExternalResource(servletPath + "/rhexample"), + "_blank", 500, 350, BorderStyle.DEFAULT); + +layout.addComponents(dataInput, open); +---- + + + diff --git a/documentation/advanced/advanced-security.asciidoc b/documentation/advanced/advanced-security.asciidoc new file mode 100644 index 0000000000..d3b0a5249c --- /dev/null +++ b/documentation/advanced/advanced-security.asciidoc @@ -0,0 +1,56 @@ +--- +title: Common Security Issues +order: 8 +layout: page +--- + +[[advanced.security]] += Common Security Issues + +[[advanced.security.sanitizing]] +== Sanitizing User Input to Prevent Cross-Site Scripting + +You can put raw HTML content in many components, such as the [classname]#Label# +and [classname]#CustomLayout#, as well as in tooltips and notifications. In such +cases, you should make sure that if the content has any possibility to come from +user input, you must make sure that the content is safe before displaying it. +Otherwise, a malicious user can easily make a +link:http://en.wikipedia.org/wiki/Cross-site_scripting[cross-site scripting +attack] by injecting offensive JavaScript code in such components. See other +sources for more information about cross-site scripting. + +Offensive code can easily be injected with [literal]#++<script>++# markup or in +tag attributes as events, such as +[parameter]#onLoad#.//// +TODO Consider an example, Alice, Bob, +etc. +//// +Cross-site scripting vulnerabilities are browser dependent, depending on the +situations in which different browsers execute scripting markup. + +Therefore, if the content created by one user is shown to other users, the +content must be sanitized. There is no generic way to sanitize user input, as +different applications can allow different kinds of input. Pruning (X)HTML tags +out is somewhat simple, but some applications may need to allow (X)HTML content. +It is therefore the responsibility of the application to sanitize the input. + +Character encoding can make sanitization more difficult, as offensive tags can +be encoded so that they are not recognized by a sanitizer. This can be done, for +example, with HTML character entities and with variable-width encodings such as +UTF-8 or various CJK encodings, by abusing multiple representations of a +character. Most trivially, you could input [literal]#++<++# and [literal]#++>++# +with [literal]#++<++# and [literal]#++>++#, respectively. The input could +also be malformed and the sanitizer must be able to interpret it exactly as the +browser would, and different browsers can interpret malformed HTML and +variable-width character encodings differently. + +Notice that the problem applies also to user input from a +[classname]#RichTextArea# is transmitted as HTML from the browser to server-side +and is not sanitized. As the entire purpose of the [classname]#RichTextArea# +component is to allow input of formatted text, you can not just remove all HTML +tags. Also many attributes, such as [parameter]#style#, should pass through the +sanitization. + + + + diff --git a/documentation/advanced/advanced-shortcuts.asciidoc b/documentation/advanced/advanced-shortcuts.asciidoc new file mode 100644 index 0000000000..a3c57a3d25 --- /dev/null +++ b/documentation/advanced/advanced-shortcuts.asciidoc @@ -0,0 +1,292 @@ +--- +title: Shortcut Keys +order: 5 +layout: page +--- + +[[advanced.shortcuts]] += Shortcut Keys + +Vaadin provides simple ways to define shortcut keys for field components, as +well as to a default button, and a lower-level generic shortcut API based on +actions. + +A __shortcut__ is an action that is executed when a key or key combination is +pressed within a specific scope in the UI. The scope can be the entire +[classname]#UI# or a [classname]#Window# inside it. + +[[advanced.shortcuts.defaultbutton]] +== Shortcut Keys for Default Buttons + +You can add a __click shortcut__ to a button to set it as "default" button; +pressing the defined key, typically Enter, in any component in the scope +(sub-window or UI) causes a click event for the button to be fired. + +You can define a click shortcut with the [methodname]#setClickShortcut()# +shorthand method: + + +[source, java] +---- +// Have an OK button and set it as the default button +Button ok = new Button("OK"); +ok.setClickShortcut(KeyCode.ENTER); +ok.addStyleName(ValoTheme.BUTTON_PRIMARY); +---- + +The [methodname]#setClickShortcut()# is a shorthand method to create, add, and +manage a [classname]#ClickShortcut#, rather than to add it with +[methodname]#addShortcutListener()#. + +Themes offer special button styles to show that a button is special. In the Valo +theme, you can use the [literal]#++BUTTON_PRIMARY++# style name. The result can +be seen in <<figure.advanced.shortcuts.defaultbutton>>. + +[[figure.advanced.shortcuts.defaultbutton]] +.Default Button with Click Shortcut +image::img/shortcut-defaultbutton.png[] + + +[[advanced.shortcuts.focus]] +== Field Focus Shortcuts + +You can define a shortcut key that sets the focus to a field component (any +component that inherits [classname]#AbstractField#) by adding a +[classname]#FocusShortcut# as a shortcut listener to the field. + +The constructor of the [classname]#FocusShortcut# takes the field component as +its first parameter, followed by the key code, and an optional list of modifier +keys, as listed in <<advanced.shortcuts.keycodes>>. + + +[source, java] +---- +// A field with Alt+N bound to it +TextField name = new TextField("Name (Alt+N)"); +name.addShortcutListener( + new AbstractField.FocusShortcut(name, KeyCode.N, + ModifierKey.ALT)); +layout.addComponent(name); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.shortcut.focus[on-line example, window="_blank"]. + +You can also specify the shortcut by a shorthand notation, where the shortcut +key is indicated with an ampersand ( [literal]#++&++#). + + +[source, java] +---- +// A field with Alt+A bound to it, using shorthand notation +TextField address = new TextField("Address (Alt+A)"); +address.addShortcutListener( + new AbstractField.FocusShortcut(address, "&Address")); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.shortcut.focus[on-line example, window="_blank"]. + +This is especially useful for internationalization, so that you can determine +the shortcut key from the localized string. + + +[[advanced.shortcuts.actions]] +== Generic Shortcut Actions + +Shortcut keys can be defined as __actions__ using the +[classname]#ShortcutAction# class. It extends the generic [classname]#Action# +class that is used for example in [classname]#Tree# and [classname]#Table# for +context menus. Currently, the only classes that accept +[classname]#ShortcutAction#s are [classname]#Window# and [classname]#Panel#. + +To handle key presses, you need to define an action handler by implementing the +[classname]#Handler# interface. The interface has two methods that you need to +implement: [methodname]#getActions()# and [methodname]#handleAction()#. + +The [methodname]#getActions()# method must return an array of +[classname]#Action# objects for the component, specified with the second +parameter for the method, the [parameter]#sender# of an action. For a keyboard +shortcut, you use a [classname]#ShortcutAction#. The implementation of the +method could be following: + + +[source, java] +---- +// Have the unmodified Enter key cause an event +Action action_ok = new ShortcutAction("Default key", + ShortcutAction.KeyCode.ENTER, null); + +// Have the C key modified with Alt cause an event +Action action_cancel = new ShortcutAction("Alt+C", + ShortcutAction.KeyCode.C, + new int[] { ShortcutAction.ModifierKey.ALT }); + +Action[] actions = new Action[] {action_cancel, action_ok}; + +public Action[] getActions(Object target, Object sender) { + if (sender == myPanel) + return actions; + + return null; +} +---- + +The returned [classname]#Action# array may be static or you can create it +dynamically for different senders according to your needs. + +The constructor of [classname]#ShortcutAction# takes a symbolic caption for the +action; this is largely irrelevant for shortcut actions in their current +implementation, but might be used later if implementors use them both in menus +and as shortcut actions. The second parameter is the key code and the third a +list of modifier keys, which are listed in <<advanced.shortcuts.keycodes>>. + +The following example demonstrates the definition of a default button for a user +interface, as well as a normal shortcut key, AltC for clicking the +[guibutton]#Cancel# button. + + +[source, java] +---- +public class DefaultButtonExample extends CustomComponent + implements Handler { + // Define and create user interface components + Panel panel = new Panel("Login"); + FormLayout formlayout = new FormLayout(); + TextField username = new TextField("Username"); + TextField password = new TextField("Password"); + HorizontalLayout buttons = new HorizontalLayout(); + + // Create buttons and define their listener methods. + Button ok = new Button("OK", this, "okHandler"); + Button cancel = new Button("Cancel", this, "cancelHandler"); + + // Have the unmodified Enter key cause an event + Action action_ok = new ShortcutAction("Default key", + ShortcutAction.KeyCode.ENTER, null); + + // Have the C key modified with Alt cause an event + Action action_cancel = new ShortcutAction("Alt+C", + ShortcutAction.KeyCode.C, + new int[] { ShortcutAction.ModifierKey.ALT }); + + public DefaultButtonExample() { + // Set up the user interface + setCompositionRoot(panel); + panel.addComponent(formlayout); + formlayout.addComponent(username); + formlayout.addComponent(password); + formlayout.addComponent(buttons); + buttons.addComponent(ok); + buttons.addComponent(cancel); + + // Set focus to username + username.focus(); + + // Set this object as the action handler + panel.addActionHandler(this); + } + + /** + * Retrieve actions for a specific component. This method + * will be called for each object that has a handler; in + * this example just for login panel. The returned action + * list might as well be static list. + */ + public Action[] getActions(Object target, Object sender) { + System.out.println("getActions()"); + return new Action[] { action_ok, action_cancel }; + } + + /** + * Handle actions received from keyboard. This simply directs + * the actions to the same listener methods that are called + * with ButtonClick events. + */ + public void handleAction(Action action, Object sender, + Object target) { + if (action == action_ok) { + okHandler(); + } + if (action == action_cancel) { + cancelHandler(); + } + } + + public void okHandler() { + // Do something: report the click + formlayout.addComponent(new Label("OK clicked. " + + "User=" + username.getValue() + ", password=" + + password.getValue())); + } + + public void cancelHandler() { + // Do something: report the click + formlayout.addComponent(new Label("Cancel clicked. User=" + + username.getValue() + ", password=" + + password.getValue())); + } +} +---- + +Notice that the keyboard actions can currently be attached only to +[classname]#Panel#s and [classname]#Window#s. This can cause problems if you +have components that require a certain key. For example, multi-line +[classname]#TextField# requires the Enter key. There is currently no way to +filter the shortcut actions out while the focus is inside some specific +component, so you need to avoid such conflicts. + + +[[advanced.shortcuts.keycodes]] +== Supported Key Codes and Modifier Keys + +The shortcut key definitions require a key code to identify the pressed key and +modifier keys, such as Shift, Alt, or Ctrl, to specify a key combination. + +The key codes are defined in the [classname]#ShortcutAction.KeyCode# interface +and are: + +Keys [parameter]#A#to[parameter]#Z#:: Normal letter keys +[parameter]#F1#to[parameter]#F12#:: Function keys + +[parameter]#BACKSPACE#,[parameter]#DELETE#,[parameter]#ENTER#,[parameter]#ESCAPE#,[parameter]#INSERT#,[parameter]#TAB#:: Control keys + +[parameter]#NUM0#to[parameter]#NUM9#:: Number pad keys + +[parameter]#ARROW_DOWN#,[parameter]#ARROW_UP#,[parameter]#ARROW_LEFT#,[parameter]#ARROW_RIGHT#:: Arrow keys + +[parameter]#HOME#,[parameter]#END#,[parameter]#PAGE_UP#,[parameter]#PAGE_DOWN#:: Other movement keys + + + +Modifier keys are defined in [classname]#ShortcutAction.ModifierKey# and are: + +[parameter]#ModifierKey.ALT#:: Alt key +[parameter]#ModifierKey.CTRL#:: Ctrl key +[parameter]#ModifierKey.SHIFT#:: Shift key + + +All constructors and methods accepting modifier keys take them as a variable +argument list following the key code, separated with commas. For example, the +following defines a CtrlShiftN key combination for a shortcut. + + +[source, java] +---- +TextField name = new TextField("Name (Ctrl+Shift+N)"); +name.addShortcutListener( + new AbstractField.FocusShortcut(name, KeyCode.N, + ModifierKey.CTRL, + ModifierKey.SHIFT)); +---- + +=== Supported Key Combinations + +The actual possible key combinations vary greatly between browsers, as most +browsers have a number of built-in shortcut keys, which can not be used in web +applications. For example, Mozilla Firefox allows binding almost any key +combination, while Opera does not even allow binding Alt shortcuts. Other +browsers are generally in between these two. Also, the operating system can +reserve some key combinations and some computer manufacturers define their own +system key combinations. + + + + + diff --git a/documentation/advanced/advanced-spring.asciidoc b/documentation/advanced/advanced-spring.asciidoc new file mode 100644 index 0000000000..7f83b864fd --- /dev/null +++ b/documentation/advanced/advanced-spring.asciidoc @@ -0,0 +1,696 @@ +--- +title: Vaadin Spring Add-on +order: 18 +layout: page +--- + +[[advanced.spring]] += Vaadin Spring Add-on + +((("Vaadin Spring", id="term.advanced.spring.springlong", range="startofrange"))) + + +((("Spring", id="term.advanced.spring.spring", range="startofrange"))) + + +Vaadin Spring and Vaadin Spring Boot add-ons make it easier to use Spring in +Vaadin applications. Vaadin Spring enables Spring dependency injection with +custom UI and view providers, and provides three custom scopes: +[classname]#UIScope#, [classname]#ViewScope#, and +[classname]#VaadinSessionScope#. + +API documentation for add-ons is available at: + +* Vaadin Spring API at link:https://vaadin.com/api/vaadin-spring[vaadin.com/api/vaadin-spring] +* Vaadin Spring Boot API at link:https://vaadin.com/api/vaadin-spring-boot[vaadin.com/api/vaadin-spring-boot] + +To learn more about Vaadin Spring, the +link:https://vaadin.com/wiki/-/wiki/Main/Vaadin+Spring[Vaadin Spring Tutorial] +gives a hands-on introduction. The source code of the Spring Tutorial demo is +available for browsing or cloning at +link:https://github.com/Vaadin/spring-tutorial[github.com/Vaadin/spring-tutorial]. + +[[advanced.spring.spring]] +== Spring Overview + +__Spring Framework__ is a Java application framework that provides many useful +services for building applications, such as authentication, authorization, data +access, messaging, testing, and so forth. In the Spring core, one of the central +features is dependency injection, which accomplishes inversion of control for +dependency management in managed beans. Other Spring features rely on it +extensively. As such, Spring offers capabilities similar to CDI, but with +integration with other Spring services. Spring is well-suited for applications +where Vaadin provides the UI layer and Spring is used for other aspects of the +application logic. + +__Spring Boot__ is a Spring application development tool that allows creating +Spring applications easily. __Vaadin Spring Boot__ builds on Spring Boot to +allow creating Vaadin Spring applications easily. It starts up a servlet, +handles the configuration of the application context, registers a UI provider, +and so forth. + +Regarding general Spring topics, we recommend the following Spring +documentation: + +ifdef::web[] +* link:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/[Spring +Framework Reference Documentation]. + +* link:http://projects.spring.io/spring-framework/[Spring Project] + +* link:https://vaadin.com/wiki/-/wiki/Main/Vaadin+Spring[Vaadin Spring Tutorial] + +endif::web[] + +[[advanced.spring.spring.injection]] +=== Dependency Injection + +__Dependency injection__ is a way to pass dependencies (service objects) to +dependent objects (clients) by injecting them in member variables or initializer +parameters, instead of managing the lifecycle in the clients or passing them +explicitly as parameters. In Spring, injection of a service object to a client +is configured with the [classname]#@Autowired# annotation. + +For a very typical example in a web application, you could have a user data +object associated with a user session: + + +[source, java] +---- +@SpringComponent +@VaadinSessionScope +public class User implements Serializable { + private String name; + + public void setName(String name) {this.name = name;} + public String getName() {return name;} +} +---- + +The [classname]#@SpringComponent# annotation allows for automatic detection of +managed beans by Spring. (The annotation is exactly the same as the regular +Spring [classname]#@Component#, but has been given an alias, because Vaadin has +a [interfacename]#Component# interface, which can cause trouble.) + +Now, if we have a UI view that depends on user data, we could inject the data in +the client as follows: + + +[source, java] +---- +public class MainView extends CustomComponent implements View { + User user; + Label greeting = new Label(); + + @Autowired + public MainView(User user) { + this.user = user; + ... + } + + ... + @Override + public void enter(ViewChangeEvent event) { + // Then you can use the injected data + // for some purpose + greeting.setValue("Hello, " + user.getName()); + } +} +---- + +Here, we injected the user object in the constructor. The user object would be +created automatically when the view is created, with all such references +referring to the same shared instance in the scope of the Vaadin user session. + + +[[advanced.spring.spring.contexts]] +=== Contexts and Scopes + +__Contexts__ in Spring are services that manage the lifecycle of objects and +handle their injection. Generally speaking, a context is a situation in which an +instance is used with a unique identity. Such objects are essentially +"singletons" in the context. While conventional singletons are application-wide, +objects managed by a Spring container can be "singletons" in a more narrow +__scope__: a user session, a particular UI instance associated with the session, +a view within the UI, or even just a single request. Such a context defines the +lifecycle of the object: its creation, use, and finally its destruction. + +Earlier, we introduced a user class defined as session-scoped: + + +[source, java] +---- +@SpringComponent +@VaadinSessionScope +public class User { +---- + +Now, when you need to refer to the user, you can use Spring injection to inject +the session-scoped "singleton" to a member variable or a constructor parameter; +the former in the following: + + +[source, java] +---- +public class MainView extends CustomComponent implements View { + @Autowired + User user; + + Label greeting = new Label(); + ... + + @Override + public void enter(ViewChangeEvent event) { + greeting.setValue("Hello, " + user.getName()); + } +} +---- + + + +[[advanced.spring.boot]] +== Quick Start with Vaadin Spring Boot + +The Vaadin Spring Boot is an add-on that allows for easily creating a project +that uses Vaadin Spring. It is meant to be used together with Spring Boot, which +enables general Spring functionalities in a web application. + +You can use the Spring Initializr at +link:https://start.spring.io/[start.spring.io] website to generate a project, +which you can then download as a package and import in your IDE. The generated +project is a Spring application stub; you need to add at least Vaadin +dependencies ( [literal]#++vaadin-spring-boot++#, [literal]#++vaadin-themes++#, +and [literal]#++vaadin-client-compiled++#) and a UI class to the generated +project, as well as a theme, and so forth. + +See the link:https://vaadin.com/wiki/-/wiki/Main/Vaadin+Spring[Vaadin Spring +Tutorial] for detailed instructions for using Spring Boot. + + +[[advanced.spring.installation]] +== Installing Vaadin Spring Add-on + +Vaadin Spring requires a Java EE 7 compatible servlet container, such as +Glassfish or Apache TomEE Web Profile, as mentioned for the reference toolchain +in +<<dummy/../../../framework/getting-started/getting-started-environment#getting-started.environment,"Setting +up the Development Environment">>. + +To install the Vaadin Spring and/or Vaadin Spring Boot add-ons, either define +them as an Ivy or Maven dependency or download from the Vaadin Directory add-on +page at <<,vaadin.com/directory#addon/vaadin-spring>> or +<<,vaadin.com/directory#addon/vaadin-spring-boot>>. See +<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using +Vaadin Add-ons">> for general instructions for installing and using Vaadin +add-ons. + +The Ivy dependency is as follows: + +[subs="normal"] +---- + <dependency org="com.vaadin" name="vaadin-spring" + rev="[replaceable]#latest.release#"/> +---- +The Maven dependency is as follows: + +[subs="normal"] +---- + <dependency> + <groupId>com.vaadin</groupId> + <artifactId>vaadin-spring</artifactId> + <version>[replaceable]#LATEST#</version> + </dependency> +---- + +[[advanced.spring.peparing]] +== Preparing Application for Spring + +A Vaadin application that uses Spring must have a file named +[filename]#applicationContext.xml# in the [filename]#WEB-INF# directory. + +[subs="normal"] +---- +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-4.1.xsd"> + + //Configuration object + + <bean class="[replaceable]#com.example.myapp.MySpringUI.MyConfiguration#" /> + + //Location for automatically scanned beans + + <context:component-scan + base-package="[replaceable]#com.example.myapp.domain#" /> +</beans> +---- +The application should not have a servlet extending [classname]#VaadinServlet#, +as Vaadin servlet has its own [classname]#VaadinSpringServlet# that is deployed +automatically. If you need multiple servlets or need to customize the Vaadin +Spring servlet, see <<advanced.spring.deployment>>. + +You can configure managed beans explicitly in the file, or configure them to be +scanned using the annotations, which is the preferred way described in this +section. + + +[[advanced.spring.springui]] +== Injecting a UI with [classname]#@SpringUI# + +((("[classname]#@SpringUI#", id="term.advanced.spring.springui", range="startofrange"))) + + +Vaadin Spring offers an easier way to instantiate UIs and to define the URL +mapping for them than the usual ways described in +<<dummy/../../../framework/application/application-environment#application.environment,"Deploying +an Application">>. It is also needed for enabling Spring features in the UI. To +define a UI class that should be instantiated for a given URL, you simply need +to annotate the class with [classname]#@SpringUI#. It takes an optional path as +parameter. + + +[source, java] +---- +@SpringUI(path="/myniceui") +@Theme("valo") +public class MyNiceUI extends UI { + ... +---- + +The path in the URL for accessing the UI consists of the context path of the +application and the UI path, for example, [literal]#++/myapp/myniceui++#. Giving +empty UI path maps the UI to the root of the application context, for example, +[literal]#++/myapp++#. + + +[source, java] +---- +@SpringUI +---- + +See <<advanced.spring.deployment>> for how to handle servlet URL mapping of +Spring UIs when working with multiple servlets in the same web application. + +(((range="endofrange", startref="term.advanced.spring.springui"))) + +[[advanced.spring.scopes]] +== Scopes + +((("Spring", "scopes", id="term.advanced.spring.scopes", range="startofrange"))) + + +As in programming languages, where a variable name refers to a unique object +within the scope of the variable, an object has unique identity within a scope +in Spring. However, instead of identifying the objects by variable names, they +are identified by their type (object class) and any qualifiers they may have. + +The scope of an object can be defined with an annotation to the class as +follows: + + +[source, java] +---- +@VaadinSessionScope +public class User { + ... +---- + +Defining a scope in Spring is normally done with the [classname]#@Scope# +annotation. For example, [literal]#++@Scope("prototype")++# creates a new +instance every time one is requested/auto-wired. Such standard scopes can be +used with some limitations. For example, Spring session and request scopes do +not work in background threads and with certain push transport modes. + +Vaadin Spring provides three scopes useful in Vaadin applications: a session +scope, a UI scope, a view scope, all defined in the +[package]#com.vaadin.spring.annotation# package. + +[[advanced.spring.scopes.session]] +=== [classname]#@VaadinSessionScope# + +The session scope is the broadest of the custom scopes defined in Vaadin Spring. +Objects in the Vaadin session scope are unique in a user session, and shared +between all UIs open in the session. This is the most basic scope in Vaadin +applications, useful for accessing data for the user associated with the +session. It is also useful when updating UIs from a background thread, as in +those cases the UI access is locked on the session and also data should be in +that scope. + + +[[advanced.spring.scopes.ui]] +=== [classname]#@UIScope# + +UI-scoped beans are uniquely identified within a UI instance, that is, a browser +window or tab. The lifecycle of UI-scoped beans is bound between to the +initialization and closing of a UI. Whenever you inject a bean, as long as you +are within the same UI, you will get the same instance. + +Annotating a Spring view (annotated with [classname]#@SpringView# as described +later) also as [classname]#@UIScoped# makes the view retain the same instance +when the user navigates away and back to the view. + + +[[advanced.spring.scopes.view]] +=== [classname]#@ViewScope# + +The annotation enables the view scope in a bean. The lifecycle of such a bean +starts when the user navigates to a view referring to the object and ends when +the user navigates out of the view (or when the UI is closed or expires). + +Views themselves are by default view-scoped, so a new instance is created every +time the user navigates to the view. + + +(((range="endofrange", startref="term.advanced.spring.scopes"))) + +ifdef::web[] +[[advanced.spring.navigation]] +== View Navigation + +Vaadin Spring extends the navigation framework in Vaadin, described in +<<dummy/../../../framework/advanced/advanced-navigator#advanced.navigator,"Navigating +in an Application">>. It manages Spring views with a special view provider and +enables view scoping. + +[[advanced.spring.navigation.ui]] +=== Preparing the UI + +You can define navigation for any single-component container, as described in +<<dummy/../../../framework/advanced/advanced-navigator#advanced.navigator.navigating,"Setting +Up for Navigation">>, but typically you set up navigation for the entire UI +content. To use Vaadin Spring views, you need to inject a +[classname]#SpringViewProvider# in the UI and add it as a provider for the +navigator. + + +[source, java] +---- +@SpringUI(path="/myspringui") +public class MySpringUI extends UI { + @Autowired + SpringViewProvider viewProvider; + + @Override + protected void init(VaadinRequest request) { + Navigator navigator = new Navigator(this, this); + navigator.addProvider(viewProvider); + + // Navigate to start view + navigator.navigateTo(""); + } +} +---- + + +[[advanced.spring.navigation.view]] +=== The View + +A view managed by Vaadin Spring only needs to have the [classname]#@SpringView# +annotation, which registers the view in the [classname]#SpringViewProvider#. The +annotation is also necessary to enable Spring features in the view, such as +injection. + + +[source, java] +---- +@SpringView(name=MainView.NAME) +public class MainView extends CustomComponent implements View { + public static final String NAME = "main"; + ... +---- + +The annotation can have the following optional paramers: + +name (optional):: Specifies the path by which the view can be accessed programmatically and by the +URI fragment. + + ++ +[source, java] +---- +@SpringView(name="main") +---- ++ +If the view name is not given, it is derived from the class name by removing a +possible "View" suffix, making it lower case, and using a dash ("-") to separate +words originally denoted by capital letters. Thereby, a view class such as +[classname]#MyFunnyView# would have name " [literal]#++my-funny++#". + ++ +It is a recommended pattern to have the view name in a static member constant in +the view class, as was done in the example previously, so that the name can be +referred to safely. + +supportsParameters:: Specifies whether view parameters can be passed to the view as a suffix to the +name in the navigation state, that is, in the form of +[literal]#++viewname+viewparameters++#. The view name is merely a prefix and +there is no separator nor format for the parameters, but those are left for the +view to handle. The parameter support mode is disabled by default. + + ++ +[source, java] +---- +@SpringView(name="myview", supportsParameters=true) +---- ++ +You could then navigate to the state with a URI fragment such as +[literal]#++#!myview/someparameter++# or programmatically with: + + ++ +[source, java] +---- +getUI().getNavigator().navigateTo("myview/someparameter"); +---- ++ +The [methodname]#enter()# method of the view gets the URI fragment as parameter +as is and can interpret it in any application-defined way. + ++ +Note that in this mode, matching a navigation state to a view is done by the +prefix of the fragment! Thereby, no other views may start with the name of the +view as prefix. For example, if the view name is " [literal]#++main++#", you +must not have a view named " [literal]#++maintenance++#". + +uis:: If the application has multiple UIs that use [classname]#SpringViewProvider#, +you can use this parameter to specify which UIs can show the view. + + ++ +[source, java] +---- +@SpringView(name="myview", uis={MySpringUI.class}) +---- ++ +If the list contains [parameter]#UI.class#, the view is available to all UIs. + + ++ +[source, java] +---- +@SpringView(name="myview", uis={UI.class}) +---- + + +In the following, we have a login view that accesses a session-scoped user +object. Here, we use a constant to define the view name, so that we can use the +constant when navigating to it. + + +[source, java] +---- +@SpringView(name=LoginView.NAME) +public class LoginView extends CustomComponent + implements View { + public final static String NAME = ""; + + // Here we inject to the constructor and actually do + // not store the injected object to use it later + @Autowired + public LoginView(User user) { + VerticalLayout layout = new VerticalLayout(); + + // An input field for editing injected data + BeanItem<User> item = new BeanItem<User>(user); + TextField username = new TextField("User name", + item.getItemProperty("name")); + username.setNullRepresentation(""); + layout.addComponent(username); + + // Login button (authentication omitted) / Java 8 + layout.addComponent(new Button("Login", e -> + getUI().getNavigator(). + navigateTo(MainView.VIEWNAME))); + + setCompositionRoot(layout); + } + + @Override + public void enter(ViewChangeEvent event) {} +} +---- + +You could now navigate to the view from any other view in the UI with: + + +[source, java] +---- +getUI().getNavigator().navigateTo(LoginView.VIEWNAME); +---- + + +endif::web[] + +[[advanced.spring.accesscontrol]] +== Access Control + +Access control for views can be implemented by registering beans implementing +[interfacename]#ViewAccessControl# or +[interfacename]#ViewInstanceAccessControl#, which can restrict access to the +view either before or after a view instance is created. + +Integration with authorization solutions, such as Spring Security, is provided +by additional unofficial add-ons on top of Vaadin Spring. + +[[advanced.spring.accesscontrol.accessdenied]] +=== Access Denied View + +By default, the view provider acts as if a denied view didn't exist. You can set +up an "Access Denied" view that is shown if the access is denied with +[methodname]#setAccessDeniedView()# in [classname]#SpringViewProvider#. + + +[source, java] +---- +@Autowired +SpringViewProvider viewProvider; + +@Override +protected void init(VaadinRequest request) { + Navigator navigator = new Navigator(this, this); + navigator.addProvider(viewProvider); + + // Set up access denied view + viewProvider.setAccessDeniedViewClass( + MyAccessDeniedView.class); +---- + + + +[[advanced.spring.deployment]] +== Deploying Spring UIs and Servlets + +Vaadin Spring hooks into Vaadin framework by using a special +[classname]#VaadinSpringServlet#. As described earlier, you do not need to map +an URL path to a UI, as it is handled by Vaadin Spring. However, in the +following, we go through some cases where you need to customize the servlet or +use Spring with non-Spring servlets and UIs in a web application. + +[[advanced.spring.servlets.custom]] +=== Custom Servlets + +When customizing the Vaadin servlet, as outlined in +<<dummy/../../../framework/application/application-lifecycle#application.lifecycle.servlet-service,"Vaadin +Servlet, Portlet, and Service">>, you simply need to extend +[classname]#com.vaadin.spring.internal.VaadinSpringServlet# instead of +[classname]#com.vaadin.servlet.VaadinServlet#. + +[subs="normal"] +---- +@WebServlet(value = "[replaceable]#/*#", asyncSupported = true) +public class [replaceable]#MySpringServlet# extends SpringVaadinServlet { +} +---- +The custom servlet must not have [classname]#@VaadinServletConfiguration#, as +you would normally with a Vaadin servlet, as described in +<<dummy/../../../framework/application/application-environment#application.environment,"Deploying +an Application">>. + + +[[advanced.spring.deployment.urlmapping]] +=== Defining Servlet Root + +Spring UIs are managed by a Spring servlet ( [classname]#VaadinSpringServlet#), +which is by default mapped to the root of the application context. For example, +if the name of a Spring UI is " [literal]#++my-spring-ui++#" and application +context is [literal]#++/myproject++#, the UI would by default have URL " +[literal]#++/myproject/my-spring-ui++#". If you do not want to have the servlet +mapped to context root, you can use a [classname]#@WebServlet# annotation for +the servlet or a [filename]#web.xml# definition to map all Spring UIs to a +sub-path. + +For example, if we have a root UI and another: + +[subs="normal"] +---- +@SpringUI(path=[replaceable]#""#) // At Spring servlet root +public class [replaceable]#MySpringRootUI# extends UI {...} + +@SpringUI("[replaceable]#another#") +public class [replaceable]#AnotherUI# extends UI {...} +---- +Then define a path for the servlet by defining a custom servlet: + +[subs="normal"] +---- +@WebServlet(value = "[replaceable]#/myspringuis/*#", asyncSupported = true) +public class [replaceable]#MySpringServlet# extends SpringVaadinServlet { +} +---- +These two UIs would have URLs /myproject/myspringuis and +/myproject/myspringuis/another, respectively. + +You can also map the Spring servlet to another URL in servlet definition in +[filename]#web.xml#, as described the following. + + +[[advanced.spring.servlets.mixing]] +=== Mixing With Other Servlets + +The [classname]#VaadinSpringServlet# is normally used as the default servlet, +but if you have other servlets in the application, such as for non-Spring UIs, +you need to define the Spring servlet explicitly in the [filename]#web.xml#. You +can map the servlet to any URL path, but perhaps typically, you define it as the +default servlet as follows, and map the other servlets to other URL paths: + +[subs="normal"] +---- +<web-app> + ... + + <servlet> + <servlet-name>Default</servlet-name> + <servlet-class> + com.vaadin.spring.internal.VaadinSpringServlet + </servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>Default</servlet-name> + <url-pattern>[replaceable]#/myspringuis/*#</url-pattern> + </servlet-mapping> + + <servlet-mapping> + <servlet-name>Default</servlet-name> + <url-pattern>/VAADIN/*</url-pattern> + </servlet-mapping> +</web-app> +---- +With such a setting, paths to Spring UIs would have base path +[filename]#/myapp/myspringuis#, to which the (optional) UI path would be +appended. The [filename]#/VAADIN/*# only needs to be mapped to the servlet if +there are no other Vaadin servlets. + + + +(((range="endofrange", startref="term.advanced.spring.springlong"))) +(((range="endofrange", startref="term.advanced.spring.spring"))) + + diff --git a/documentation/advanced/advanced-urifu.asciidoc b/documentation/advanced/advanced-urifu.asciidoc new file mode 100644 index 0000000000..709d6c4bd3 --- /dev/null +++ b/documentation/advanced/advanced-urifu.asciidoc @@ -0,0 +1,191 @@ +--- +title: Managing URI Fragments +order: 11 +layout: page +--- + +[[advanced.urifu]] += Managing URI Fragments + +A major issue in AJAX applications is that as they run in a single web page, +bookmarking the application URL (or more generally the __URI__) can only +bookmark the application, not an application state. This is a problem for many +applications, such as product catalogs and discussion forums, in which it would +be good to provide links to specific products or messages. Consequently, as +browsers remember the browsing history by URI, the history and the +[guibutton]#Back# button do not normally work. The solution is to use the +__fragment identifier__ part of the URI, which is separated from the primary +part (address + path + optional query parameters) of the URI with the hash (#) +character. For example: + + +---- +http://example.com/path#myfragment +---- + +The exact syntax of the fragment identifier part is defined in RFC 3986 +(Internet standard STD 66) that defines the URI syntax. A fragment may only +contain the regular URI __path characters__ (see the standard) and additionally +the slash and the question mark. + +Vaadin offers two ways to enable the use of URI fragments: the high-level +[classname]#Navigator# utility described in +<<dummy/../../../framework/advanced/advanced-navigator#advanced.navigator,"Navigating +in an Application">> and the low-level API described here. + +[[advanced.urifu.setting]] +== Setting the URI Fragment + +You can set the current fragment identifier with the +[methodname]#setUriFragment()# method in the [classname]#Page# object. + + +[source, java] +---- +Page.getCurrent().setUriFragment("mars"); +---- + +Setting the URI fragment causes an [interfacename]#UriFragmentChangeEvent#, +which is processed in the same server request. As with UI rendering, the URI +fragment is changed in the browser after the currently processed server request +returns the response. + +Prefixing the fragment identifier with an exclamation mark enables the web +crawler support described in <<advanced.urifu.crawling>>. + + +[[advanced.urifu.reading]] +== Reading the URI Fragment + +The current URI fragment can be acquired with the [methodname]#getUriFragment()# +method from the current [classname]#Page# object. The fragment is known when the +[methodname]#init()# method of the UI is called. + + +[source, java] +---- +// Read initial URI fragment to create UI content +String fragment = getPage().getUriFragment(); +enter(fragment); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.urifragment.basic[on-line example, window="_blank"]. + +To enable reusing the same code when the URI fragment is changed, as described +next, it is usually best to build the relevant part of the UI in a separate +method. In the above example, we called an [methodname]#enter()# method, in a +way that is similar to handling view changes with [classname]#Navigator#. + + +[[advanced.urifu.listening]] +== Listening for URI Fragment Changes + +After the UI has been initialized, changes in the URI fragment can be handled +with a [interfacename]#UriFragmentChangeListener#. The listeners are called when +the URI fragment changes, but not when the UI is initialized, where the current +fragment is available from the page object as described earlier. + +For example, we could define the listener as follows in the [methodname]#init()# +method of a UI class: + + +[source, java] +---- +public class MyUI extends UI { + @Override + protected void init(VaadinRequest request) { + getPage().addUriFragmentChangedListener( + new UriFragmentChangedListener() { + public void uriFragmentChanged( + UriFragmentChangedEvent source) { + enter(source.getUriFragment()); + } + }); + + // Read the initial URI fragment + enter(getPage().getUriFragment()); + } + + void enter(String fragment) { + ... initialize the UI ... + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.urifragment.basic[on-line example, window="_blank"]. + +<<figure.advanced.urifu>> shows an application that allows specifying the menu +selection with a URI fragment and correspondingly sets the fragment when the +user selects a menu item. + +[[figure.advanced.urifu]] +.Application State Management with URI Fragment Utility +image::img/urifu-1.png[] + + +[[advanced.urifu.crawling]] +== Supporting Web Crawling + +Stateful AJAX applications can not normally be crawled by a search engine, as +they run in a single page and a crawler can not navigate the states even if URI +fragments are enabled. The Google search engine and crawler +link:http://googlewebmastercentral.blogspot.fi/2009/10/proposal-for-making-ajax-crawlable.html[support +a convention] where the fragment identifiers are prefixed with exclamation mark, +such as [literal]#++#!myfragment++#. The servlet needs to have a separate +searchable content page accessible with the same URL, but with a +[literal]#++_escaped_fragment_++# parameter. For example, for +[literal]#++/myapp/myui#!myfragment++# it would be +[literal]#++/myapp/myui?_escaped_fragment_=myfragment++#. + +You can provide the crawl content by overriding the [methodname]#service()# +method in a custom servlet class. For regular requests, you should call the +super implementation in the [classname]#VaadinServlet# class. + + +[source, java] +---- +public class MyCustomServlet extends VaadinServlet + @Override + protected void service(HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException { + String fragment = request + .getParameter("_escaped_fragment_"); + if (fragment != null) { + response.setContentType("text/html"); + Writer writer = response.getWriter(); + writer.append("<html><body>"+ + "<p>Here is some crawlable "+ + "content about " + fragment + "</p>"); + + // A list of all crawlable pages + String items[] = {"mercury", "venus", + "earth", "mars"}; + writer.append("<p>Index of all content:</p><ul>"); + for (String item: items) { + String url = request.getContextPath() + + request.getServletPath() + + request.getPathInfo() + "#!" + item; + writer.append("<li><a href='" + url + "'>" + + item + "</a></li>"); + } + writer.append("</ul></body>"); + } else + super.service(request, response); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#advanced.urifragment.basic[on-line example, window="_blank"]. + +The crawlable content does not need to be human readable. It can provide an +index of links to other application states, as we did in the example above. The +links should use the " [literal]#++#!++#" notation, but can not be relative to +avoid having the [literal]#++_escaped_fragment_++# parameter. + +You need to use the custom servlet class in the [filename]#web.xml# deployment +descriptor instead of the normal [classname]#VaadinServlet# class, as described +in +<<dummy/../../../framework/application/application-environment#application.environment.web-xml,"Using +a web.xml Deployment Descriptor">>. + + + + diff --git a/documentation/advanced/advanced-windows.asciidoc b/documentation/advanced/advanced-windows.asciidoc new file mode 100644 index 0000000000..741812ffd2 --- /dev/null +++ b/documentation/advanced/advanced-windows.asciidoc @@ -0,0 +1,180 @@ +--- +title: Handling Browser Windows +order: 1 +layout: page +--- + +[[advanced.windows]] += Handling Browser Windows + +The UI of a Vaadin application runs in a web page displayed in a browser window +or tab. An application can be used from multiple UIs in different windows or +tabs, either opened by the user using an URL or by the Vaadin application. + +In addition to native browser windows, Vaadin has a [classname]#Window# +component, which is a floating panel or __sub-window__ inside a page, as +described in +<<dummy/../../../framework/layout/layout-sub-window#layout.sub-window,"Sub-Windows">>. + +* __Native popup windows__. An application can open popup windows for sub-tasks. +* __Page-based browsing__. The application can allow the user to open certain content to different windows. For example, in a messaging application, it can be useful to open different messages to different windows so that the user can browse through them while writing a new message. +* __Bookmarking__. Bookmarks in the web browser can provide an entry-point to some content provided by an application. +* __Embedding UIs__. UIs can be embedded in web pages, thus making it possible to provide different views to an application from different pages or even from the same page, while keeping the same session. See <<dummy/../../../framework/advanced/advanced-embedding#advanced.embedding,"Embedding UIs in Web Pages">>. + +Use of multiple windows in an application may require defining and providing +different UIs for the different windows. The UIs of an application share the +same user session, that is, the [classname]#VaadinSession# object, as described +in +<<dummy/../../../framework/application/application-lifecycle#application.lifecycle.session,"User +Session">>. Each UI is identified by a URL that is used to access it, which +makes it possible to bookmark application UIs. UI instances can even be created +dynamically based on the URLs or other request parameters, such as browser +information, as described in +<<dummy/../../../framework/application/application-lifecycle#application.lifecycle.ui,"Loading +a UI">>. + +Because of the special nature of AJAX applications, use of multiple windows uses +require some +caveats.//// +TODO Re-enable We will go through them later in <xref +linkend="advanced.windows.caveats"/>. +//// + +[[advanced.windows.popup]] +== Opening Popup Windows + +((("popup windows"))) +((("windows", "popup"))) +Popup windows are native browser windows or tabs opened by user interaction with +an existing window. Due to browser security reasons, it is made incovenient for +a web page to open popup windows using JavaScript commands. At the least, the +browser will ask for a permission to open the popup, if it is possible at all. +This limitation can be circumvented by letting the browser open the new window +or tab directly by its URL when the user clicks some target. This is realized in +Vaadin with the [classname]#BrowserWindowOpener# component extension, which +causes the browser to open a window or tab when the component is clicked. + +[[advanced.windows.popup.ui]] +=== The Popup Window UI + +A popup Window displays an [classname]#UI#. The UI of a popup window is defined +just like a main UI in a Vaadin application, and it can have a theme, title, and +so forth. + +For example: + + +[source, java] +---- +@Theme("book-examples") +public static class MyPopupUI extends UI { + @Override + protected void init(VaadinRequest request) { + getPage().setTitle("Popup Window"); + + // Have some content for it + VerticalLayout content = new VerticalLayout(); + Label label = + new Label("I just popped up to say hi!"); + label.setSizeUndefined(); + content.addComponent(label); + content.setComponentAlignment(label, + Alignment.MIDDLE_CENTER); + content.setSizeFull(); + setContent(content); + } +} +---- + + +[[advanced.windows.popup.popping]] +=== Popping It Up + +A popup window is opened using the [classname]#BrowserWindowOpener# extension, +which you can attach to any component. The constructor of the extension takes +the class object of the UI class to be opened as a parameter. + +You can configure the features of the popup window with +[methodname]#setFeatures()#. It takes as its parameter a comma-separated list of +window features, as defined in the HTML specification. + +status=[parameter]#0|1#:: Whether the status bar at the bottom of the window should be enabled. +[parameter]##:: +scrollbars:: Enables scrollbars in the window if the document area is bigger than the view area of the window. +resizable:: Allows the user to resize the browser window (no effect for tabs). +menubar:: Enables the browser menu bar. +location:: Enables the location bar. +toolbar:: Enables the browser toolbar. +height=[parameter]#value#:: Specifies the height of the window in pixels. +width=[parameter]#value#:: Specifies the width of the window in pixels. + + +For example: + + +[source, java] +---- +// Create an opener extension +BrowserWindowOpener opener = + new BrowserWindowOpener(MyPopupUI.class); +opener.setFeatures("height=200,width=300,resizable"); + +// Attach it to a button +Button button = new Button("Pop It Up"); +opener.extend(button); +---- + +The resulting popup window, which appears when the button is clicked, is shown +in <<figure.advanced.windows.popup.popping>>. + +[[figure.advanced.windows.popup.popping]] +.A Popup Window +image::img/windows-popup.png[] + + +[[advanced.windows.popup.target]] +=== Popup Window Name (Target) + +The target name is one of the default HTML target names ( [parameter]#_new#, +[parameter]#_blank#, [parameter]#_top#, etc.) or a custom target name. How the +window is exactly opened depends on the browser. Browsers that support tabbed +browsing can open the window in another tab, depending on the browser settings. + + +[[advanced.windows.popup.url]] +=== URL and Session + +The URL path for a popup window UI is by default determined from the UI class +name, by prefixig it with " [literal]#++popup/++#". For example, for the example +UI giver earlier, the URL would be +[literal]#++/book-examples/book/popup/MyPopupUI++#. + + + +[[advanced.windows.popup-closing]] +== Closing Popup Windows + +Besides closing popup windows from a native window close button, you can close +them programmatically by calling the JavaScript [methodname]#close()# method as +follows. + + +[source, java] +---- +public class MyPopup extends UI { + @Override + protected void init(VaadinRequest request) { + setContent(new Button("Close Window", event -> {// Java 8 + // Close the popup + JavaScript.eval("close()"); + + // Detach the UI from the session + getUI().close(); + })); + } +} +---- + + + + diff --git a/documentation/advanced/chapter-advanced.asciidoc b/documentation/advanced/chapter-advanced.asciidoc new file mode 100644 index 0000000000..b14abfdda1 --- /dev/null +++ b/documentation/advanced/chapter-advanced.asciidoc @@ -0,0 +1,41 @@ +[[advanced]] +== Advanced Web Application Topics + +This chapter covers various features and topics often needed in applications. + + +include::advanced-windows.asciidoc[leveloffset=+2] + +include::advanced-embedding.asciidoc[leveloffset=+2] + +include::advanced-debug.asciidoc[leveloffset=+2] + +include::advanced-requesthandler.asciidoc[leveloffset=+2] + +include::advanced-shortcuts.asciidoc[leveloffset=+2] + +include::advanced-printing.asciidoc[leveloffset=+2] + +include::advanced-gae.asciidoc[leveloffset=+2] + +include::advanced-security.asciidoc[leveloffset=+2] + +include::advanced-navigator.asciidoc[leveloffset=+2] + +include::advanced-architecture.asciidoc[leveloffset=+2] + +include::advanced-urifu.asciidoc[leveloffset=+2] + +include::advanced-dragndrop.asciidoc[leveloffset=+2] + +include::advanced-logging.asciidoc[leveloffset=+2] + +include::advanced-javascript.asciidoc[leveloffset=+2] + +include::advanced-global.asciidoc[leveloffset=+2] + +include::advanced-push.asciidoc[leveloffset=+2] + +include::advanced-cdi.asciidoc[leveloffset=+2] + +include::advanced-spring.asciidoc[leveloffset=+2] diff --git a/documentation/advanced/img/cdi-events-observing.png b/documentation/advanced/img/cdi-events-observing.png Binary files differnew file mode 100644 index 0000000000..c61c6b2ea9 --- /dev/null +++ b/documentation/advanced/img/cdi-events-observing.png diff --git a/documentation/advanced/img/debug-hierarchy-tree.png b/documentation/advanced/img/debug-hierarchy-tree.png Binary files differnew file mode 100644 index 0000000000..4ff97b7821 --- /dev/null +++ b/documentation/advanced/img/debug-hierarchy-tree.png diff --git a/documentation/advanced/img/debug-info.png b/documentation/advanced/img/debug-info.png Binary files differnew file mode 100644 index 0000000000..f607251917 --- /dev/null +++ b/documentation/advanced/img/debug-info.png diff --git a/documentation/advanced/img/debug-log-hi.png b/documentation/advanced/img/debug-log-hi.png Binary files differnew file mode 100644 index 0000000000..47b926b0d7 --- /dev/null +++ b/documentation/advanced/img/debug-log-hi.png diff --git a/documentation/advanced/img/debug-log-lo.png b/documentation/advanced/img/debug-log-lo.png Binary files differnew file mode 100644 index 0000000000..3fea86822a --- /dev/null +++ b/documentation/advanced/img/debug-log-lo.png diff --git a/documentation/advanced/img/debug-window-analyze-layouts.png b/documentation/advanced/img/debug-window-analyze-layouts.png Binary files differnew file mode 100644 index 0000000000..d57078e287 --- /dev/null +++ b/documentation/advanced/img/debug-window-analyze-layouts.png diff --git a/documentation/advanced/img/debug-window-annotated-hi.png b/documentation/advanced/img/debug-window-annotated-hi.png Binary files differnew file mode 100644 index 0000000000..2d7db8ee8e --- /dev/null +++ b/documentation/advanced/img/debug-window-annotated-hi.png diff --git a/documentation/advanced/img/debug-window-annotated-lo.png b/documentation/advanced/img/debug-window-annotated-lo.png Binary files differnew file mode 100644 index 0000000000..2079d75785 --- /dev/null +++ b/documentation/advanced/img/debug-window-annotated-lo.png diff --git a/documentation/advanced/img/debug-window.png b/documentation/advanced/img/debug-window.png Binary files differnew file mode 100644 index 0000000000..65807bc081 --- /dev/null +++ b/documentation/advanced/img/debug-window.png diff --git a/documentation/advanced/img/embedding3.png b/documentation/advanced/img/embedding3.png Binary files differnew file mode 100644 index 0000000000..8ee600a2ec --- /dev/null +++ b/documentation/advanced/img/embedding3.png diff --git a/documentation/advanced/img/mvp-pattern-hi.png b/documentation/advanced/img/mvp-pattern-hi.png Binary files differnew file mode 100644 index 0000000000..550ded7bb8 --- /dev/null +++ b/documentation/advanced/img/mvp-pattern-hi.png diff --git a/documentation/advanced/img/mvp-pattern-lo.png b/documentation/advanced/img/mvp-pattern-lo.png Binary files differnew file mode 100644 index 0000000000..07099ac6f1 --- /dev/null +++ b/documentation/advanced/img/mvp-pattern-lo.png diff --git a/documentation/advanced/img/navigator-mainview.png b/documentation/advanced/img/navigator-mainview.png Binary files differnew file mode 100644 index 0000000000..485ece46c9 --- /dev/null +++ b/documentation/advanced/img/navigator-mainview.png diff --git a/documentation/advanced/img/shortcut-defaultbutton.png b/documentation/advanced/img/shortcut-defaultbutton.png Binary files differnew file mode 100644 index 0000000000..9757c6e120 --- /dev/null +++ b/documentation/advanced/img/shortcut-defaultbutton.png diff --git a/documentation/advanced/img/threadlocal-concurrency-hi.png b/documentation/advanced/img/threadlocal-concurrency-hi.png Binary files differnew file mode 100644 index 0000000000..86412d5fe2 --- /dev/null +++ b/documentation/advanced/img/threadlocal-concurrency-hi.png diff --git a/documentation/advanced/img/threadlocal-concurrency-lo.png b/documentation/advanced/img/threadlocal-concurrency-lo.png Binary files differnew file mode 100644 index 0000000000..a2269b9904 --- /dev/null +++ b/documentation/advanced/img/threadlocal-concurrency-lo.png diff --git a/documentation/advanced/img/threadlocal-sequentiality-hi.png b/documentation/advanced/img/threadlocal-sequentiality-hi.png Binary files differnew file mode 100644 index 0000000000..20abd7b889 --- /dev/null +++ b/documentation/advanced/img/threadlocal-sequentiality-hi.png diff --git a/documentation/advanced/img/threadlocal-sequentiality-lo.png b/documentation/advanced/img/threadlocal-sequentiality-lo.png Binary files differnew file mode 100644 index 0000000000..b45f2e47d5 --- /dev/null +++ b/documentation/advanced/img/threadlocal-sequentiality-lo.png diff --git a/documentation/advanced/img/urifu-1.png b/documentation/advanced/img/urifu-1.png Binary files differnew file mode 100644 index 0000000000..b2b01f28c9 --- /dev/null +++ b/documentation/advanced/img/urifu-1.png diff --git a/documentation/advanced/img/window-polling-example1.png b/documentation/advanced/img/window-polling-example1.png Binary files differnew file mode 100644 index 0000000000..75b2532cd0 --- /dev/null +++ b/documentation/advanced/img/window-polling-example1.png diff --git a/documentation/advanced/img/windows-popup.png b/documentation/advanced/img/windows-popup.png Binary files differnew file mode 100644 index 0000000000..0076324eaf --- /dev/null +++ b/documentation/advanced/img/windows-popup.png diff --git a/documentation/advanced/original-drawings/cdi-events-messaging.svg b/documentation/advanced/original-drawings/cdi-events-messaging.svg new file mode 100644 index 0000000000..2c9d56352f --- /dev/null +++ b/documentation/advanced/original-drawings/cdi-events-messaging.svg @@ -0,0 +1,2926 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2475"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="cdi-events-messaging.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
+ inkscape:export-xdpi="600.02155"
+ inkscape:export-ydpi="600.02155"
+ version="1.0">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10"
+ guidetolerance="10"
+ objecttolerance="6"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="203.09088"
+ inkscape:cy="731.33425"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1672"
+ inkscape:window-height="1019"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ units="mm"
+ inkscape:snap-global="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-guide="true"
+ inkscape:snap-intersection-line-segments="true"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ spacingy="1mm"
+ spacingx="1mm"
+ empspacing="5"
+ units="mm"
+ enabled="true"
+ visible="true"
+ id="grid4674"
+ type="xygrid"
+ dotted="false"
+ originx="0mm"
+ originy="0mm" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2477">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient10356">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop10358" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop10360" />
+ </linearGradient>
+ <pattern
+ patternUnits="userSpaceOnUse"
+ width="19.488184"
+ height="5.3149635"
+ patternTransform="translate(442.02756,179.82281)"
+ id="pattern31837">
+ <path
+ id="path31833"
+ d="M 0.88582677,4.4291368 L 18.602357,4.4291368"
+ style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path31835"
+ d="M 0.88582677,0.88582677 L 18.602357,0.88582677"
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </pattern>
+ <pattern
+ inkscape:collect="always"
+ xlink:href="#pattern31837"
+ id="pattern31843"
+ patternTransform="matrix(0.8219623,-0.5106659,0.5106659,0.8219623,407.01829,190.47423)" />
+ <pattern
+ inkscape:collect="always"
+ xlink:href="#pattern31843"
+ id="pattern39357"
+ patternTransform="matrix(1.2292733,-0.7637186,0.7637186,1.2292733,703.27252,730.47938)" />
+ <marker
+ inkscape:stockid="CurvyCross"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="CurvyCross"
+ style="overflow:visible">
+ <g
+ id="g18903"
+ transform="scale(0.6)">
+ <path
+ id="path18905"
+ d="M 4.6254930,-5.0456926 C 1.8654930,-5.0456926 -0.37450702,-2.8056926 -0.37450702,-0.045692580 C -0.37450702,2.7143074 1.8654930,4.9543074 4.6254930,4.9543074"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none" />
+ <path
+ id="path18907"
+ d="M -5.4129913,-5.0456926 C -2.6529913,-5.0456926 -0.41299131,-2.8056926 -0.41299131,-0.045692580 C -0.41299131,2.7143074 -2.6529913,4.9543074 -5.4129913,4.9543074"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none" />
+ </g>
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient4794"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient4590"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient841"
+ id="linearGradient4390"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9208103,1.086)"
+ x1="10.800377"
+ y1="-94.637573"
+ x2="116.61332"
+ y2="-94.637573" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient4376"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient3095"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ id="linearGradient1683">
+ <stop
+ style="stop-color:#db1f0c;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1684" />
+ <stop
+ style="stop-color:#761006;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop1685" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient24714"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ id="linearGradient2263">
+ <stop
+ style="stop-color:#ff9696;stop-opacity:0.61960787;"
+ offset="0"
+ id="stop2264" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.70103091;"
+ offset="1.0000000"
+ id="stop2265" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2891">
+ <stop
+ style="stop-color:#ff0000;stop-opacity:0.68041235;"
+ offset="0"
+ id="stop2892" />
+ <stop
+ style="stop-color:#ff0000;stop-opacity:0.14432989;"
+ offset="1"
+ id="stop2893" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient24524"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutL"
+ style="overflow:visible">
+ <path
+ id="path3964"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.8,0.8)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient2870"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient239278"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ id="linearGradient865">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop866" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.00000000;"
+ offset="1.0000000"
+ id="stop868" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1400">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.67843139;"
+ offset="0.0000000"
+ id="stop1401" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.32941177;"
+ offset="0.56999999"
+ id="stop1403" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.00000000;"
+ offset="1.0000000"
+ id="stop1402" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient233706"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ y2="383.76529"
+ y1="843.20789"
+ xlink:href="#linearGradient1507"
+ x2="547.80804"
+ x1="201.38963"
+ id="linearGradient1506"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient3450"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ id="linearGradient1290">
+ <stop
+ style="stop-color:#b2a269;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1291" />
+ <stop
+ style="stop-color:#6d5b18;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop1292" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient846">
+ <stop
+ style="stop-color:#e7e7e7;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop847" />
+ <stop
+ style="stop-color:#a5a5a5;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop848" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient841">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.00000000"
+ id="stop842" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.00000000;"
+ offset="1.0000000"
+ id="stop843" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient853">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.29752067;"
+ offset="0.00000000"
+ id="stop854" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.00000000;"
+ offset="1.0000000"
+ id="stop855" />
+ </linearGradient>
+ <linearGradient
+ y2="287.73825"
+ y1="169.4436"
+ xlink:href="#linearGradient1492"
+ x2="622.33325"
+ x1="741.63898"
+ id="linearGradient1497"
+ gradientTransform="scale(0.9552926,1.0467997)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1501">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1502" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop1504" />
+ </linearGradient>
+ <linearGradient
+ y2="418.53635"
+ y1="236.12772"
+ xlink:href="#linearGradient1501"
+ x2="330.88034"
+ x1="687.96375"
+ id="linearGradient1499"
+ gradientTransform="scale(0.9890091,1.011113)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1492">
+ <stop
+ style="stop-color:#dadada;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1493" />
+ <stop
+ style="stop-color:#f1f1f1;stop-opacity:1.0000000;"
+ offset="0.34923077"
+ id="stop1496" />
+ <stop
+ style="stop-color:#f0f0f0;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop1494" />
+ </linearGradient>
+ <linearGradient
+ y2="689.86005"
+ y1="230.07422"
+ xlink:href="#linearGradient1492"
+ x2="351.7063"
+ x1="728.96643"
+ id="linearGradient1495"
+ gradientTransform="scale(0.955425,1.0466546)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient1507">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.095505618;"
+ offset="0.0000000"
+ id="stop1508" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop1510" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient3877"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <linearGradient
+ id="linearGradient1699">
+ <stop
+ style="stop-color:#017eff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1700" />
+ <stop
+ style="stop-color:#ecfaff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop1701" />
+ </linearGradient>
+ <marker
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DiamondEmpty"
+ style="overflow:visible">
+ <path
+ id="path7"
+ d="M 0,-5 L -5,0 L 0,5 L 5,0 L 0,-5 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="translate(-5,0)" />
+ </marker>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient19816"
+ id="radialGradient3268"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,541.12253,30.198804)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient3270"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient19816"
+ id="radialGradient3272"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.6000725,2.3808346e-3,-3.7621654e-3,0.5955044,664.61868,-4.8275956)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient3274"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient3276"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient3278"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <linearGradient
+ id="linearGradient7299">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop7301" />
+ <stop
+ style="stop-color:#a090e7;stop-opacity:1"
+ offset="1"
+ id="stop7303" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7299"
+ id="radialGradient3280"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ cx="-147.5"
+ cy="97.300964"
+ fx="-147.5"
+ fy="97.300964"
+ r="109.42857" />
+ <linearGradient
+ id="linearGradient5596">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5598" />
+ <stop
+ style="stop-color:#e7e790;stop-opacity:0.56489879"
+ offset="1"
+ id="stop5600" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient19816">
+ <stop
+ id="stop19818"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop19820"
+ offset="1"
+ style="stop-color:#e7e790;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508">
+ <stop
+ id="stop11510"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop11512"
+ offset="1"
+ style="stop-color:#008401;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3286">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3288" />
+ <stop
+ style="stop-color:#79e291;stop-opacity:1;"
+ offset="1"
+ id="stop3290" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible">
+ <path
+ id="path16811"
+ 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>
+ <linearGradient
+ id="linearGradient7447">
+ <stop
+ style="stop-color:#ff6161;stop-opacity:1;"
+ offset="0"
+ id="stop7449" />
+ <stop
+ style="stop-color:#840929;stop-opacity:1;"
+ offset="1"
+ id="stop7451" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7485">
+ <stop
+ style="stop-color:#b6bcef;stop-opacity:1;"
+ offset="0"
+ id="stop7487" />
+ <stop
+ style="stop-color:#4026b1;stop-opacity:1;"
+ offset="1"
+ id="stop7489" />
+ </linearGradient>
+ <marker
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyArrow2"
+ style="overflow:visible">
+ <path
+ id="path13"
+ d="M 0,0 L 0,-5 L -10,0 L 0,5 L 0,0 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-1,0,0,-1,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5210"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 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
+ style="overflow:visible"
+ id="DotS"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotS">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path3636" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS"
+ style="overflow:visible">
+ <path
+ id="path3717"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <inkscape:path-effect
+ copytype="single_stretched"
+ pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
+ prop_scale="1"
+ id="path-effect2503"
+ effect="skeletal" />
+ <inkscape:path-effect
+ prop_scale="1"
+ id="path-effect2499"
+ effect="skeletal" />
+ <inkscape:path-effect
+ pattern-nodetypes="cc"
+ pattern="M 432.28346,272.83462 L 403.93701,216.14171"
+ prop_scale="1"
+ id="path-effect2497"
+ effect="skeletal" />
+ <marker
+ style="overflow:visible"
+ id="Arrow1Send"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3641" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3629" />
+ </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="perspective3487" />
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendp"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendp">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
+ id="path28139" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSK"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSK">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36611" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSH"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSH">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36614" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSA">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36617" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSKF"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSKF">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36620" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS9"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS9">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36623" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2SendpA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2SendpA">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
+ id="path3396" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendpg"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendpg">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
+ id="path3360" />
+ </marker>
+ <filter
+ id="filter2780"
+ inkscape:label="White Halo"
+ width="1.1"
+ height="1.1">
+ <feMorphology
+ id="feMorphology2782"
+ operator="dilate"
+ radius="3"
+ result="result0" />
+ <feFlood
+ id="feFlood2786"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="1"
+ in="result0"
+ result="result3" />
+ <feComposite
+ id="feComposite2623"
+ in="result3"
+ in2="result0"
+ operator="in"
+ result="result4" />
+ <feMerge
+ id="feMerge2629">
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2631"
+ in="result4" />
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2633"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSn"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSn"
+ style="overflow:visible">
+ <path
+ id="path4441"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS9F"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS9F"
+ style="overflow:visible">
+ <path
+ id="path4444"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI"
+ style="overflow:visible">
+ <path
+ id="path4447"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSO"
+ style="overflow:visible">
+ <path
+ id="path4450"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSW"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSW"
+ style="overflow:visible">
+ <path
+ id="path4453"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSB"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSB"
+ style="overflow:visible">
+ <path
+ id="path4456"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSZ"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSZ"
+ style="overflow:visible">
+ <path
+ id="path4459"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSq"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSq">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path5853" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSBO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSBO"
+ style="overflow:visible">
+ <path
+ id="path7501"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path9463" />
+ </marker>
+ <filter
+ height="1.1"
+ width="1.1"
+ inkscape:label="Black Halo"
+ id="filter10694">
+ <feMorphology
+ result="result0"
+ radius="3"
+ operator="dilate"
+ id="feMorphology10696" />
+ <feFlood
+ result="result3"
+ in="result0"
+ flood-opacity="1"
+ flood-color="rgb(0,0,0)"
+ id="feFlood10698" />
+ <feComposite
+ result="result4"
+ operator="in"
+ in2="result0"
+ in="result3"
+ id="feComposite10700" />
+ <feMerge
+ id="feMerge10702">
+ <feMergeNode
+ in="result4"
+ id="feMergeNode10704"
+ inkscape:collect="always" />
+ <feMergeNode
+ in="SourceGraphic"
+ id="feMergeNode10706"
+ inkscape:collect="always" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSu"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSu"
+ style="overflow:visible">
+ <path
+ id="path8127"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI8"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI8"
+ style="overflow:visible">
+ <path
+ id="path8130"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSr"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSr"
+ style="overflow:visible">
+ <path
+ id="path8133"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSM"
+ style="overflow:visible">
+ <path
+ id="path8136"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSb"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSb"
+ style="overflow:visible">
+ <path
+ id="path8139"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ id="marker18095"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker44971"
+ orient="auto"
+ markerHeight="5.7450781"
+ markerWidth="4.6297355">
+ <g
+ id="g18059"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path18061"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18063"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker64887"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297255">
+ <g
+ id="g64855"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path64857"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path64859"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker4057"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297302">
+ <g
+ id="g51986"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path51988"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path51990"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker72805"
+ orient="auto"
+ markerHeight="4.5568175"
+ markerWidth="4.0334239">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18057"
+ d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ id="marker72808"
+ orient="auto"
+ markerHeight="4.5568123"
+ markerWidth="4.0334177">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path72801"
+ d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSuN"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSuN">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path81580" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1507"
+ id="linearGradient92445"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(0.9446888,1.0585496)"
+ x1="201.38963"
+ y1="843.20789"
+ x2="547.80804"
+ y2="383.76529" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.8305603,1.0914308e-3,-1.9528524e-3,0.2729933,281.94958,112.36765)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112303"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.8305603,1.0914308e-3,-1.9528524e-3,0.2729933,281.94958,112.36765)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112301"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.8305603,1.0914308e-3,-1.9528524e-3,0.2729933,281.94958,112.36765)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112299"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.293791,1.3701286e-2,-5.3144349e-3,0.5018339,-46.792176,73.88505)"
+ r="95.092682"
+ fy="112.14567"
+ fx="153.46323"
+ cy="112.14567"
+ cx="153.46323"
+ id="radialGradient112297"
+ xlink:href="#linearGradient11508"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112295"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112293"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112291"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112289"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient112287"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient1694">
+ <stop
+ id="stop1695"
+ offset="0.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+ <stop
+ id="stop1696"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient112278">
+ <stop
+ id="stop112280"
+ offset="0.0000000"
+ style="stop-color:#0c1fdb;stop-opacity:1.0000000;" />
+ <stop
+ id="stop112282"
+ offset="1.0000000"
+ style="stop-color:#062d76;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ gradientTransform="scale(1.475472,0.677749)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1686"
+ inkscape:collect="always"
+ x1="242.39842"
+ x2="242.39842"
+ xlink:href="#linearGradient1683"
+ y1="1035.3337"
+ y2="636.25543" />
+ <linearGradient
+ gradientTransform="scale(1.475472,0.677749)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1690"
+ inkscape:collect="always"
+ x1="240.86183"
+ x2="240.86183"
+ xlink:href="#linearGradient1683"
+ y1="635.74658"
+ y2="1038.9441" />
+ <linearGradient
+ gradientTransform="scale(1.479463,0.675921)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1692"
+ inkscape:collect="always"
+ x1="244.8598"
+ x2="244.8598"
+ xlink:href="#linearGradient1694"
+ y1="827.01349"
+ y2="646.06177" />
+ <linearGradient
+ gradientTransform="matrix(0,1.475472,-0.677749,0,0,0)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient112273"
+ inkscape:collect="always"
+ x1="303.90472"
+ x2="-93.992599"
+ xlink:href="#linearGradient1683"
+ y1="-492.41382"
+ y2="-492.41382" />
+ <linearGradient
+ gradientTransform="matrix(0,1.475472,-0.677749,0,0,0)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient112271"
+ inkscape:collect="always"
+ x1="-92.98716"
+ x2="315.00735"
+ xlink:href="#linearGradient1683"
+ y1="-477.69666"
+ y2="-477.69669" />
+ <linearGradient
+ gradientTransform="matrix(0,1.475473,-0.677749,0,0,0)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient1705"
+ inkscape:collect="always"
+ x1="112.06259"
+ x2="-170.00552"
+ xlink:href="#linearGradient1694"
+ y1="-485.28952"
+ y2="-485.28973" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,262.24281,78.560061)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5287"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,262.24281,78.560061)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5285"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,262.24281,78.560061)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5283"
+ xlink:href="#linearGradient3286"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient5281"
+ xlink:href="#linearGradient11508"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient11602"
+ xlink:href="#linearGradient19816"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,262.24281,78.560061)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient15668"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="148.38934"
+ x2="389.01984"
+ y1="148.38934"
+ x1="96.085953"
+ id="linearGradient5355"
+ xlink:href="#linearGradient5349"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient4152">
+ <stop
+ id="stop4154"
+ offset="0"
+ style="stop-color:#6b6bff;stop-opacity:1;" />
+ <stop
+ id="stop4156"
+ offset="1"
+ style="stop-color:#6b6bff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5349">
+ <stop
+ id="stop5351"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop5353"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient112247">
+ <stop
+ id="stop112249"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop112251"
+ offset="1"
+ style="stop-color:#a090e7;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient9263">
+ <stop
+ id="stop9265"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0" />
+ <stop
+ id="stop9267"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible"
+ id="marker112241"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8,0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path16734" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleInL"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleInL">
+ <path
+ transform="scale(-0.8,-0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path16743" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutM"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutM">
+ <path
+ transform="scale(0.4,0.4)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path16731" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker112234"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path16829" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker112230"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ 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"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ id="path112232" />
+ </marker>
+ <linearGradient
+ id="linearGradient112224">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop112226" />
+ <stop
+ style="stop-color:#e7e790;stop-opacity:1;"
+ offset="1"
+ id="stop112228" />
+ </linearGradient>
+ <marker
+ style="overflow:visible"
+ id="marker112220"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="matrix(-1,0,0,-1,-10,0)"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 0,-5 L -10,0 L 0,5 L 0,0 z"
+ id="path112222" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="EmptyArrow"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="matrix(-1,0,0,-1,-10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 0,-5 L -12.5,0 L 0,5 L 0,0 z M -0.5,0 L -0.5,-4.5 L -12,0 L -0.5,4.5 L -0.5,0 z"
+ id="path9" />
+ </marker>
+ <linearGradient
+ id="linearGradient112212">
+ <stop
+ id="stop112214"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop112216"
+ offset="1"
+ style="stop-color:#79e291;stop-opacity:1;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible"
+ id="marker112208"
+ refX="0"
+ refY="0"
+ orient="auto">
+ <path
+ transform="translate(-5,0)"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,-5 L -5,0 L 0,5 L 5,0 L 0,-5 z"
+ id="path112210" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DiamondL"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DiamondL">
+ <path
+ transform="scale(0.8,0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z"
+ id="path4404" />
+ </marker>
+ <linearGradient
+ id="linearGradient112200">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop112202" />
+ <stop
+ style="stop-color:#e27979;stop-opacity:1"
+ offset="1"
+ id="stop112204" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11516">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop11518" />
+ <stop
+ style="stop-color:#a090e7;stop-opacity:1"
+ offset="1"
+ id="stop11520" />
+ </linearGradient>
+ <marker
+ style="overflow:visible"
+ id="Arrow2Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lstart">
+ <path
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ 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"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ id="path6743" />
+ </marker>
+ <inkscape:perspective
+ id="perspective112192"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective9300"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective9574"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective9882"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective10244"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10356"
+ id="linearGradient10362"
+ x1="407.48032"
+ y1="968.17322"
+ x2="669.66157"
+ y2="968.17322"
+ gradientUnits="userSpaceOnUse" />
+ <inkscape:perspective
+ id="perspective5379"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective5446"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective7010"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ id="marker18095-5"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-2"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-5"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-0"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker18095-2"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-9"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-0"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-07"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker18095-4"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-5"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-2"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-6"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu-3"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path9463-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#f39300;stroke-width:1pt;fill:#f39300"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path6738" />
+ </marker>
+ <marker
+ id="marker18095-3"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-8"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-7"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-7"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ id="marker18095-31"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-4"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-6"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-3"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ id="marker18095-56"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064-22"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050-67"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035-5"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu-8"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path9463-3"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu-1"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path9463-8"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8-6"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path6738-5"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8-9"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path6738-52"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8-65"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path6738-55"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8I"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8I">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#d9d9cd;stroke-width:1pt;fill:#d9d9cd"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path10009" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu-11"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path9463-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8-8"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path6738-551" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu8-1"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu8">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path6738-9" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata2480">
+ <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
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ style="display:inline">
+ <g
+ transform="translate(459.6407,-46.30366)"
+ id="g7540">
+ <rect
+ ry="5.6651931"
+ y="843.54773"
+ x="241.1908"
+ height="301.18109"
+ width="365.70398"
+ id="rect29628"
+ style="fill:none;stroke:#000000;stroke-width:1.4955349;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.4955348, 2.9910696;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.95534801px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="245.14299"
+ y="921.89264"
+ id="text39363"><tspan
+ sodipodi:role="line"
+ id="tspan39365"
+ x="245.14299"
+ y="921.89264">Server-Side</tspan><tspan
+ id="tspan9618"
+ sodipodi:role="line"
+ x="245.14299"
+ y="940.58685">Integration</tspan></text>
+ <flowRoot
+ 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"
+ id="flowRoot9620"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9622"><rect
+ y="542.53821"
+ x="326.68332"
+ height="317.49094"
+ width="320.31937"
+ id="rect9624" /></flowRegion><flowPara
+ id="flowPara9626" /></flowRoot> </g>
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.4955349;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.4955348, 2.9910696;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect39497"
+ width="368.50394"
+ height="100.68364"
+ x="698.03149"
+ y="386.22043"
+ ry="5.6651931" />
+ <text
+ id="text4185"
+ y="748.74036"
+ x="953.08466"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="748.74036"
+ x="953.08466"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191">XMLHttpRequest</tspan></text>
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot2485"
+ xml:space="preserve"
+ transform="matrix(1.4955348,0,0,1.4955348,92.256602,241.39629)"><flowRegion
+ id="flowRegion2487"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ y="238.07646"
+ x="262.85715"
+ height="120"
+ width="184.28572"
+ id="rect2489" /></flowRegion><flowPara
+ id="flowPara2491" /></flowRoot> <g
+ transform="matrix(1.4955348,0,0,1.4955348,86.915392,276.11406)"
+ id="g3178" />
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="flowRoot8724"
+ xml:space="preserve"
+ transform="matrix(1.4955348,0,0,1.4955348,92.256602,241.39629)"><flowRegion
+ id="flowRegion8726"><rect
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ y="752.14441"
+ x="39.286312"
+ height="22.868153"
+ width="29.904507"
+ id="rect8728" /></flowRegion><flowPara
+ id="flowPara8730" /></flowRoot> <g
+ transform="matrix(0.7477674,0,0,0.7477674,246.80962,242.58386)"
+ id="g18053" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6905"
+ transform="matrix(1.4955348,0,0,1.4955348,-176.81346,-383.25709)"><flowRegion
+ id="flowRegion6907"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use6909"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara6911">VariableOwner</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6913"
+ transform="matrix(1.4955348,0,0,1.4955348,-584.1426,-939.26862)"><flowRegion
+ id="flowRegion6915"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use6917"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara6919">VariableOwner</flowPara></flowRoot> <g
+ style="display:inline"
+ id="g39423"
+ transform="matrix(1.4955348,0,0,1.4955348,395.22216,639.9301)">
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39425"
+ transform="translate(-5.2378947,106.19782)"><flowRegion
+ id="flowRegion39427"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39429"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39431">Sizeable</flowPara></flowRoot> <g
+ id="g39433"
+ transform="translate(-46.062995,-30.433073)">
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39435"
+ transform="translate(-5.2378947,106.19782)"><flowRegion
+ id="flowRegion39437"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39439"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39441">Sizeable</flowPara></flowRoot> </g>
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39443"
+ transform="translate(75.734798,-715.9695)"><flowRegion
+ id="flowRegion39445"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39447"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39449">VariableOwner</flowPara></flowRoot> <g
+ style="display:inline"
+ id="g39451"
+ transform="translate(123.00096,-20.40135)">
+ <rect
+ style="fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect39453"
+ width="138.189"
+ height="35.43309"
+ x="167.13719"
+ y="232.20705"
+ ry="3.7880721" />
+ <text
+ id="text39455"
+ y="252.89734"
+ x="171.76772"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="252.89734"
+ x="171.76772"
+ id="tspan39457"
+ sodipodi:role="line">AbstractComponent</tspan></text>
+ <text
+ id="text39351-1-0-7"
+ y="241.36755"
+ x="171.69571"
+ style="font-size:6.00000048px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="241.36755"
+ x="171.69571"
+ sodipodi:role="line"
+ id="tspan39353-9-4-4">com.vaadin.ui</tspan></text>
+ </g>
+ </g>
+ <g
+ style="display:inline"
+ id="g39459"
+ transform="matrix(1.4955348,0,0,1.4955348,469.33185,70.83648)">
+ <rect
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect39461"
+ width="94.770302"
+ height="35.433075"
+ x="160.02942"
+ y="229.8378"
+ ry="3.7880721" />
+ <text
+ id="text39463"
+ y="250.52808"
+ x="164.65993"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="250.52808"
+ x="164.65993"
+ id="tspan39465"
+ sodipodi:role="line">Widget</tspan></text>
+ <text
+ id="text31857-5-9"
+ y="238.99831"
+ x="164.58794"
+ style="font-size:5.99999952px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="238.99831"
+ x="164.58794"
+ sodipodi:role="line"
+ id="tspan31859-2-9">com.google.gwt.user.client.ui</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:6.02362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSu);display:inline"
+ d="m 946.06298,607.55265 0,-139.84646"
+ id="path4600-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ style="fill:#49c2f1;fill-opacity:1;display:inline"
+ id="g39467"
+ transform="matrix(1.4955348,0,0,1.4955348,607.15102,67.29319)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect39469"
+ width="73.446983"
+ height="35.43306"
+ x="191.07704"
+ y="232.20705"
+ ry="3.7880721" />
+ <text
+ id="text39471"
+ y="248.15881"
+ x="226.07834"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#49c2f1;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="248.15881"
+ x="226.07834"
+ id="tspan39473"
+ sodipodi:role="line"
+ style="fill:#49c2f1;fill-opacity:1">MyWidget</tspan></text>
+ <text
+ id="text10319"
+ y="255.48111"
+ x="198.09482"
+ style="font-size:6.00000048px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="255.48111"
+ x="198.09482"
+ sodipodi:role="line"
+ style="font-size:6.00000048px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan10338">An existing widget</tspan><tspan
+ y="262.98111"
+ x="198.09482"
+ sodipodi:role="line"
+ style="font-size:6.00000048px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan3455">or your own</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#49c2f1;stroke-width:5.82905245;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker18095);display:inline"
+ d="m 892.91339,442.91336 -46.063,0"
+ id="path39475"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <g
+ style="display:inline"
+ id="g17430"
+ transform="matrix(1.4955348,0,0,1.4955348,-88.401153,-89.799734)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17432"
+ width="93.270302"
+ height="34.038864"
+ x="179.07294"
+ y="232.13176"
+ ry="3.7880721" />
+ <text
+ id="text17434"
+ y="251.32205"
+ x="188.54323"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#49c2f1;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="251.32205"
+ x="188.54323"
+ id="tspan17436"
+ sodipodi:role="line">MyCDIUI</tspan></text>
+ </g>
+ <g
+ style="display:inline"
+ id="g17467"
+ transform="matrix(1.4955348,0,0,1.4955348,-9.6780096,107.32889)">
+ <rect
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17469"
+ width="152.3622"
+ height="35.433071"
+ x="160.69756"
+ y="232.13174"
+ ry="3.7880721" />
+ <text
+ id="text17471"
+ y="252.82204"
+ x="231.55074"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="252.82204"
+ x="231.55074"
+ sodipodi:role="line"
+ id="tspan17475">ApplicationConnection</tspan></text>
+ <text
+ id="text39409"
+ y="241.29225"
+ x="165.25607"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="241.29225"
+ x="165.25607"
+ sodipodi:role="line"
+ id="tspan39411">com.vaadin.client</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#49c2f1;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot80522"
+ transform="matrix(1.4955348,0,0,1.4955348,602.15588,338.14138)"><flowRegion
+ id="flowRegion80524"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use80526"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara80528">1</flowPara></flowRoot> <text
+ id="text18090"
+ y="404.32913"
+ x="704.32544"
+ style="font-size:14.95534801px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="404.32913"
+ x="704.32544"
+ id="tspan18092"
+ sodipodi:role="line">Client-Side Framework</tspan></text>
+ <g
+ id="g7535"
+ transform="translate(450,290.55118)">
+ <rect
+ ry="5.6651931"
+ y="209.0551"
+ x="248.03149"
+ height="255.1181"
+ width="368.50391"
+ id="rect18094"
+ style="fill:none;stroke:#000000;stroke-width:1.4955349;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.4955348, 2.9910696;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.95534801px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="254.82117"
+ y="231.69943"
+ id="text18096"><tspan
+ sodipodi:role="line"
+ id="tspan18098"
+ x="254.82117"
+ y="231.69943">Client-Side Integration</tspan></text>
+ </g>
+ <g
+ style="display:inline"
+ id="g18100"
+ transform="matrix(1.4955348,0,0,1.4955348,588.80507,467.7995)">
+ <rect
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect18102"
+ width="152.3622"
+ height="35.433071"
+ x="160.69756"
+ y="232.13174"
+ ry="3.7880721" />
+ <text
+ id="text18104"
+ y="252.82204"
+ x="237.1282"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="252.82204"
+ x="237.1282"
+ sodipodi:role="line"
+ id="tspan18106">CommunicationManager</tspan></text>
+ <text
+ id="text31853"
+ y="241.29227"
+ x="165.25607"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="241.29227"
+ x="165.25607"
+ sodipodi:role="line"
+ id="tspan31855">com.vaadin.server</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#49c2f1;stroke-width:5.82905245;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:url(#CurvyCross);marker-end:none;display:inline"
+ d="m 946.06299,814.96061 0,-92.12599"
+ id="path20937"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <g
+ style="display:inline"
+ id="g29630"
+ transform="matrix(1.4955348,0,0,1.4955348,579.17437,538.55303)">
+ <rect
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect29632"
+ width="137.41693"
+ height="35.43306"
+ x="167.13719"
+ y="232.20705"
+ ry="3.7880721" />
+ <text
+ id="text29634"
+ y="252.89734"
+ x="171.2397"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="252.89734"
+ x="171.2397"
+ id="tspan29636"
+ sodipodi:role="line">ClientConnector</tspan></text>
+ <text
+ id="text31857"
+ y="241.36755"
+ x="171.69571"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="241.36755"
+ x="171.69571"
+ sodipodi:role="line"
+ id="tspan31859">com.vaadin.server</tspan></text>
+ </g>
+ <path
+ sodipodi:open="true"
+ transform="matrix(1.4955348,0,0,1.4955348,252.86446,547.57561)"
+ sodipodi:end="6.2827149"
+ sodipodi:start="0"
+ d="m 491.94323,228.54329 a 4.7385135,4.7385135 0 1 1 -1e-5,-0.002"
+ sodipodi:ry="4.7385135"
+ sodipodi:rx="4.7385135"
+ sodipodi:cy="228.54329"
+ sodipodi:cx="487.20471"
+ id="path29638"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <text
+ id="text29642"
+ y="881.27277"
+ x="969.97064"
+ style="font-size:17.94641876px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#49c2f1;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="881.27277"
+ x="969.97064"
+ id="tspan29644"
+ sodipodi:role="line">n</tspan></text>
+ <g
+ style="display:inline"
+ id="g29646"
+ transform="matrix(1.4955348,0,0,1.4955348,562.93645,683.94123)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect29648"
+ width="137.41693"
+ height="35.433044"
+ x="177.9948"
+ y="232.13174"
+ ry="3.7880721" />
+ <text
+ id="text29650"
+ y="248.08353"
+ x="224.30263"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#49c2f1;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="248.08353"
+ x="224.30263"
+ id="tspan29652"
+ sodipodi:role="line">MyComponent</tspan></text>
+ </g>
+ <rect
+ style="fill:url(#pattern39357);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.83464575;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect29654"
+ width="105.98283"
+ height="37.093971"
+ x="910.62988"
+ y="758.2677"
+ ry="3.9656363" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#49c2f1;stroke-width:4.23931122;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#DotSu);display:inline"
+ d="m 945.81616,662.17128 0,23.21146"
+ id="path39383"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <text
+ id="text4185-8"
+ y="598.65137"
+ x="866.72382"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="598.65137"
+ x="866.72382"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0">«extends...»</tspan></text>
+ <g
+ id="g6138"
+ transform="translate(695.24491,303.58448)">
+ <rect
+ ry="5.6651931"
+ y="387.36038"
+ x="-131.85909"
+ height="167.3125"
+ width="240.19713"
+ id="rect18094-6"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.4955349;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.4955348, 2.9910696;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.95534801px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="-124.77247"
+ y="405.07693"
+ id="text18096-2"><tspan
+ sodipodi:role="line"
+ id="tspan18098-9"
+ x="-124.77247"
+ y="405.07693">Shared</tspan></text>
+ <g
+ style="display:inline"
+ id="g17430-7"
+ transform="matrix(1.4955348,0,0,1.4955348,-359.25086,135.86855)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect17432-9"
+ width="129.86864"
+ height="35.433243"
+ x="166.26268"
+ y="232.13176"
+ ry="3.7880721" />
+ <text
+ id="text17434-3"
+ y="248.08353"
+ x="170.1252"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#49c2f1;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="248.08353"
+ x="170.1252"
+ id="tspan17436-2"
+ sodipodi:role="line">MyComponentState</tspan></text>
+ </g>
+ <g
+ style="display:inline"
+ id="g39423-1-2"
+ transform="matrix(1.4955348,0,0,1.4955348,-544.29666,101.95228)">
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39425-7-5"
+ transform="translate(-5.2378947,106.19782)"><flowRegion
+ id="flowRegion39427-5-7"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39429-4-5"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39431-8-2">Sizeable</flowPara></flowRoot> <g
+ id="g39433-4-3"
+ transform="translate(-46.062995,-30.433073)">
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39435-3-3"
+ transform="translate(-5.2378947,106.19782)"><flowRegion
+ id="flowRegion39437-1-5"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39439-1-0"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39441-0-4">Sizeable</flowPara></flowRoot> </g>
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot39443-9-0"
+ transform="translate(75.734798,-715.9695)"><flowRegion
+ id="flowRegion39445-0-4"><use
+ transform="translate(1.467046,-91.03536)"
+ x="0"
+ y="0"
+ xlink:href="#rect4654"
+ id="use39447-0-4"
+ width="744.09448"
+ height="1052.3622" /></flowRegion><flowPara
+ id="flowPara39449-6-9">VariableOwner</flowPara></flowRoot> <g
+ style="display:inline"
+ id="g39451-9-7"
+ transform="translate(123.00096,-20.40135)">
+ <rect
+ style="fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect39453-6-1"
+ width="130.30916"
+ height="33.169598"
+ x="166.99391"
+ y="232.56483"
+ ry="3.7880721" />
+ <text
+ id="text39455-6-5"
+ y="252.29591"
+ x="171.16541"
+ style="font-size:10.69851398px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="252.29591"
+ x="171.16541"
+ id="tspan39457-4-0"
+ sodipodi:role="line">ComponentState</tspan></text>
+ </g>
+ <text
+ id="text39351-1"
+ y="221.32399"
+ x="294.55338"
+ style="font-size:6.00000048px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="221.32399"
+ x="294.55338"
+ sodipodi:role="line"
+ id="tspan39353-9">com.vaadin.shared</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:6.02362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker18095);display:inline"
+ d="m 38.219653,483.02968 0,-21.25985"
+ id="path4600-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:6.02362204;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSu8);display:inline"
+ d="m -121.22916,454.68322 10.62992,0"
+ id="path4600-1-5-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ sodipodi:open="true"
+ transform="matrix(1.8694191,0,0,1.8694191,-163.13036,295.59143)"
+ sodipodi:end="6.2827149"
+ sodipodi:start="0"
+ d="m 491.94323,228.54329 a 4.7385135,4.7385135 0 1 1 -1e-5,-0.002"
+ sodipodi:ry="4.7385135"
+ sodipodi:rx="4.7385135"
+ sodipodi:cy="228.54329"
+ sodipodi:cx="487.20471"
+ id="path29638-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <text
+ id="text4185-8-9"
+ y="596.80322"
+ x="753.37244"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="596.80322"
+ x="753.37244"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0-1">«has»</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:6.02362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016);display:inline"
+ d="m 981.49606,960.23621 0,-28.34647"
+ id="path4600-4-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:6.02362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker18095);display:inline"
+ d="m 981.49606,1031.1024 0,-21.2599"
+ id="path4600-4-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ id="text31847"
+ y="770.02686"
+ x="813.61792"
+ style="font-size:14.95534801px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="770.02686"
+ x="813.61792"
+ id="tspan31849"
+ sodipodi:role="line">Server connection:</tspan><tspan
+ y="788.72107"
+ x="813.61792"
+ sodipodi:role="line"
+ id="tspan31851">HTTP(S) / JSON</tspan></text>
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4.96062994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSu);display:inline"
+ d="m 981.49606,864.5669 0,24.80315"
+ id="path4600-1-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ id="text4185-8-9-4"
+ y="977.90942"
+ x="783.1142"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="977.90942"
+ x="783.1142"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0-1-4">«has»</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:6.02362204;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none;display:inline"
+ d="m 574.01575,758.26769 0,226.77166 258.66142,0"
+ id="path4600-1-5-6-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <g
+ style="display:inline"
+ id="g29630-7"
+ transform="matrix(1.4955348,0,0,1.4955348,458.70193,184.22232)">
+ <rect
+ style="fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect29632-3"
+ width="150.45576"
+ height="35.43306"
+ x="167.13719"
+ y="232.20705"
+ ry="3.7880721" />
+ <text
+ id="text29634-0"
+ y="251.95493"
+ x="169.84711"
+ style="font-size:9.36119938px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="251.95493"
+ x="169.84711"
+ id="tspan29636-4"
+ sodipodi:role="line">AbstractComponentConnector</tspan></text>
+ <text
+ id="text31857-5"
+ y="240.42516"
+ x="170.30312"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="240.42516"
+ x="170.30312"
+ sodipodi:role="line"
+ id="tspan31859-2">com.vaadin.client.ui</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:6.02362204;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker18095)"
+ d="m 857.48031,609.4488 0,-28.34646"
+ id="path4600"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:open="true"
+ transform="matrix(1.8694191,0,0,1.8694191,-95.829158,157.1308)"
+ sodipodi:end="6.2827149"
+ sodipodi:start="0"
+ d="m 491.94323,228.54329 a 4.7385135,4.7385135 0 1 1 -1e-5,-0.002"
+ sodipodi:ry="4.7385135"
+ sodipodi:rx="4.7385135"
+ sodipodi:cy="228.54329"
+ sodipodi:cx="487.20471"
+ id="path29638-1-4"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4.96062994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSu);display:inline"
+ d="m 829.13386,712.2047 -14.17323,0 0,-127.55905"
+ id="path4600-1-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ id="text39405-7"
+ y="602.12891"
+ x="824.49982"
+ style="font-size:17.94641876px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:#49c2f1;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="602.12891"
+ x="824.49982"
+ id="tspan39407-9"
+ sodipodi:role="line">n</tspan></text>
+ <text
+ id="text4185-8-9-5"
+ y="678.29932"
+ x="817.15198"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="678.29932"
+ x="817.15198"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0-1-2">«has»</tspan></text>
+ <text
+ id="text4185-8-9-5-5"
+ y="678.29932"
+ x="951.79761"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="678.29932"
+ x="951.79761"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0-1-2-7">«knows»</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4.96062994;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSu8);display:inline"
+ d="m 747.6378,584.64565 0,138.18897"
+ id="path4600-1-5-6-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ id="text4185-8-2"
+ y="435.65924"
+ x="859.00732"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="435.65924"
+ x="859.00732"
+ sodipodi:role="line"
+ style="font-size:11.96427917px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="tspan4191-0-5">«...»</tspan></text>
+ </g>
+</svg>
diff --git a/documentation/advanced/original-drawings/debug-log.svg b/documentation/advanced/original-drawings/debug-log.svg new file mode 100644 index 0000000000..f57f1e2ae6 --- /dev/null +++ b/documentation/advanced/original-drawings/debug-log.svg @@ -0,0 +1,424 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="debug-log.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ enable-background="new"
+ version="1.1">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="461.10259"
+ inkscape:cy="887.71455"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ gridtolerance="10000"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="236"
+ inkscape:window-y="0"
+ showgrid="true"
+ inkscape:window-maximized="0"
+ inkscape:snap-bbox="true"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3942"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="330,1000"
+ id="guide4118" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1903">
+ <linearGradient
+ id="linearGradient4123">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0"
+ id="stop4125" />
+ <stop
+ id="stop4131"
+ offset="0.25"
+ style="stop-color:#ffffff;stop-opacity:0.70161289;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.87903225;"
+ offset="0.75"
+ id="stop4133" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4127" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3944"
+ inkscape:collect="always">
+ <stop
+ id="stop3946"
+ offset="0"
+ style="stop-color:#ff1515;stop-opacity:1;" />
+ <stop
+ id="stop3948"
+ offset="1"
+ style="stop-color:#ff1515;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3196" />
+ </marker>
+ <inkscape:perspective
+ id="perspective7"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <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="perspective2464" />
+ <filter
+ inkscape:label="filter1"
+ id="filter2470">
+ <feGaussianBlur
+ id="feGaussianBlur2472"
+ stdDeviation="3.6554687499999998"
+ result="result0" />
+ <feFlood
+ id="feFlood3438"
+ in="SourceGraphic"
+ flood-opacity="0.49289099526066349"
+ flood-color="rgb(139,139,139)"
+ result="result1" />
+ <feBlend
+ blend="normal"
+ id="feBlend3440"
+ in="result0"
+ mode="normal"
+ in2="result1" />
+ </filter>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="66.994687"
+ x2="345.28571"
+ y1="66.994687"
+ x1="228.07906"
+ id="linearGradient3950"
+ xlink:href="#linearGradient3944"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow2MendL"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2MendL">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:url(#linearGradient3950);stroke-width:0.62500000;fill:url(#linearGradient3950)"
+ id="path3967" />
+ </marker>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3442">
+ <rect
+ y="105.21935"
+ x="162.85715"
+ height="82.142815"
+ width="175.71426"
+ id="rect3444"
+ style="opacity:1;fill:#545454;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.29999998;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </clipPath>
+ <marker
+ id="marker52016"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-3"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-5"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-6"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-4"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-5"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-1"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-3"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-2"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-0"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-4"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-9"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-3"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-03"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-17"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-8"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-9"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-1"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-2"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-0"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-8"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-038"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-49"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-7"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-6"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-9"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-47"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-2"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-7"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ </defs>
+ <metadata
+ id="metadata1906">
+ <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></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ style="opacity:1"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Taso 1">
+ <image
+ y="177.36218"
+ x="75"
+ id="image3126"
+ xlink:href="file:///home/magi/itmill/book-7/manual/img/debug/debug-window.png"
+ height="186.25829"
+ width="375" />
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 165,127.36218 -67.272842,0 0,64.74746"
+ id="path4833-3-7-55"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3"
+ y="132.63379"
+ x="174.136"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="132.63379"
+ x="174.136"
+ id="tspan2423-6"
+ sodipodi:role="line">Clear Log</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 165,152.36218 -43.28302,0 0,40"
+ id="path4833-3-7-55-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 165,177.36218 -20,0 0,15"
+ id="path4833-3-7-55-6-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-3"
+ y="158.80699"
+ x="173.56"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="158.80699"
+ x="173.56"
+ id="tspan2423-6-9"
+ sodipodi:role="line">Reset Timer</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-3-2"
+ y="183.89645"
+ x="174.226"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="183.89645"
+ x="174.226"
+ id="tspan2423-6-9-6"
+ sodipodi:role="line">Scroll Lock</tspan></text>
+ </g>
+</svg>
diff --git a/documentation/advanced/original-drawings/debug-window-annotated.svg b/documentation/advanced/original-drawings/debug-window-annotated.svg new file mode 100644 index 0000000000..6c1fb5d1b5 --- /dev/null +++ b/documentation/advanced/original-drawings/debug-window-annotated.svg @@ -0,0 +1,608 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg1901"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="debug-window-annotated.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ enable-background="new"
+ version="1.1">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="219.4901"
+ inkscape:cy="836.30592"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ gridtolerance="10000"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="236"
+ inkscape:window-y="0"
+ showgrid="true"
+ inkscape:window-maximized="0"
+ inkscape:snap-bbox="true"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3942"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="5px"
+ spacingy="5px" />
+ <sodipodi:guide
+ orientation="1,0"
+ position="330,1000"
+ id="guide4118" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1903">
+ <linearGradient
+ id="linearGradient5902">
+ <stop
+ style="stop-color:#2d2d2d;stop-opacity:1;"
+ offset="0"
+ id="stop5904" />
+ <stop
+ style="stop-color:#2d2d2d;stop-opacity:0;"
+ offset="1"
+ id="stop5906" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4123">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0"
+ id="stop4125" />
+ <stop
+ id="stop4131"
+ offset="0.25"
+ style="stop-color:#ffffff;stop-opacity:0.70161289;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.87903225;"
+ offset="0.75"
+ id="stop4133" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4127" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3944"
+ inkscape:collect="always">
+ <stop
+ id="stop3946"
+ offset="0"
+ style="stop-color:#ff1515;stop-opacity:1;" />
+ <stop
+ id="stop3948"
+ offset="1"
+ style="stop-color:#ff1515;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3196" />
+ </marker>
+ <inkscape:perspective
+ id="perspective7"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <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="perspective2464" />
+ <filter
+ inkscape:label="filter1"
+ id="filter2470">
+ <feGaussianBlur
+ id="feGaussianBlur2472"
+ stdDeviation="3.6554687499999998"
+ result="result0" />
+ <feFlood
+ id="feFlood3438"
+ in="SourceGraphic"
+ flood-opacity="0.49289099526066349"
+ flood-color="rgb(139,139,139)"
+ result="result1" />
+ <feBlend
+ blend="normal"
+ id="feBlend3440"
+ in="result0"
+ mode="normal"
+ in2="result1" />
+ </filter>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="66.994687"
+ x2="345.28571"
+ y1="66.994687"
+ x1="228.07906"
+ id="linearGradient3950"
+ xlink:href="#linearGradient3944"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow2MendL"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2MendL">
+ <path
+ transform="scale(0.6) rotate(180) translate(0,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:url(#linearGradient3950);stroke-width:0.62500000;fill:url(#linearGradient3950)"
+ id="path3967" />
+ </marker>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3442">
+ <rect
+ y="105.21935"
+ x="162.85715"
+ height="82.142815"
+ width="175.71426"
+ id="rect3444"
+ style="opacity:1;fill:#545454;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.29999998;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </clipPath>
+ <marker
+ id="marker52016"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-3"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-5"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-6"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-4"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-5"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-1"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-3"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-2"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-0"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-4"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-9"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-3"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-03"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-17"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-8"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-9"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-1"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-2"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-0"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-8"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-038"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-49"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-7"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-6"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-9"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-47"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-2"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-7"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5902"
+ id="linearGradient5908"
+ x1="260"
+ y1="362.36218"
+ x2="260"
+ y2="202.36218"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5902"
+ id="linearGradient5950"
+ gradientUnits="userSpaceOnUse"
+ x1="260"
+ y1="362.36218"
+ x2="260"
+ y2="202.36218"
+ gradientTransform="translate(130,0)" />
+ <filter
+ id="filter5952"
+ inkscape:menu-tooltip="Make the lightest parts of the object progressively transparent"
+ inkscape:menu="Transparency utilities"
+ inkscape:label="Light eraser"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ color-interpolation-filters="sRGB">
+ <feColorMatrix
+ id="feColorMatrix5954"
+ result="result14"
+ type="luminanceToAlpha"
+ in="SourceGraphic" />
+ <feComposite
+ id="feComposite5956"
+ in2="result14"
+ in="SourceGraphic"
+ result="fbSourceGraphic"
+ operator="out" />
+ <feBlend
+ id="feBlend5958"
+ in2="fbSourceGraphic"
+ mode="normal"
+ result="result15" />
+ </filter>
+ <marker
+ id="marker52016-35"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-7"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-20"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-76"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016-7"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010-6"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012-4"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014-48"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </marker>
+ </defs>
+ <metadata
+ id="metadata1906">
+ <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
+ style="opacity:1"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Taso 1">
+ <image
+ y="177.36218"
+ x="75"
+ id="image3126"
+ xlink:href="file:///home/magi/itmill/book-7/manual/img/debug/debug-window.png"
+ height="186.25829"
+ width="375" />
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 310,2.3621826 -15.71428,0 0,169.9999974"
+ id="path4833-3-7-55-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8"
+ y="7.633739"
+ x="313.54199"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="7.633739"
+ x="313.54199"
+ id="tspan2423-6-2"
+ sodipodi:role="line">Debug message log</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 335,27.362183 -17.23225,0 0,144.999997"
+ id="path4833-3-7-55-7-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9"
+ y="33.57235"
+ x="339.04599"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="33.57235"
+ x="339.04599"
+ id="tspan2423-6-2-5"
+ sodipodi:role="line">General info</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 355,52.36218 -14.36865,0 0,120"
+ id="path4833-3-7-55-7-3-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9-8"
+ y="57.392303"
+ x="359.13599"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="57.392303"
+ x="359.13599"
+ id="tspan2423-6-2-5-5"
+ sodipodi:role="line">Component hierarchy</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 380,77.36218 -16.76778,0 0,95"
+ id="path4833-3-7-55-7-3-6-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9-4"
+ y="83.878448"
+ x="384.04599"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="83.878448"
+ x="384.04599"
+ id="tspan2423-6-2-5-2"
+ sodipodi:role="line">Communication</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 403.91437,102.36218 -16.76778,0 0,70"
+ id="path4833-3-7-55-7-3-6-5-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9-4-1"
+ y="109.05702"
+ x="409.13599"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="109.05702"
+ x="409.13599"
+ id="tspan2423-6-2-5-2-6"
+ sodipodi:role="line">Menu</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 425,127.36218 -14.49492,0 0,45"
+ id="path4833-3-7-55-7-3-6-5-8-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9-4-1-2"
+ y="133.71503"
+ x="428.59601"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="133.71503"
+ x="428.59601"
+ id="tspan2423-6-2-5-2-6-6"
+ sodipodi:role="line">Minimize</tspan></text>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker52016)"
+ d="m 445,152.36218 -11.60713,0 0,20"
+ id="path4833-3-7-55-7-3-6-5-8-9-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text2421-3-8-9-4-1-2-9"
+ y="159.07217"
+ x="448.59601"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;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:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="159.07217"
+ x="448.59601"
+ id="tspan2423-6-2-5-2-6-6-0"
+ sodipodi:role="line">Close</tspan></text>
+ <rect
+ style="fill:#ffffff;fill-opacity:0.63793105;stroke:none"
+ id="rect6062"
+ width="345"
+ height="120"
+ x="85"
+ y="222.36218"
+ ry="3.7880721" />
+ <rect
+ style="fill:#ffffff;fill-opacity:0.67672414;stroke:none"
+ id="rect6062-9"
+ width="125"
+ height="15"
+ x="85"
+ y="202.36218"
+ ry="3.7880721" />
+ </g>
+</svg>
diff --git a/documentation/advanced/original-drawings/mvp-pattern.svg b/documentation/advanced/original-drawings/mvp-pattern.svg new file mode 100644 index 0000000000..fe55ac874d --- /dev/null +++ b/documentation/advanced/original-drawings/mvp-pattern.svg @@ -0,0 +1,832 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ sodipodi:modified="true"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:docname="mvp-pattern.svg"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:version="0.32"
+ id="svg1901"
+ height="297mm"
+ width="210mm">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="296.58974"
+ inkscape:cy="799.23501"
+ inkscape:document-units="px"
+ inkscape:current-layer="g6951-6"
+ gridtolerance="10000"
+ inkscape:window-width="1680"
+ inkscape:window-height="1027"
+ inkscape:window-x="-4"
+ inkscape:window-y="-4"
+ showgrid="true"
+ showguides="true"
+ inkscape:connector-spacing="10"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ spacingy="5px"
+ spacingx="5px"
+ snapvisiblegridlinesonly="true"
+ enabled="true"
+ visible="true"
+ empspacing="5"
+ id="grid3123"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1903">
+ <marker
+ style="overflow:visible"
+ id="DotS"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="DotS">
+ <path
+ transform="scale(0.2) translate(7.4, 1)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ id="path4833" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotM"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="DotM">
+ <path
+ transform="scale(0.4) translate(7.4, 1)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ id="path4830" />
+ </marker>
+ <marker
+ markerWidth="4.6297355"
+ markerHeight="5.7450781"
+ orient="auto"
+ id="marker44971">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g18059">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path18061"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path18063"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450776"
+ orient="auto"
+ id="marker18095">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
+ id="g11064">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path11050"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path11035"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <inkscape:perspective
+ id="perspective7604"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ id="linearGradient11516">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop11518" />
+ <stop
+ style="stop-color:#a090e7;stop-opacity:1"
+ offset="1"
+ id="stop11520" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11508">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop11510" />
+ <stop
+ style="stop-color:#e27979;stop-opacity:1"
+ offset="1"
+ id="stop11512" />
+ </linearGradient>
+ <marker
+ style="overflow:visible"
+ id="DiamondL"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="DiamondL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z "
+ id="path4404" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DiamondEmpty"
+ refX="0.0"
+ refY="0.0"
+ orient="auto">
+ <path
+ transform="scale(1.0) translate(-5,0)"
+ style="fill-rule:evenodd;fill:#ffffff;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 0,-5 L -5,0 L 0,5 L 5,0 L 0,-5 z "
+ id="path7" />
+ </marker>
+ <linearGradient
+ id="linearGradient3286">
+ <stop
+ id="stop3288"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3290"
+ offset="1"
+ style="stop-color:#79e291;stop-opacity:1;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="EmptyArrow"
+ refX="0.0"
+ refY="0.0"
+ orient="auto">
+ <path
+ transform="scale(1.0) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 0.0,-5.0 L -12.5,0.0 L 0.0,5.0 L 0.0,0.0 z M -0.5,0.0 L -0.5,-4.5 L -12.0,0.0 L -0.5,4.5 L -0.5,0.0 z"
+ id="path9" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="EmptyArrow2"
+ refX="0.0"
+ refY="0.0"
+ orient="auto">
+ <path
+ transform="scale(1.0) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;fill:#ffffff;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 0.0,-5.0 L -10.0,0.0 L 0.0,5.0 L 0.0,0.0 z"
+ id="path13" />
+ </marker>
+ <linearGradient
+ id="linearGradient19816">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop19818" />
+ <stop
+ style="stop-color:#e7e790;stop-opacity:1;"
+ offset="1"
+ id="stop19820" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Lend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="scale(1.1) rotate(180) translate(1,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path16811" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Lend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ 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 "
+ id="path16829" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutM"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutM">
+ <path
+ transform="scale(0.4)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path16731" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleInL"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleInL">
+ <path
+ transform="scale(-0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path16743" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutL"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path16734" />
+ </marker>
+ <linearGradient
+ id="linearGradient9263">
+ <stop
+ id="stop9265"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:0" />
+ <stop
+ id="stop9267"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7299">
+ <stop
+ id="stop7301"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1" />
+ <stop
+ id="stop7303"
+ offset="1"
+ style="stop-color:#a090e7;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5349">
+ <stop
+ id="stop5351"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop5353"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4152">
+ <stop
+ id="stop4154"
+ offset="0"
+ style="stop-color:#6b6bff;stop-opacity:1;" />
+ <stop
+ id="stop4156"
+ offset="1"
+ style="stop-color:#6b6bff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="148.38934"
+ x2="389.01985"
+ y1="148.38934"
+ x1="96.085953"
+ id="linearGradient5355"
+ xlink:href="#linearGradient5349"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient11602"
+ xlink:href="#linearGradient19816"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(0.9214039,2.3896193e-3,-2.166448e-3,0.5977017,541.12253,30.198804)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3268"
+ xlink:href="#linearGradient19816"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3270"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.6000725,2.3808346e-3,-3.7621654e-3,0.5955044,664.61868,-4.8275956)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3272"
+ xlink:href="#linearGradient19816"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3274"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3276"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3278"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <radialGradient
+ r="109.42857"
+ fy="97.300964"
+ fx="-147.5"
+ cy="97.300964"
+ cx="-147.5"
+ gradientTransform="matrix(1.3208501,2.3843471e-3,-3.1056446e-3,0.596383,334.93437,78.721097)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3280"
+ xlink:href="#linearGradient7299"
+ inkscape:collect="always" />
+ <marker
+ markerWidth="4.6297355"
+ markerHeight="5.7450781"
+ orient="auto"
+ id="marker44971-5">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g18059-9">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ id="path18061-1"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ id="path18063-4"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450776"
+ orient="auto"
+ id="marker18095-3">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
+ id="g11064-5">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ id="path11050-8"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ id="path11035-2"
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSC"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="DotSC">
+ <path
+ transform="scale(0.2) translate(7.4, 1)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#49c2f1;stroke-width:1.0pt;fill:#49c2f1"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ id="path5535" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSC-1"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSC">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ id="path5535-8" />
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450776"
+ orient="auto"
+ id="marker18095-34">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
+ id="g11064-1">
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 370,508.65625 c -0.86067,0.0587 -1.60944,0.6213 -1.90625,1.4375 -0.26976,0.74176 -0.0577,1.53493 0.4375,2.125 l -1.75,0 c -0.0424,-0.005 -0.0824,0.002 -0.125,0 l 0,4.375 0.125,0 1.75,0 c -0.67896,0.8597 -0.69701,2.11549 0.0937,2.90625 0.85091,0.85091 2.27409,0.85091 3.125,0 l 3.34375,-3.375 c 0.033,-0.0295 0.0643,-0.0608 0.0937,-0.0937 0.0322,-0.0193 0.0635,-0.0402 0.0937,-0.0625 3.7e-4,-3.6e-4 0.21851,-0.28079 0.21875,-0.28125 5e-5,-9e-5 -0.007,-0.0447 0,-0.0625 0.001,-0.003 0.03,0.003 0.0312,0 0.0391,-0.0521 0.051,-0.0518 0.0937,-0.125 0.13699,-0.23476 0.16684,-0.37191 0.15625,-0.34375 0.0368,-0.0915 0.0185,-0.11251 0.0312,-0.15625 0.0106,-0.0102 0.021,-0.0206 0.0312,-0.0312 0.06,-0.22398 0.0881,-0.51689 0.0625,-0.78125 -0.0136,-0.20363 -0.0589,-0.29765 -0.0625,-0.3125 1.4e-4,-0.0104 1.4e-4,-0.0208 0,-0.0312 0.026,0.097 0.0153,0.016 -0.0937,-0.25 -0.0525,-0.13039 -0.0899,-0.21936 -0.125,-0.28125 -0.0524,-0.0897 -0.13346,-0.26235 -0.34375,-0.46875 L 371.75,509.3125 c -0.45645,-0.48671 -1.08509,-0.71163 -1.75,-0.65625 z"
+ id="path11050-84"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ d="m 366.65625,515.40625 4.625,0 -1.8125,1.8125 c -0.39695,0.39695 -0.39695,1.04055 0,1.4375 0.39695,0.39695 1.04055,0.39695 1.4375,0 l 3.4375,-3.46875 0.0937,-0.0625 c 0.006,-0.006 -0.006,-0.0253 0,-0.0312 0.0554,-0.0572 0.1151,-0.11699 0.15625,-0.1875 0.0286,-0.0491 0.0429,-0.10409 0.0625,-0.15625 0.0124,-0.0307 0.0221,-0.0622 0.0312,-0.0937 0.0311,-0.1161 0.0427,-0.22493 0.0312,-0.34375 -0.004,-0.0578 -0.0174,-0.0996 -0.0312,-0.15625 -0.0109,-0.0407 -0.0151,-0.0857 -0.0312,-0.125 -0.0164,-0.0408 -0.0405,-0.0862 -0.0625,-0.125 -0.0455,-0.0779 -0.0936,-0.15726 -0.15625,-0.21875 l -3.53125,-3.53125 c -0.20891,-0.22276 -0.50816,-0.33785 -0.8125,-0.3125 -0.39478,0.0269 -0.73977,0.28438 -0.875,0.65625 -0.13524,0.37187 -0.0353,0.78826 0.25,1.0625 l 1.875,1.84375 -4.6875,0"
+ id="path11035-25"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ </defs>
+ <metadata
+ id="metadata1906">
+ <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
+ style="opacity:1"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Taso 1">
+ <g
+ transform="matrix(1.4062095,0,0,1.4062095,-160.27559,-197.72935)"
+ id="g6925"
+ style="display:inline">
+ <rect
+ ry="3.7880721"
+ y="231.36011"
+ x="167.87294"
+ height="53.157619"
+ width="123.88699"
+ id="rect2549"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="174.42322"
+ y="248.96115"
+ id="text6921"><tspan
+ sodipodi:role="line"
+ id="tspan6923"
+ x="174.42322"
+ y="248.96115">CalculatorView</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-5"
+ y="262.29724"
+ x="173.71204"
+ style="font-size:9.95584228px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Italic"
+ xml:space="preserve"><tspan
+ id="tspan4492"
+ y="262.29724"
+ x="173.71204"
+ sodipodi:role="line">setDisplay()</tspan><tspan
+ y="274.74203"
+ x="173.71204"
+ sodipodi:role="line"
+ id="tspan5929">addListener()</tspan></text>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path5742"
+ sodipodi:cx="225"
+ sodipodi:cy="172.36218"
+ sodipodi:rx="10"
+ sodipodi:ry="10"
+ d="m 235,172.36218 a 10,10 0 1 1 0,-0.005"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ sodipodi:open="true"
+ transform="translate(25,2.6171874e-6)" />
+ <g
+ transform="matrix(1.4062095,0,0,1.4062095,52.743842,-199.95949)"
+ id="g6951"
+ style="display:inline">
+ <rect
+ ry="3.7880721"
+ y="232.76878"
+ x="168.72035"
+ height="71.113159"
+ width="131.55934"
+ id="rect6953"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="175.83167"
+ y="250.54707"
+ id="text6955"><tspan
+ sodipodi:role="line"
+ id="tspan6957"
+ x="175.83167"
+ y="250.54707">CalculatorPresenter</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-5-4"
+ y="263.88318"
+ x="177.25385"
+ style="font-size:9.95584202px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ id="tspan4492-0"
+ y="263.88318"
+ x="177.25385"
+ sodipodi:role="line">buttonClick()</tspan></text>
+ </g>
+ <g
+ transform="matrix(1.4062095,0,0,1.4062095,-160.02993,-59.169572)"
+ id="g6951-6"
+ style="display:inline">
+ <rect
+ ry="3.7880721"
+ y="232.20705"
+ x="167.13719"
+ height="71.113159"
+ width="124.44804"
+ id="rect6953-7"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="172.96414"
+ y="250.54707"
+ id="text6955-8"><tspan
+ sodipodi:role="line"
+ id="tspan6957-7"
+ x="172.96414"
+ y="250.54707">CalculatorViewImpl</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-5-6"
+ y="264.20798"
+ x="174.24852"
+ style="font-size:9.95584202px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ id="tspan4492-3"
+ y="264.20798"
+ x="174.24852"
+ sodipodi:role="line">setDisplay()</tspan><tspan
+ y="276.65277"
+ x="174.24852"
+ sodipodi:role="line"
+ id="tspan5931">addListener()</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155"
+ y="237.36218"
+ x="160"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="237.36218"
+ x="160"
+ id="tspan3157"
+ sodipodi:role="line">«implements»</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3204"
+ d="m 150,267.36218 0,-65"
+ style="fill:none;stroke:#49c2f1;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker18095)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3204-2"
+ d="m 290,172.36218 -40,0"
+ style="fill:none;stroke:#49c2f1;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSC)" />
+ <g
+ transform="matrix(1.4062095,0,0,1.4062095,54.970076,-59.169585)"
+ id="g6951-6-1"
+ style="display:inline">
+ <rect
+ ry="3.7880721"
+ y="232.20705"
+ x="167.13719"
+ height="88.891457"
+ width="131.55936"
+ id="rect6953-7-4"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="172.96414"
+ y="250.54707"
+ id="text6955-8-8"><tspan
+ sodipodi:role="line"
+ id="tspan6957-7-3"
+ x="172.96414"
+ y="250.54707">Calculator</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-5-6-8"
+ y="264.20798"
+ x="174.24852"
+ style="font-size:9.95584202px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="264.20798"
+ x="174.24852"
+ id="tspan3157-2-8-1"
+ sodipodi:role="line">set/getValue()</tspan><tspan
+ id="tspan4492-3-8"
+ y="276.65277"
+ x="174.24852"
+ sodipodi:role="line">add()</tspan><tspan
+ y="289.0976"
+ x="174.24852"
+ sodipodi:role="line"
+ id="tspan5919">multiply()</tspan><tspan
+ y="301.54239"
+ x="174.24852"
+ sodipodi:role="line"
+ id="tspan5921">divide()</tspan><tspan
+ y="313.98718"
+ x="174.24852"
+ sodipodi:role="line"
+ id="tspan5923">clear()</tspan></text>
+ </g>
+ <path
+ transform="translate(140,95)"
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path5742-1"
+ sodipodi:cx="225"
+ sodipodi:cy="172.36218"
+ sodipodi:rx="10"
+ sodipodi:ry="10"
+ d="m 235,172.36218 a 10,10 0 1 1 0,-0.005"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ sodipodi:open="true" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3204-2-7"
+ d="m 365,227.36218 0,40"
+ style="fill:none;stroke:#49c2f1;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotSC)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-50"
+ y="162.36218"
+ x="251"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="162.36218"
+ x="251"
+ id="tspan3157-1"
+ sodipodi:role="line">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-50-0"
+ y="262.36218"
+ x="373.69604"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="262.36218"
+ x="373.69604"
+ id="tspan3157-1-5"
+ sodipodi:role="line">1</tspan></text>
+ <g
+ transform="matrix(1.4062095,0,0,1.4062095,-130.27557,-232.9786)"
+ id="g6925-1"
+ style="display:inline">
+ <rect
+ ry="3.7880721"
+ y="231.36011"
+ x="167.31189"
+ height="32.000923"
+ width="110.2254"
+ id="rect2549-7"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.42226315;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.53357887px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ x="174.42322"
+ y="244.69438"
+ id="text6921-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6923-7"
+ x="174.42322"
+ y="244.69438">CalculatorViewListener</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-5-63"
+ y="255.1859"
+ x="175.13429"
+ style="font-size:7.11131592px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Italic"
+ xml:space="preserve"><tspan
+ id="tspan4492-7"
+ y="255.1859"
+ x="175.13429"
+ sodipodi:role="line">buttonClick()</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path3204-6"
+ d="m 365,127.36218 0,-10 -105,0"
+ style="fill:none;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker18095)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3155-9"
+ y="112.36218"
+ x="280"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ y="112.36218"
+ x="280"
+ id="tspan3157-7"
+ sodipodi:role="line">«implements»</tspan></text>
+ </g>
+ <g
+ inkscape:label="Varjot"
+ id="layer2"
+ inkscape:groupmode="layer" />
+</svg>
diff --git a/documentation/advanced/original-drawings/threadlocal-concurrency.svg b/documentation/advanced/original-drawings/threadlocal-concurrency.svg new file mode 100644 index 0000000000..5c88b92486 --- /dev/null +++ b/documentation/advanced/original-drawings/threadlocal-concurrency.svg @@ -0,0 +1,1142 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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="744.09448"
+ height="1052.3622"
+ id="svg2475"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="threadlocal-concurrency.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
+ inkscape:export-xdpi="300.01001"
+ inkscape:export-ydpi="300.01001"
+ version="1.0">
+ <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.6970563"
+ inkscape:cx="416.73703"
+ inkscape:cy="658.67086"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="232"
+ inkscape:window-y="0"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ units="mm"
+ inkscape:snap-global="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ spacingy="1mm"
+ spacingx="1mm"
+ empspacing="5"
+ units="mm"
+ enabled="true"
+ visible="true"
+ id="grid4674"
+ type="xygrid"
+ dotted="false" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2477">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5210"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 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
+ style="overflow:visible"
+ id="DotS"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotS">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path3636" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS"
+ style="overflow:visible">
+ <path
+ id="path3717"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <inkscape:path-effect
+ copytype="single_stretched"
+ pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
+ prop_scale="1"
+ id="path-effect2503"
+ effect="skeletal" />
+ <inkscape:path-effect
+ prop_scale="1"
+ id="path-effect2499"
+ effect="skeletal" />
+ <inkscape:path-effect
+ pattern-nodetypes="cc"
+ pattern="M 432.28346,272.83462 L 403.93701,216.14171"
+ prop_scale="1"
+ id="path-effect2497"
+ effect="skeletal" />
+ <marker
+ style="overflow:visible"
+ id="Arrow1Send"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3641" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3629" />
+ </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="perspective3487" />
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendp"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendp">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
+ id="path28139" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSK"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSK">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36611" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSH"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSH">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36614" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSA">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36617" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSKF"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSKF">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36620" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS9"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS9">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36623" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2SendpA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2SendpA">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
+ id="path3396" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendpg"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendpg">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ 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"
+ style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
+ id="path3360" />
+ </marker>
+ <filter
+ id="filter2780"
+ inkscape:label="White Halo"
+ width="1.1"
+ height="1.1">
+ <feMorphology
+ id="feMorphology2782"
+ operator="dilate"
+ radius="3"
+ result="result0" />
+ <feFlood
+ id="feFlood2786"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="1"
+ in="result0"
+ result="result3" />
+ <feComposite
+ id="feComposite2623"
+ in="result3"
+ in2="result0"
+ operator="in"
+ result="result4" />
+ <feMerge
+ id="feMerge2629">
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2631"
+ in="result4" />
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2633"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSn"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSn"
+ style="overflow:visible">
+ <path
+ id="path4441"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS9F"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS9F"
+ style="overflow:visible">
+ <path
+ id="path4444"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI"
+ style="overflow:visible">
+ <path
+ id="path4447"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSO"
+ style="overflow:visible">
+ <path
+ id="path4450"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSW"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSW"
+ style="overflow:visible">
+ <path
+ id="path4453"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSB"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSB"
+ style="overflow:visible">
+ <path
+ id="path4456"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSZ"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSZ"
+ style="overflow:visible">
+ <path
+ id="path4459"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSq"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSq">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path5853" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSBO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSBO"
+ style="overflow:visible">
+ <path
+ id="path7501"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path9463" />
+ </marker>
+ <filter
+ height="1.1"
+ width="1.1"
+ inkscape:label="Black Halo"
+ id="filter10694">
+ <feMorphology
+ result="result0"
+ radius="3"
+ operator="dilate"
+ id="feMorphology10696" />
+ <feFlood
+ result="result3"
+ in="result0"
+ flood-opacity="1"
+ flood-color="rgb(0,0,0)"
+ id="feFlood10698" />
+ <feComposite
+ result="result4"
+ operator="in"
+ in2="result0"
+ in="result3"
+ id="feComposite10700" />
+ <feMerge
+ id="feMerge10702">
+ <feMergeNode
+ in="result4"
+ id="feMergeNode10704"
+ inkscape:collect="always" />
+ <feMergeNode
+ in="SourceGraphic"
+ id="feMergeNode10706"
+ inkscape:collect="always" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSu"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSu"
+ style="overflow:visible">
+ <path
+ id="path8127"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI8"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI8"
+ style="overflow:visible">
+ <path
+ id="path8130"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSr"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSr"
+ style="overflow:visible">
+ <path
+ id="path8133"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSM"
+ style="overflow:visible">
+ <path
+ id="path8136"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSb"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSb"
+ style="overflow:visible">
+ <path
+ id="path8139"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ id="marker18095"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker44971"
+ orient="auto"
+ markerHeight="5.7450781"
+ markerWidth="4.6297355">
+ <g
+ id="g18059"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path18061"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18063"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker64887"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297255">
+ <g
+ id="g64855"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path64857"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path64859"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker4057"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297302">
+ <g
+ id="g51986"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path51988"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path51990"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker72805"
+ orient="auto"
+ markerHeight="4.5568175"
+ markerWidth="4.0334239">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18057"
+ d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ id="marker72808"
+ orient="auto"
+ markerHeight="4.5568123"
+ markerWidth="4.0334177">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path72801"
+ d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSuN"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSuN">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path81580" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSqO"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSqO">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#f39300;stroke-width:1pt;fill:#f39300"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path13615" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSqOt"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSqOt">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#49c2f1;stroke-width:1pt;fill:#49c2f1"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path13992" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSqOth"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSqOth">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#d9d9cd;stroke-width:1pt;fill:#d9d9cd"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path14421" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSqOtY"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSqOtY">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#f39300;stroke-width:1pt;fill:#f39300"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path12260" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata2480">
+ <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
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot2485"
+ xml:space="preserve"><flowRegion
+ id="flowRegion2487"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ y="238.07646"
+ x="262.85715"
+ height="120"
+ width="184.28572"
+ id="rect2489" /></flowRegion><flowPara
+ id="flowPara2491" /></flowRoot> <g
+ transform="translate(-3.5714286,23.214286)"
+ id="g3178" />
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="flowRoot8724"
+ xml:space="preserve"><flowRegion
+ id="flowRegion8726"><rect
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ y="752.14441"
+ x="39.286312"
+ height="22.868153"
+ width="29.904507"
+ id="rect8728" /></flowRegion><flowPara
+ id="flowPara8730" /></flowRoot> <g
+ transform="matrix(0.5,0,0,0.5,103.34299,0.7940752)"
+ id="g18053" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:3.54330707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 577.33419,443.27065 -417.68723,0"
+ id="path2544"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:3.54330707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 578.16752,344.99696 -418.93723,0"
+ id="path7078"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(215.28678,114.29679)"
+ id="g7090">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect7092"
+ width="72.269569"
+ height="35.433075"
+ x="14.173247"
+ y="237.40155"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(19.422623,251.0954)"
+ id="flowRoot14290"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion14292" /><flowPara
+ id="flowPara14294">User B</flowPara><flowPara
+ id="flowPara14296">Request</flowPara></flowRoot> </g>
+ <g
+ transform="translate(160.20793,143.48504)"
+ id="g7100">
+ <rect
+ ry="3.7880721"
+ y="208.55002"
+ x="172.42705"
+ height="35.93816"
+ width="87.798714"
+ id="rect7102"
+ style="opacity:1;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ transform="translate(178.96771,222.54606)"
+ id="flowRoot7104"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion7106" /><flowPara
+ id="flowPara14282">User A</flowPara><flowPara
+ id="flowPara14286">Request</flowPara></flowRoot> </g>
+ <g
+ transform="translate(160.8144,273.6179)"
+ id="g12724">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect12726"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(272.73415,204.25271)"
+ id="flowRoot12728"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion12730" /><flowPara
+ id="flowPara12732">Data B</flowPara></flowRoot> </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path8430"
+ d="m 164.52619,374.82623 24.11062,-0.6048"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path13507"
+ d="m 547.05718,374.82623 24.11062,-0.6048"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(98.710324,220.60224)"
+ id="g13489">
+ <flowRoot
+ transform="translate(168.53473,197.13766)"
+ id="flowRoot13493"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion13495" /><flowPara
+ id="flowPara13502">ThreadLocal</flowPara><flowPara
+ id="flowPara12568">Reference</flowPara></flowRoot> <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#d9d9cd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect13491"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path13881"
+ d="m 356.13661,437.61897 -9.65403,15.6042"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path6576"
+ d="m 373.0034,409.38453 -0.004,-10.08184"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOth);display:inline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(38.81777,272.95927)"
+ id="g3696">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f39300;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3698"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(272.73415,204.25271)"
+ id="flowRoot3700"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3702" /><flowPara
+ id="flowPara3704">Data A</flowPara></flowRoot> </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path13883"
+ d="m 388.14963,437.57598 8.51687,14.46247"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path14262"
+ d="m 515.13539,381.83876 -0.64979,14.46247"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path14264"
+ d="m 299.76931,384.93236 0.16044,12.62321"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(431.12012,114.29679)"
+ id="g14298">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect14300"
+ width="72.269569"
+ height="35.433075"
+ x="14.173247"
+ y="237.40155"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(19.422623,251.0954)"
+ id="flowRoot14302"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion14304" /><flowPara
+ id="flowPara14306">User B</flowPara><flowPara
+ id="flowPara14308">Request</flowPara></flowRoot> </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path14310"
+ d="m 372.90447,387.62702 0.0947,10.18752"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path2540"
+ d="M 357.28507,435.52453 372.9481,409.86787"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4.00039387;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path7961"
+ d="m 418.39227,384.45566 0.0947,8.20888"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path8736"
+ d="m 334.74425,384.69509 0.0947,8.20888"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path8738"
+ d="m 231.54764,384.9544 0.16044,8.04347"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9513"
+ d="m 447.2753,384.39663 0.16044,8.04347"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:3.54330707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 577.33419,242.02064 -417.68723,0"
+ id="path9733"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(37.233967,94.297449)"
+ id="g9747">
+ <rect
+ ry="3.7880721"
+ y="208.55002"
+ x="172.42705"
+ height="35.93816"
+ width="87.798714"
+ id="rect9749"
+ style="opacity:1;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ transform="translate(178.96771,222.54606)"
+ id="flowRoot9751"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9753" /><flowPara
+ id="flowPara9755">User A</flowPara><flowPara
+ id="flowPara9757">Request</flowPara></flowRoot> </g>
+ <g
+ transform="translate(338.14616,65.1092)"
+ id="g9763">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect9765"
+ width="72.269569"
+ height="35.433075"
+ x="14.173247"
+ y="237.40155"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(19.422623,251.0954)"
+ id="flowRoot9767"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9769" /><flowPara
+ id="flowPara9771">User B</flowPara><flowPara
+ id="flowPara9773">Request</flowPara></flowRoot> </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9775"
+ d="m 295.18052,304.43942 0.0947,-12.914"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9779"
+ d="m 211.77029,297.50749 0.0947,8.20888"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9783"
+ d="m 354.30134,297.20903 0.16044,8.04347"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(276.98029,92.788348)"
+ id="g9785">
+ <rect
+ ry="3.7880721"
+ y="208.55002"
+ x="172.42705"
+ height="35.93816"
+ width="87.798714"
+ id="rect9787"
+ style="opacity:1;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ transform="translate(178.96771,222.54606)"
+ id="flowRoot9789"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9791" /><flowPara
+ id="flowPara9793">User A</flowPara><flowPara
+ id="flowPara9795">Request</flowPara></flowRoot> </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9797"
+ d="m 534.84349,302.4303 0.0947,-10.97365"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9801"
+ d="m 451.51661,295.99839 0.0947,8.20888"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9805"
+ d="m 422.38468,297.20903 0.16044,8.04347"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <g
+ transform="translate(132.26747,69.915423)"
+ id="g9807">
+ <flowRoot
+ transform="translate(166.53473,195.13766)"
+ id="flowRoot9809"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion9811" /><flowPara
+ id="flowPara9813">ThreadLocal</flowPara><flowPara
+ id="flowPara9815">Reference</flowPara></flowRoot> <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#d9d9cd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect9817"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9819"
+ d="m 401.62682,286.48218 20.66303,-32.73999"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4.00039387;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-type="polyline"
+ id="path9759"
+ d="m 401.57217,306.56781 -0.0605,-15.49058"
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path10598"
+ d="M 423.75,251.5462 L 435.69904,234.44552 L 589.16667,234.44551 L 589.16667,472.36218 L 470.83334,472.36218"
+ style="fill:none;fill-rule:evenodd;stroke:#49c2f1;stroke-width:3.54330709;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;opacity:1;color:#000000;fill-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cccccs"
+ id="path10601"
+ d="M 386.87501,250.92119 L 404.16922,228.82052 L 595.625,227.98718 L 594.79167,499.65384 L 356.87501,499.23718 L 347.70834,490.48718"
+ style="opacity:1;stroke-linejoin:round;enable-background:accumulate;marker-end:url(#DotSqOtY);stroke-opacity:1;fill-rule:evenodd;marker-start:none;fill-opacity:1;stroke-dashoffset:0;visibility:visible;display:inline;stroke:#f39300;stroke-linecap:round;stroke-miterlimit:4;marker:none;stroke-dasharray:none;overflow:visible;stroke-width:3.54330709;marker-mid:none;fill:none" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path12570"
+ d="m 164.44286,320.4929 24.11062,-0.6048"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path12572"
+ d="m 547.05718,320.82623 24.11062,-0.6048"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <flowRoot
+ transform="translate(158.5545,257.37226)"
+ id="flowRoot12574"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion12576" /><flowPara
+ id="flowPara12578">Thread 1</flowPara></flowRoot> <flowRoot
+ transform="translate(158.32228,359.37226)"
+ id="flowRoot12580"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion12582" /><flowPara
+ id="flowPara12584">Thread 2</flowPara></flowRoot> </g>
+</svg>
diff --git a/documentation/advanced/original-drawings/threadlocal-sequentiality.svg b/documentation/advanced/original-drawings/threadlocal-sequentiality.svg new file mode 100644 index 0000000000..86475d262e --- /dev/null +++ b/documentation/advanced/original-drawings/threadlocal-sequentiality.svg @@ -0,0 +1,980 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- 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="744.09448"
+ height="1052.3622"
+ id="svg2475"
+ sodipodi:version="0.32"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="threadlocal-sequentiality.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
+ inkscape:export-xdpi="300.01001"
+ inkscape:export-ydpi="300.01001"
+ version="1.0">
+ <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.4"
+ inkscape:cx="374.31245"
+ inkscape:cy="621.17988"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="232"
+ inkscape:window-y="0"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ units="mm"
+ inkscape:snap-global="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ dotted="false"
+ type="xygrid"
+ id="grid4674"
+ visible="true"
+ enabled="true"
+ units="mm"
+ empspacing="5"
+ spacingx="1mm"
+ spacingy="1mm" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2477">
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path5210" />
+ </marker>
+ <marker
+ inkscape:stockid="DotS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotS"
+ style="overflow:visible">
+ <path
+ id="path3636"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path3717" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2503"
+ prop_scale="1"
+ pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
+ copytype="single_stretched" />
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2499"
+ prop_scale="1" />
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2497"
+ prop_scale="1"
+ pattern="M 432.28346,272.83462 L 403.93701,216.14171"
+ pattern-nodetypes="cc" />
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send"
+ style="overflow:visible">
+ <path
+ id="path3641"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3629"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 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
+ id="perspective3487"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow2Sendp"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sendp"
+ style="overflow:visible">
+ <path
+ id="path28139"
+ style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;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(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSK"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSK"
+ style="overflow:visible">
+ <path
+ id="path36611"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSH"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSH"
+ style="overflow:visible">
+ <path
+ id="path36614"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSA"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSA"
+ style="overflow:visible">
+ <path
+ id="path36617"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSKF"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSKF"
+ style="overflow:visible">
+ <path
+ id="path36620"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS9"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS9"
+ style="overflow:visible">
+ <path
+ id="path36623"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2SendpA"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2SendpA"
+ style="overflow:visible">
+ <path
+ id="path3396"
+ style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;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(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sendpg"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sendpg"
+ style="overflow:visible">
+ <path
+ id="path3360"
+ style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;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(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <filter
+ height="1.1"
+ width="1.1"
+ inkscape:label="White Halo"
+ id="filter2780">
+ <feMorphology
+ result="result0"
+ radius="3"
+ operator="dilate"
+ id="feMorphology2782" />
+ <feFlood
+ result="result3"
+ in="result0"
+ flood-opacity="1"
+ flood-color="rgb(255,255,255)"
+ id="feFlood2786" />
+ <feComposite
+ result="result4"
+ operator="in"
+ in2="result0"
+ in="result3"
+ id="feComposite2623" />
+ <feMerge
+ id="feMerge2629">
+ <feMergeNode
+ in="result4"
+ id="feMergeNode2631"
+ inkscape:collect="always" />
+ <feMergeNode
+ in="SourceGraphic"
+ id="feMergeNode2633"
+ inkscape:collect="always" />
+ </feMerge>
+ </filter>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSn"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSn">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4441" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS9F"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS9F">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4444" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSI"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSI">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4447" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSO"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSO">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4450" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSW"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSW">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4453" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSB"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSB">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4456" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSZ"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSZ">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4459" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSq"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSq"
+ style="overflow:visible">
+ <path
+ id="path5853"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSBO"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSBO">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path7501" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSu"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSu"
+ style="overflow:visible">
+ <path
+ id="path9463"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <filter
+ id="filter10694"
+ inkscape:label="Black Halo"
+ width="1.1"
+ height="1.1">
+ <feMorphology
+ id="feMorphology10696"
+ operator="dilate"
+ radius="3"
+ result="result0" />
+ <feFlood
+ id="feFlood10698"
+ flood-color="rgb(0,0,0)"
+ flood-opacity="1"
+ in="result0"
+ result="result3" />
+ <feComposite
+ id="feComposite10700"
+ in="result3"
+ in2="result0"
+ operator="in"
+ result="result4" />
+ <feMerge
+ id="feMerge10702">
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode10704"
+ in="result4" />
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode10706"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSu"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSu">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8127" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSI8"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSI8">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8130" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSr"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSr">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8133" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSM"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSM">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8136" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSb"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSb">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8139" />
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450776"
+ orient="auto"
+ id="marker18095">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
+ id="g11064">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path11050"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path11035"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297355"
+ markerHeight="5.7450781"
+ orient="auto"
+ id="marker44971">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g18059">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path18061"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path18063"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450786"
+ orient="auto"
+ id="marker52016">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g52010">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path52012"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path52014"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297255"
+ markerHeight="5.745079"
+ orient="auto"
+ id="marker64887">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g64855">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path64857"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path64859"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.745079"
+ orient="auto"
+ id="marker4057">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g51986">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path51988"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path51990"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.0334239"
+ markerHeight="4.5568175"
+ orient="auto"
+ id="marker72805">
+ <path
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
+ id="path18057"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </marker>
+ <marker
+ markerWidth="4.0334177"
+ markerHeight="4.5568123"
+ orient="auto"
+ id="marker72808">
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
+ id="path72801"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSuN"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSuN"
+ style="overflow:visible">
+ <path
+ id="path81580"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSqO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSqO"
+ style="overflow:visible">
+ <path
+ id="path13615"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#f39300;stroke-width:1pt;fill:#f39300"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSqOt"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSqOt"
+ style="overflow:visible">
+ <path
+ id="path13992"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#49c2f1;stroke-width:1pt;fill:#49c2f1"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSqOth"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSqOth"
+ style="overflow:visible">
+ <path
+ id="path14421"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#d9d9cd;stroke-width:1pt;fill:#d9d9cd"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata2480">
+ <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">
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2485"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"><flowRegion
+ id="flowRegion2487"><rect
+ id="rect2489"
+ width="184.28572"
+ height="120"
+ x="262.85715"
+ y="238.07646"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold" /></flowRegion><flowPara
+ id="flowPara2491" /></flowRoot> <g
+ id="g3178"
+ transform="translate(-3.5714286,23.214286)" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot8724"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"><flowRegion
+ id="flowRegion8726"><rect
+ id="rect8728"
+ width="29.904507"
+ height="22.868153"
+ x="39.286312"
+ y="752.14441"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light" /></flowRegion><flowPara
+ id="flowPara8730" /></flowRoot> <g
+ id="g18053"
+ transform="matrix(0.5,0,0,0.5,103.34299,0.7940752)" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path2544"
+ d="m 577.33419,399.27065 -417.68723,0"
+ style="fill:none;stroke:#000000;stroke-width:3.54330707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path7078"
+ d="m 578.16752,344.99696 -418.93723,0"
+ style="fill:none;stroke:#000000;stroke-width:3.54330707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g7090"
+ transform="translate(205.28678,114.29679)">
+ <rect
+ ry="3.7880721"
+ y="237.40155"
+ x="14.173247"
+ height="35.433075"
+ width="72.269569"
+ id="rect7092"
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot14290"
+ transform="translate(19.422623,251.0954)"><flowRegion
+ id="flowRegion14292" /><flowPara
+ id="flowPara14294">User B</flowPara><flowPara
+ id="flowPara14296">Request</flowPara></flowRoot> </g>
+ <g
+ id="g7100"
+ transform="translate(160.20793,143.48504)">
+ <rect
+ style="opacity:1;fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect7102"
+ width="87.798714"
+ height="35.93816"
+ x="172.42705"
+ y="208.55002"
+ ry="3.7880721" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot7104"
+ transform="translate(178.96771,222.54606)"><flowRegion
+ id="flowRegion7106" /><flowPara
+ id="flowPara14282">User A</flowPara><flowPara
+ id="flowPara14286">Request</flowPara></flowRoot> </g>
+ <g
+ id="g12724"
+ transform="translate(160.8144,287.6179)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="234.86888"
+ height="35.43306"
+ width="74.409447"
+ id="rect12726"
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot12728"
+ transform="translate(272.73415,204.25271)"><flowRegion
+ id="flowRegion12730" /><flowPara
+ id="flowPara12732">Data B</flowPara></flowRoot> </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ d="m 164.52619,370.82623 24.11062,-0.6048"
+ id="path8430"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ d="m 547.05718,370.82623 24.11062,-0.6048"
+ id="path13507"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g13489"
+ transform="translate(98.710324,234.60224)">
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot13493"
+ transform="translate(162.53473,193.13766)"><flowRegion
+ id="flowRegion13495" /><flowPara
+ id="flowPara13497">Switchable</flowPara><flowPara
+ id="flowPara13502">Reference</flowPara></flowRoot> <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="234.86888"
+ height="35.43306"
+ width="74.409447"
+ id="rect13491"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#d9d9cd;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ d="m 356.13661,451.61897 -9.65403,15.6042"
+ id="path13881"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOth);display:inline"
+ d="m 373.0034,423.38453 -0.004,-10.08184"
+ id="path6576"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g3696"
+ transform="translate(38.81777,286.95927)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="234.86888"
+ height="35.43306"
+ width="74.409447"
+ id="rect3698"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#f39300;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;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:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot3700"
+ transform="translate(272.73415,204.25271)"><flowRegion
+ id="flowRegion3702" /><flowPara
+ id="flowPara3704">Data A</flowPara></flowRoot> </g>
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ d="m 388.14963,451.57598 8.51687,14.46247"
+ id="path13883"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ d="m 515.13539,381.83876 -0.64979,22.7958"
+ id="path14262"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqOt);display:inline"
+ d="m 289.76931,384.93236 0.16044,20.12321"
+ id="path14264"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g14298"
+ transform="translate(431.12012,114.29679)">
+ <rect
+ ry="3.7880721"
+ y="237.40155"
+ x="14.173247"
+ height="35.433075"
+ width="72.269569"
+ id="rect14300"
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot14302"
+ transform="translate(19.422623,251.0954)"><flowRegion
+ id="flowRegion14304" /><flowPara
+ id="flowPara14306">User B</flowPara><flowPara
+ id="flowPara14308">Request</flowPara></flowRoot> </g>
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#DotSqO);display:inline"
+ d="m 372.90447,387.62702 0.0947,18.52085"
+ id="path14310"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#d9d9cd;stroke-width:4.00039387;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="M 356.03507,451.60786 372.9481,423.86787"
+ id="path2540"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="flowRoot7955"
+ transform="translate(444.56871,337.39513)"><flowRegion
+ id="flowRegion7957" /><flowPara
+ id="flowPara7959">transactionStart()</flowPara></flowRoot> <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 418.39227,384.45566 0.0947,8.20888"
+ id="path7961"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 334.74425,384.69509 0.0947,8.20888"
+ id="path8736"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 221.54764,384.9544 0.16044,8.04347"
+ id="path8738"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 447.2753,384.39663 0.16044,8.04347"
+ id="path9513"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1.77165353;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="m 421.96015,389.14884 25.24637,-48.15665"
+ id="path9515"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="flowRoot9517"
+ transform="translate(304.44491,338.82052)"><flowRegion
+ id="flowRegion9519" /><flowPara
+ id="flowPara9521">transactionEnd()</flowPara></flowRoot> <path
+ style="fill:none;stroke:#000000;stroke-width:1.77165353;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:none;display:inline"
+ d="M 329.87681,389.77384 311.37319,340.78385"
+ id="path9523"
+ inkscape:connector-type="polyline"
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
|