doc: remove docbook

Signed-off-by: Julian Orth <ju.orth@gmail.com>
This commit is contained in:
Julian Orth 2026-01-31 11:59:10 +01:00
parent 7f7e2d50f2
commit d2931c68b3
70 changed files with 2 additions and 8974 deletions

View file

@ -9,11 +9,6 @@ import sys
# Custom configuration for each documentation format
doxygen_templates = {
'xml': [
'GENERATE_XML=YES\n',
'XML_OUTPUT={format}/{section}\n',
'INPUT= {files}\n',
],
'html': [
'GENERATE_HTML=YES\n',
'HTML_OUTPUT={format}/{section}\n',
@ -60,9 +55,9 @@ parser.add_argument('--section',
metavar='NAME',
default='Client')
parser.add_argument('--output-format',
help='The output format: xml, html, man',
help='The output format: html, man',
metavar='FORMAT',
default='xml')
default='html')
parser.add_argument('--stamp',
help='Stamp file to output',
metavar='STAMP_FILE',

View file

@ -48,8 +48,6 @@ extra_cursor_files = [
gen_doxygen = find_program('gen-doxygen.py')
subdir('xml')
formats = {
'html': {
'Client': shared_files + client_files + extra_client_files,

View file

@ -1,17 +0,0 @@
tgt = custom_target(
'xml-Client-doc',
command: [
gen_doxygen,
# XXX pass doxygen path as argument
'--builddir=@OUTDIR@',
'--section=Client',
'--output-format=xml',
wayland_doxygen,
'@INPUT@',
],
input: [ shared_files, client_files ],
output: [ 'combine.xslt', 'index.xml' ],
)
doxygen_Client_combine_xslt = tgt[0]
doxygen_Client_index_xml = tgt[1]

View file

@ -1,17 +0,0 @@
tgt = custom_target(
'xml-Server-doc',
command: [
gen_doxygen,
# XXX pass doxygen path as argument
'--builddir=@OUTDIR@',
'--section=Server',
'--output-format=xml',
wayland_doxygen,
'@INPUT@',
],
input: [ shared_files, server_files ],
output: [ 'combine.xslt', 'index.xml' ],
)
doxygen_Server_combine_xslt = tgt[0]
doxygen_Server_index_xml = tgt[1]

View file

@ -1,2 +0,0 @@
subdir('Client')
subdir('Server')

View file

@ -2,10 +2,7 @@ if not get_option('libraries')
error('-Ddocumentation=true requires -Dlibraries=true')
endif
dot = find_program('dot')
doxygen = find_program('doxygen')
xsltproc = find_program('xsltproc')
xmlto = find_program('xmlto')
mdbook = find_program('mdbook')
cmd = run_command(doxygen, '--version', check: true)
@ -15,19 +12,6 @@ if vers.version_compare('< 1.6.0')
error('Doxygen 1.6 or later is required for building documentation, found @0@.'.format(vers))
endif
cmd = run_command(dot, '-V', check: true)
message('dot: ' + cmd.stderr().strip())
vers = cmd.stderr().split('version')[1].strip().split(' ')[0]
if vers.version_compare('< 2.26.0')
error('Dot (Graphviz) 2.26 or later is required for building documentation, found @0@.'.format(vers))
endif
manpage_xsl = 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl'
cmd = run_command(xsltproc, '--nonet', manpage_xsl, check: false)
if cmd.returncode() != 0
error('The style sheet for man pages providing "@0@" was not found.'.format(manpage_xsl))
endif
publican_install_prefix = join_paths(
get_option('prefix'),
get_option('datadir'),
@ -39,5 +23,4 @@ publican_install_prefix = join_paths(
publican_html_dir = 'html'
subdir('doxygen')
subdir('publican')
subdir('book')

View file

@ -1,3 +0,0 @@
Wayland
en-US/
publican-copy.cfg

View file

@ -1,392 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Wayland-Architecture">
<title>Wayland Architecture</title>
<section id="sect-Wayland-Architecture-wayland_architecture">
<title>X vs. Wayland Architecture</title>
<para>
A good way to understand the Wayland architecture
and how it is different from X is to follow an event
from the input device to the point where the change
it affects appears on screen.
</para>
<para>
This is where we are now with X:
</para>
<figure>
<title>X architecture diagram</title>
<mediaobjectco>
<imageobjectco>
<areaspec id="map1" units="other" otherunits="imagemap">
<area id="area1_1" linkends="x_flow_1" x_steal="#step_1"/>
<area id="area1_2" linkends="x_flow_2" x_steal="#step_2"/>
<area id="area1_3" linkends="x_flow_3" x_steal="#step_3"/>
<area id="area1_4" linkends="x_flow_4" x_steal="#step_4"/>
<area id="area1_5" linkends="x_flow_5" x_steal="#step_5"/>
<area id="area1_6" linkends="x_flow_6" x_steal="#step_6"/>
</areaspec>
<imageobject>
<imagedata fileref="images/x-architecture.png" format="PNG" />
</imageobject>
</imageobjectco>
</mediaobjectco>
</figure>
<para>
<orderedlist>
<listitem id="x_flow_1">
<para>
The kernel gets an event from an input
device and sends it to X through the evdev
input driver. The kernel does all the hard
work here by driving the device and
translating the different device specific
event protocols to the linux evdev input
event standard.
</para>
</listitem>
<listitem id="x_flow_2">
<para>
The X server determines which window the
event affects and sends it to the clients
that have selected for the event in question
on that window. The X server doesn't
actually know how to do this right, since
the window location on screen is controlled
by the compositor and may be transformed in
a number of ways that the X server doesn't
understand (scaled down, rotated, wobbling,
etc).
</para>
</listitem>
<listitem id="x_flow_3">
<para>
The client looks at the event and decides
what to do. Often the UI will have to change
in response to the event - perhaps a check
box was clicked or the pointer entered a
button that must be highlighted. Thus the
client sends a rendering request back to the
X server.
</para>
</listitem>
<listitem id="x_flow_4">
<para>
When the X server receives the rendering
request, it sends it to the driver to let it
program the hardware to do the rendering.
The X server also calculates the bounding
region of the rendering, and sends that to
the compositor as a damage event.
</para>
</listitem>
<listitem id="x_flow_5">
<para>
The damage event tells the compositor that
something changed in the window and that it
has to recomposite the part of the screen
where that window is visible. The compositor
is responsible for rendering the entire
screen contents based on its scenegraph and
the contents of the X windows. Yet, it has
to go through the X server to render this.
</para>
</listitem>
<listitem id="x_flow_6">
<para>
The X server receives the rendering requests
from the compositor and either copies the
compositor back buffer to the front buffer
or does a pageflip. In the general case, the
X server has to do this step so it can
account for overlapping windows, which may
require clipping and determine whether or
not it can page flip. However, for a
compositor, which is always fullscreen, this
is another unnecessary context switch.
</para>
</listitem>
</orderedlist>
</para>
<para>
As suggested above, there are a few problems with this
approach. The X server doesn't have the information to
decide which window should receive the event, nor can it
transform the screen coordinates to window-local
coordinates. And even though X has handed responsibility for
the final painting of the screen to the compositing manager,
X still controls the front buffer and modesetting. Most of
the complexity that the X server used to handle is now
available in the kernel or self contained libraries (KMS,
evdev, mesa, fontconfig, freetype, cairo, Qt etc). In
general, the X server is now just a middle man that
introduces an extra step between applications and the
compositor and an extra step between the compositor and the
hardware.
</para>
<para>
In Wayland the compositor is the display server. We transfer
the control of KMS and evdev to the compositor. The Wayland
protocol lets the compositor send the input events directly
to the clients and lets the client send the damage event
directly to the compositor:
</para>
<figure>
<title>Wayland architecture diagram</title>
<mediaobjectco>
<imageobjectco>
<areaspec id="mapB" units="other" otherunits="imagemap">
<area id="areaB_1" linkends="wayland_flow_1" x_steal="#step_1"/>
<area id="areaB_2" linkends="wayland_flow_2" x_steal="#step_2"/>
<area id="areaB_3" linkends="wayland_flow_3" x_steal="#step_3"/>
<area id="areaB_4" linkends="wayland_flow_4" x_steal="#step_4"/>
</areaspec>
<imageobject>
<imagedata fileref="images/wayland-architecture.png" format="PNG" />
</imageobject>
</imageobjectco>
</mediaobjectco>
</figure>
<para>
<orderedlist>
<listitem id="wayland_flow_1">
<para>
The kernel gets an event and sends
it to the compositor. This
is similar to the X case, which is
great, since we get to reuse all the
input drivers in the kernel.
</para>
</listitem>
<listitem id="wayland_flow_2">
<para>
The compositor looks through its
scenegraph to determine which window
should receive the event. The
scenegraph corresponds to what's on
screen and the compositor
understands the transformations that
it may have applied to the elements
in the scenegraph. Thus, the
compositor can pick the right window
and transform the screen coordinates
to window-local coordinates, by
applying the inverse
transformations. The types of
transformation that can be applied
to a window is only restricted to
what the compositor can do, as long
as it can compute the inverse
transformation for the input events.
</para>
</listitem>
<listitem id="wayland_flow_3">
<para>
As in the X case, when the client
receives the event, it updates the
UI in response. But in the Wayland
case, the rendering happens in the
client, and the client just sends a
request to the compositor to
indicate the region that was
updated.
</para>
</listitem>
<listitem id="wayland_flow_4">
<para>
The compositor collects damage
requests from its clients and then
recomposites the screen. The
compositor can then directly issue
an ioctl to schedule a pageflip with
KMS.
</para>
</listitem>
</orderedlist>
</para>
</section>
<section id="sect-Wayland-Architecture-wayland_rendering">
<title>Wayland Rendering</title>
<para>
One of the details I left out in the above overview
is how clients actually render under Wayland. By
removing the X server from the picture we also
removed the mechanism by which X clients typically
render. But there's another mechanism that we're
already using with DRI2 under X: direct rendering.
With direct rendering, the client and the server
share a video memory buffer. The client links to a
rendering library such as OpenGL that knows how to
program the hardware and renders directly into the
buffer. The compositor in turn can take the buffer
and use it as a texture when it composites the
desktop. After the initial setup, the client only
needs to tell the compositor which buffer to use and
when and where it has rendered new content into it.
</para>
<para>
This leaves an application with two ways to update its window contents:
</para>
<para>
<orderedlist>
<listitem>
<para>
Render the new content into a new buffer and tell the compositor
to use that instead of the old buffer. The application can
allocate a new buffer every time it needs to update the window
contents or it can keep two (or more) buffers around and cycle
between them. The buffer management is entirely under
application control.
</para>
</listitem>
<listitem>
<para>
Render the new content into the buffer that it previously
told the compositor to to use. While it's possible to just
render directly into the buffer shared with the compositor,
this might race with the compositor. What can happen is that
repainting the window contents could be interrupted by the
compositor repainting the desktop. If the application gets
interrupted just after clearing the window but before
rendering the contents, the compositor will texture from a
blank buffer. The result is that the application window will
flicker between a blank window or half-rendered content. The
traditional way to avoid this is to render the new content
into a back buffer and then copy from there into the
compositor surface. The back buffer can be allocated on the
fly and just big enough to hold the new content, or the
application can keep a buffer around. Again, this is under
application control.
</para>
</listitem>
</orderedlist>
</para>
<para>
In either case, the application must tell the compositor
which area of the surface holds new contents. When the
application renders directly to the shared buffer, the
compositor needs to be noticed that there is new content.
But also when exchanging buffers, the compositor doesn't
assume anything changed, and needs a request from the
application before it will repaint the desktop. The idea
that even if an application passes a new buffer to the
compositor, only a small part of the buffer may be
different, like a blinking cursor or a spinner.
</para>
</section>
<section id="sect-Wayland-Architecture-wayland_hw_enabling">
<title>Accelerated GPU Buffer Exchange</title>
<para>
Clients
<ulink url="https://docs.kernel.org/userspace-api/dma-buf-alloc-exchange.html">exchange</ulink>
GPU buffers with the compositor as dma-buf file descriptors, which are universal handles
that are independent of any particular rendering API or memory allocator. The
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/stable/linux-dmabuf/linux-dmabuf-v1.xml">linux-dmabuf-v1</ulink>
protocol is used to turn one or more dma-buf FDs into a
<link linkend="protocol-spec-wl_buffer">wl_buffer</link>.
</para>
<para>
If the client uses the
<ulink url="https://docs.vulkan.org/spec/latest/chapters/VK_KHR_surface/wsi.html">Vulkan</ulink>
or
<ulink url="https://registry.khronos.org/EGL/extensions/EXT/EGL_EXT_platform_wayland.txt">EGL</ulink>
(via
<ulink url="https://gitlab.freedesktop.org/wayland/wayland/-/tree/main/egl">wayland-egl</ulink>)
window-system integration
(WSI), this is done transparently by the WSI.
</para>
<para>
Clients can alternatively allocate and import dma-bufs themselves
using the GBM library, Vulkan, udmabuf, or dma-buf heaps.
</para>
<itemizedlist>
<listitem>
<para>
Using GBM, the client can allocate a gbm_bo and export one or more
dma-buf FDs from it.
</para>
</listitem>
<listitem>
<para>
Using Vulkan, the client can create a VkDeviceMemory object and use
<ulink url="https://docs.vulkan.org/refpages/latest/refpages/source/VK_EXT_external_memory_dma_buf.html">VK_EXT_external_memory_dma_buf</ulink>
and
<ulink url="https://docs.vulkan.org/refpages/latest/refpages/source/VK_EXT_image_drm_format_modifier.html">VK_EXT_image_drm_format_modifier</ulink>
to export a dma-buf FD from it.
</para>
</listitem>
<listitem>
<para>
<ulink url="https://lwn.net/Articles/749206/">udmabuf</ulink>
can be used to create dma-buf FDs from linear host memory.
</para>
</listitem>
<listitem>
<para>
<ulink url="https://docs.kernel.org/userspace-api/dma-buf-heaps.html">Dma-buf heaps</ulink>
can be used by privileged applications to create dma-buf FDs on embedded
devices.
</para>
</listitem>
</itemizedlist>
<para>
Compositors use
<ulink url="https://docs.vulkan.org/refpages/latest/refpages/source/VK_EXT_external_memory_dma_buf.html">VK_EXT_external_memory_dma_buf</ulink>
and
<ulink url="https://docs.vulkan.org/refpages/latest/refpages/source/VK_EXT_image_drm_format_modifier.html">VK_EXT_image_drm_format_modifier</ulink>
or
<ulink url="https://registry.khronos.org/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import.txt">EGL_EXT_image_dma_buf_import</ulink>
and
<ulink url="https://registry.khronos.org/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt">EGL_EXT_image_dma_buf_import_modifiers</ulink>
to import the dma-bufs provided by the client into their own Vulkan or
EGL renderers.
</para>
<para>
Clients do not need to wait for the GPU to finish rendering before submitting
dma-bufs to the compositor. Clients can use the
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/staging/linux-drm-syncobj/linux-drm-syncobj-v1.xml">linux-drm-syncobj-v1</ulink>
protocol to exchange DRM synchronization objects with the compositor. These objects
are used to asynchronously signal ownership transfer of buffers from clients to the
compositor and vice versa. The WSIs do this transparently.
</para>
<para>
If the linux-drm-syncobj-v1 protocol is not supported by the compositor, clients
and compositors can use the
<ulink url="https://docs.kernel.org/driver-api/dma-buf.html#c.dma_buf_export_sync_file">DMA_BUF_IOCTL_EXPORT_SYNC_FILE</ulink>
and
<ulink url="https://docs.kernel.org/driver-api/dma-buf.html#c.dma_buf_import_sync_file">DMA_BUF_IOCTL_IMPORT_SYNC_FILE</ulink>
ioctls to access and create implicit synchronization barriers.
</para>
</section>
<section id="sect-Wayland-Architecture-kms">
<title>Display Programming</title>
<para>
Compositors enumerate DRM KMS devices using
<ulink url="https://en.wikipedia.org/wiki/Udev">udev</ulink>.
Udev also notifies compositors of KMS device and display hotplug events.
</para>
<para>
Access to DRM KMS device ioctls is privileged. Since compositors usually run as
unprivileged applications, they typically gain access to a privileged file
descriptor using the
<ulink url="https://www.freedesktop.org/software/systemd/man/latest/org.freedesktop.login1.html#Session%20Objects">TakeDevice</ulink>
method provided by logind.
</para>
<para>
Using the file descriptor, compositors use KMS
<ulink url="https://docs.kernel.org/gpu/drm-kms.html">ioctls</ulink>
to enumerate the available displays.
</para>
<para>
Compositors use
<ulink url="https://docs.kernel.org/gpu/drm-kms.html#atomic-mode-setting">atomic mode setting</ulink>
to change the buffer shown by the display, to change the display's resolution, to
enable or disable HDR, and so on.
</para>
</section>
</chapter>

View file

@ -1,16 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<authorgroup>
<author>
<firstname>Kristian</firstname>
<surname>Høgsberg</surname>
<affiliation>
<orgname>Intel Corporation</orgname>
</affiliation>
<email>krh@bitplanet.net</email>
</author>
</authorgroup>

View file

@ -1,71 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<bookinfo id="book-Wayland-Wayland">
<title>Wayland</title>
<subtitle>The Wayland Protocol</subtitle>
<productname>Documentation</productname>
<productnumber>0.1</productnumber>
<edition>1</edition>
<pubsnumber>0</pubsnumber>
<abstract>
<para>
Wayland is a protocol for a compositor to talk to
its clients as well as a C library implementation of
that protocol. The compositor can be a standalone
display server running on Linux kernel modesetting
and evdev input devices, an X application, or a
Wayland client itself. The clients can be
traditional applications, X servers (rootless or
fullscreen) or other display servers.
</para>
</abstract>
<corpauthor>
<inlinemediaobject>
<imageobject>
<imagedata fileref="images/wayland.png" format="PNG" />
</imageobject>
<textobject>
<phrase>
Wayland logo
</phrase>
</textobject>
</inlinemediaobject>
</corpauthor>
<legalnotice lang="en-US">
<para>
Copyright <trademark class="copyright"></trademark> &YEAR; &HOLDER;
</para>
<para>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
</para>
<para>
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
</para>
<para>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
</para>
</legalnotice>
<xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</bookinfo>

View file

@ -1,92 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
<!ENTITY doxygen SYSTEM "ClientAPI.xml">
%BOOK_ENTITIES;
]>
<appendix id="sect-Library-Client">
<title>Client API</title>
<section><title>Introduction</title>
<para>
The open-source reference implementation of Wayland protocol is
split in two C libraries, libwayland-client and <link
linkend="sect-Library-Server">libwayland-server</link>. Their main
responsibility is to handle the Inter-process communication
(<emphasis>IPC</emphasis>) with each other, therefore guaranteeing
the protocol objects marshaling and messages synchronization.
</para>
<para>
A client uses libwayland-client to communicate with one or more
wayland servers. A <link
linkend="Client-classwl__display">wl_display</link> object is
created and manages each open connection to a server. At least one
<link linkend="Client-classwl__event__queue">wl_event_queue</link>
object is created for each wl_display, this holds events as they
are received from the server until they can be
processed. Multi-threading is supported by creating an additional
wl_event_queue for each additional thread, each object can have
it's events placed in a particular queue, so potentially a
different thread could be made to handle the events for each
object created.
</para>
<para>
Though some convenience functions are provided, libwayland-client
is designed to allow the calling code to wait for events, so that
different polling mechanisms can be used. A file descriptor is
provided, when it becomes ready for reading the calling code can
ask libwayland-client to read the available events from it into
the wl_event_queue objects.
</para>
<para>
The library only provides low-level access to the wayland objects.
Each object created by the client is represented by a <link
linkend="Client-classwl__proxy">wl_proxy</link> object that this
library creates. This includes the id that is actually
communicated over the socket to the server, a void* data pointer
that is intended to point at a client's representation of the
object, and a pointer to a static <link
linkend="Client-structwl__interface">wl_interface</link> object,
which is generated from the xml and identifies the object's class
and can be used for introspection into the messages and events.
</para>
<para>
Messages are sent by calling wl_proxy_marshal. This will write a
message to the socket, by using the message id and the
wl_interface to identify the types of each argument and convert
them into stream format. Most software will call type-safe
wrappers generated from the xml description of the <link
linkend="appe-Wayland-Protocol">Wayland protocols</link>. For
instance the C header file generated from the xml defines the
following inline function to transmit the <link
linkend="protocol-spec-wl_surface-request-attach">wl_surface::attach</link>
message:
</para>
<programlisting>static inline void
wl_surface_attach(struct wl_surface *wl_surface, struct wl_buffer *buffer, int32_t x, int32_t y)
{
wl_proxy_marshal((struct wl_proxy *) wl_surface, WL_SURFACE_ATTACH, buffer, x, y);
}</programlisting>
<para>
Events (messages from the server) are handled by calling a
"dispatcher" callback the client stores in the wl_proxy for each
event. A language binding for a string-based interpreter, such as
CPython, might have a dispatcher that uses the event name from the
wl_interface to identify the function to call. The default
dispatcher uses the message id number to index an array of
functions pointers, called a wl_listener, and the wl_interface to
convert data from the stream into arguments to the function. The
C header file generated from the xml defines a per-class structure
that forces the function pointers to be of the correct type, for
instance the <link
linkend="protocol-spec-wl_surface-event-enter">wl_surface::enter</link>
event defines this pointer in the wl_surface_listener object:
</para>
<programlisting>struct wl_surface_listener {
void (*enter)(void *data, struct wl_surface *, struct wl_output *);
...
}</programlisting>
<para>
</para>
</section>
&doxygen;
</appendix>

View file

@ -1,139 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Color-Management">
<title>Color management</title>
<section id="sect-Color-Management-preface">
<title>Overview</title>
<para>
Color management in Wayland considers only displays. All pictures in
Wayland are always display-referred, meaning that the pixel values are
intended as-is for some specific display where they would produce the
light emissions (<ulink
url="https://cie.co.at/eilvterm/17-23-002">stimuli</ulink>) the picture's
author desired. Wayland does not support displaying "raw" camera or
scanner images as they are not display-referred, nor are they even
pictures without complex and subjective processing.
</para>
<para>
Stimuli — the picture itself — are only half of the picture reproduction.
The other half is the environment where a display is viewed. A striking
example is comparing a brightly lit office to a dark movie theater, the
stimuli required to produce a good reading of the picture is greatly
different. Therefore display-referred does not include only the display
but the viewing environment as well.
</para>
<para>
Window systems have been very well capable of operating without any
explicit consideration to color management. This is because there used to
be the implicit assumption of the standard display, the sRGB display,
which all computer monitors implemented, more or less. The viewing
environment was and still is accounted by adjusting the display and/or the
room to produce a workable experience. Pictures are authored on a computer
system by drawing, painting and adjusting the picture until it looks right
on the author's monitor. This implicitly builds the standard display and
environment assumption into the picture data. Deviations from the sRGB
specification were minor enough that they often did not matter if not in a
professional context like the printing industry. Displaying video material
required some more attention to the details, because video and television
standards differ enough from the sRGB display. What really made explicit
color management a hard requirement for entertainment is the coming of
wide color gamut (WCG) and high dynamic range (HDR) materials and
displays.
</para>
<para>
The color management design in Wayland follows the general Wayland design
principles: compositors tell clients what would be the optimal thing to
do, clients tell the compositors what kind of pictures they are actually
producing, and then compositors display those pictures the best they can.
</para>
</section>
<section id="sect-Color-Management-Protocol">
<title>Protocol Interfaces</title>
<para>
Color management interfaces in Wayland and divided into two protocols:
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/tree/main/staging/color-management?ref_type=heads">color-management</ulink>
and
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols/-/tree/main/staging/color-representation?ref_type=heads">color-representation</ulink>.
They are designed to work together, but they can also be used
independently when the other one is not needed.
</para>
<section id="sect-Color-Management-Protocol-color-management">
<title>Color-management</title>
<para>
Color management protocol has two main purposes. First, it puts the
responsibility of color management on the compositor. This means that
clients do not necessarily need to care about color management at all,
and can display just fine by using the traditional standard display
assumption even when the actual display is wildly different. Clients
can also choose to target some other assumed display and let the
compositor handle it, or they can explicitly render for the actual
display at hand. Second, when the window system has multiple different
monitors, and a wl_surface happens to span more than one monitor, the
compositor can display the surface content correctly on all spanned
monitors simultaneously, as much as physically possible.
</para>
<para>
Color-management protocol concentrates on colorimetry: when you have a
pixel with RGB values, what stimulus do those values represent. The
stimulus definition follows the CIE 1931 two-degree observer model. Some
core concepts here are color primaries, white point, transfer function,
and dynamic range. The viewing environment is represented in an
extremely simplified way as the reference white luminance. The
connection between pixel RGB values and stimulus plus viewing
environment is recorded in an <emphasis>image description</emphasis>
object. Clients can create image description objects and tag
<code>wl_surface</code>s with them, to indicate what kind of surface
content there will be. Clients can also ask what image description the
compositor would prefer to have on the <code>wl_surface</code>, and that
preference can change over time, e.g. when the <code>wl_surface</code>
is moved from one
<code>wl_output</code> to another. Following the compositor's preference
may provide advantages in image quality and power consumption.
</para>
<para>
Image description objects can come in two flavors: parametric and
ICC-based. The above was written with parametric image descriptions in
mind, and they have first-class support for HDR. ICC-based image
descriptions are wrapping an ICC profile and have no other data. ICC
profiles are the standard tool for standard dynamic range (SDR) display
color management. This means the capabilities between the two flavors
differ, and one cannot always be replaced by the other. Compositor
support for each flavor is optional.
</para>
</section>
<section id="sect-Color-Management-Protocol-color-representation">
<title>Color-representation</title>
<para>
Color-representation protocol deals with (potentially sub-sampled)
YCbCr-RGB conversion, quantization range, and the inclusion of alpha in
the RGB color channels, a.k.a. pre-multiplication. There are several
different specifications on how an YCbCr-like (including ICtCp) signal,
with chroma sub-sampling or not, is created from a full-resolution RGB
image. Again, a client can tag a <code>wl_surface</code> with
color-representation metadata to tell the compositor what kind of pixel
data will be displayed through the wl_surface.
</para>
<para>
The main purpose of color-representation is to correctly off-load the
YCbCr-RGB conversion to the compositor, which can then opportunistically
off-load it further to very power-efficient fixed-function circuitry in
a display controller. This can significantly reduce power consumption
when watching videos compared to using a GPU for the same, and on some
embedded hardware platforms it is a hard requirement for processing high
resolution video.
</para>
</section>
</section>
</chapter>

View file

@ -1,128 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Compositors">
<title>Types of Compositors</title>
<para>
Compositors come in different types, depending on which
role they play in the overall architecture of the OS.
For instance, a
<link linkend="sect-Compositors-System-Compositor">system compositor</link>
can be used for booting the system, handling multiple user switching, a
possible console terminal emulator and so forth. A different compositor, a
<link linkend="sect-Compositors-Session-Compositor">session compositor</link>
would provide the actual desktop environment. There are many ways for
different types of compositors to co-exist.
</para>
<para>
In this section, we introduce three types of Wayland compositors relying
on <link linkend="sect-Library-Server">libwayland-server</link>.
</para>
<section id="sect-Compositors-System-Compositor">
<title>System Compositor</title>
<para>
A system compositor can run from early boot until shutdown.
It effectively replaces the kernel vt system, and can tie in
with the systems graphical boot setup and multiseat support.
</para>
<para>
A system compositor can host different types of session
compositors, and let us switch between multiple sessions
(fast user switching, or secure/personal desktop switching).
</para>
<para>
A linux implementation of a system compositor will typically
use libudev, egl, kms, evdev and cairo.
</para>
<para>
For fullscreen clients, the system compositor can reprogram the
video scanout address to read directly from the client provided
buffer.
</para>
</section>
<section id="sect-Compositors-Session-Compositor">
<title>Session Compositor</title>
<para>
A session compositor is responsible for a single user session.
If a system compositor is present, the session compositor will
run nested under the system compositor. Nesting is feasible because
the protocol is asynchronous; roundtrips would be too expensive
when nesting is involved. If no system compositor is present, a
session compositor can run directly on the hardware.
</para>
<para>
X applications can continue working under a session compositor
by means of a root-less X server that is activated on demand.
</para>
<para>
Possible examples for session compositors include
<itemizedlist>
<listitem>
<para>
gnome-shell
</para>
</listitem>
<listitem>
<para>
moblin
</para>
</listitem>
<listitem>
<para>
kwin
</para>
</listitem>
<listitem>
<para>
kmscon
</para>
</listitem>
<listitem>
<para>
rdp session
</para>
</listitem>
<listitem>
<para>
Weston with X11 or Wayland backend is a session compositor nested
in another session compositor.
</para>
</listitem>
<listitem>
<para>
fullscreen X session under Wayland
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section id="sect-Compositors-Embedding-Compositor">
<title>Embedding Compositor</title>
<para>
X11 lets clients embed windows from other clients, or lets clients
copy pixmap contents rendered by another client into their window.
This is often used for applets in a panel, browser plugins and similar.
Wayland doesn't directly allow this, but clients can communicate GEM
buffer names out-of-band, for example, using D-Bus, or command line
arguments when the panel launches the applet. Another option is to
use a nested Wayland instance. For this, the Wayland server will have
to be a library that the host application links to. The host
application will then pass the Wayland server socket name to the
embedded application, and will need to implement the Wayland
compositor interface. The host application composites the client
surfaces as part of it's window, that is, in the web page or in the
panel. The benefit of nesting the Wayland server is that it provides
the requests the embedded client needs to inform the host about buffer
updates and a mechanism for forwarding input events from the host
application.
</para>
<para>
An example for this kind of setup is firefox embedding the flash
player as a kind of special-purpose compositor.
</para>
</section>
</chapter>

View file

@ -1,460 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Content-Updates">
<title>Content Updates</title>
<section id="sect-Content-Updates-preface">
<title>Overview</title>
<para>
In the Wayland protocol, requests are asynchronous but take effect
immediately when the compositor receives them. However, some requests on
surfaces are not applied immediately but are instead double-buffered to
allow atomic changes. These double-buffered changes are committed through
the wl_surface.commit request, which creates a Content Update.
</para>
<para>
Content Updates encapsulate all double-buffered state changes and can be
applied by the compositor. The complexity arises when considering
subsurfaces, which can operate in synchronized mode. When a subsurface is
synchronized, its Content Updates must be applied atomically together with
the parent surface's state. This synchronization can extend through an
entire tree of subsurfaces, where child subsurfaces inherit the
synchronized behavior from their parents.
</para>
<para>
Historically, Content Updates from synchronized subsurfaces were merged
into the pending state of the parent surface on commit. However, the
introduction of constraints—which can defer the application of Content
Updates—necessitated a more sophisticated model. This led to the
implementation of per-surface queues of Content Updates, with dependencies
between Content Updates across different queues. This queuing model
maintains backwards compatibility with the earlier approach of merging
Content Updates into the parent's pending state on commit.
</para>
<para>
The core protocol defines the semantics of Content Updates using
per-surface queues, but compositors that do not need to support constraints
may implement the simpler legacy model where synchronized subsurface states
are merged directly into the parent's pending state.
</para>
</section>
<section id="sect-Content-Updates-rules">
<title>Rules</title>
<para>
The core protocol specifies the behavior in wl_subsurface and
wl_surface.commit. The behavior can be summarized by the following rules:
</para>
<orderedlist numeration="arabic">
<listitem>
<para>
Content Updates (CU) contain all double-buffered state of the surface and
selected state from their direct children.
</para>
</listitem>
<listitem>
<para>
Surfaces which are effectively synchronized create Synchronized
Content Updates (SCU), otherwise they create Desync Content Updates
(DCU).
</para>
</listitem>
<listitem>
<para>
When a CU is created, it gets a dependency on the previous CU of the
same queues (if it exists).
</para>
</listitem>
<listitem>
<para>
When a CU is created, it gets a dependency on the last SCU of direct
child surfaces that are not reachable (if they exists).
</para>
</listitem>
<listitem>
<para>
The CUs and their dependencies form a DAG, where CUs are nodes and
dependencies are edges.
</para>
</listitem>
<listitem>
<para>
All DCUs starting from the front of the queues until the first SCU or
the back of the queue is reached are candidates.
</para>
</listitem>
<listitem>
<para>
If the maximal DAG that's reachable from a candidate (candidate DAG)
does not have any constraints, then this DAG can be applied.
</para>
</listitem>
<listitem>
<para>
A DAG is applied atomically by recursively applying a content update
without dependencies and removing it from the DAG.
</para>
</listitem>
<listitem>
<para>
Surfaces transition from effectively sync to effectively desync after
their parents.
</para>
</listitem>
<listitem>
<para>
When a surface transitions to effectively desync, all SCUs in its
queue which are not reachable by a DCU become DCUs.
</para>
</listitem>
</orderedlist>
</section>
<section id="sect-Content-Updates-examples">
<title>Examples</title>
<para>
These examples should help to build an intuition for how content updates
actually behave. They cover the interesting edge cases, such as
subsurfaces with constraints, and transitioning from a sync subsurface to
a desync one.
</para>
<para>
In all the examples below, the surface T1 refers to a toplevel surface,
SS1 refers to a sub-surface which is a child of T1, and SS2 refers to a
sub-surface which is a child of SS1.
</para>
<figure>
<title>Legend</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/content-update-legend.png"/>
</imageobject>
</mediaobject>
</figure>
<figure>
<title>Simple Desynchronized Case</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-1.png"/>
</imageobject>
<caption>
<para>
SS2 is effectively desynchronized and commits. This results in the
desynchronized content update (DCU) <emphasis>1</emphasis>.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-2.png"/>
</imageobject>
<caption>
<para>
DCU <emphasis>1</emphasis> is a candidate, and the candidate DAG
reachable from DCU <emphasis>1</emphasis> is only
DCU <emphasis>1</emphasis> itself. DCU <emphasis>1</emphasis> and
thus the candidate DAG does not have any constraints and can be
applied.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-3.png"/>
</imageobject>
<caption>
<para>
The content updates of the candidate DAG get applied to the surface
atomically.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-4.png"/>
</imageobject>
<caption>
<para>
T1 commits a DCU with a <emphasis>buffer-sync</emphasis> constraint.
It is a candidate but its DAG can't be applied because it contains a
constraint.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-5.png"/>
</imageobject>
<caption>
<para>
T1 commits another CU (DCU <emphasis>3</emphasis>) which is added at
the end of the queue, with a dependency to the previous CU (DCU
<emphasis>2</emphasis>). Both DCU <emphasis>2</emphasis> and DCU
<emphasis>3</emphasis> are candidates, but both DAGs contain DCU
<emphasis>2</emphasis> with a constraint, and can't be applied.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-desynchronized-state-6.png"/>
</imageobject>
<caption>
<para>
When the constraint gets cleared, both DAGs can be applied to the
surface atomitcally (either only <emphasis>2</emphasis>, or
<emphasis>2</emphasis> and <emphasis>3</emphasis>).
</para>
</caption>
</mediaobject>
</figure>
<figure>
<title>Simple Synchronized Case</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-synchronized-state-1.png"/>
</imageobject>
<caption>
<para>
SS1 and SS2 are effectively synchronized. SS2 commits SCU <emphasis>1</emphasis>.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-synchronized-state-2.png"/>
</imageobject>
<caption>
<para>
SS1 commits SCU <emphasis>2</emphasis>. The direct child surfaces SS2 has the last SCU <emphasis>1</emphasis> in its queue, which is not reachable. This creates a dependency from SCU <emphasis>2</emphasis> to SCU <emphasis>1</emphasis>.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-synchronized-state-3.png"/>
</imageobject>
<caption>
<para>
SS1 commits SCU <emphasis>3</emphasis>. The direct child surfaces SS2 has the last SCU <emphasis>1</emphasis> in its queue, which is already reachable by SCU <emphasis>2</emphasis>. No dependency to SCU <emphasis>1</emphasis> is created. A dependency to the previous CU of the same queue (SCU <emphasis>2</emphasis>) is created.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-synchronized-state-4.png"/>
</imageobject>
<caption>
<para>
T1 commit DCU <emphasis>4</emphasis>. It is a candidate, its DAG does not contain any constraint and it can be applied.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/simple-synchronized-state-5.png"/>
</imageobject>
<caption>
<para>
The DAG gets applied to the surfaces atomically.
</para>
</caption>
</mediaobject>
</figure>
<figure>
<title>Complex Synchronized Subsurface Case 1</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case1-1.png"/>
</imageobject>
<caption>
<para>
Every DCU (<emphasis>1</emphasis> and <emphasis>6</emphasis>) contain
CUs with constraints in their candidate DAG
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case1-2.png"/>
</imageobject>
<caption>
<para>
Waiting until the <emphasis>buffer-sync</emphasis> constrain on CU
<emphasis>1</emphasis> is cleared, the candidate DAG of CU
<emphasis>1</emphasis> does not contain constraints and can be applied
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case1-3.png"/>
</imageobject>
<caption>
<para>
That leaves the candidate DAG of CU <emphasis>6</emphasis> which still
contains another CU with a <emphasis>buffer-sync</emphasis> constrain
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case1-4.png"/>
</imageobject>
<caption>
<para>
Waiting until the <emphasis>buffer-sync</emphasis> constrain on CU
<emphasis>6</emphasis> is cleared, the candidate DAG of
<emphasis>6</emphasis> does not contain CUs with constraints and can
be applied.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case1-5.png"/>
</imageobject>
<caption>
<para>
There is no DCU left and no constraint remaining. Nothing more can be
applied without a new CU.
</para>
</caption>
</mediaobject>
</figure>
<figure>
<title>Complex Synchronized Subsurface Case 2</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case2-1.png"/>
</imageobject>
<caption>
<para>
Both DCUs (<emphasis>1</emphasis> and <emphasis>6</emphasis>) have a
reachable DAG containing CU <emphasis>1</emphasis> with a constraint
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case2-2.png"/>
</imageobject>
<caption>
<para>
Waiting until the <emphasis>buffer-sync</emphasis> constrain on
<emphasis>1</emphasis> is cleared, both DAGs contain no CU with
constraints and can be applied in any order
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-subsurf-case2-3.png"/>
</imageobject>
<caption>
<para>
That leaves the same state as in the previous case
</para>
</caption>
</mediaobject>
</figure>
<figure>
<title>Synchronized to Desynchronized Subsurface</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-subsurf-1.png"/>
</imageobject>
<caption>
<para>
There is one DCU (<emphasis>4</emphasis>) with its reachable DAG
that cannot be applied because CU <emphasis>4</emphasis> contains a
constraint
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-subsurf-2.png"/>
</imageobject>
<caption>
<para>
Surface <emphasis>SS1</emphasis> transitions from effectively
synchronized to effectively desynchronized. SCU
<emphasis>2</emphasis> is reachable by DCU <emphasis>4</emphasis> so
nothing changes.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-subsurf-3.png"/>
</imageobject>
<caption>
<para>
Surface <emphasis>SS1</emphasis> provides a new DCU
(<emphasis>5</emphasis>) but because the CU before
(<emphasis>2</emphasis>) is a Synchronized CU, it is not a candidate
</para>
</caption>
</mediaobject>
</figure>
<figure>
<title>Synchronized to Desynchronized Transition</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-transition-1.png"/>
</imageobject>
<caption>
<para>
There are four SCUs and all surfaces are effectively synchronized.
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-transition-2.png"/>
</imageobject>
<caption>
<para>
Surface <emphasis>SS1</emphasis> transitions to effectively
desynchronized and SCU <emphasis>2</emphasis> becomes a DCU because
it is not reachable from a DCU
</para>
</caption>
</mediaobject>
<mediaobject>
<imageobject>
<imagedata fileref="images/content-updates/sync-to-desync-transition-3.png"/>
</imageobject>
<caption>
<para>
Surface <emphasis>SS2</emphasis> transitions to effectively
desynchronized. SCUs <emphasis>3</emphasis> and
<emphasis>4</emphasis> become DCUs because they are not reachable
from a DCU. SCU <emphasis>1</emphasis> does not change because it is
reachable by DCU <emphasis>2</emphasis>.
</para>
</caption>
</mediaobject>
</figure>
</section>
</chapter>

View file

@ -1,28 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<preface>
<title>Preface</title>
<para>
This document describes the (i) Wayland architecture, (ii) Wayland model of
operation and (iii) its library API. Also, the Wayland protocol specification is shown
in the Appendix. This document is aimed primarily at Wayland developers and
those looking to program with it; it does not cover application development.
</para>
<para>
There have been many contributors to this document and since this is only the
first edition many errors are expected to be found. We appreciate
corrections.
</para>
<literallayout>
Yours,
the Wayland open-source community
November 2012
</literallayout>
</preface>

View file

@ -1,116 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Introduction">
<title>Introduction</title>
<section id="sect-Motivation">
<title>Motivation</title>
<para>
Most Linux and Unix-based systems rely on the X Window System (or
simply <emphasis>X</emphasis>) as the low-level protocol for building
bitmap graphics interfaces. On these systems, the X stack has grown to
encompass functionality arguably belonging in client libraries,
helper libraries, or the host operating system kernel. Support for
things like PCI resource management, display configuration management,
direct rendering, and memory management has been integrated into the X
stack, imposing limitations like limited support for standalone
applications, duplication in other projects (e.g. the Linux fb layer
or the DirectFB project), and high levels of complexity for systems
combining multiple elements (for example radeon memory map handling
between the fb driver and X driver, or VT switching).
</para>
<para>
Moreover, X has grown to incorporate modern features like offscreen
rendering and scene composition, but subject to the limitations of the
X architecture. For example, the X implementation of composition adds
additional context switches and makes things like input redirection
difficult.
</para>
<mediaobject>
<imageobject>
<imagedata fileref="images/x-architecture.png" format="PNG" />
</imageobject>
<textobject>
<phrase>
X architecture diagram
</phrase>
</textobject>
</mediaobject>
<para>
The diagram above illustrates the central role of the X server and
compositor in operations, and the steps required to get contents on to
the screen.
</para>
<para>
Over time, X developers came to understand the shortcomings of this
approach and worked to split things up. Over the past several years,
a lot of functionality has moved out of the X server and into
client-side libraries or kernel drivers. One of the first components
to move out was font rendering, with freetype and fontconfig providing
an alternative to the core X fonts. Direct rendering OpenGL as a
graphics driver in a client side library went through some iterations,
ending up as DRI2, which abstracted most of the direct rendering
buffer management from client code. Then cairo came along and provided
a modern 2D rendering library independent of X, and compositing
managers took over control of the rendering of the desktop as toolkits
like GTK+ and Qt moved away from using X APIs for rendering. Recently,
memory and display management have moved to the Linux kernel, further
reducing the scope of X and its driver stack. The end result is a
highly modular graphics stack.
</para>
</section>
<section id="sect-Compositing-manager-display-server">
<title>The compositing manager as the display server</title>
<para>
Wayland is a new display server and compositing protocol, and Weston
is the implementation of this protocol which builds on top of all the
components above. We are trying to distill out the functionality in
the X server that is still used by the modern Linux desktop. This
turns out to be not a whole lot. Applications can allocate their own
off-screen buffers and render their window contents directly, using
hardware accelerated libraries like libGL, or high quality software
implementations like those found in Cairo. In the end, whats needed
is a way to present the resulting window surface for display, and a
way to receive and arbitrate input among multiple clients. This is
what Wayland provides, by piecing together the components already in
the eco-system in a slightly different way.
</para>
<para>
X will always be relevant, in the same way Fortran compilers and VRML
browsers are, but its time that we think about moving it out of the
critical path and provide it as an optional component for legacy
applications.
</para>
<para>
Overall, the philosophy of Wayland is to provide clients with a way to
manage windows and how their contents are displayed. Rendering is left
to clients, and system wide memory management interfaces are used to
pass buffer handles between clients and the compositing manager.
</para>
<mediaobject>
<imageobject>
<imagedata fileref="images/wayland-architecture.png" format="PNG" />
</imageobject>
<textobject>
<phrase>
Wayland architecture diagram
</phrase>
</textobject>
</mediaobject>
<para>
The figure above illustrates how Wayland clients interact with a
Wayland server. Note that window management and composition are
handled entirely in the server, significantly reducing complexity
while marginally improving performance through reduced context
switching. The resulting system is easier to build and extend than a
similar X system, because often changes need only be made in one
place. Or in the case of protocol extensions, two (rather than 3 or 4
in the X case where window management and/or composition handling may
also need to be updated).
</para>
</section>
</chapter>

View file

@ -1,928 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
<!ENTITY protocol "<link linkend='sect-MessageXML-tag-protocol'>protocol</link>">
<!ENTITY copyright "<link linkend='sect-MessageXML-tag-copyright'>copyright</link>">
<!ENTITY description "<link linkend='sect-MessageXML-tag-description'>description</link>">
<!ENTITY interface "<link linkend='sect-MessageXML-tag-interface'>interface</link>">
<!ENTITY enum "<link linkend='sect-MessageXML-tag-enum'>enum</link>">
<!ENTITY entry "<link linkend='sect-MessageXML-tag-entry'>entry</link>">
<!ENTITY request "<link linkend='sect-MessageXML-tag-request'>request</link>">
<!ENTITY event "<link linkend='sect-MessageXML-tag-event'>event</link>">
<!ENTITY arg "<link linkend='sect-MessageXML-tag-arg'>arg</link>">
<!ENTITY cname-requirements "The name must start with one of the ASCII
characters a-z, A-Z, or underscore, and the following characters may
additionally include numbers 0-9.">
<!ENTITY cname-suffix-requirements "The name must contain only the ASCII
characters a-z, A-Z, 0-9, or underscore. The name cannot be empty.">
]>
<chapter id="chap-MessageXML">
<title>Message Definition Language</title>
<section id="sect-MessageXML-preface">
<title>Overview</title>
<para>
The fundamentals of the Wayland protocol are explained in
<xref linkend="chap-Protocol"/>. This chapter formally defines the
language used to define Wayland protocols.
</para>
<para>
Wayland is an object-oriented protocol. Each object follows exactly
one interface. An interface is a collection of message and enumeration
definitions. A message can be either a request (sent by a client)
or an event (sent by a server). A message can have arguments.
All arguments are typed.
</para>
</section>
<section id="sect-MessageXML-tags">
<title>XML Elements</title>
<section id="sect-MessageXML-tag-protocol">
<title>protocol</title>
<synopsis>protocol ::= (&copyright;?, &description;? &interface;+)</synopsis>
<para>
<code>protocol</code> is the root element in a Wayland protocol XML file.
Code generation tools may optionally use the protocol
<varname>name</varname> in API symbol names. The XML file name should be
similar to the protocol name.
</para>
<para>
The &description; element should be used to document the intended
purpose of the protocol, give an overview, and give any development
stage notices if applicable.
</para>
<para>
The &copyright; element should be used to indicate the copyrights and
the license of the XML file.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the protocol (a.k.a protocol extension).
&cname-requirements;
</para>
<para>
The name should be globally unique. Protocols to be included in
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols">wayland-protocols</ulink>
must follow the naming rules set there. Other protocols should use
a unique prefix for the name, e.g. referring to the owning project's
name.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-copyright">
<title>copyright</title>
<para>
Parent elements: &protocol;
</para>
<synopsis>copyright ::= #PCDATA</synopsis>
<para>
Contains free-form, pre-formatted text for copyright and license
notices.
</para>
</section>
<section id="sect-MessageXML-tag-description">
<title>description</title>
<para>
Parent elements: &protocol;, &interface;, &request;, &event;,
&arg;, &enum;, &entry;
</para>
<synopsis>description ::= #PCDATA</synopsis>
<para>
Contains human-readable documentation for its parent element.
May contain formatted text, including paragraphs and bulleted
lists.
</para>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>summary</varname>="<userinput>summary</userinput>"</synopsis>
</term>
<listitem>
<para>
A short (half a line at most) description of the documented
element.
</para>
<para>
When a &description; element is used, it is recommended to
not use the <varname>summary</varname> attribute of the parent
element.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-interface">
<title>interface</title>
<para>
Parent elements: &protocol;
</para>
<synopsis>interface ::= (&description;?, (&request;|&event;|&enum;)+)</synopsis>
<para>
An interface element contains the &request;s and &event;s that form the
interface. Enumerations can also be defined with &enum; elements.
These all belong into the namespace of the interface. Code generation
tools may use the interface <varname>name</varname> in API symbol names.
</para>
<para>
Interfaces form an ancestry tree. Aside from
<xref linkend="protocol-spec-wl_display" />, new protocol objects are
always created through an existing protocol object that may be referred to
as <firstterm>the factory object</firstterm>.
This can happen in one of two ways: the factory object's interface either
defines or does not define the new object's interface.
</para>
<para>
When the factory interface defines the new object's interface, the new
object also inherits the factory object's interface version number.
This number defines the interface version of the new object.
The factory object is referred to as
<firstterm>the parent object</firstterm> and the factory interface is
referred to as <firstterm>the parent interface</firstterm>. This
forms the ancestry tree of interfaces.
</para>
<para>
When the factory interface does not define the new object's interface,
both the interface name and the version must be communicated explicitly.
The foremost example of this is
<xref linkend="protocol-spec-wl_registry-request-bind" />.
In this case the terms "parent" or "ancestor" are not used. Interfaces
that are advertised through <xref linkend="protocol-spec-wl_registry" />
are called <firstterm>global interfaces</firstterm>, or globals for short.
</para>
<para>
If objects having the interface can cause protocol errors, the protocol
error codes must be defined within the interface with an &enum;
element with its <varname>name</varname> set to <literal>"error"</literal>.
Protocol error codes are always specific to the interface of the object
referred to in <xref linkend="protocol-spec-wl_display-event-error" />.
</para>
<para>
The &description; element should be used to describe the purpose and
the general usage of the interface.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the interface. &cname-requirements;
The name must be unique in the &protocol;, and preferably it should
also be globally unique to avoid API conflicts in language bindings
of multiple protocols.
</para>
<para>
Protocols to be included in
<ulink url="https://gitlab.freedesktop.org/wayland/wayland-protocols">wayland-protocols</ulink>
must follow the interface naming rules set there. Other protocols
should use a unique prefix for the name, e.g. referring to the owning
project's name.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>version</varname>="<userinput>V</userinput>"</synopsis>
</term>
<listitem>
<para>
The interface's latest version number <userinput>V</userinput> must
be an integer greater than zero. An interface element defines
all versions of the interface from 1 to <userinput>V</userinput>
inclusive. The contents of each interface version are defined in each of
the &request;, &event;, &enum; and &entry; elements using the attributes
<varname>since</varname> and <varname>deprecated-since</varname>, and
in the specification text.
</para>
<para>
When an interface is extended, the version number must be incremented
on all the interfaces part of the same interface ancestry tree.
The exception to this rule are interfaces which are forever stuck
to version 1, which is usually caused by having multiple parent
interfaces with independent ancestor global interfaces.
</para>
<para>
A protocol object may have any defined version of the interface.
The version of the object is determined at runtime either
by inheritance from another protocol object or explicitly.
</para>
<para>
It is possible for a protocol object to have a version higher than
defined by its interface. This may happen when the interface is
stuck at version 1 as per above. It may also happen when a protocol
XML file has not been thoroughly updated as required. In such cases
the object shall function as with the highest defined interface
version.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-request">
<title>request</title>
<para>
Parent elements: &interface;
</para>
<synopsis>request ::= (&description;?, &arg;*)</synopsis>
<para>
Defines a request, a message from a client to a server.
Requests are always associated with a specific protocol object.
</para>
<para>
Requests are automatically assigned opcodes in the order they
appear inside the &interface; element. Therefore the only
backwards-compatible way to add requests to an interface is to
add them to the end. Any &event; elements do not interfere
with request opcode assignments.
</para>
<para>
The &arg; elements declare the request's arguments.
There can be 0 to 20 arguments for a request.
The order of &arg; inside the request element defines the order of
the arguments on the wire. All declared arguments are mandatory,
and extra arguments are not allowed on the wire.
</para>
<para>
The &description; element should be used to document the request.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the request. &cname-requirements;
The name must be unique within all requests and &event;s in the
containing &interface;.
</para>
<para>
Code and language binding generators may use the name in the API
they create. The <varname>name</varname> of the containing
&interface; provides the namespace for requests.
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>type</varname>="<literal>destructor</literal>"</synopsis>
</term>
<listitem>
<para>
When this attribute is present, the request is a destructor:
it shall destroy the protocol object it is sent on. Protocol IPC
libraries may use this for bookkeeping protocol object lifetimes.
</para>
<para>
Libwayland-client uses this information to ignore incoming &event;s
for destroyed protocol objects. Such events may occur due to a
natural race condition between the client destroying a protocol
object and the server sending events before processing the
destroy request.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>since</varname>="<userinput>S</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>S</userinput> must be an integer greater than zero.
If <varname>since</varname> is not specified,
<code>since="1"</code> is assumed.
</para>
<para>
This request was added in &interface; <varname>version</varname>
<userinput>S</userinput>. The request does not exist if the
protocol object has a bound version smaller than
<userinput>S</userinput>. Attempts to use it in such a case
shall raise the protocol error
<varname>wl_display.error.invalid_method</varname>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>deprecated-since</varname>="<userinput>D</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>D</userinput> must be an integer greater than the
value of <varname>since</varname>.
If <varname>deprecated-since</varname> is not specified, then
the request is not deprecated in any version of the containing
&interface;.
</para>
<para>
This request was deprecated in &interface; <varname>version</varname>
<userinput>D</userinput> and above, and should not be sent on
protocol objects of such version. This is informational.
Compositors must still be prepared to handle the
request unless specified otherwise.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-event">
<title>event</title>
<para>
Parent elements: &interface;
</para>
<synopsis>event ::= (&description;?, &arg;*)</synopsis>
<para>
Defines an event, a message from a server to a client.
Events are always associated with a specific protocol object.
</para>
<para>
Events are automatically assigned opcodes in the order they
appear inside the &interface; element. Therefore the only
backwards-compatible way to add events to an interface is to
add them to the end. Any &request; elements do not interfere
with event opcode assignments.
</para>
<para>
The &arg; elements declare the event's arguments.
There can be 0 to 20 arguments for an event.
The order of &arg; inside the event element defines the order of
the arguments on the wire. All declared arguments are mandatory,
and extra arguments are not allowed on the wire.
</para>
<para>
The &description; element should be used to document the event.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the event. &cname-requirements;
The name must be unique within all &request;s and events in the
containing &interface;.
</para>
<para>
Code and language binding generators may use the name in the API
they create. The <varname>name</varname> of the containing
&interface; provides the namespace for events.
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>type</varname>="<literal>destructor</literal>"</synopsis>
</term>
<listitem>
<para>
When this attribute is present, the event is a destructor:
it shall destroy the protocol object it is sent on. Protocol IPC
libraries may use this for bookkeeping protocol object lifetimes.
</para>
<warning>
<para>
Destructor events are an underdeveloped feature in Wayland.
They can be used only on client-created protocol objects, and
it is the protocol designer's responsibility
to design such a message exchange that race conditions cannot
occur. The main problem would be a client sending a request at the
same time as the server is sending a destructor event. The
server will consider the protocol object to be already invalid
or even recycled when it proceeds to process the request.
This often results in protocol errors, but under specific
conditions it might also result in silently incorrect behavior.
</para>
<para>
Destructor events should not be used in new protocols.
If a destructor event is necessary, the simplest way to avoid
these problems is to have the &interface; not contain any
&request;s.
</para>
</warning>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>since</varname>="<userinput>S</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>S</userinput> must be an integer greater than zero.
If <varname>since</varname> is not specified,
<code>since="1"</code> is assumed.
</para>
<para>
This event was added in &interface; <varname>version</varname>
<userinput>S</userinput>. The event does not exist if the
protocol object has a bound version smaller than
<userinput>S</userinput>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>deprecated-since</varname>="<userinput>D</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>D</userinput> must be an integer greater than the
value of <varname>since</varname>.
If <varname>deprecated-since</varname> is not specified, then
the event is not deprecated in any version of the containing
&interface;.
</para>
<para>
This event was deprecated in &interface; <varname>version</varname>
<userinput>D</userinput> and above, and should not be sent on
protocol objects of such version. This is informational.
Clients must still be prepared to receive this event
unless otherwise specified.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-arg">
<title>arg</title>
<para>
Parent elements: &request;, &event;
</para>
<synopsis>arg ::= &description;?</synopsis>
<para>
This element declares one argument for the request or the event.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the argument. &cname-requirements;
The name must be unique within all the arguments of the parent element.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>type</varname>="<userinput>T</userinput>"</synopsis>
</term>
<listitem>
<para>
The type <userinput>T</userinput> of the argument datum must
be one of:
</para>
<variablelist>
<varlistentry>
<term><literal>int</literal></term>
<listitem>
<simpara>32-bit signed integer.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>uint</literal></term>
<listitem>
<simpara>32-bit unsigned integer.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>fixed</literal></term>
<listitem>
<simpara>Signed 24.8-bit fixed-point value.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>string</literal></term>
<listitem>
<simpara>
UTF-8 encoded string value, NUL byte terminated.
Interior NUL bytes are not allowed.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>array</literal></term>
<listitem>
<simpara>A byte array of arbitrary data.</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>fd</literal></term>
<listitem>
<simpara>A file descriptor.</simpara>
<simpara>
The file descriptor must be open and valid on send.
It is not possible to pass a null value.
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>new_id</literal></term>
<listitem>
<simpara>
Creates a new protocol object. A &request; or an &event; may
have at most one <literal>new_id</literal> argument.
</simpara>
<simpara>
If <varname>interface</varname> is specified, the new
protocol object shall have the specified &interface;,
and the new object's (interface) version shall be the
version of the object on which the &request; or &event;
is being sent.
</simpara>
<simpara>
If <varname>interface</varname> is not specified, the
&request; shall implicitly have two additional arguments:
A <literal>string</literal> for an &interface; name, and
a <literal>uint</literal> for the new object's version.
Leaving the interface unspecified is reserved for special use,
<xref linkend="protocol-spec-wl_registry-request-bind" />
for example.
</simpara>
<note>
<simpara>
An &event; argument must always specify the
<literal>new_id</literal> <varname>interface</varname>.
</simpara>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>object</literal></term>
<listitem>
<simpara>Reference to an existing protocol object.</simpara>
<simpara>
The attribute <varname>interface</varname> should be
specified. Otherwise IPC libraries cannot enforce the
interface, and checking the interface falls on user code
and specification text.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>summary</varname>="<userinput>summary</userinput>"</synopsis>
</term>
<listitem>
<para>
A short (half a line at most) description. This attribute
should not be used if a &description; is used.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>interface</varname>="<userinput>iface</userinput>"</synopsis>
</term>
<listitem>
<para>
If given, <userinput>iface</userinput> must be the
<varname>name</varname> of some &interface;, and
<varname>type</varname> of this argument must be either
<literal>"object"</literal> or <literal>"new_id"</literal>.
This indicates that the existing or new object must have
the interface <userinput>iface</userinput>.
Use for other argument types is forbidden.
</para>
<note>
<simpara>
If an interface from another protocol is used, then this
creates a dependency between the protocols. If an application
generates code for one protocol, then it must also generate
code for all dependencies. Therefore this would not be a
backwards compatible change.
</simpara>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>allow-null</varname>="<literal>true</literal>" | "<literal>false</literal>"</synopsis>
</term>
<listitem>
<para>
Whether the argument value can be null on send.
Defaults to <literal>"false"</literal>, meaning it is illegal
to send a null value.
Can be used only when <varname>type</varname> is
<literal>"string"</literal> or <literal>"object"</literal>.
</para>
<note>
<para>
Even though this attribute can be used to forbid a compositor
from sending a null object as an event argument, an IPC library
implementation may not protect the client from receiving a null
object. This can happen with libwayland-client when the client
has destroyed the protocol object before dispatching an event
that referred to it in an argument.
</para>
</note>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>enum</varname>="<userinput>enum-cname-suffix</userinput>"</synopsis>
</term>
<listitem>
<para>
If specified, indicates that the argument value should come from the
&enum; named <userinput>enum-cname-suffix</userinput>. If the
enumeration is a bitfield, then <varname>type</varname> must be
<literal>"uint"</literal>. Otherwise <varname>type</varname> must
be either <literal>"uint"</literal> or <literal>"int"</literal>.
</para>
<para>
The name <userinput>enum-cname-suffix</userinput> refers to an &enum;
in the same &interface; by default. If it is necessary to refer to an
enumeration from another interface, the interface name can be
given with a period:
<synopsis><varname>enum</varname>="<userinput>iface</userinput>.<userinput>enum-cname-suffix</userinput>"</synopsis>
</para>
<note>
<para>
This attribute alone does not automatically restrict the legal
values for this argument.
If values from outside of the enumeration need to be forbidden,
that must be specified explicitly in the documentation.
</para>
<para>
A common design pattern is to have the server advertise the
supported enumeration or bit values with &event;s and
explicitly forbid clients from using any other values in
requests. This also requires a protocol error code to be
specified with the error &enum; to be raised if a client
uses an illegal value, see
<xref linkend="sect-MessageXML-tag-interface" />.
</para>
</note>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-enum">
<title>enum</title>
<para>
Parent elements: &protocol;
</para>
<synopsis>enum ::= (&description;?, &entry;*)</synopsis>
<para>
This tag defines an enumeration of integer values. Enumerations are
merely a syntactic construct to give names to arbitrary integer
constants. Each constant is listed as an &entry; with its name.
There are two types of enumerations: regular enumerations and bitfields.
</para>
<para>
Regular enumerations do not use <varname>bitfield</varname>
attribute, or they set it to <literal>"false"</literal>.
The set of pre-defined values that belong to a regular enumeration is
exactly the set of values listed as &entry; elements after
the protocol object version is taken into account.
See the &entry; attributes <varname>since</varname> and
<varname>deprecated-since</varname>.
</para>
<para>
Bitfields set <varname>bitfield</varname> to
<literal>"true"</literal>. The set of values that belong to a
bitfield enumeration are all the values that can be formed by
the bitwise-or operator from the set of values listed as &entry;
elements like in the regular enumeration. Usually also zero is
implicitly included.
</para>
<para>
All the values in a regular enumeration must be either
signed or unsigned 32-bit integers. All the values in a
bitfield enumeration must be unsigned 32-bit integers.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname-suffix</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of the enumeration. &cname-suffix-requirements;
The name must be unique within all enumerations in the containing
&interface;. The name is used as the namespace for all the
contained &entry; elements.
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>since</varname>="<userinput>S</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>S</userinput> must be an integer greater than zero.
If <varname>since</varname> is not specified,
<code>since="1"</code> is assumed.
</para>
<para>
This enumeration was added in &interface; <varname>version</varname>
<userinput>S</userinput>. The enumeration does not exist if the
protocol object has a bound version smaller than
<userinput>S</userinput>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>bitfield</varname>="<literal>true</literal>" | "<literal>false</literal>"</synopsis>
</term>
<listitem>
<para>
Specifies if this enumeration is a bitfield.
Defaults to <literal>"false"</literal>.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
<section id="sect-MessageXML-tag-entry">
<title>entry</title>
<para>
Parent elements: &enum;
</para>
<synopsis>entry ::= &description;?</synopsis>
<para>
Defines a name for an integer constant and makes it part of the
set of values of the containing enumeration.
</para>
<variablelist>
<title>Required attributes</title>
<varlistentry>
<term>
<synopsis><varname>name</varname>="<userinput>cname-suffix</userinput>"</synopsis>
</term>
<listitem>
<para>
The name of a value in an enumeration. &cname-suffix-requirements;
The name must be unique within all entry elements in the containing
&enum;.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>value</varname>="<userinput>V</userinput>"</synopsis>
</term>
<listitem>
<para>
An integer value.
The value can be given in decimal, hexadecimal, or octal
representation.
</para>
</listitem>
</varlistentry>
</variablelist>
<variablelist>
<title>Optional attributes</title>
<varlistentry>
<term>
<synopsis><varname>summary</varname>="<userinput>summary</userinput>"</synopsis>
</term>
<listitem>
<para>
A short (half a line at most) description. This attribute
should not be used if a &description; is used.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>since</varname>="<userinput>S</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>S</userinput> must be an integer greater than zero.
If <varname>since</varname> is not specified,
<code>since="1"</code> is assumed.
</para>
<para>
This value was added in &interface; <varname>version</varname>
<userinput>S</userinput>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<synopsis><varname>deprecated-since</varname>="<userinput>D</userinput>"</synopsis>
</term>
<listitem>
<para>
<userinput>D</userinput> must be an integer greater than the
value of <varname>since</varname>.
If <varname>deprecated-since</varname> is not specified, then
the value is not deprecated in any version of the containing
&interface;.
</para>
<para>
This value was removed in &interface; <varname>version</varname>
<userinput>D</userinput>. This does not make the value
automatically illegal to use, see
<xref linkend="sect-MessageXML-tag-arg" /> attribute
<varname>enum</varname>.
</para>
</listitem>
</varlistentry>
</variablelist>
</section>
</section>
</chapter>

View file

@ -1,592 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-Protocol">
<title>Wayland Protocol and Model of Operation</title>
<section id="sect-Protocol-Basic-Principles">
<title>Basic Principles</title>
<para>
The Wayland protocol is an asynchronous object oriented protocol. All
requests are method invocations on some object. The requests include
an object ID that uniquely identifies an object on the server. Each
object implements an interface and the requests include an opcode that
identifies which method in the interface to invoke.
</para>
<para>
The protocol is message-based. A message sent by a client to the server
is called request. A message from the server to a client is called event.
A message has a number of arguments, each of which has a certain type (see
<xref linkend="sect-Protocol-Wire-Format"/> for a list of argument types).
</para>
<para>
Additionally, the protocol can specify <type>enum</type>s which associate
names to specific numeric enumeration values. These are primarily just
descriptive in nature: at the wire format level enums are just integers.
But they also serve a secondary purpose to enhance type safety or
otherwise add context for use in language bindings or other such code.
This latter usage is only supported so long as code written before these
attributes were introduced still works after; in other words, adding an
enum should not break API, otherwise it puts backwards compatibility at
risk.
</para>
<para>
<type>enum</type>s can be defined as just a set of integers, or as
bitfields. This is specified via the <type>bitfield</type> boolean
attribute in the <type>enum</type> definition. If this attribute is true,
the enum is intended to be accessed primarily using bitwise operations,
for example when arbitrarily many choices of the enum can be ORed
together; if it is false, or the attribute is omitted, then the enum
arguments are a just a sequence of numerical values.
</para>
<para>
The <type>enum</type> attribute can be used on either <type>uint</type>
or <type>int</type> arguments, however if the <type>enum</type> is
defined as a <type>bitfield</type>, it can only be used on
<type>uint</type> args.
</para>
<para>
The server sends back events to the client, each event is emitted from
an object. Events can be error conditions. The event includes the
object ID and the event opcode, from which the client can determine
the type of event. Events are generated both in response to requests
(in which case the request and the event constitutes a round trip) or
spontaneously when the server state changes.
</para>
<para>
<itemizedlist>
<listitem>
<para>
State is broadcast on connect, events are sent
out when state changes. Clients must listen for
these changes and cache the state.
There is no need (or mechanism) to query server state.
</para>
</listitem>
<listitem>
<para>
The server will broadcast the presence of a number of global objects,
which in turn will broadcast their current state.
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section id="sect-Protocol-Code-Generation">
<title>Code Generation</title>
<para>
The interfaces, requests and events are defined in
<filename>protocol/wayland.xml</filename>.
This xml is used to generate the function prototypes that can be used by
clients and compositors.
</para>
<para>
The protocol entry points are generated as inline functions which just
wrap the <function>wl_proxy_*</function> functions. The inline functions aren't
part of the library ABI and language bindings should generate their
own stubs for the protocol entry points from the xml.
</para>
</section>
<section id="sect-Protocol-Wire-Format">
<title>Wire Format</title>
<para>
The protocol is sent over a UNIX domain stream socket, where the endpoint
usually is named <systemitem class="service">wayland-0</systemitem>
(although it can be changed via <emphasis>WAYLAND_DISPLAY</emphasis>
in the environment). Beginning in Wayland 1.15, implementations can
optionally support server socket endpoints located at arbitrary
locations in the filesystem by setting <emphasis>WAYLAND_DISPLAY</emphasis>
to the absolute path at which the server endpoint listens. The socket may
also be provided through file descriptor inheritance, in which case
<emphasis>WAYLAND_SOCKET</emphasis> is set.
</para>
<para>
Every message is structured as 32-bit words; values are represented in the
host's byte-order. The message header has 2 words in it:
<itemizedlist>
<listitem>
<para>
The first word is the sender's object ID (32-bit).
</para>
</listitem>
<listitem>
<para>
The second has 2 parts of 16-bit. The upper 16-bits are the message
size in bytes, starting at the header (i.e. it has a minimum value of 8).The lower is the request/event opcode.
</para>
</listitem>
</itemizedlist>
The payload describes the request/event arguments. Every argument is always
aligned to 32-bits. Where padding is required, the value of padding bytes is
undefined. There is no prefix that describes the type, but it is
inferred implicitly from the xml specification.
</para>
<para>
The representation of argument types are as follows:
<variablelist>
<varlistentry>
<term>int</term>
<term>uint</term>
<listitem>
<para>
The value is the 32-bit value of the signed/unsigned
int.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>fixed</term>
<listitem>
<para>
Signed 24.8 decimal numbers. It is a signed decimal type which
offers a sign bit, 23 bits of integer precision and 8 bits of
decimal precision. This is exposed as an opaque struct with
conversion helpers to and from double and int on the C API side.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>string</term>
<listitem>
<para>
Starts with an unsigned 32-bit length (including null terminator),
followed by the UTF-8 encoded string contents, including
terminating null byte, then padding to a 32-bit boundary. A null
value is represented with a length of 0. Interior null bytes are
not permitted.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>object</term>
<listitem>
<para>
32-bit object ID. A null value is represented with an ID of 0.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>new_id</term>
<listitem>
<para>
The 32-bit object ID. Generally, the interface used for the new
object is inferred from the xml, but in the case where it's not
specified, a new_id is preceded by a <code>string</code> specifying
the interface name, and a <code>uint</code> specifying the version.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>array</term>
<listitem>
<para>
Starts with 32-bit array size in bytes, followed by the array
contents verbatim, and finally padding to a 32-bit boundary.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>fd</term>
<listitem>
<para>
The file descriptor is not stored in the message buffer, but in
the ancillary data of the UNIX domain socket message (msg_control).
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
The protocol does not specify the exact position of the ancillary data
in the stream, except that the order of file descriptors is the same as
the order of messages and <code>fd</code> arguments within messages on
the wire.
</para>
<para>
In particular, it means that any byte of the stream, even the message
header, may carry the ancillary data with file descriptors.
</para>
<para>
Clients and compositors should queue incoming data until they have
whole messages to process, as file descriptors may arrive earlier
or later than the corresponding data bytes.
</para>
</section>
<xi:include href="ProtocolInterfaces.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<section id="sect-Protocol-Versioning">
<title>Versioning</title>
<para>
Every interface is versioned and every protocol object implements a
particular version of its interface. For global objects, the maximum
version supported by the server is advertised with the global and the
actual version of the created protocol object is determined by the
version argument passed to wl_registry.bind(). For objects that are
not globals, their version is inferred from the object that created
them.
</para>
<para>
In order to keep things sane, this has a few implications for
interface versions:
<itemizedlist>
<listitem>
<para>
The object creation hierarchy must be a tree. Otherwise,
inferring object versions from the parent object becomes a much
more difficult to properly track.
</para>
</listitem>
<listitem>
<para>
When the version of an interface increases, so does the version
of its parent (recursively until you get to a global interface)
</para>
</listitem>
<listitem>
<para>
A global interface's version number acts like a counter for all
of its child interfaces. Whenever a child interface gets
modified, the global parent's interface version number also
increases (see above). The child interface then takes on the
same version number as the new version of its parent global
interface.
</para>
</listitem>
</itemizedlist>
</para>
<para>
To illustrate the above, consider the wl_compositor interface. It
has two children, wl_surface and wl_region. As of wayland version
1.2, wl_surface and wl_compositor are both at version 3. If
something is added to the wl_region interface, both wl_region and
wl_compositor will get bumpped to version 4. If, afterwards,
wl_surface is changed, both wl_compositor and wl_surface will be at
version 5. In this way the global interface version is used as a
sort of "counter" for all of its child interfaces. This makes it
very simple to know the version of the child given the version of its
parent. The child is at the highest possible interface version that
is less than or equal to its parent's version.
</para>
<para>
It is worth noting a particular exception to the above versioning
scheme. The wl_display (and, by extension, wl_registry) interface
cannot change because it is the core protocol object and its version
is never advertised nor is there a mechanism to request a different
version.
</para>
</section>
<section id="sect-Protocol-Connect-Time">
<title>Connect Time</title>
<para>
There is no fixed connection setup information, the server emits
multiple events at connect time, to indicate the presence and
properties of global objects: outputs, compositor, input devices.
</para>
</section>
<section id="sect-Protocol-Security-and-Authentication">
<title>Security and Authentication</title>
<para>
<itemizedlist>
<listitem>
<para>
mostly about access to underlying buffers, need new drm auth
mechanism (the grant-to ioctl idea), need to check the cmd stream?
</para>
</listitem>
<listitem>
<para>
getting the server socket depends on the compositor type, could
be a system wide name, through fd passing on the session dbus.
or the client is forked by the compositor and the fd is
already opened.
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section id="sect-Protocol-Creating-Objects">
<title>Creating Objects</title>
<para>
Each object has a unique ID. The IDs are allocated by the entity
creating the object (either client or server). IDs allocated by the
client are in the range [1, 0xfeffffff] while IDs allocated by the
server are in the range [0xff000000, 0xffffffff]. The 0 ID is
reserved to represent a null or non-existent object.
For efficiency purposes, the IDs are densely packed in the sense that
the ID N will not be used until N-1 has been used. This ordering is
not merely a guideline, but a strict requirement, and there are
implementations of the protocol that rigorously enforce this rule,
including the ubiquitous libwayland.
</para>
</section>
<section id="sect-Protocol-Compositor">
<title>Compositor</title>
<para>
The compositor is a global object, advertised at connect time.
</para>
<para>
See <xref linkend="protocol-spec-wl_compositor"/> for the
protocol description.
</para>
</section>
<section id="sect-Protocol-Surface">
<title>Surfaces</title>
<para>
A surface manages a rectangular grid of pixels that clients create
for displaying their content to the screen. Clients don't know
the global position of their surfaces, and cannot access other
clients' surfaces.
</para>
<para>
Once the client has finished writing pixels, it 'commits' the
buffer; this permits the compositor to access the buffer and read
the pixels. When the compositor is finished, it releases the
buffer back to the client.
</para>
<para>
See <xref linkend="protocol-spec-wl_surface"/> for the protocol
description.
</para>
</section>
<section id="sect-Protocol-Input">
<title>Input</title>
<para>
A seat represents a group of input devices including mice,
keyboards and touchscreens. It has a keyboard and pointer
focus. Seats are global objects. Pointer events are delivered
in surface-local coordinates.
</para>
<para>
The compositor maintains an implicit grab when a button is
pressed, to ensure that the corresponding button release
event gets delivered to the same surface. But there is no way
for clients to take an explicit grab. Instead, surfaces can
be mapped as 'popup', which combines transient window semantics
with a pointer grab.
</para>
<para>
To avoid race conditions, input events that are likely to
trigger further requests (such as button presses, key events,
pointer motions) carry serial numbers, and requests such as
wl_surface.set_popup require that the serial number of the
triggering event is specified. The server maintains a
monotonically increasing counter for these serial numbers.
</para>
<para>
Input events also carry timestamps with millisecond granularity.
Their base is undefined, so they can't be compared against
system time (as obtained with clock_gettime or gettimeofday).
They can be compared with each other though, and for instance
be used to identify sequences of button presses as double
or triple clicks.
</para>
<para>
See <xref linkend="protocol-spec-wl_seat"/> for the
protocol description.
</para>
<para>
Talk about:
<itemizedlist>
<listitem>
<para>
keyboard map, change events
</para>
</listitem>
<listitem>
<para>
xkb on Wayland
</para>
</listitem>
<listitem>
<para>
multi pointer Wayland
</para>
</listitem>
</itemizedlist>
</para>
<para>
A surface can change the pointer image when the surface is the pointer
focus of the input device. Wayland doesn't automatically change the
pointer image when a pointer enters a surface, but expects the
application to set the cursor it wants in response to the pointer
focus and motion events. The rationale is that a client has to manage
changing pointer images for UI elements within the surface in response
to motion events anyway, so we'll make that the only mechanism for
setting or changing the pointer image. If the server receives a request
to set the pointer image after the surface loses pointer focus, the
request is ignored. To the client this will look like it successfully
set the pointer image.
</para>
<para>
Setting the pointer image to NULL causes the cursor to be hidden.
</para>
<para>
The compositor will revert the pointer image back to a default image
when no surface has the pointer focus for that device.
</para>
<para>
What if the pointer moves from one window which has set a special
pointer image to a surface that doesn't set an image in response to
the motion event? The new surface will be stuck with the special
pointer image. We can't just revert the pointer image on leaving a
surface, since if we immediately enter a surface that sets a different
image, the image will flicker. If a client does not set a pointer image
when the pointer enters a surface, the pointer stays with the image set
by the last surface that changed it, possibly even hidden. Such a client
is likely just broken.
</para>
</section>
<section id="sect-Protocol-Output">
<title>Output</title>
<para>
An output is a global object, advertised at connect time or as it
comes and goes.
</para>
<para>
See <xref linkend="protocol-spec-wl_output"/> for the protocol
description.
</para>
<para>
</para>
<itemizedlist>
<listitem>
<para>
laid out in a big (compositor) coordinate system
</para>
</listitem>
<listitem>
<para>
basically xrandr over Wayland
</para>
</listitem>
<listitem>
<para>
geometry needs position in compositor coordinate system
</para>
</listitem>
<listitem>
<para>
events to advertise available modes, requests to move and change
modes
</para>
</listitem>
</itemizedlist>
</section>
<section id="sect-Protocol-data-sharing">
<title>Data sharing between clients</title>
<para>
The Wayland protocol provides clients a mechanism for sharing
data that allows the implementation of copy-paste and
drag-and-drop. The client providing the data creates a
<function>wl_data_source</function> object and the clients
obtaining the data will see it as <function>wl_data_offer</function>
object. This interface allows the clients to agree on a mutually
supported mime type and transfer the data via a file descriptor
that is passed through the protocol.
</para>
<para>
The next section explains the negotiation between data source and
data offer objects. <xref linkend="sect-Protocol-data-sharing-devices"/>
explains how these objects are created and passed to different
clients using the <function>wl_data_device</function> interface
that implements copy-paste and drag-and-drop support.
</para>
<para>
See <xref linkend="protocol-spec-wl_data_offer"/>,
<xref linkend="protocol-spec-wl_data_source"/>,
<xref linkend="protocol-spec-wl_data_device"/> and
<xref linkend="protocol-spec-wl_data_device_manager"/> for
protocol descriptions.
</para>
<para>
MIME is defined in RFC's 2045-2049. A
<ulink url="https://www.iana.org/assignments/media-types/media-types.xhtml">
registry of MIME types</ulink> is maintained by the Internet Assigned
Numbers Authority (IANA).
</para>
<section>
<title>Data negotiation</title>
<para>
A client providing data to other clients will create a <function>wl_data_source</function>
object and advertise the mime types for the formats it supports for
that data through the <function>wl_data_source.offer</function>
request. On the receiving end, the data offer object will generate one
<function>wl_data_offer.offer</function> event for each supported mime
type.
</para>
<para>
The actual data transfer happens when the receiving client sends a
<function>wl_data_offer.receive</function> request. This request takes
a mime type and a file descriptor as arguments. This request will generate a
<function>wl_data_source.send</function> event on the sending client
with the same arguments, and the latter client is expected to write its
data to the given file descriptor using the chosen mime type.
</para>
</section>
<section id="sect-Protocol-data-sharing-devices">
<title>Data devices</title>
<para>
Data devices glue data sources and offers together. A data device is
associated with a <function>wl_seat</function> and is obtained by the clients using the
<function>wl_data_device_manager</function> factory object, which is also responsible for
creating data sources.
</para>
<para>
Clients are informed of new data offers through the
<function>wl_data_device.data_offer</function> event. After this
event is generated the data offer will advertise the available mime
types. New data offers are introduced prior to their use for
copy-paste or drag-and-drop.
</para>
<section>
<title>Selection</title>
<para>
Each data device has a selection data source. Clients create a data
source object using the device manager and may set it as the
current selection for a given data device. Whenever the current
selection changes, the client with keyboard focus receives a
<function>wl_data_device.selection</function> event. This event is
also generated on a client immediately before it receives keyboard
focus.
</para>
<para>
The data offer is introduced with
<function>wl_data_device.data_offer</function> event before the
selection event.
</para>
</section>
<section>
<title>Drag and Drop</title>
<para>
A drag-and-drop operation is started using the
<function>wl_data_device.start_drag</function> request. This
requests causes a pointer grab that will generate enter, motion and
leave events on the data device. A data source is supplied as
argument to start_drag, and data offers associated with it are
supplied to clients surfaces under the pointer in the
<function>wl_data_device.enter</function> event. The data offer
is introduced to the client prior to the enter event with the
<function>wl_data_device.data_offer</function> event.
</para>
<para>
Clients are expected to provide feedback to the data sending client
by calling the <function>wl_data_offer.accept</function> request with
a mime type it accepts. If none of the advertised mime types is
supported by the receiving client, it should supply NULL to the
accept request. The accept request causes the sending client to
receive a <function>wl_data_source.target</function> event with the
chosen mime type.
</para>
<para>
When the drag ends, the receiving client receives a
<function>wl_data_device.drop</function> event at which it is expected
to transfer the data using the
<function>wl_data_offer.receive</function> request.
</para>
</section>
</section>
</section>
</chapter>

View file

@ -1,49 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
<!ENTITY doxygen SYSTEM "ServerAPI.xml">
%BOOK_ENTITIES;
]>
<appendix id="sect-Library-Server">
<title>Server API</title>
<section><title>Introduction</title>
<para>
The open-source reference implementation of Wayland protocol is
split in two C libraries, <link
linkend="sect-Library-Client">libwayland-client</link> and
libwayland-server. Their main responsibility is to handle the
Inter-process communication (<emphasis>IPC</emphasis>) with each
other, therefore guaranteeing the protocol objects marshaling and
messages synchronization.
</para>
<para>
The server library is designed to work much like libwayland-client,
although it is considerably complicated due to the server needing
to support multiple versions of the protocol. It is best to learn
libwayland-client first.
</para>
<para>
Each open socket to a client is represented by a <link
linkend="Server-structwl__client">wl_client</link>. The equivalent
of the <link linkend="Client-classwl__proxy">wl_proxy</link> that
libwayland-client uses to represent an object is <link
linkend="Server-structwl__resource">wl_resource</link> for
client-created objects, and <link
linkend="Server-structwl__global">wl_global</link> for objects
created by the server.
</para>
<para>
Often a server is also a client for another Wayland server, and
thus must link with both libwayland-client and libwayland-server.
This produces some type name conflicts (such as the <link
linkend="Client-classwl__display">client wl_display</link> and
<link linkend="Server-structwl__display">server wl_display</link>,
but the duplicate-but-not-the-same types are opaque, and accessed
only inside the correct library where it came from. Naturally that
means that the program writer needs to always know if a pointer to
a wl_display is for the server or client side and use the
corresponding functions.
</para>
</section>
&doxygen;
</appendix>

View file

@ -1,4 +0,0 @@
<!ENTITY PRODUCT "Documentation">
<!ENTITY BOOKID "Wayland">
<!ENTITY YEAR "2012">
<!ENTITY HOLDER "Kristian Høgsberg, Intel Corporation">

View file

@ -1,20 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<book>
<xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Foreword.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Introduction.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Compositors.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Architecture.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Protocol.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Message_XML.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Xwayland.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Content_Updates.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Color.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="ProtocolSpec.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="Client.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<xi:include href="Server.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
</book>

View file

@ -1,168 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
<chapter id="chap-X11-Application-Support">
<title>X11 Application Support</title>
<section id="sect-X11-Application-Support-introduction">
<title>Introduction</title>
<para>
Being able to run existing X11 applications is crucial for the adoption
of Wayland, especially on desktops, as there will always be X11
applications that have not been or cannot be converted into Wayland
applications, and throwing them all away would be prohibitive.
Therefore a Wayland compositor often needs to support running X11
applications.
</para>
<para>
X11 and Wayland are different enough that there is no "simple" way to
translate between them. Most of X11 is uninteresting to a Wayland
compositor. That, combined with the gigantic implementation effort needed
to support X11, makes it intractable to just write X11 support directly in
a Wayland compositor. The implementation would be nothing short of a
real X11 server.
</para>
<para>
Therefore, Wayland compositors should use Xwayland, the X11 server that
lives in the Xorg server source code repository and shares most of the
implementation with the Xorg server. Xwayland is a complete X11 server,
just like Xorg is, but instead of driving the displays and opening input
devices, it acts as a Wayland client. The rest of this chapter talks
about how Xwayland works.
</para>
<para>
For integration and architecture reasons, while Xwayland is a Wayland
client of the Wayland compositor, the Wayland compositor is an X11 client
of Xwayland. This circular dependency requires special care from the
Wayland compositor.
</para>
</section>
<section id="sect-X11-Application-Support-two-modes">
<title>Two Modes for Foreign Windows</title>
<para>
In general, windows from a foreign window system can be presented in one
of two ways: rootless and rootful (not rootless).
</para>
<para>
In rootful mode, the foreign window system as a whole is represented as a
window (or more) of its own. You have a native window, inside which all
the foreign windows are. The advantage of this approach in Xwayland's
case is that you can run your favourite X11 window manager to manage your
X11 applications. The disadvantage is that the foreign windows do not
integrate with the native desktop. Therefore this mode is not usually
used.
</para>
<para>
In rootless mode, each foreign window is a first-class resident among the
native windows. Foreign windows are not confined inside a native window
but act as if they were native windows. The advantage is that one can
freely stack and mix native and foreign windows, which is not possible in
rootful mode. The disadvantage is that this mode is harder to implement
and fundamental differences in window systems may prevent some things
from working. With rootless Xwayland, the Wayland compositor must take
the role as the X11 window manager, and one cannot use any other X11
window manager in its place.
</para>
<para>
This chapter concentrates on the rootless mode, and ignores the rootful
mode.
</para>
</section>
<section id="sect-X11-Application-Support-architecture">
<title>Architecture</title>
<para>
A Wayland compositor usually takes care of launching Xwayland.
Xwayland works in cooperation with a Wayland compositor as follows:
</para>
<figure>
<title>Xwayland architecture diagram</title>
<mediaobject>
<imageobject>
<imagedata fileref="images/xwayland-architecture.png" format="PNG" />
</imageobject>
</mediaobject>
</figure>
<para>
An X11 application connects to Xwayland just like it would connect to any
X server. Xwayland processes all the X11 requests. On the other end,
Xwayland is a Wayland client that connects to the Wayland compositor.
</para>
<para>
The X11 window manager (XWM) is an integral part of the Wayland
compositor. XWM uses the usual X11 window management protocol to manage
all X11 windows in Xwayland. Most importantly, XWM acts as a bridge
between Xwayland window state and the Wayland compositor's window manager
(WWM). This way WWM can manage all windows, both native Wayland and X11
(Xwayland) windows. This is very important for a coherent user
experience.
</para>
<para>
Since Xwayland uses Wayland for input and output, it does not have any
use for the device drivers that Xorg uses. None of the xf86-video-* or
xf86-input-* modules are used. There also is no configuration file for
the Xwayland server. For optional hardware accelerated rendering,
Xwayland uses GLAMOR.
</para>
<para>
A Wayland compositor usually spawns only one Xwayland instance. This is
because many X11 applications assume they can communicate with other X11
applications through the X server, and this requires a shared X server
instance. This also means that Xwayland does not protect nor isolate X11
clients from each other, unless the Wayland compositor specifically
chooses to break the X11 client intercommunications by spawning
application specific Xwayland instances. X11 clients are naturally
isolated from Wayland clients.
</para>
<para>
Xwayland compatibility compared to a native X server will probably never
reach 100%. Desktop environment (DE) components, specifically X11 window
managers, are practically never supported. An X11 window manager would
not know about native Wayland windows, so it could manage only X11
windows. On the other hand, there must be an XWM that reserves the
exclusive window manager role so that the Wayland compositor could show
the X11 windows appropriately. For other DE components, like pagers and
panels, adding the necessary interfaces to support them in WWM through XWM
is often considered not worthwhile.
</para>
</section>
<section id="sect-X11-Application-Support-xwm">
<title>X Window Manager (XWM)</title>
<para>
From the X11 point of view, the X window manager (XWM) living inside a
Wayland compositor is just like any other window manager. The difference
is mostly in which process it resides in, and the few extra conventions
in the X11 protocol to support Wayland window management (WWM)
specifically.
</para>
<para>
There are two separate asynchronous communication channels between
Xwayland and a Wayland compositor: one uses the Wayland protocol, and the
other one, solely for XWM, uses X11 protocol. This setting demands great
care from the XWM implementation to avoid (random) deadlocks with
Xwayland. It is often nearly impossible to prove that synchronous or
blocking X11 calls from XWM cannot cause a deadlock, and therefore it is
strongly recommended to make all X11 communications asynchronous. All
Wayland communications are already asynchronous by design.
</para>
<section id="sect-X11-Application-Support-xwm-window-identification">
<title>Window identification</title>
<para>
In Xwayland, an X11 window may have a corresponding wl_surface object
in Wayland. The wl_surface object is used for input and output: it is
referenced by input events and used to provide the X11 window content
to the Wayland compositor. The X11 window and the wl_surface live in
different protocol streams, and they need to be matched for XWM to do
its job.
</para>
<para>
When Xwayland creates a wl_surface on Wayland, it will also send an X11
ClientMessage of type atom "WL_SURFACE_ID" to the X11 window carrying
the wl_surface Wayland object ID as the first 32-bit data element. This
is how XWM can associate a wl_surface with an X11 window. Note that
the request to create a wl_surface and the ID message may arrive in any
order in the Wayland compositor.
</para>
</section>
</section>
</chapter>

File diff suppressed because it is too large Load diff

View file

@ -1,3 +0,0 @@
@import url("common.css");
@import url("overrides.css");
@import url("lang.css");

View file

@ -1,11 +0,0 @@
foreach src : files([
'common.css',
'default.css',
])
name = fs.name(src)
publican_inputs += fs.copyfile(
name,
install: true,
install_dir: publican_install_prefix + '/html/css',
)
endforeach

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load diff

View file

@ -1,35 +0,0 @@
foreach src : files([
'simple-desynchronized-state-1.png',
'simple-desynchronized-state-2.png',
'simple-desynchronized-state-3.png',
'simple-desynchronized-state-4.png',
'simple-desynchronized-state-5.png',
'simple-desynchronized-state-6.png',
'simple-synchronized-state-1.png',
'simple-synchronized-state-2.png',
'simple-synchronized-state-3.png',
'simple-synchronized-state-4.png',
'simple-synchronized-state-5.png',
'sync-subsurf-case1-1.png',
'sync-subsurf-case1-2.png',
'sync-subsurf-case1-3.png',
'sync-subsurf-case1-4.png',
'sync-subsurf-case1-5.png',
'sync-subsurf-case2-1.png',
'sync-subsurf-case2-2.png',
'sync-subsurf-case2-3.png',
'sync-to-desync-subsurf-1.png',
'sync-to-desync-subsurf-2.png',
'sync-to-desync-subsurf-3.png',
'sync-to-desync-transition-1.png',
'sync-to-desync-transition-2.png',
'sync-to-desync-transition-3.png',
'content-update-legend.png',
])
name = fs.name(src)
publican_inputs += fs.copyfile(
name,
install: true,
install_dir: publican_install_prefix + '/html/images/content-updates',
)
endforeach

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,198 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.0.3 Chrome/140.0.7339.249 Electron/38.7.0 Safari/537.36" version="29.0.3" pages="6">
<diagram name="state 1" id="9R2pyHIIQvV-60tET7sh">
<mxGraphModel dx="446" dy="299" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-56" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="119" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-57" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-58" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-59" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-60" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-61" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="Vljyf9wL_jF0PBdsZ3ZJ-62" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="J0DvB8TbWnCMMz7TEYbc" name="state 2">
<mxGraphModel dx="446" dy="299" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="1">
<mxGeometry x="110" y="20" width="50" height="40" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-2" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="119" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-3" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-6" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-7" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="NNa_h0o6fpdAX9mVI6Ni-8" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="ySO0QrqtFkECLiZt7iPp" name="state 3">
<mxGraphModel dx="701" dy="470" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="pI76myQ_i7gC2-BWcum8-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="pI76myQ_i7gC2-BWcum8-2" value="&lt;b&gt;1&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="pI76myQ_i7gC2-BWcum8-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="pI76myQ_i7gC2-BWcum8-4" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="pI76myQ_i7gC2-BWcum8-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="pI76myQ_i7gC2-BWcum8-6" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="Kx24UVXuaWmlcUcIS4GM" name="state 4">
<mxGraphModel dx="446" dy="299" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="v1jzpavZj8JK8wO-OO9X-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-2" value="&lt;b&gt;1&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-4" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-6" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-7" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-8" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="1">
<mxGeometry x="120" y="180" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="v1jzpavZj8JK8wO-OO9X-9" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="1">
<mxGeometry x="110" y="180" width="50" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="0yCGw3I3AjIYRBlyI2Mm" name="state 5">
<mxGraphModel dx="446" dy="299" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="1">
<mxGeometry x="102" y="170" width="148" height="60" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="1">
<mxGeometry x="110" y="180" width="50" height="40" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-3" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-4" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="1">
<mxGeometry x="120" y="180" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-5" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-6" value="&lt;b&gt;1&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-7" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-8" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-9" value="&lt;b&gt;&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-10" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-11" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="200" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="z-ZDJLvQiKHsJtFRiBHY-12" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="z-ZDJLvQiKHsJtFRiBHY-11" target="z-ZDJLvQiKHsJtFRiBHY-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="209" y="160" as="sourcePoint" />
<mxPoint x="159" y="160" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="rl79urPFriLDlxviKeb4" name="state 6">
<mxGraphModel dx="446" dy="299" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="-BeM0r6oPtfcQ-rT40E6-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="-BeM0r6oPtfcQ-rT40E6-2" value="&lt;b&gt;1&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-BeM0r6oPtfcQ-rT40E6-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-BeM0r6oPtfcQ-rT40E6-4" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="-BeM0r6oPtfcQ-rT40E6-5" value="&lt;b&gt;2, 3&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-BeM0r6oPtfcQ-rT40E6-6" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -1,207 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.0.3 Chrome/140.0.7339.249 Electron/38.7.0 Safari/537.36" version="29.0.3" pages="5">
<diagram name="state 1" id="W-2uyegr0hxMwi0Wm8H9">
<mxGraphModel dx="452" dy="307" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="B5W2QRrcq4c7WbW7dQDT-1" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="B5W2QRrcq4c7WbW7dQDT-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="GeoL4XoRYetvg1q4LOzn" name="state 2">
<mxGraphModel dx="452" dy="307" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="JhubsHDD-TggGAyBPSTr-1" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-8" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="JhubsHDD-TggGAyBPSTr-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="JhubsHDD-TggGAyBPSTr-8" target="JhubsHDD-TggGAyBPSTr-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="302.5" y="130" as="sourcePoint" />
<mxPoint x="252.5" y="130" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="svgPSnmsjaSZccQ20U9g" name="state 3">
<mxGraphModel dx="452" dy="307" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="2cyrzz5kdchdPGbAOOf7-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-2" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-4" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-6" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-7" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-8" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="2cyrzz5kdchdPGbAOOf7-8" target="2cyrzz5kdchdPGbAOOf7-7">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="302" y="130" as="sourcePoint" />
<mxPoint x="252" y="130" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-10" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="200" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="2cyrzz5kdchdPGbAOOf7-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="2cyrzz5kdchdPGbAOOf7-10" target="2cyrzz5kdchdPGbAOOf7-8">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="199.5" y="140" as="sourcePoint" />
<mxPoint x="199.5" y="90" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="ddwt5pxY8eCGA5Yld8Ut" name="state 4">
<mxGraphModel dx="452" dy="307" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="XKeFNdCRafvIn0IOzWkK-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.46,0.36],[1,0.36],[1,1],[0.62,1],[0.54,1],[0.54,0.64],[0,0.64],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="1">
<mxGeometry x="110" y="10" width="130" height="220" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-8" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="200" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-9" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-10" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="120" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="XKeFNdCRafvIn0IOzWkK-10" target="XKeFNdCRafvIn0IOzWkK-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="303" y="130" as="sourcePoint" />
<mxPoint x="253" y="130" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-12" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#D5E8D4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="1">
<mxGeometry x="200" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-13" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="XKeFNdCRafvIn0IOzWkK-12" target="XKeFNdCRafvIn0IOzWkK-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="200.5" y="140" as="sourcePoint" />
<mxPoint x="200.5" y="90" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="XKeFNdCRafvIn0IOzWkK-14" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="1" source="XKeFNdCRafvIn0IOzWkK-8" target="XKeFNdCRafvIn0IOzWkK-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="310.5" y="150" as="sourcePoint" />
<mxPoint x="260.5" y="150" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="yHjaI6yTqZ63goZKKFoW" name="state 5">
<mxGraphModel dx="452" dy="307" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="yybNvkjd9s6HATvzKrxT-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="20" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="yybNvkjd9s6HATvzKrxT-2" value="&lt;b&gt;1&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="25" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="yybNvkjd9s6HATvzKrxT-3" value="&lt;b&gt;2, 3&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="105" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="yybNvkjd9s6HATvzKrxT-4" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="100" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="yybNvkjd9s6HATvzKrxT-5" value="&lt;b&gt;4&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="45" y="185" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="yybNvkjd9s6HATvzKrxT-6" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="1">
<mxGeometry y="180" width="40" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View file

@ -1,500 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.1.1 Chrome/132.0.6834.210 Electron/34.3.3 Safari/537.36" version="26.1.1" pages="5">
<diagram name="state 1" id="piv4MB1wSOUai22uoHMj">
<mxGraphModel dx="1149" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="BNEKj4FSaMJSDyX3_cBq-27" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="390" height="220" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0,0],[0.75,0],[1,0],[1,1],[0.21,1],[0,1],[0,1],[0,0.73],[0.64,0.73],[0.64,0.27],[0,0.27]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="100" width="140" height="220" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="110" y="170" width="50" height="40" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-3" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-5" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-6" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-7" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-6" target="BNEKj4FSaMJSDyX3_cBq-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="70" as="sourcePoint" />
<mxPoint x="140" y="70" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-8" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="280" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-8" target="BNEKj4FSaMJSDyX3_cBq-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="30" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-10" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-11" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="200" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-12" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-13" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-14" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-11" target="BNEKj4FSaMJSDyX3_cBq-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="40" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-16" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="280" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="110" as="sourcePoint" />
<mxPoint x="230" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-18" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-16" target="BNEKj4FSaMJSDyX3_cBq-8">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="225" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-19" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="360" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-20" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-19">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="30" as="sourcePoint" />
<mxPoint x="310" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-21" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="200" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-22" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-21">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="215" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-23" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-24" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="BNEKj4FSaMJSDyX3_cBq-27" source="BNEKj4FSaMJSDyX3_cBq-21" target="BNEKj4FSaMJSDyX3_cBq-23">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="145" y="105" as="sourcePoint" />
<mxPoint x="135" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-25" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="120" y="170" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="BNEKj4FSaMJSDyX3_cBq-26" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="BNEKj4FSaMJSDyX3_cBq-27">
<mxGeometry x="200" y="90" width="14" height="14" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="AmVTVAnnSdh7PAwgHQ-J" name="state 2">
<mxGraphModel dx="1149" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="-tglhTkY9j0lAeJh4ESk-26" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="390" height="220" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="111" y="170" width="50" height="40" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0,0],[0.75,0],[1,0],[1,1],[0.21,1],[0,1],[0,1],[0,0.73],[0.64,0.73],[0.64,0.27],[0,0.27]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="101" width="140" height="220" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-3" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-5" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-6" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-7" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-6" target="-tglhTkY9j0lAeJh4ESk-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="70" as="sourcePoint" />
<mxPoint x="140" y="70" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-8" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="280" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-8" target="-tglhTkY9j0lAeJh4ESk-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="30" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-10" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-11" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="200" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-12" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-13" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-14" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-11" target="-tglhTkY9j0lAeJh4ESk-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="40" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-16" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="280" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="110" as="sourcePoint" />
<mxPoint x="230" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-18" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-16" target="-tglhTkY9j0lAeJh4ESk-8">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="225" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-19" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="360" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-20" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-19">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="30" as="sourcePoint" />
<mxPoint x="310" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-21" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="200" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-22" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-21">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="215" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-23" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-24" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="-tglhTkY9j0lAeJh4ESk-26" source="-tglhTkY9j0lAeJh4ESk-21" target="-tglhTkY9j0lAeJh4ESk-23">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="145" y="105" as="sourcePoint" />
<mxPoint x="135" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="-tglhTkY9j0lAeJh4ESk-25" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="-tglhTkY9j0lAeJh4ESk-26">
<mxGeometry x="200" y="90" width="14" height="14" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="TJGIR_aT1lfBzh5hI3th" name="state 3">
<mxGraphModel dx="1149" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="kDi60eDrDWeN_IZO_Oer-23" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="20" width="390" height="200" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0.62,0.2],[0.62,0.2],[0.62,0.2],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="110" width="130" height="200" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="45" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-4" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="120" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-5" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="200" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-6" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-5" target="kDi60eDrDWeN_IZO_Oer-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="60" as="sourcePoint" />
<mxPoint x="140" y="60" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-7" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="280" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-8" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-7" target="kDi60eDrDWeN_IZO_Oer-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="20" as="sourcePoint" />
<mxPoint x="240" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-9" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="45" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-10" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="200" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-11" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry y="80" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-12" value="&lt;b&gt;1&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="45" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-13" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry y="160" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-14" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-10" target="kDi60eDrDWeN_IZO_Oer-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="30" as="sourcePoint" />
<mxPoint x="240" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-15" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="280" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-16" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-15">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="100" as="sourcePoint" />
<mxPoint x="230" y="100" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-15" target="kDi60eDrDWeN_IZO_Oer-7">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="95" as="sourcePoint" />
<mxPoint x="225" y="45" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-18" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="360" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-19" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="20" as="sourcePoint" />
<mxPoint x="310" y="20" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-20" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="200" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-21" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="kDi60eDrDWeN_IZO_Oer-23" source="kDi60eDrDWeN_IZO_Oer-20">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="95" as="sourcePoint" />
<mxPoint x="215" y="115" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="kDi60eDrDWeN_IZO_Oer-22" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="kDi60eDrDWeN_IZO_Oer-23">
<mxGeometry x="200" y="80" width="14" height="14" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="8tl_i4AG-ByblRdbeoAc" name="state 4">
<mxGraphModel dx="1149" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-22" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="20" width="390" height="200" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0.62,0.2],[0.62,0.2],[0.62,0.2],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="110" width="130" height="200" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="45" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-4" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="120" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-5" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="200" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-6" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-5" target="KFU6xLtBjxV3UyIQiZ9u-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="60" as="sourcePoint" />
<mxPoint x="140" y="60" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-7" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="280" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-8" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-7" target="KFU6xLtBjxV3UyIQiZ9u-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="20" as="sourcePoint" />
<mxPoint x="240" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-9" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="45" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-10" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="200" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-11" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry y="80" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-12" value="&lt;b&gt;1&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="45" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-13" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry y="160" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-14" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-10" target="KFU6xLtBjxV3UyIQiZ9u-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="30" as="sourcePoint" />
<mxPoint x="240" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-15" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="280" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-16" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-15">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="100" as="sourcePoint" />
<mxPoint x="230" y="100" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-15" target="KFU6xLtBjxV3UyIQiZ9u-7">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="95" as="sourcePoint" />
<mxPoint x="225" y="45" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-18" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="360" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-19" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="20" as="sourcePoint" />
<mxPoint x="310" y="20" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-20" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="KFU6xLtBjxV3UyIQiZ9u-22">
<mxGeometry x="200" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="KFU6xLtBjxV3UyIQiZ9u-21" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="KFU6xLtBjxV3UyIQiZ9u-22" source="KFU6xLtBjxV3UyIQiZ9u-20">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="95" as="sourcePoint" />
<mxPoint x="215" y="115" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="I_Id2mCzoGFMSwHJqH5q" name="state 5">
<mxGraphModel dx="1149" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="YIpS9g6xBEaVuflAf0iO-12" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="20" width="231" height="200" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-2" value="&lt;b&gt;2, 3&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="45" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-3" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="121" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-4" value="&lt;b&gt;4&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="45" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry y="80" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-6" value="&lt;b&gt;1, 6&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="45" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry y="160" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-8" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="121" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="YIpS9g6xBEaVuflAf0iO-12" source="YIpS9g6xBEaVuflAf0iO-8" target="YIpS9g6xBEaVuflAf0iO-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="66" y="95" as="sourcePoint" />
<mxPoint x="66" y="45" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-10" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="YIpS9g6xBEaVuflAf0iO-12">
<mxGeometry x="201" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="YIpS9g6xBEaVuflAf0iO-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="YIpS9g6xBEaVuflAf0iO-12" source="YIpS9g6xBEaVuflAf0iO-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="191" y="20" as="sourcePoint" />
<mxPoint x="151" y="20" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

View file

@ -1,287 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.1.1 Chrome/132.0.6834.210 Electron/34.3.3 Safari/537.36" version="26.1.1" pages="3">
<diagram id="8Eo1AGRWHWefgpNjroBf" name="state 1">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="lMObtAj2JowYBNsHivty-26" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="390" height="220" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0,0],[0.75,0],[1,0],[1,1],[0.21,1],[0,1],[0,1],[0,0.73],[0.64,0.73],[0.64,0.27],[0,0.27]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="100" width="140" height="220" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="110" y="170" width="50" height="40" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-3" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-5" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-6" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-7" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-6" target="lMObtAj2JowYBNsHivty-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="70" as="sourcePoint" />
<mxPoint x="140" y="70" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-8" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="280" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-8" target="lMObtAj2JowYBNsHivty-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="30" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-10" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-11" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="200" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-12" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-13" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-14" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-11" target="lMObtAj2JowYBNsHivty-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="40" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-16" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="280" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="110" as="sourcePoint" />
<mxPoint x="230" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-18" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-16" target="lMObtAj2JowYBNsHivty-8">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="225" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-19" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="360" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-20" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-19">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="30" as="sourcePoint" />
<mxPoint x="310" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-21" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="200" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-22" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-21">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="215" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-23" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-24" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="lMObtAj2JowYBNsHivty-26" source="lMObtAj2JowYBNsHivty-21" target="lMObtAj2JowYBNsHivty-23">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="145" y="105" as="sourcePoint" />
<mxPoint x="135" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="lMObtAj2JowYBNsHivty-25" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="lMObtAj2JowYBNsHivty-26">
<mxGeometry x="120" y="170" width="14" height="14" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="ZB54035AOYvPo9_0UTcb" name="state 2">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="mpJY2JbuI38zzk8to14d-25" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="390" height="220" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0,0],[0.75,0],[1,0],[1,1],[0.21,1],[0,1],[0,1],[0,0.73],[0.64,0.73],[0.64,0.27],[0,0.27]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="101" width="140" height="220" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-4" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-5" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-6" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-5" target="mpJY2JbuI38zzk8to14d-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="70" as="sourcePoint" />
<mxPoint x="140" y="70" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-7" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="280" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-8" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-7" target="mpJY2JbuI38zzk8to14d-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="30" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-9" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-10" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="200" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-11" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-12" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-13" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-14" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-10" target="mpJY2JbuI38zzk8to14d-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="40" as="sourcePoint" />
<mxPoint x="240" y="40" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-15" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="280" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-16" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-15">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="110" as="sourcePoint" />
<mxPoint x="230" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-17" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-15" target="mpJY2JbuI38zzk8to14d-7">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="225" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-18" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="360" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-19" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="350" y="30" as="sourcePoint" />
<mxPoint x="310" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-20" value="6" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="200" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-21" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-20">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="225" y="105" as="sourcePoint" />
<mxPoint x="215" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-22" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-23" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="mpJY2JbuI38zzk8to14d-25" source="mpJY2JbuI38zzk8to14d-20" target="mpJY2JbuI38zzk8to14d-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="145" y="105" as="sourcePoint" />
<mxPoint x="135" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="mpJY2JbuI38zzk8to14d-24" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.45,0],[0.75,0],[1,0],[1,1],[0.62,1],[0,1],[0,1],[0,1],[0,0.2],[0,0],[0.24,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="mpJY2JbuI38zzk8to14d-25">
<mxGeometry x="111" y="170" width="50" height="40" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram name="state 3" id="pfYS2UsdWF6MnEGA_9M5">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="G2f_uyPNZEB1i5etgh__-147" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="20" width="230" height="200" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-136" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-137" value="&lt;b&gt;2, 3&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="45" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-138" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="120" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-139" value="&lt;b&gt;4&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="45" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-140" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry y="80" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-141" value="&lt;b&gt;1, 6&lt;br&gt;&lt;/b&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="45" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-142" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry y="160" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-143" value="7" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="120" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-144" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="G2f_uyPNZEB1i5etgh__-147" source="G2f_uyPNZEB1i5etgh__-143" target="G2f_uyPNZEB1i5etgh__-138">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="95" as="sourcePoint" />
<mxPoint x="65" y="45" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-145" value="8" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="G2f_uyPNZEB1i5etgh__-147">
<mxGeometry x="200" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="G2f_uyPNZEB1i5etgh__-146" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="G2f_uyPNZEB1i5etgh__-147" source="G2f_uyPNZEB1i5etgh__-145">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="20" as="sourcePoint" />
<mxPoint x="150" y="20" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View file

@ -1,223 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.1.1 Chrome/132.0.6834.210 Electron/34.3.3 Safari/537.36" version="26.1.1" pages="3">
<diagram name="state 1" id="VrdkUToxpVwyLyul_Cfd">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="oHeAk4B_Z_e2L7biMZUw-16" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="230" height="220" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.24,0],[1,0],[1,0.4],[1,1],[0.48,1],[0,1],[0,0.75],[0,0.73],[0.02,0.5],[0,0.25],[0,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="101" width="70" height="220" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-4" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-6" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-7" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-8" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-9" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="120" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-10" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="oHeAk4B_Z_e2L7biMZUw-16" source="oHeAk4B_Z_e2L7biMZUw-9" target="oHeAk4B_Z_e2L7biMZUw-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="105" as="sourcePoint" />
<mxPoint x="65" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-11" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-12" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="oHeAk4B_Z_e2L7biMZUw-16" source="oHeAk4B_Z_e2L7biMZUw-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="30" as="sourcePoint" />
<mxPoint x="150" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-13" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-14" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="oHeAk4B_Z_e2L7biMZUw-16">
<mxGeometry x="120" y="170" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="oHeAk4B_Z_e2L7biMZUw-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="oHeAk4B_Z_e2L7biMZUw-16" source="oHeAk4B_Z_e2L7biMZUw-13" target="oHeAk4B_Z_e2L7biMZUw-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="199.43" y="182" as="sourcePoint" />
<mxPoint x="199.43" y="132" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="dumz7MtjuSRbbVgNawrV" name="state 2">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="n_ChFhbu9l9toi0L3hxX-16" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="230" height="220" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.24,0],[1,0],[1,0.4],[1,1],[0.48,1],[0,1],[0,0.75],[0,0.73],[0.02,0.5],[0,0.25],[0,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="101" width="70" height="220" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-4" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-6" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-7" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-8" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-9" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="120" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-10" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="n_ChFhbu9l9toi0L3hxX-16" source="n_ChFhbu9l9toi0L3hxX-9" target="n_ChFhbu9l9toi0L3hxX-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="105" as="sourcePoint" />
<mxPoint x="65" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-11" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-12" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="n_ChFhbu9l9toi0L3hxX-16" source="n_ChFhbu9l9toi0L3hxX-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="30" as="sourcePoint" />
<mxPoint x="150" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-13" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-14" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="n_ChFhbu9l9toi0L3hxX-16">
<mxGeometry x="120" y="170" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="n_ChFhbu9l9toi0L3hxX-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="n_ChFhbu9l9toi0L3hxX-16" source="n_ChFhbu9l9toi0L3hxX-13" target="n_ChFhbu9l9toi0L3hxX-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="199.43000000000006" y="182" as="sourcePoint" />
<mxPoint x="199.43000000000006" y="132" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="UgwmXKjNo72Kti5tnIX_" name="state 3">
<mxGraphModel dx="1070" dy="732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="PkcBEfq_iBlsM-m9fPOb-20" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="230" height="220" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.24,0],[1,0],[1,0.4],[1,1],[0.48,1],[0,1],[0,0.75],[0,0.73],[0.02,0.5],[0,0.25],[0,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="100" width="70" height="220" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-3" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-5" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-7" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-8" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-9" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-10" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="120" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="PkcBEfq_iBlsM-m9fPOb-20" source="PkcBEfq_iBlsM-m9fPOb-10" target="PkcBEfq_iBlsM-m9fPOb-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="105" as="sourcePoint" />
<mxPoint x="65" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-12" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-13" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="PkcBEfq_iBlsM-m9fPOb-20" source="PkcBEfq_iBlsM-m9fPOb-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="30" as="sourcePoint" />
<mxPoint x="150" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-14" value="5" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="200" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="PkcBEfq_iBlsM-m9fPOb-20" source="PkcBEfq_iBlsM-m9fPOb-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="146" y="25" as="sourcePoint" />
<mxPoint x="151" y="110" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-16" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;plain-blue;gradientColor=none;fillColor=#B5E3Fe;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="120" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-17" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="PkcBEfq_iBlsM-m9fPOb-20">
<mxGeometry x="120" y="170" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-18" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="PkcBEfq_iBlsM-m9fPOb-20" source="PkcBEfq_iBlsM-m9fPOb-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="199.43000000000006" y="182" as="sourcePoint" />
<mxPoint x="135" y="125" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="PkcBEfq_iBlsM-m9fPOb-19" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="PkcBEfq_iBlsM-m9fPOb-20" source="PkcBEfq_iBlsM-m9fPOb-14" target="PkcBEfq_iBlsM-m9fPOb-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="230" as="sourcePoint" />
<mxPoint x="311" y="230" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,203 +0,0 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.1.1 Chrome/132.0.6834.210 Electron/34.3.3 Safari/537.36" version="26.1.1" pages="3">
<diagram name="state 1" id="w7PF-E3A9k5X4TpleA9C">
<mxGraphModel dx="1070" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="sifWEnGrpBqlT8R1-RFs-15" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="20" width="310" height="200" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-2" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="45" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-3" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="120" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="45" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry y="80" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="45" y="165" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry y="160" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-8" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="120" y="85" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="sifWEnGrpBqlT8R1-RFs-15" source="sifWEnGrpBqlT8R1-RFs-8" target="sifWEnGrpBqlT8R1-RFs-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="95" as="sourcePoint" />
<mxPoint x="65" y="45" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-10" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="200" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="sifWEnGrpBqlT8R1-RFs-15" source="sifWEnGrpBqlT8R1-RFs-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="20" as="sourcePoint" />
<mxPoint x="150" y="20" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-12" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="120" y="80" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-13" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="sifWEnGrpBqlT8R1-RFs-15">
<mxGeometry x="280" y="5" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="sifWEnGrpBqlT8R1-RFs-14" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="sifWEnGrpBqlT8R1-RFs-15" source="sifWEnGrpBqlT8R1-RFs-13" target="sifWEnGrpBqlT8R1-RFs-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="59.659999999999854" as="sourcePoint" />
<mxPoint x="240" y="59.659999999999854" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="8cHA4ecnVEcz090J-liN" name="state 2">
<mxGraphModel dx="1070" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="OwjlZwffn-Y4nYBfrumN-16" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="311" height="210" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-1" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-2" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-3" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-4" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-5" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-6" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-7" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-8" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#B5E3FE;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="120" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-9" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="OwjlZwffn-Y4nYBfrumN-16" source="OwjlZwffn-Y4nYBfrumN-8" target="OwjlZwffn-Y4nYBfrumN-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="105" as="sourcePoint" />
<mxPoint x="65" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-10" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-11" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="OwjlZwffn-Y4nYBfrumN-16" source="OwjlZwffn-Y4nYBfrumN-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="30" as="sourcePoint" />
<mxPoint x="150" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-12" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.24,0],[1,0],[1,0.4],[1,1],[0.48,1],[0,1],[0,0.75],[0,0.73],[0.02,0.5],[0,0.25],[0,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="101" width="70" height="140" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-13" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="121" y="90" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-14" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="OwjlZwffn-Y4nYBfrumN-16">
<mxGeometry x="281" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="OwjlZwffn-Y4nYBfrumN-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="OwjlZwffn-Y4nYBfrumN-16" source="OwjlZwffn-Y4nYBfrumN-14" target="OwjlZwffn-Y4nYBfrumN-10">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="291" y="69.65999999999985" as="sourcePoint" />
<mxPoint x="231" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="9Yl-pgUNl23KlRTR3j43" name="state 3">
<mxGraphModel dx="1070" dy="774" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="450" pageHeight="250" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="3Z5IVvEdUQoImQymVIXm-16" value="" style="group" vertex="1" connectable="0" parent="1">
<mxGeometry x="10" y="10" width="310" height="210" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-1" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.polygon;polyCoords=[[0.24,0],[1,0],[1,0.4],[1,1],[0.48,1],[0,1],[0,0.75],[0,0.73],[0.02,0.5],[0,0.25],[0,0]];polyline=0;fillColor=none;dashed=1;strokeColor=#CC00CC;strokeWidth=2;perimeterSpacing=0;shadow=1;sketch=1;curveFitting=1;jiggle=2;fixDash=0;container=0;dropTarget=0;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="101" width="70" height="140" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-2" value="SS2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry y="10" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-3" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="45" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-4" value="1" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#d5e8d4;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="120" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-5" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="45" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-6" value="SS1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry y="90" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-7" value="" style="whiteSpace=wrap;html=1;aspect=fixed;labelBackgroundColor=none;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="45" y="175" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-8" value="T1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;fontSize=14;fontStyle=1;fontFamily=Courier New;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry y="170" width="40" height="40" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-9" value="2" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#B5E3FE;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="120" y="95" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-10" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;" edge="1" parent="3Z5IVvEdUQoImQymVIXm-16" source="3Z5IVvEdUQoImQymVIXm-9" target="3Z5IVvEdUQoImQymVIXm-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="65" y="105" as="sourcePoint" />
<mxPoint x="65" y="55" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-11" value="3" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#B5E3FE;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="200" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-12" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="3Z5IVvEdUQoImQymVIXm-16" source="3Z5IVvEdUQoImQymVIXm-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="30" as="sourcePoint" />
<mxPoint x="150" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-13" value="B" style="verticalLabelPosition=middle;verticalAlign=middle;html=1;strokeWidth=1;shape=mxgraph.flowchart.on-page_reference;strokeColor=#b85450;fillColor=#f8cecc;labelPosition=center;align=center;dashed=1;fontStyle=1;spacing=0;spacingBottom=2;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="120" y="90" width="14" height="14" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-14" value="4" style="verticalLabelPosition=middle;verticalAlign=middle;strokeWidth=4;shape=mxgraph.flowchart.on-page_reference;fillColor=#B5E3FE;strokeColor=#000000;labelPosition=center;align=center;html=1;fontSize=18;fontStyle=1;spacingBottom=3;" vertex="1" parent="3Z5IVvEdUQoImQymVIXm-16">
<mxGeometry x="280" y="15" width="30" height="30" as="geometry" />
</mxCell>
<mxCell id="3Z5IVvEdUQoImQymVIXm-15" value="" style="endArrow=open;html=1;rounded=0;strokeWidth=3;curved=0;endFill=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="3Z5IVvEdUQoImQymVIXm-16" source="3Z5IVvEdUQoImQymVIXm-14" target="3Z5IVvEdUQoImQymVIXm-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="270" y="30" as="sourcePoint" />
<mxPoint x="230" y="30" as="targetPoint" />
<Array as="points" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View file

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="32" height="32" id="svg3017">
<defs id="defs3019">
<linearGradient id="linearGradient2381">
<stop id="stop2383" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
<stop id="stop2385" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
</linearGradient>
<linearGradient x1="296.4996" y1="188.81061" x2="317.32471" y2="209.69398" id="linearGradient2371" xlink:href="#linearGradient2381" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)"/>
</defs>
<g transform="matrix(0.437808,-0.437808,0.437808,0.437808,-220.8237,43.55311)" id="g5089">
<path d="m 8.4382985,-6.28125 c -0.6073916,0 -4.3132985,5.94886271 -4.3132985,8.25 l 0,26.71875 c 0,0.846384 0.5818159,1.125 1.15625,1.125 l 25.5625,0 c 0.632342,0 1.125001,-0.492658 1.125,-1.125 l 0,-5.21875 0.28125,0 c 0.49684,0 0.906249,-0.409411 0.90625,-0.90625 l 0,-27.9375 c 0,-0.4968398 -0.40941,-0.90625 -0.90625,-0.90625 l -23.8117015,0 z" transform="translate(282.8327,227.1903)" id="path5091" style="fill:#5c5c4f;stroke:#000000;stroke-width:3.23021388;stroke-miterlimit:4;stroke-dasharray:none"/>
<rect width="27.85074" height="29.369793" rx="1.1414107" ry="1.1414107" x="286.96509" y="227.63805" id="rect5093" style="fill:#032c87"/>
<path d="m 288.43262,225.43675 25.2418,0 0,29.3698 -26.37615,0.0241 1.13435,-29.39394 z" id="rect5095" style="fill:#ffffff"/>
<path d="m 302.44536,251.73726 c 1.38691,7.85917 -0.69311,11.28365 -0.69311,11.28365 2.24384,-1.60762 3.96426,-3.47694 4.90522,-5.736 0.96708,2.19264 1.83294,4.42866 4.27443,5.98941 0,0 -1.59504,-7.2004 -1.71143,-11.53706 l -6.77511,0 z" id="path5097" style="fill:#a70000;fill-opacity:1;stroke-width:2"/>
<rect width="25.241802" height="29.736675" rx="0.89682275" ry="0.89682275" x="290.73544" y="220.92249" id="rect5099" style="fill:#809cc9"/>
<path d="m 576.47347,725.93939 6.37084,0.41502 0.4069,29.51809 c -1.89202,-1.31785 -6.85427,-3.7608 -8.26232,-1.68101 l 0,-26.76752 c 0,-0.82246 0.66212,-1.48458 1.48458,-1.48458 z" transform="matrix(0.499065,-0.866565,0,1,0,0)" id="rect5101" style="fill:#4573b3;fill-opacity:1"/>
<path d="m 293.2599,221.89363 20.73918,0 c 0.45101,0 0.8141,0.3631 0.8141,0.81411 0.21547,6.32836 -19.36824,21.7635 -22.36739,17.59717 l 0,-17.59717 c 0,-0.45101 0.3631,-0.81411 0.81411,-0.81411 z" id="path5103" style="opacity:0.65536726;fill:url(#linearGradient2371);fill-opacity:1"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -1,37 +0,0 @@
foreach src : files([
'icon.svg',
'wayland.png',
])
name = fs.name(src)
publican_inputs += fs.copyfile(
name,
install: true,
install_dir: publican_install_prefix + '/html/images',
)
endforeach
subdir('content-updates')
foreach src : files([
'wayland-architecture.gv',
'x-architecture.gv',
])
input = fs.name(src)
output = fs.stem(src) + '.png'
publican_inputs += custom_target(
input + '.png',
command: [ dot, '-Tpng', '-o@OUTPUT@', '@INPUT@' ],
input: input,
output: output,
install: true,
install_dir: publican_install_prefix + '/html/images',
)
publican_image_maps += custom_target(
input + '.map',
command: [ dot, '-Tcmapx_np', '-o@OUTPUT@', '@INPUT@' ],
input: input,
output: fs.stem(src) + '.map',
)
endforeach

View file

@ -1,36 +0,0 @@
digraph arch_wayland {
edge[
fontname="DejaVu Sans",
dir="both",
arrowtail="dot",
arrowsize=.5,
fontname="DejaVu Sans",
fontsize="18",
]
node[
color=none,
margin=0,
fontname="DejaVu Sans",
fontsize="18",
]
c1 [label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>Wayland Client</TD></TR></TABLE>>, URL="#c1"]
c2 [label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>Wayland Client</TD></TR></TABLE>>, URL="#c2"]
comp [tooltip="Wayland Compositor", label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD><BR/>Wayland<BR/>Compositor<BR/><BR/></TD></TR></TABLE>>, URL="#comp"]
impl [tooltip="KMS evdev Kernel", label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>KMS</TD><TD>evdev</TD></TR><TR><TD COLSPAN="2">Kernel</TD></TR></TABLE>>, URL="#impl"]
c1 -> comp [taillabel="③", labeldistance=2.5, URL="#step_3"];
c2 -> comp;
comp -> c1 [label="②", URL="#step_2"];
comp -> c2;
comp -> impl [xlabel = "④", URL="#step_4"];
comp -> impl [style = invis, label=" "];
impl -> comp [xlabel = "①", URL="#step_1"];
c1 -> c2 [style=invis];
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

View file

@ -1,53 +0,0 @@
digraph arch_x {
edge[
fontname="DejaVu Sans",
dir="both",
arrowtail="dot",
arrowsize=.5,
fontname="DejaVu Sans",
fontsize="18",
]
node[
shape="none",
color=none,
margin=0,
fontname="DejaVu Sans",
fontsize="18",
]
{
rank=same;
c1 [label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>X Client</TD></TR></TABLE>>, URL="#c1"]
c3 [label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>X Client</TD></TR></TABLE>>, URL="#c3"]
}
c2 [label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>X Client</TD></TR></TABLE>>, URL="#c2"]
{
rank=same;
xserver [tooltip="X Server", label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD><BR/>X Server<BR/><BR/></TD></TR></TABLE>>, URL="#xserver"]
comp [tooltip="Compositor", label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD><BR/>Compositor<BR/><BR/></TD></TR></TABLE>>, URL="#comp"]
}
impl [tooltip="KMS evdev Kernel", label=<<TABLE STYLE="rounded" BGCOLOR="#ffbc00"><TR><TD>KMS</TD><TD>evdev</TD></TR><TR><TD COLSPAN="2">Kernel</TD></TR></TABLE>>, URL="#impl"]
c1 -> xserver [taillabel="③", labeldistance=2, URL="#step_3"];
c2 -> xserver;
c3 -> xserver;
xserver -> c1 [taillabel="②", labeldistance=2, URL="#step_2"];
xserver -> c2;
xserver -> c3;
xserver -> impl [taillabel="⑥", labeldistance=1.75, URL="#step_6"];
xserver -> impl [style=invis, label=" "];
impl -> xserver [taillabel="①", labeldistance=1.75, URL="#step_1"];
xserver -> comp [style=invis];
xserver -> comp [taillabel="④", labeldistance=1.75, labelangle=-45, URL="#step_4"];
comp -> xserver [taillabel="⑤", URL="#step_5"];
comp -> xserver [style=invis]
c1 -> c2 [style=invis];
c3 -> c2 [style=invis];
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

View file

@ -1,116 +0,0 @@
proto_to_docboox_xsl = files('xsl/protocol-to-docbook.xsl')
proto_iface_to_docboox_xsl = files('xsl/protocol-interfaces-to-docbook.xsl')
merge_mapcoords_xsl = files('xsl/merge-mapcoords.xsl')
to_publican_xsl = files('xsl/doxygen-to-publican.xsl')
publican_inputs = []
publican_image_maps = []
foreach src : files([
'Wayland.xml', # must be first in publican_inputs
'Wayland.ent',
'Book_Info.xml',
'Author_Group.xml',
'Foreword.xml',
'Protocol.xml',
'Xwayland.xml',
'Compositors.xml',
'Content_Updates.xml',
'Color.xml',
'Client.xml',
'Server.xml',
'Message_XML.xml',
])
name = fs.name(src)
publican_inputs += fs.copyfile(name)
endforeach
publican_inputs += custom_target(
'ProtocolSpec.xml',
command: [ xsltproc, '-o', '@OUTPUT@', proto_to_docboox_xsl, '@INPUT@' ],
input: wayland_protocol_xml,
output: 'ProtocolSpec.xml'
)
publican_inputs += custom_target(
'ProtocolInterfaces.xml',
command: [ xsltproc, '-o', '@OUTPUT@', proto_iface_to_docboox_xsl, '@INPUT@' ],
input: wayland_protocol_xml,
output: 'ProtocolInterfaces.xml'
)
# Doxygen generates a myriad of files, and offers an XSLT
# to combine them all into one. This does the combining.
# The result is still Doxygen XML.
ClientAPI_combined = custom_target(
'ClientAPI-combine-doxygen-files',
command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
input: [ doxygen_Client_combine_xslt, doxygen_Client_index_xml ],
output: 'ClientAPI-combined.xml'
)
# This converts Doxygen XML to DocBook XML.
publican_inputs += custom_target(
'ClientAPI-doxygen-to-docbook',
command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Client', to_publican_xsl, '@INPUT@' ],
input: ClientAPI_combined,
output: 'ClientAPI.xml'
)
ServerAPI_combined = custom_target(
'ServerAPI-combine-doxygen-files',
command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
input: [ doxygen_Server_combine_xslt, doxygen_Server_index_xml ],
output: 'ServerAPI-combined.xml'
)
publican_inputs += custom_target(
'ServerAPI-doxygen-to-docbook',
command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Server', to_publican_xsl, '@INPUT@' ],
input: ServerAPI_combined,
output: 'ServerAPI.xml'
)
subdir('html/css')
subdir('html/images')
foreach src : files([
'Architecture.xml',
'Introduction.xml'
])
name = fs.name(src)
publican_inputs += custom_target(
name,
command: [
xsltproc,
'-o', '@OUTPUT@',
'--stringparam', 'basedir', meson.current_build_dir() / 'html',
merge_mapcoords_xsl,
'@INPUT@',
],
input: src,
output: [name],
depends: publican_image_maps,
)
endforeach
custom_target(
'Wayland-docbook-html',
command: [
xmlto,
'--skip-validation',
'--stringparam', 'chunker.output.encoding=UTF-8',
'--stringparam', 'chunk.section.depth=0',
'--stringparam', 'toc.section.depth=1',
'--stringparam', 'generate.consistent.ids=1',
'--stringparam', 'html.stylesheet=css/default.css',
'-o', '@OUTPUT@',
'html',
'@INPUT0@'
],
input: publican_inputs,
output: 'html',
build_by_default: true,
install: true,
install_dir: publican_install_prefix,
)

View file

@ -1,160 +0,0 @@
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:param name="which" />
<xsl:template match="/">
<xsl:apply-templates select="/doxygen/compounddef[@kind!='file' and @kind!='dir']" />
<section id="{$which}-Functions">
<title>Functions</title>
<para />
<xsl:apply-templates select="/doxygen/compounddef[@kind='file']/sectiondef" />
</section>
</xsl:template>
<xsl:template match="parameteritem">
<varlistentry>
<term>
<xsl:apply-templates select="parameternamelist/parametername"/>
</term>
<listitem>
<simpara><xsl:apply-templates select="parameterdescription"/></simpara>
</listitem>
</varlistentry>
</xsl:template>
<xsl:template match="parameterlist">
<xsl:if test="parameteritem">
<variablelist>
<xsl:apply-templates select="parameteritem" />
</variablelist>
</xsl:if>
</xsl:template>
<xsl:template match="ref">
<link linkend="{$which}-{@refid}"><xsl:value-of select="." /></link>
</xsl:template>
<xsl:template match="simplesect[@kind='return']">
<variablelist>
<varlistentry>
<term>Returns:</term>
<listitem>
<simpara><xsl:apply-templates /></simpara>
</listitem>
</varlistentry>
</variablelist>
</xsl:template>
<xsl:template match="simplesect[@kind='see']">
See also: <xsl:apply-templates />
</xsl:template>
<xsl:template match="simplesect[@kind='since']">
Since: <xsl:apply-templates />
</xsl:template>
<xsl:template match="simplesect[@kind='note']">
<emphasis>Note: <xsl:apply-templates /></emphasis>
</xsl:template>
<xsl:template match="sp">
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="programlisting">
<programlisting><xsl:apply-templates /></programlisting>
</xsl:template>
<xsl:template match="itemizedlist">
<itemizedlist><xsl:apply-templates select="listitem" /></itemizedlist>
</xsl:template>
<xsl:template match="listitem">
<listitem><simpara><xsl:apply-templates /></simpara></listitem>
</xsl:template>
<!-- stops cross-references in the section titles -->
<xsl:template match="briefdescription">
<xsl:value-of select="." />
</xsl:template>
<!-- this opens a para for each detaileddescription/para. I could not find a
way to extract the right text for the description from the
source otherwise. Downside: we can't use para for return value, "see
also", etc. because they're already inside a para. So they're lists.
It also means we don't control the order of when something is added to
the output, it matches the input file
-->
<xsl:template match="detaileddescription/para">
<para><xsl:apply-templates /></para>
</xsl:template>
<xsl:template match="detaileddescription">
<xsl:apply-templates select="para" />
</xsl:template>
<xsl:template match="sectiondef">
<xsl:variable name="docitems"
select="memberdef[
(@kind = 'function' and
(@static = 'no' or
substring(location/@bodyfile,
string-length(location/@bodyfile) - 1,
1000) = '.h'
)
and @prot = 'public'
)
or
(@kind != 'function' and normalize-space(briefdescription) != '')
]" />
<xsl:if test="$docitems">
<variablelist>
<!-- Apply memberdef template -->
<xsl:apply-templates select="$docitems" />
</variablelist>
</xsl:if>
</xsl:template>
<!-- methods -->
<xsl:template match="memberdef" >
<varlistentry id="{$which}-{@id}">
<term>
<xsl:value-of select="name"/>
<xsl:if test="normalize-space(briefdescription) != ''">
- <xsl:apply-templates select="briefdescription" />
</xsl:if>
</term>
<listitem>
<synopsis>
<xsl:apply-templates select="definition"/><xsl:apply-templates select="argsstring"/>
</synopsis>
<xsl:apply-templates select="detaileddescription" />
</listitem>
</varlistentry>
</xsl:template>
<!-- classes -->
<xsl:template match="compounddef" >
<section id="{$which}-{@id}">
<title>
<xsl:value-of select="compoundname" />
<xsl:if test="normalize-space(briefdescription) != ''">
- <xsl:apply-templates select="briefdescription" />
</xsl:if>
</title>
<xsl:choose>
<xsl:when test="normalize-space(detaileddescription) != ''">
<xsl:apply-templates select="detaileddescription" />
</xsl:when>
<xsl:otherwise>
<para />
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="sectiondef" />
</section>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,64 +0,0 @@
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="basedir"/>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<!-- -->
<!-- Template for the root so we can add a DOCTYPE -->
<xsl:template match="/">
<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
]]></xsl:text>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<!-- -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- -->
<!-- suppress existing image map areas -->
<xsl:template match="area"/>
<!-- -->
<xsl:template match="areaspec[area][name(..)='imageobjectco']">
<xsl:element name="areaspec">
<xsl:apply-templates select="@*"/>
<xsl:text>&#xa;</xsl:text>
<xsl:variable name="pngfile" select="../imageobject/imagedata/@fileref"/>
<xsl:variable name="mapfile" select="concat(substring($pngfile, 1, string-length($pngfile)-3), 'map')"/>
<xsl:variable name="maproot" select="document(concat($basedir, '/', $mapfile))"/>
<!-- -->
<!-- now emit the needed areas -->
<xsl:for-each select="area">
<xsl:variable name="anchor" select="."/>
<xsl:variable name="other" select="($maproot)//area[@href=($anchor)/@x_steal]"/>
<xsl:choose>
<xsl:when test="$other">
<xsl:text>&#x9; </xsl:text>
<xsl:element name="area">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="linkends">
<xsl:value-of select="@linkends"/>
</xsl:attribute>
<xsl:attribute name="coords">
<xsl:value-of select="($other)/@coords"/>
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:text>&#x9; </xsl:text>
<xsl:comment>
<xsl:value-of select="concat('Warning: unable to locate area tagged ', ($anchor)/@x_steal)"/>
</xsl:comment>
</xsl:otherwise>
</xsl:choose>
<xsl:text>&#xa;</xsl:text>
</xsl:for-each>
<!-- -->
<xsl:text>&#x9; </xsl:text>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,51 +0,0 @@
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<!-- insert docbook's DOCTYPE blurb -->
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
]]></xsl:text>
<section id="sect-Protocol-Interfaces">
<title>Interfaces</title>
<para>
The protocol includes several interfaces which are used for
interacting with the server. Each interface provides requests,
events, and errors (which are really just special events) as described
above. Specific compositor implementations may have their own
interfaces provided as extensions, but there are several which are
always expected to be present.
</para>
<para>
Core interfaces:
<variablelist>
<xsl:apply-templates select="protocol/interface" />
</variablelist>
</para>
</section>
</xsl:template>
<!-- Interfaces summary -->
<xsl:template match="interface" >
<varlistentry>
<term>
<link linkend="protocol-spec-{@name}">
<xsl:value-of select="@name" />
</link>
</term>
<listitem>
<simpara>
<xsl:value-of select="description/@summary" />
</simpara>
</listitem>
</varlistentry>
</xsl:template>
</xsl:stylesheet>
<!-- vim: set expandtab shiftwidth=2: -->

View file

@ -1,225 +0,0 @@
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<!-- insert docbook's DOCTYPE blurb -->
<xsl:text disable-output-escaping = "yes"><![CDATA[
<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "Wayland.ent">
%BOOK_ENTITIES;
]>
]]></xsl:text>
<appendix id="appe-Wayland-Protocol">
<title>Wayland Protocol Specification</title>
<xsl:apply-templates select="protocol/copyright" />
<xsl:apply-templates select="protocol/interface" />
</appendix>
</xsl:template>
<!-- Break text blocks separated by two new lines into paragraphs -->
<xsl:template name="break">
<xsl:param name="text" />
<xsl:param name="linebreak" select="'&#10;&#10;'" />
<xsl:choose>
<xsl:when test="contains($text,$linebreak)">
<para>
<xsl:value-of select="substring-before($text,$linebreak)" />
</para>
<xsl:call-template name="break">
<xsl:with-param name="text" select="substring-after($text,$linebreak)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<para><xsl:value-of select="$text" /></para>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Copyright blurb -->
<xsl:template match="copyright">
<para>
<literallayout>
<xsl:value-of select="." disable-output-escaping="yes"/>
</literallayout>
</para>
</xsl:template>
<!-- Interface descriptions -->
<xsl:template match="interface" >
<section id="protocol-spec-{@name}">
<title>
<xsl:value-of select="@name" />
<!-- only show summary if it exists -->
<xsl:if test="description/@summary">
- <xsl:value-of select="description/@summary" />
</xsl:if>
</title>
<xsl:call-template name="break">
<xsl:with-param name="text" select="description" />
</xsl:call-template>
<xsl:if test="request">
<section>
<title>Requests provided by <xsl:value-of select="@name" /></title>
<xsl:apply-templates select="request" />
</section>
</xsl:if>
<xsl:if test="event">
<section>
<title>Events provided by <xsl:value-of select="@name" /></title>
<xsl:apply-templates select="event" />
</section>
</xsl:if>
<xsl:if test="enum">
<section>
<title>Enums provided by <xsl:value-of select="@name" /></title>
<xsl:apply-templates select="enum" />
</section>
</xsl:if>
</section>
</xsl:template>
<!-- table contents for enum values -->
<xsl:template match="entry">
<varlistentry>
<term><xsl:value-of select="@name"/></term>
<listitem>
<simpara>
<xsl:value-of select="@value"/>
<xsl:if test="@summary" >
- <xsl:value-of select="@summary"/>
</xsl:if>
</simpara>
</listitem>
</varlistentry>
</xsl:template>
<!-- table contents for request/event arguments -->
<xsl:template match="arg">
<varlistentry>
<term><xsl:value-of select="@name"/></term>
<listitem>
<simpara>
<xsl:value-of select="@type"/>
<xsl:if test="@summary" >
- <xsl:value-of select="@summary"/>
</xsl:if>
</simpara>
</listitem>
</varlistentry>
</xsl:template>
<!-- id arguments -->
<xsl:template match="arg[@type='object' and @interface]">
<varlistentry>
<term><xsl:value-of select="@name"/></term>
<listitem>
<simpara>
<link linkend="protocol-spec-{@interface}">
<xsl:value-of select="@interface"/>
</link>
<xsl:if test="@summary" >
- <xsl:value-of select="@summary"/>
</xsl:if>
</simpara>
</listitem>
</varlistentry>
</xsl:template>
<!-- new_id arguments -->
<xsl:template match="arg[@type='new_id' and @interface]">
<varlistentry>
<term><xsl:value-of select="@name"/></term>
<listitem>
<simpara>
id for the new
<link linkend="protocol-spec-{@interface}">
<xsl:value-of select="@interface"/>
</link>
<xsl:if test="@summary" >
- <xsl:value-of select="@summary"/>
</xsl:if>
</simpara>
</listitem>
</varlistentry>
</xsl:template>
<!-- enum and bitfield arguments -->
<xsl:template match="arg[@enum]">
<varlistentry>
<term><xsl:value-of select="@name"/></term>
<listitem>
<simpara>
<xsl:choose>
<xsl:when test="contains(@enum, '.')">
<link linkend="protocol-spec-{substring-before(@enum, '.')}-enum-{substring-after(@enum, '.')}">
<xsl:value-of select="substring-before(@enum, '.')"/>
<xsl:text>::</xsl:text>
<xsl:value-of select="substring-after(@enum, '.')"/>
</link>
</xsl:when>
<xsl:otherwise>
<link linkend="protocol-spec-{../../@name}-enum-{@enum}">
<xsl:value-of select="../../@name"/>
<xsl:text>::</xsl:text>
<xsl:value-of select="@enum"/>
</link>
</xsl:otherwise>
</xsl:choose>
(<xsl:value-of select="@type"/>)
<xsl:if test="@summary" >
- <xsl:value-of select="@summary"/>
</xsl:if>
</simpara>
</listitem>
</varlistentry>
</xsl:template>
<!-- Request/event list -->
<xsl:template match="request|event">
<section id="protocol-spec-{../@name}-{name()}-{@name}">
<title>
<xsl:value-of select="../@name"/>::<xsl:value-of select="@name" />
<xsl:if test="description/@summary">
- <xsl:value-of select="description/@summary" />
</xsl:if>
</title>
<xsl:if test="arg">
<para>
<variablelist>
<xsl:apply-templates select="arg"/>
</variablelist>
</para>
</xsl:if>
<xsl:call-template name="break">
<xsl:with-param name="text" select="description" />
</xsl:call-template>
</section>
</xsl:template>
<!-- Enumeration -->
<xsl:template match="enum">
<section id="protocol-spec-{../@name}-enum-{@name}">
<title>
<xsl:value-of select="../@name"/>::<xsl:value-of select="@name" />
<xsl:if test="@bitfield">
- bitfield
</xsl:if>
<xsl:if test="description/@summary">
- <xsl:value-of select="description/@summary" />
</xsl:if>
</title>
<xsl:call-template name="break">
<xsl:with-param name="text" select="description" />
</xsl:call-template>
<variablelist>
<xsl:apply-templates select="entry"/>
</variablelist>
</section>
</xsl:template>
</xsl:stylesheet>
<!-- vim: set expandtab shiftwidth=2: -->