Merge deafult in wxPython4 wxPython4
authorEdouard Tisserant
Wed, 20 Oct 2021 08:57:07 +0200
branchwxPython4
changeset 3344 4a08728a2ea4
parent 3340 a13da70a8ae4 (diff)
parent 3343 c6de1a6cb655 (current diff)
child 3369 c646a1f0fb0b
Merge deafult in wxPython4
graphics/GraphicCommons.py
svghmi/svghmi.py
--- a/.hgignore	Tue Oct 19 15:15:03 2021 +0200
+++ b/.hgignore	Wed Oct 20 08:57:07 2021 +0200
@@ -9,6 +9,7 @@
 
 syntax: regexp
 ^tests/.*/build$
+^exemples/.*/build$
 ^.idea/.*
 syntax: regexp
 ^.*\.pyc$
--- a/BeremizIDE.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/BeremizIDE.py	Wed Oct 20 08:57:07 2021 +0200
@@ -92,7 +92,7 @@
     return os.path.join(beremiz_dir, *args)
 
 def AppendMenu(parent, help, id, kind, text):
-    return parent.Append(help=help, id=id, kind=kind, text=text)
+    return parent.Append(wx.MenuItem(helpString=help, id=id, kind=kind, text=text))
 
 MAX_RECENT_PROJECTS = 9
 
@@ -179,7 +179,7 @@
                     if style is None:
                         style = self.black_white
                     if style != self.black_white:
-                        self.output.StartStyling(self.output.GetLength(), 0xff)
+                        self.output.StartStyling(self.output.GetLength())
 
                     # Temporary deactivate read only mode on StyledTextCtrl for
                     # adding text. It seems that text modifications, even
@@ -241,6 +241,7 @@
     def _init_utils(self):
         self.ConfNodeMenu = wx.Menu(title='')
         self.RecentProjectsMenu = wx.Menu(title='')
+        self.TutorialsProjectsMenu = wx.Menu(title='')
 
         IDEFrame._init_utils(self)
 
@@ -249,7 +250,29 @@
                    kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
         AppendMenu(parent, help='', id=wx.ID_OPEN,
                    kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
-        parent.AppendMenu(ID_FILEMENURECENTPROJECTS, _("&Recent Projects"), self.RecentProjectsMenu)
+        parent.Append(ID_FILEMENURECENTPROJECTS, _("&Recent Projects"), self.RecentProjectsMenu)
+        parent.AppendSeparator()
+        parent.Append(wx.ID_ANY, _("&Tutorials and Examples"), self.TutorialsProjectsMenu)
+
+        exemples_dir = Bpath("exemples")
+        project_list = sorted(os.listdir(exemples_dir))
+
+        for idx, dirname  in enumerate(project_list):
+            text = u'&%d: %s' % (idx + 1, dirname)
+
+            item = self.TutorialsProjectsMenu.Append(wx.ID_ANY, text, '')
+
+            projectpath = os.path.join(exemples_dir, dirname)
+
+            def OpenExemple(event):
+                if self.CTR is not None and not self.CheckSaveBeforeClosing():
+                    return
+
+                self.OpenProject(projectpath)
+                if not self.CTR.CheckProjectPathPerm():
+                    self.ResetView()
+
+            self.Bind(wx.EVT_MENU, OpenExemple, item)
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_SAVE,
                    kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
@@ -291,10 +314,10 @@
         for name, text, helpstr, children in items:
             if len(children) > 0:
                 new_menu = wx.Menu(title='')
-                menu.AppendMenu(wx.ID_ANY, text, new_menu)
+                menu.AppendSubMenu(new_menu, text)
                 self._RecursiveAddMenuItems(new_menu, children)
             else:
-                item = menu.Append(wx.ID_ANY, text, helpstr)
+                item = menu.Append(wx.MenuItem(text=text, helpString=helpstr, kind=wx.ITEM_NORMAL, id=wx.ID_ANY))
                 self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name), item)
 
     def _init_coll_AddMenu_Items(self, parent):
@@ -311,16 +334,16 @@
         item = parent.Append(wx.ID_ANY, _(u'Community support'), '')
         self.Bind(wx.EVT_MENU, handler, item)
 
-        parent.Append(help='', id=wx.ID_ABOUT,
-                      kind=wx.ITEM_NORMAL, text=_(u'About'))
+        parent.Append(wx.MenuItem(helpString='', id=wx.ID_ABOUT,
+                      kind=wx.ITEM_NORMAL, text=_(u'About')))
         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
 
     def _init_coll_ConnectionStatusBar_Fields(self, parent):
         parent.SetFieldsCount(3)
 
-        parent.SetStatusText(number=0, text='')
-        parent.SetStatusText(number=1, text='')
-        parent.SetStatusText(number=2, text='')
+        parent.SetStatusText(i=0, text='')
+        parent.SetStatusText(i=1, text='')
+        parent.SetStatusText(i=2, text='')
 
         parent.SetStatusWidths([-1, 300, 200])
 
@@ -397,7 +420,7 @@
 
         self.AUIManager.Update()
 
-        self.ConnectionStatusBar = esb.EnhancedStatusBar(self, style=wx.ST_SIZEGRIP)
+        self.ConnectionStatusBar = esb.EnhancedStatusBar(self, style=wx.STB_SIZEGRIP)
         self._init_coll_ConnectionStatusBar_Fields(self.ConnectionStatusBar)
         self.ProgressStatusBar = wx.Gauge(self.ConnectionStatusBar, -1, range=100)
         self.ConnectionStatusBar.AddWidget(self.ProgressStatusBar, esb.ESB_EXACT_FIT, esb.ESB_EXACT_FIT, 2)
@@ -474,8 +497,6 @@
         if self.EnableDebug:
             self.DebugVariablePanel.SetDataProducer(self.CTR)
 
-        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
-
         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
         self.RefreshAll()
         self.LogConsole.SetFocus()
@@ -625,6 +646,7 @@
         if self.CTR is None or self.CheckSaveBeforeClosing(_("Close Application")):
             if self.CTR is not None:
                 self.CTR.KillDebugThread()
+                self.CTR._Disconnect()
             self.KillLocalRuntime()
 
             self.SaveLastState()
@@ -639,6 +661,7 @@
     def OnCloseFrame(self, event):
         if self.TryCloseFrame():
             self.LogConsole.Disconnect(-1, -1, wx.wxEVT_KILL_FOCUS)
+            super(Beremiz, self).OnCloseFrame(event)
             event.Skip()
         else:
             # prevent event to continue, i.e. cancel closing
@@ -699,7 +722,7 @@
 
         while self.RecentProjectsMenu.GetMenuItemCount() > 0:
             item = self.RecentProjectsMenu.FindItemByPosition(0)
-            self.RecentProjectsMenu.RemoveItem(item)
+            self.RecentProjectsMenu.Remove(item)
 
         self.FileMenu.Enable(ID_FILEMENURECENTPROJECTS, len(recent_projects) > 0)
         for idx, projectpath in enumerate(recent_projects):
@@ -746,9 +769,9 @@
 
             for confnode_method in self.CTR.StatusMethods:
                 if "method" in confnode_method and confnode_method.get("shown", True):
-                    tool = StatusToolBar.AddSimpleTool(
-                        wx.ID_ANY, GetBitmap(confnode_method.get("bitmap", "Unknown")),
-                        confnode_method["tooltip"])
+                    tool = StatusToolBar.AddTool(
+                        wx.ID_ANY, confnode_method["tooltip"],
+                        GetBitmap(confnode_method.get("bitmap", "Unknown")))
                     self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), tool)
 
             StatusToolBar.Realize()
@@ -798,7 +821,7 @@
                     else:
                         self.EditMenu.Delete(item.GetId())
             self.LastPanelSelected = None
-        self.MenuBar.UpdateMenus()
+        self.MenuBar.Refresh()
 
     def RefreshAll(self):
         self.RefreshStatusToolBar()
--- a/Beremiz_service.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/Beremiz_service.py	Wed Oct 20 08:57:07 2021 +0200
@@ -224,6 +224,7 @@
 
     if havewx:
         import re
+        import wx.adv
 
         if wx.VERSION >= (3, 0, 0):
             app = wx.App(redirect=False)
@@ -265,7 +266,7 @@
             def SetTests(self, tests):
                 self.Tests = tests
 
-        class BeremizTaskBarIcon(wx.TaskBarIcon):
+        class BeremizTaskBarIcon(wx.adv.TaskBarIcon):
             TBMENU_START = wx.NewId()
             TBMENU_STOP = wx.NewId()
             TBMENU_CHANGE_NAME = wx.NewId()
@@ -277,7 +278,7 @@
             TBMENU_QUIT = wx.NewId()
 
             def __init__(self, pyroserver):
-                wx.TaskBarIcon.__init__(self)
+                wx.adv.TaskBarIcon.__init__(self)
                 self.pyroserver = pyroserver
                 # Set the image
                 self.UpdateIcon(None)
@@ -325,7 +326,7 @@
                 elif "wxGTK" in wx.PlatformInfo:
                     img = img.Scale(22, 22)
                 # wxMac can be any size upto 128x128, so leave the source img alone....
-                icon = wx.IconFromBitmap(img.ConvertToBitmap())
+                icon = wx.Icon(img.ConvertToBitmap())
                 return icon
 
             def OnTaskBarStartPLC(self, evt):
--- a/ConfigTreeNode.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/ConfigTreeNode.py	Wed Oct 20 08:57:07 2021 +0200
@@ -194,7 +194,7 @@
         os.mkdir(self.CTNPath())
 
     def CTNRequestSave(self, from_project_path=None):
-        if self.GetCTRoot().CheckProjectPathPerm(False):
+        if self.GetCTRoot().CheckProjectPathPerm():
             # If confnode do not have corresponding directory
             ctnpath = self.CTNPath()
             if not os.path.isdir(ctnpath):
--- a/IDEFrame.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/IDEFrame.py	Wed Oct 20 08:57:07 2021 +0200
@@ -115,7 +115,7 @@
 
 
 def AppendMenu(parent, help, kind, text, id=wx.ID_ANY):
-    return parent.Append(help=help, kind=kind, text=text, id=id)
+    return parent.Append(wx.MenuItem(helpString=help, kind=kind, text=text, id=id))
 
 
 [
@@ -391,7 +391,7 @@
         parent.AppendSeparator()
         add_menu = wx.Menu(title='')
         self._init_coll_AddMenu_Items(add_menu)
-        parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), add_menu)
+        parent.Append(wx.ID_ADD, _(u"&Add Element"), add_menu)
         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
                    kind=wx.ITEM_NORMAL, text=_(u'Select All') + '\tCTRL+A')
         AppendMenu(parent, help='', id=wx.ID_DELETE,
@@ -442,7 +442,7 @@
                        kind=wx.ITEM_NORMAL, text=_(u'Clear Errors') + '\tCTRL+K')
         parent.AppendSeparator()
         zoommenu = wx.Menu(title='')
-        parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
+        parent.Append(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
         for idx, value in enumerate(ZOOM_FACTORS):
             new_item = AppendMenu(zoommenu, help='',
                        kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
@@ -569,8 +569,8 @@
 
         self.ProjectPanel = wx.SplitterWindow(
             id=ID_PLCOPENEDITORPROJECTPANEL,
-            name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
-            size=wx.Size(0, 0), style=wx.SP_3D)
+            name='ProjectPanel', parent=self.LeftNoteBook,
+            size=wx.Size(0, 0))
 
         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
                                       name='ProjectTree',
@@ -631,9 +631,9 @@
                                    wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
         EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
         EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION,
+                                   _("Select an object"),
                                    GetBitmap("select"),
-                                   wx.NullBitmap,
-                                   _("Select an object"))
+                                   wx.NullBitmap)
         EditorToolBar.Realize()
         self.Panes["EditorToolBar"] = EditorToolBar
         self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
@@ -759,6 +759,8 @@
         self.SetRefreshFunctions()
         self.SetDeleteFunctions()
 
+        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
+
         wx.CallAfter(self.InitFindDialog)
 
     def __del__(self):
@@ -919,12 +921,8 @@
 
         :param elements: List of elements to refresh.
         """
-        try:
-            for element in elements:
-                self.RefreshFunctions[element]()
-        except wx.PyDeadObjectError:
-            # ignore exceptions caused by refresh while quitting
-            pass
+        for element in elements:
+            self.RefreshFunctions[element]()
 
     def OnPageClose(self, event):
         """Callback function when AUINotebook Page closed with CloseButton
@@ -1154,6 +1152,9 @@
     def OnQuitMenu(self, event):
         self.Close()
 
+    def OnCloseFrame(self, event):
+        self.AUIManager.UnInit()
+
     # -------------------------------------------------------------------------------
     #                            Edit Menu Functions
     # -------------------------------------------------------------------------------
@@ -1413,7 +1414,8 @@
         self.AuiTabCtrl = auitabctrl
         if self.TabsOpened.GetPageCount() == 0:
             pane = self.AUIManager.GetPane(self.TabsOpened)
-            if pane.IsMaximized():
+            # on wxPython 4.1.0, AuiPaneInfo has no "IsMaximized" attribute...
+            if (not hasattr(pane, "IsMaximized")) or pane.IsMaximized():
                 self.AUIManager.RestorePane(pane)
             self.AUIManager.Update()
 
@@ -1501,7 +1503,8 @@
 
     def SwitchPerspective(self, evt):
         pane = self.AUIManager.GetPane(self.TabsOpened)
-        if pane.IsMaximized():
+        # on wxPython 4.1.0, AuiPaneInfo has no "IsMaximized" attribute...
+        if (not hasattr(pane, "IsMaximized")) or pane.IsMaximized():
             self.AUIManager.RestorePane(pane)
         else:
             self.AUIManager.MaximizePane(pane)
@@ -1803,7 +1806,7 @@
                     else:
                         block_type = "Action"
                     self.LastToolTipItem = item
-                    wx.CallAfter(self.ProjectTree.SetToolTipString,
+                    wx.CallAfter(self.ProjectTree.SetToolTip,
                                  "%s : %s : %s" % (
                                      block_type, bodytype, item_infos["name"]))
             elif self.LastToolTipItem is not None:
@@ -2113,7 +2116,7 @@
                 MenuToolBar.AddSeparator()
             else:
                 id, bitmap, help, callback = toolbar_item
-                MenuToolBar.AddSimpleTool(id=id, shortHelpString=help, bitmap=GetBitmap(bitmap))
+                MenuToolBar.AddTool(id, help, GetBitmap(bitmap))
                 if callback is not None:
                     self.Bind(wx.EVT_TOOL, callback, id=id)
         MenuToolBar.Realize()
@@ -2153,9 +2156,9 @@
                 for radio, modes, id, method, picture, help in self.EditorToolBarItems[menu]:
                     if modes & self.DrawingMode:
                         if radio or self.DrawingMode == FREEDRAWING_MODE:
-                            EditorToolBar.AddRadioTool(id, GetBitmap(picture), wx.NullBitmap, help)
+                            EditorToolBar.AddRadioTool(id, help, GetBitmap(picture), wx.NullBitmap)
                         else:
-                            EditorToolBar.AddSimpleTool(id, GetBitmap(picture), help)
+                            EditorToolBar.AddTool(id, help, GetBitmap(picture))
                         self.Bind(wx.EVT_MENU, getattr(self, method), id=id)
                         self.CurrentEditorToolBar.append(id)
                 EditorToolBar.Realize()
--- a/ProjectController.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/ProjectController.py	Wed Oct 20 08:57:07 2021 +0200
@@ -402,7 +402,7 @@
         return res
 
     # helper func to check project path write permission
-    def CheckProjectPathPerm(self, dosave=True):
+    def CheckProjectPathPerm(self):
         if CheckPathPerm(self.ProjectPath):
             return True
         if self.AppFrame is not None:
@@ -577,7 +577,7 @@
         return True
 
     def SaveProject(self, from_project_path=None):
-        if self.CheckProjectPathPerm(False):
+        if self.CheckProjectPathPerm():
             if from_project_path is not None:
                 old_projectfiles_path = self._getProjectFilesPath(
                     from_project_path)
--- a/bacnet/BacnetSlaveEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/bacnet/BacnetSlaveEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -367,8 +367,7 @@
         "Engineering Units": {"GridCellEditor": wx.grid.GridCellChoiceEditor,
                               # use string renderer with choice editor!
                               "GridCellRenderer": wx.grid.GridCellStringRenderer,
-                              # syntax for GridCellChoiceEditor -> comma separated values
-                              "GridCellEditorParam": ','.join([x[0] for x in BACnetEngineeringUnits])}
+                              "GridCellEditorConstructorArgs": [x[0] for x in BACnetEngineeringUnits]}
     }
 
     # obj_properties should be a dictionary, with keys "Object Identifier",
@@ -576,7 +575,10 @@
                 PropertyName = self.BACnetObjectType.PropertyNames[col]
                 PropertyConfig = self.BACnetObjectType.PropertyConfig[PropertyName]
                 grid.SetReadOnly(row, col, False)
-                grid.SetCellEditor(row, col, PropertyConfig["GridCellEditor"]())
+                GridCellEditorConstructorArgs = \
+                    PropertyConfig["GridCellEditorConstructorArgs"]
+                    if "GridCellEditorConstructorArgs" in PropertyConfig else []
+                grid.SetCellEditor(row, col, PropertyConfig["GridCellEditor"](*GridCellEditorConstructorArgs))
                 grid.SetCellRenderer(row, col, PropertyConfig["GridCellRenderer"]())
                 grid.SetCellBackgroundColour(row, col, wx.WHITE)
                 grid.SetCellTextColour(row, col, wx.BLACK)
@@ -816,7 +818,7 @@
                 self, bitmap=GetBitmap(bitmap),
                 size=wx.Size(28, 28),
                 style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
             controls_sizer.Add(button)
 
@@ -826,7 +828,7 @@
         # use only to enable drag'n'drop
         # self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
         self.VariablesGrid.Bind(
-            wx.grid.EVT_GRID_CELL_CHANGE,     self.OnVariablesGridCellChange)
+            wx.grid.EVT_GRID_CELL_CHANGING,     self.OnVariablesGridCellChange)
         # self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
         # self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,    self.OnVariablesGridEditorShown)
         self.MainSizer.Add(self.VariablesGrid, flag=wx.GROW)
--- a/canfestival/NetworkEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/canfestival/NetworkEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -68,7 +68,7 @@
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
 
-        main_sizer.AddWindow(self.NetworkNodes, 0, border=5, flag=wx.GROW | wx.ALL)
+        main_sizer.Add(self.NetworkNodes, 0, border=5, flag=wx.GROW | wx.ALL)
 
         self.NetworkEditor.SetSizer(main_sizer)
 
--- a/connectors/SchemeEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/connectors/SchemeEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -28,19 +28,19 @@
                     (wx.StaticText(self, label=label),
                      wx.ALIGN_CENTER_VERTICAL),
                     (txtctrl, wx.GROW)]:
-                self.fieldsizer.AddWindow(win, flag=flag)
+                self.fieldsizer.Add(win, flag=flag)
 
         self.fieldsizer.AddSpacer(20)
 
         if self.EnableIDSelector:
             self.mainsizer = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
-            self.mainsizer.AddSizer(self.fieldsizer)
+            self.mainsizer.Add(self.fieldsizer)
             self.idselector = IDBrowser(
                 self, parent.ctr,
                 # use a callafter, as editor can be deleted by calling SetURI
                 partial(wx.CallAfter, parent.SetURI),
                 self.txtctrls["ID"].SetValue)
-            self.mainsizer.AddWindow(self.idselector)
+            self.mainsizer.Add(self.idselector)
             self.SetSizer(self.mainsizer)
         else:
             self.SetSizer(self.fieldsizer)
--- a/controls/CustomEditableListBox.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/CustomEditableListBox.py	Wed Oct 20 08:57:07 2021 +0200
@@ -25,13 +25,13 @@
 
 from __future__ import absolute_import
 import wx
-import wx.gizmos
+import wx.adv
 
 
-class CustomEditableListBox(wx.gizmos.EditableListBox):
+class CustomEditableListBox(wx.adv.EditableListBox):
 
     def __init__(self, *args, **kwargs):
-        wx.gizmos.EditableListBox.__init__(self, *args, **kwargs)
+        wx.adv.EditableListBox.__init__(self, *args, **kwargs)
 
         listbox = self.GetListCtrl()
         listbox.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
@@ -44,7 +44,7 @@
                 (self.GetDelButton(), _("Delete item"), "_OnDelButton"),
                 (self.GetUpButton(), _("Move up"), "_OnUpButton"),
                 (self.GetDownButton(), _("Move down"), "_OnDownButton")]:
-            button.SetToolTipString(tooltip)
+            button.SetToolTip(tooltip)
             button.Bind(wx.EVT_BUTTON, self.GetButtonPressedFunction(call_function))
 
         self.Editing = False
--- a/controls/CustomStyledTextCtrl.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/CustomStyledTextCtrl.py	Wed Oct 20 08:57:07 2021 +0200
@@ -105,9 +105,9 @@
                     [self.GetMarginWidth(i) for i in xrange(3)],
                     0)
                 if x <= margin_width:
-                    self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
+                    self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
                 else:
-                    self.SetCursor(wx.StockCursor(wx.CURSOR_IBEAM))
+                    self.SetCursor(wx.Cursor(wx.CURSOR_IBEAM))
             else:
                 event.Skip()
         else:
--- a/controls/CustomTable.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/CustomTable.py	Wed Oct 20 08:57:07 2021 +0200
@@ -40,7 +40,7 @@
     """
     def __init__(self, parent, data, colnames):
         # The base class must be initialized *first*
-        wx.grid.PyGridTableBase.__init__(self)
+        wx.grid.GridTableBase.__init__(self)
         self.data = data
         self.colnames = colnames
         self.Highlights = {}
@@ -64,7 +64,7 @@
             return self.colnames[col]
 
     def GetRowLabelValue(self, row, translate=True):
-        return row
+        return str(row)
 
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
--- a/controls/CustomToolTip.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/CustomToolTip.py	Wed Oct 20 08:57:07 2021 +0200
@@ -137,7 +137,7 @@
         max_width = max_height = 0
 
         # Create a memory DC for calculating text extent
-        dc = wx.MemoryDC(wx.EmptyBitmap(1, 1))
+        dc = wx.MemoryDC(wx.Bitmap(1, 1))
         dc.SetFont(self.Font)
 
         # Compute max tip text size
@@ -175,7 +175,6 @@
         dc.SetFont(self.Font)
 
         # Draw Tool tip
-        dc.BeginDrawing()
         tip_width, tip_height = self.GetToolTipSize()
 
         # Draw background rectangle
@@ -188,6 +187,5 @@
             _line_width, line_height = dc.GetTextExtent(line)
             line_offset += line_height
 
-        dc.EndDrawing()
 
         event.Skip()
--- a/controls/CustomTree.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/CustomTree.py	Wed Oct 20 08:57:07 2021 +0200
@@ -120,9 +120,9 @@
             _item, flags = self.HitTest(pos)
 
             bitmap_rect = self.GetBitmapRect()
-            if ((bitmap_rect.InsideXY(pos.x, pos.y) or
+            if ((bitmap_rect.Contains(pos.x, pos.y) or
                  flags & wx.TREE_HITTEST_NOWHERE) and self.AddMenu is not None):
-                wx.CallAfter(self.PopupMenuXY, self.AddMenu, pos.x, pos.y)
+                wx.CallAfter(self.PopupMenu, self.AddMenu, pos.x, pos.y)
         event.Skip()
 
     def OnEraseBackground(self, event):
--- a/controls/DebugVariablePanel/DebugVariableGraphicViewer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DebugVariablePanel/DebugVariableGraphicViewer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -174,7 +174,7 @@
             # If mouse is dropped in graph canvas bounding box and graph is
             # not 3D canvas, graphs will be merged
             rect = self.ParentControl.GetAxesBoundingBox()
-            if not self.ParentControl.Is3DCanvas() and rect.InsideXY(x, y):
+            if not self.ParentControl.Is3DCanvas() and rect.Contains(x, y):
                 # Default merge type is parallel
                 merge_type = GRAPH_PARALLEL
 
@@ -182,7 +182,7 @@
                 # wall be merged orthogonally
                 merge_rect = wx.Rect(rect.x, rect.y,
                                      rect.width / 2., rect.height)
-                if merge_rect.InsideXY(x, y):
+                if merge_rect.Contains(x, y):
                     merge_type = GRAPH_ORTHOGONAL
 
                 # Merge graphs
@@ -625,7 +625,7 @@
                 (x0, y0), (x1, y1) = t.get_window_extent().get_points()
                 rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
                 # Check if mouse was over label
-                if rect.InsideXY(x, y):
+                if rect.Contains(x, y):
                     item_idx = i
                     break
 
@@ -736,7 +736,7 @@
                 (x0, y0), (x1, y1) = t.get_window_extent().get_points()
                 rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
                 # Check if mouse was over label
-                if rect.InsideXY(event.x, height - event.y):
+                if rect.Contains(event.x, height - event.y):
                     item_idx = i
                     menu_direction = dir
                     break
@@ -756,7 +756,7 @@
             # Update resize highlight
             if event.y <= 5:
                 if self.SetHighlight(HIGHLIGHT_RESIZE):
-                    self.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS))
+                    self.SetCursor(wx.Cursor(wx.CURSOR_SIZENS))
                     self.ParentWindow.ForceRefresh()
             else:
                 if self.SetHighlight(HIGHLIGHT_NONE):
@@ -832,7 +832,7 @@
         # Check that double click was done inside figure
         pos = event.GetPosition()
         rect = self.GetAxesBoundingBox()
-        if rect.InsideXY(pos.x, pos.y):
+        if rect.Contains(pos.x, pos.y):
             # Reset Cursor tick to value before starting clicking
             self.ParentWindow.SetCursorTick(self.StartCursorTick)
             # Toggle to text Viewer(s)
@@ -926,10 +926,10 @@
 
         # Mouse is over Viewer figure and graph is not 3D
         bbox = self.GetAxesBoundingBox()
-        if bbox.InsideXY(x, y) and not self.Is3DCanvas():
+        if bbox.Contains(x, y) and not self.Is3DCanvas():
             rect = wx.Rect(bbox.x, bbox.y, bbox.width // 2, bbox.height)
             # Mouse is over Viewer left part of figure
-            if rect.InsideXY(x, y):
+            if rect.Contains(x, y):
                 self.SetHighlight(HIGHLIGHT_LEFT)
 
             # Mouse is over Viewer right part of figure
@@ -1381,8 +1381,6 @@
         # rendering
         destGC = wx.GCDC(destDC)
 
-        destGC.BeginDrawing()
-
         # Get canvas size and figure bounding box in canvas
         width, height = self.GetSize()
         bbox = self.GetAxesBoundingBox()
@@ -1409,7 +1407,5 @@
         # Draw other Viewer common elements
         self.DrawCommonElements(destGC, self.GetButtons())
 
-        destGC.EndDrawing()
-
         self._isDrawn = True
         self.gui_repaint(drawDC=drawDC)
--- a/controls/DebugVariablePanel/DebugVariablePanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DebugVariablePanel/DebugVariablePanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -221,14 +221,14 @@
         self.GraphicPanels = []
 
         graphics_button_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(graphics_button_sizer, border=5, flag=wx.GROW | wx.ALL)
+        main_sizer.Add(graphics_button_sizer, border=5, flag=wx.GROW | wx.ALL)
 
         range_label = wx.StaticText(self, label=_('Range:'))
-        graphics_button_sizer.AddWindow(range_label, flag=wx.ALIGN_CENTER_VERTICAL)
+        graphics_button_sizer.Add(range_label, flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
-        graphics_button_sizer.AddWindow(self.CanvasRange, 1,
+        graphics_button_sizer.Add(self.CanvasRange, 1,
                                         border=5,
                                         flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
 
@@ -246,10 +246,10 @@
             button = wx.lib.buttons.GenBitmapButton(
                 self, bitmap=GetBitmap(bitmap),
                 size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
             self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
-            graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
+            graphics_button_sizer.Add(button, border=5, flag=wx.LEFT)
 
         self.CanvasPosition = wx.ScrollBar(
             self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
@@ -263,19 +263,19 @@
                                  self.OnPositionChanging, self.CanvasPosition)
         self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN,
                                  self.OnPositionChanging, self.CanvasPosition)
-        main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+        main_sizer.Add(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
 
         self.TickSizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL | wx.GROW)
+        main_sizer.Add(self.TickSizer, border=5, flag=wx.ALL | wx.GROW)
 
         self.TickLabel = wx.StaticText(self)
-        self.TickSizer.AddWindow(self.TickLabel, border=5, flag=wx.RIGHT)
+        self.TickSizer.Add(self.TickLabel, border=5, flag=wx.RIGHT)
 
         self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_CENTER | wx.NO_BORDER)
-        self.TickSizer.AddWindow(self.MaskLabel, 1, border=5, flag=wx.RIGHT | wx.GROW)
+        self.TickSizer.Add(self.MaskLabel, 1, border=5, flag=wx.RIGHT | wx.GROW)
 
         self.TickTimeLabel = wx.StaticText(self)
-        self.TickSizer.AddWindow(self.TickTimeLabel)
+        self.TickSizer.Add(self.TickTimeLabel)
 
         self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL | wx.VSCROLL)
         self.GraphicsWindow.SetBackgroundColour(wx.WHITE)
@@ -284,7 +284,7 @@
         self.GraphicsWindow.Bind(wx.EVT_SIZE, self.OnGraphicsWindowResize)
         self.GraphicsWindow.Bind(wx.EVT_MOUSEWHEEL, self.OnGraphicsWindowMouseWheel)
 
-        main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW)
+        main_sizer.Add(self.GraphicsWindow, 1, flag=wx.GROW)
 
         self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL)
         self.GraphicsWindow.SetSizer(self.GraphicsSizer)
@@ -441,7 +441,7 @@
             x, y = panel.GetPosition()
             width, height = panel.GetSize()
             rect = wx.Rect(x, y, width, height)
-            if rect.InsideXY(x_mouse, y_mouse) or \
+            if rect.Contains(x_mouse, y_mouse) or \
                idx == 0 and y_mouse < 0 or \
                idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]:
                 panel.RefreshHighlight(x_mouse - x, y_mouse - y)
@@ -488,7 +488,7 @@
             xw, yw = panel.GetPosition()
             width, height = panel.GetSize()
             bbox = wx.Rect(xw, yw, width, height)
-            if bbox.InsideXY(x_mouse, y_mouse):
+            if bbox.Contains(x_mouse, y_mouse):
                 panel.ShowButtons(True)
                 merge_type = GRAPH_PARALLEL
                 if isinstance(panel, DebugVariableTextViewer) or panel.Is3DCanvas():
@@ -497,9 +497,9 @@
                     wx.CallAfter(self.MoveValue, variable, idx, True)
                 else:
                     rect = panel.GetAxesBoundingBox(True)
-                    if rect.InsideXY(x_mouse, y_mouse):
+                    if rect.Contains(x_mouse, y_mouse):
                         merge_rect = wx.Rect(rect.x, rect.y, rect.width // 2, rect.height)
-                        if merge_rect.InsideXY(x_mouse, y_mouse):
+                        if merge_rect.Contains(x_mouse, y_mouse):
                             merge_type = GRAPH_ORTHOGONAL
                         wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True)
                     else:
@@ -510,7 +510,7 @@
                 return
         width, height = self.GraphicsWindow.GetVirtualSize()
         rect = wx.Rect(0, 0, width, height)
-        if rect.InsideXY(x_mouse, y_mouse):
+        if rect.Contains(x_mouse, y_mouse):
             wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels), True)
         self.ForceRefresh()
 
@@ -518,7 +518,7 @@
         self.GraphicsSizer.Clear()
 
         for panel in self.GraphicPanels:
-            self.GraphicsSizer.AddWindow(panel, flag=wx.GROW)
+            self.GraphicsSizer.Add(panel, flag=wx.GROW)
 
         self.GraphicsSizer.Layout()
         self.RefreshGraphicsWindowScrollbars()
--- a/controls/DebugVariablePanel/DebugVariableTextViewer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DebugVariablePanel/DebugVariableTextViewer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -195,7 +195,7 @@
 
         # Create buffered DC for drawing in panel
         width, height = self.GetSize()
-        bitmap = wx.EmptyBitmap(width, height)
+        bitmap = wx.Bitmap(width, height)
         dc = wx.BufferedDC(wx.PaintDC(self), bitmap)
         dc.Clear()
 
@@ -203,8 +203,6 @@
         # rendering
         gc = wx.GCDC(dc)
 
-        gc.BeginDrawing()
-
         # Get first item
         item = self.ItemsDict.values()[0]
 
@@ -232,8 +230,6 @@
         # Draw other Viewer common elements
         self.DrawCommonElements(gc)
 
-        gc.EndDrawing()
-
     def OnLeftDown(self, event):
         """
         Function called when mouse left button is pressed
@@ -252,7 +248,7 @@
         # start a move drag'n drop of item variable
         x, y = event.GetPosition()
         item_path_bbox = wx.Rect(20, (height - h) / 2, w, h)
-        if item_path_bbox.InsideXY(x, y):
+        if item_path_bbox.Contains(x, y):
             self.ShowButtons(False)
             data = wx.TextDataObject(str((item.GetVariable(), "debug", "move")))
             dragSource = wx.DropSource(self)
--- a/controls/DebugVariablePanel/GraphButton.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DebugVariablePanel/GraphButton.py	Wed Oct 20 08:57:07 2021 +0200
@@ -146,7 +146,7 @@
         # Test if point is inside button
         w, h = self.Bitmap.GetSize()
         rect = wx.Rect(self.Position.x, self.Position.y, w, h)
-        return rect.InsideXY(x, y)
+        return rect.Contains(x, y)
 
     def ProcessCallback(self):
         """
--- a/controls/DiscoveryPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DiscoveryPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -44,17 +44,17 @@
 class DiscoveryPanel(wx.Panel, listmix.ColumnSorterMixin):
 
     def _init_coll_MainSizer_Items(self, parent):
-        parent.AddWindow(self.staticText1,    0, border=20, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
-        parent.AddWindow(self.ServicesList,   0, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW)
-        parent.AddSizer(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+        parent.Add(self.staticText1,    0, border=20, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+        parent.Add(self.ServicesList,   0, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW)
+        parent.Add(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
 
     def _init_coll_MainSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
         parent.AddGrowableRow(1)
 
     def _init_coll_ButtonGridSizer_Items(self, parent):
-        parent.AddWindow(self.RefreshButton, 0, border=0, flag=0)
-        # parent.AddWindow(self.ByIPCheck, 0, border=0, flag=0)
+        parent.Add(self.RefreshButton, 0, border=0, flag=0)
+        # parent.Add(self.ByIPCheck, 0, border=0, flag=0)
 
     def _init_coll_ButtonGridSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
--- a/controls/DurationCellEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/DurationCellEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -46,12 +46,12 @@
         self.Duration = wx.TextCtrl(self, size=wx.Size(0, -1),
                                     style=wx.TE_PROCESS_ENTER)
         self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar)
-        main_sizer.AddWindow(self.Duration, flag=wx.GROW)
+        main_sizer.Add(self.Duration, flag=wx.GROW)
 
         # create browse button
         self.EditButton = wx.Button(self, label='...', size=wx.Size(30, -1))
         self.Bind(wx.EVT_BUTTON, self.OnEditButtonClick, self.EditButton)
-        main_sizer.AddWindow(self.EditButton, flag=wx.GROW)
+        main_sizer.Add(self.EditButton, flag=wx.GROW)
 
         self.Bind(wx.EVT_SIZE, self.OnSize)
 
@@ -98,12 +98,12 @@
         self.Duration.SetFocus()
 
 
-class DurationCellEditor(wx.grid.PyGridCellEditor):
+class DurationCellEditor(wx.grid.GridCellEditor):
     '''
     Grid cell editor that uses DurationCellControl to display an edit button.
     '''
     def __init__(self, table, colname):
-        wx.grid.PyGridCellEditor.__init__(self)
+        wx.grid.GridCellEditor.__init__(self)
 
         self.Table = table
         self.Colname = colname
--- a/controls/EnhancedStatusBar.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/EnhancedStatusBar.py	Wed Oct 20 08:57:07 2021 +0200
@@ -85,12 +85,12 @@
 
 class EnhancedStatusBar(wx.StatusBar):
 
-    def __init__(self, parent, id=wx.ID_ANY, style=wx.ST_SIZEGRIP,
+    def __init__(self, parent, id=wx.ID_ANY, style=wx.STB_SIZEGRIP,
                  name="EnhancedStatusBar"):
         """Default Class Constructor.
 
         EnhancedStatusBar.__init__(self, parent, id=wx.ID_ANY,
-                                   style=wx.ST_SIZEGRIP,
+                                   style=wx.STB_SIZEGRIP,
                                    name="EnhancedStatusBar")
         """
 
@@ -100,7 +100,7 @@
         self._curPos = 0
         self._parent = parent
 
-        wx.EVT_SIZE(self, self.OnSize)
+        self.Bind(wx.EVT_SIZE, self.OnSize)
         wx.CallAfter(self.OnSize, None)
 
     def OnSize(self, event):
--- a/controls/FolderTree.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/FolderTree.py	Wed Oct 20 08:57:07 2021 +0200
@@ -74,12 +74,12 @@
         self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnTreeItemCollapsed, self.Tree)
         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTreeBeginLabelEdit, self.Tree)
         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTreeEndLabelEdit, self.Tree)
-        main_sizer.AddWindow(self.Tree, 1, flag=wx.GROW)
+        main_sizer.Add(self.Tree, 1, flag=wx.GROW)
 
         if filter is not None:
             self.Filter = wx.ComboBox(self, style=wx.CB_READONLY)
             self.Bind(wx.EVT_COMBOBOX, self.OnFilterChanged, self.Filter)
-            main_sizer.AddWindow(self.Filter, flag=wx.GROW)
+            main_sizer.Add(self.Filter, flag=wx.GROW)
         else:
             self.Filter = None
 
--- a/controls/LibraryPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/LibraryPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -77,12 +77,12 @@
             search_textctrl = self.SearchCtrl.GetChildren()[0]
             search_textctrl.Bind(wx.EVT_CHAR, self.OnKeyDown)
 
-        main_sizer.AddWindow(self.SearchCtrl, flag=wx.GROW)
+        main_sizer.Add(self.SearchCtrl, flag=wx.GROW)
 
         # Add Splitter window for tree and block comment to main sizer
         splitter_window = wx.SplitterWindow(self)
         splitter_window.SetSashGravity(1.0)
-        main_sizer.AddWindow(splitter_window, flag=wx.GROW)
+        main_sizer.Add(splitter_window, flag=wx.GROW)
 
         # Add TreeCtrl for functions and function blocks library in splitter
         # window
@@ -216,7 +216,7 @@
 
                 # Set data associated to tree item (only save that item is a
                 # category)
-                self.Tree.SetPyData(category_item, {"type": CATEGORY})
+                self.Tree.SetItemData(category_item, {"type": CATEGORY})
 
                 # Iterate over functions and function blocks defined in library
                 # category add a tree item to category tree item for each of
@@ -253,7 +253,7 @@
                                        if blocktype["extensible"] else None),
                         "comment":    _(comment) + blocktype.get("usage", "")
                     }
-                    self.Tree.SetPyData(blocktype_item, block_data)
+                    self.Tree.SetItemData(blocktype_item, block_data)
 
                     # Select block tree item in tree if it corresponds to
                     # previously selected one
--- a/controls/LocationCellEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/LocationCellEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -46,12 +46,12 @@
         self.Location = wx.TextCtrl(self, size=wx.Size(0, -1),
                                     style=wx.TE_PROCESS_ENTER)
         self.Location.Bind(wx.EVT_KEY_DOWN, self.OnLocationChar)
-        main_sizer.AddWindow(self.Location, flag=wx.GROW)
+        main_sizer.Add(self.Location, flag=wx.GROW)
 
         # create browse button
         self.BrowseButton = wx.Button(self, label='...', size=wx.Size(30, -1))
         self.BrowseButton.Bind(wx.EVT_BUTTON, self.OnBrowseButtonClick)
-        main_sizer.AddWindow(self.BrowseButton, flag=wx.GROW)
+        main_sizer.Add(self.BrowseButton, flag=wx.GROW)
 
         self.Bind(wx.EVT_SIZE, self.OnSize)
 
@@ -150,12 +150,12 @@
         self.Location.SetFocus()
 
 
-class LocationCellEditor(wx.grid.PyGridCellEditor):
+class LocationCellEditor(wx.grid.GridCellEditor):
     '''
     Grid cell editor that uses LocationCellControl to display a browse button.
     '''
     def __init__(self, table, controller):
-        wx.grid.PyGridCellEditor.__init__(self)
+        wx.grid.GridCellEditor.__init__(self)
 
         self.Table = table
         self.Controller = controller
--- a/controls/LogViewer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/LogViewer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -99,8 +99,8 @@
         width, height = self.GetClientSize()
         range_rect = self.GetRangeRect()
         thumb_rect = self.GetThumbRect()
-        if range_rect.InsideXY(posx, posy):
-            if thumb_rect.InsideXY(posx, posy):
+        if range_rect.Contains(posx, posy):
+            if thumb_rect.Contains(posx, posy):
                 self.ThumbScrollingStartPos = wx.Point(posx, posy)
             elif posy < thumb_rect.y:
                 self.Parent.ScrollToLast()
@@ -139,7 +139,6 @@
     def OnPaint(self, event):
         dc = wx.BufferedPaintDC(self)
         dc.Clear()
-        dc.BeginDrawing()
 
         gc = wx.GCDC(dc)
 
@@ -179,7 +178,6 @@
         gc.DrawRectangle(thumb_rect.x, thumb_rect.y,
                          thumb_rect.width, thumb_rect.height)
 
-        dc.EndDrawing()
         event.Skip()
 
 
@@ -207,7 +205,7 @@
     def HitTest(self, x, y):
         rect = wx.Rect(self.Position.x, self.Position.y,
                        self.Size.width, self.Size.height)
-        if rect.InsideXY(x, y):
+        if rect.Contains(x, y):
             return True
         return False
 
@@ -303,7 +301,7 @@
         main_sizer.AddGrowableRow(1)
 
         filter_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+        main_sizer.Add(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
         self.MessageFilter = wx.ComboBox(self, style=wx.CB_READONLY)
         self.MessageFilter.Append(_("All"))
@@ -312,7 +310,7 @@
         for level in levels:
             self.MessageFilter.Append(_(level))
         self.Bind(wx.EVT_COMBOBOX, self.OnMessageFilterChanged, self.MessageFilter)
-        filter_sizer.AddWindow(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
+        filter_sizer.Add(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
         self.SearchMessage = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
         self.SearchMessage.ShowSearchButton(True)
@@ -322,18 +320,18 @@
                   self.OnSearchMessageSearchButtonClick, self.SearchMessage)
         self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
                   self.OnSearchMessageCancelButtonClick, self.SearchMessage)
-        filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
+        filter_sizer.Add(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
         self.CleanButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("Clean"),
                                                           size=wx.Size(28, 28), style=wx.NO_BORDER)
-        self.CleanButton.SetToolTipString(_("Clean log messages"))
+        self.CleanButton.SetToolTip(_("Clean log messages"))
         self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton)
-        filter_sizer.AddWindow(self.CleanButton)
+        filter_sizer.Add(self.CleanButton)
 
         message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
         message_panel_sizer.AddGrowableCol(0)
         message_panel_sizer.AddGrowableRow(0)
-        main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+        main_sizer.Add(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
 
         self.MessagePanel = wx.Panel(self)
         if wx.Platform == '__WXMSW__':
@@ -349,10 +347,10 @@
         self.MessagePanel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnMessagePanelEraseBackground)
         self.MessagePanel.Bind(wx.EVT_PAINT, self.OnMessagePanelPaint)
         self.MessagePanel.Bind(wx.EVT_SIZE, self.OnMessagePanelResize)
-        message_panel_sizer.AddWindow(self.MessagePanel, flag=wx.GROW)
+        message_panel_sizer.Add(self.MessagePanel, flag=wx.GROW)
 
         self.MessageScrollBar = LogScrollBar(self, wx.Size(16, -1))
-        message_panel_sizer.AddWindow(self.MessageScrollBar, flag=wx.GROW)
+        message_panel_sizer.Add(self.MessageScrollBar, flag=wx.GROW)
 
         self.SetSizer(main_sizer)
 
@@ -534,10 +532,9 @@
 
     def RefreshView(self):
         width, height = self.MessagePanel.GetClientSize()
-        bitmap = wx.EmptyBitmap(width, height)
+        bitmap = wx.Bitmap(width, height)
         dc = wx.BufferedDC(wx.ClientDC(self.MessagePanel), bitmap)
         dc.Clear()
-        dc.BeginDrawing()
 
         if self.CurrentMessage is not None:
 
@@ -559,8 +556,6 @@
                     draw_date = message.Date != previous_message.Date
                 message = previous_message
 
-        dc.EndDrawing()
-
         self.MessageScrollBar.RefreshThumbPosition()
 
     def IsPLCLogEmpty(self):
--- a/controls/PouInstanceVariablesPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/PouInstanceVariablesPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#.!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 # This file is part of Beremiz, a Integrated Development Environment for
@@ -93,7 +93,7 @@
             rect = wx.Rect(images_bbx.x + 4, images_bbx.y + 4,
                            r_image_w, r_image_h)
             for r_image in rightimages:
-                if rect.Inside(point):
+                if rect.Contains(point):
                     return r_image
                 rect.x += r_image_w + 4
 
@@ -132,7 +132,7 @@
 
         self.ParentButton = wx.lib.buttons.GenBitmapButton(
             self, bitmap=GetBitmap("top"), size=wx.Size(28, 28), style=wx.NO_BORDER)
-        self.ParentButton.SetToolTipString(_("Parent instance"))
+        self.ParentButton.SetToolTip(_("Parent instance"))
         self.Bind(wx.EVT_BUTTON, self.OnParentButtonClick,
                   self.ParentButton)
 
@@ -142,7 +142,7 @@
 
         self.DebugButton = wx.lib.buttons.GenBitmapButton(
             self, bitmap=GetBitmap("debug_instance"), size=wx.Size(28, 28), style=wx.NO_BORDER)
-        self.DebugButton.SetToolTipString(_("Debug instance"))
+        self.DebugButton.SetToolTip(_("Debug instance"))
         self.Bind(wx.EVT_BUTTON, self.OnDebugButtonClick,
                   self.DebugButton)
 
@@ -175,15 +175,15 @@
                 self.DebugButtonCallback, self.DebugButtonDClickCallback)}
 
         buttons_sizer = wx.FlexGridSizer(cols=3, hgap=0, rows=1, vgap=0)
-        buttons_sizer.AddWindow(self.ParentButton)
-        buttons_sizer.AddWindow(self.InstanceChoice, flag=wx.GROW)
-        buttons_sizer.AddWindow(self.DebugButton)
+        buttons_sizer.Add(self.ParentButton)
+        buttons_sizer.Add(self.InstanceChoice, flag=wx.GROW)
+        buttons_sizer.Add(self.DebugButton)
         buttons_sizer.AddGrowableCol(1)
         buttons_sizer.AddGrowableRow(0)
 
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
-        main_sizer.AddSizer(buttons_sizer, flag=wx.GROW)
-        main_sizer.AddWindow(self.VariablesList, flag=wx.GROW)
+        main_sizer.Add(buttons_sizer, flag=wx.GROW)
+        main_sizer.Add(self.VariablesList, flag=wx.GROW)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
 
--- a/controls/ProjectPropertiesPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/ProjectPropertiesPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -57,7 +57,7 @@
                 border |= wx.BOTTOM
 
             st = wx.StaticText(parent, label=label)
-            sizer.AddWindow(st, border=10,
+            sizer.Add(st, border=10,
                             flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
 
             tc = wx.TextCtrl(parent, style=wx.TE_PROCESS_ENTER)
@@ -65,7 +65,7 @@
             callback = self.GetTextCtrlChangedFunction(tc, name)
             self.Bind(wx.EVT_TEXT_ENTER, callback, tc)
             tc.Bind(wx.EVT_KILL_FOCUS, callback)
-            sizer.AddWindow(tc, border=10,
+            sizer.Add(tc, border=10,
                             flag=wx.GROW | border | wx.RIGHT)
 
     def __init__(self, parent, controller=None, window=None, enable_required=True, scrolling=True):
@@ -125,19 +125,19 @@
 
         pageSize_st = wx.StaticText(self.GraphicsPanel,
                                     label=_('Page Size (optional):'))
-        graphicpanel_sizer.AddWindow(
+        graphicpanel_sizer.Add(
             pageSize_st, border=10,
             flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT | wx.RIGHT)
 
         pageSize_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
         pageSize_sizer.AddGrowableCol(1)
-        graphicpanel_sizer.AddSizer(pageSize_sizer, border=10,
+        graphicpanel_sizer.Add(pageSize_sizer, border=10,
                                     flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         for name, label in [('PageWidth', _('Width:')),
                             ('PageHeight', _('Height:'))]:
             st = wx.StaticText(self.GraphicsPanel, label=label)
-            pageSize_sizer.AddWindow(st, border=12,
+            pageSize_sizer.Add(st, border=12,
                                      flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT)
 
             sp = wx.SpinCtrl(self.GraphicsPanel,
@@ -146,15 +146,15 @@
             callback = self.GetPageSizeChangedFunction(sp, name)
             self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
             sp.Bind(wx.EVT_KILL_FOCUS, callback)
-            pageSize_sizer.AddWindow(sp, flag=wx.GROW)
+            pageSize_sizer.Add(sp, flag=wx.GROW)
 
         scaling_st = wx.StaticText(self.GraphicsPanel,
                                    label=_('Grid Resolution:'))
-        graphicpanel_sizer.AddWindow(scaling_st, border=10,
+        graphicpanel_sizer.Add(scaling_st, border=10,
                                      flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         scaling_nb = wx.Notebook(self.GraphicsPanel)
-        graphicpanel_sizer.AddWindow(scaling_nb, border=10,
+        graphicpanel_sizer.Add(scaling_nb, border=10,
                                      flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.Scalings = {}
@@ -173,7 +173,7 @@
                     border = wx.BOTTOM
 
                 st = wx.StaticText(scaling_panel, label=label)
-                scalingpanel_sizer.AddWindow(
+                scalingpanel_sizer.Add(
                     st, border=10,
                     flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
 
@@ -183,7 +183,7 @@
                 callback = self.GetScalingChangedFunction(sp, language, name)
                 self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
                 sp.Bind(wx.EVT_KILL_FOCUS, callback)
-                scalingpanel_sizer.AddWindow(sp, border=10,
+                scalingpanel_sizer.Add(sp, border=10,
                                              flag=wx.GROW | border | wx.RIGHT)
 
             self.Scalings[language] = scaling_controls
@@ -206,18 +206,18 @@
 
         language_label = wx.StaticText(self.MiscellaneousPanel,
                                        label=_('Language (optional):'))
-        miscellaneouspanel_sizer.AddWindow(language_label, border=10,
+        miscellaneouspanel_sizer.Add(language_label, border=10,
                                            flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT)
 
         self.Language = wx.ComboBox(self.MiscellaneousPanel,
                                     style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnLanguageChanged, self.Language)
-        miscellaneouspanel_sizer.AddWindow(self.Language, border=10,
+        miscellaneouspanel_sizer.Add(self.Language, border=10,
                                            flag=wx.GROW | wx.TOP | wx.RIGHT)
 
         description_label = wx.StaticText(
             self.MiscellaneousPanel, label=_('Content Description (optional):'))
-        miscellaneouspanel_sizer.AddWindow(description_label, border=10,
+        miscellaneouspanel_sizer.Add(description_label, border=10,
                                            flag=wx.BOTTOM | wx.LEFT)
 
         self.ContentDescription = wx.TextCtrl(
@@ -227,7 +227,7 @@
                   self.ContentDescription)
         self.ContentDescription.Bind(wx.EVT_KILL_FOCUS,
                                      self.OnContentDescriptionChanged)
-        miscellaneouspanel_sizer.AddWindow(self.ContentDescription, border=10,
+        miscellaneouspanel_sizer.Add(self.ContentDescription, border=10,
                                            flag=wx.GROW | wx.BOTTOM | wx.RIGHT)
 
         self.AddPage(self.MiscellaneousPanel, _("Miscellaneous"))
--- a/controls/SearchResultPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/SearchResultPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -52,16 +52,16 @@
 class SearchResultPanel(wx.Panel):
 
     def _init_coll_MainSizer_Items(self, parent):
-        parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW)
-        parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
+        parent.Add(self.HeaderSizer, 0, border=0, flag=wx.GROW)
+        parent.Add(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
 
     def _init_coll_MainSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
         parent.AddGrowableRow(1)
 
     def _init_coll_HeaderSizer_Items(self, parent):
-        parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
-        parent.AddWindow(self.ResetButton, 0, border=0, flag=0)
+        parent.Add(self.HeaderLabel, 1, border=5, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
+        parent.Add(self.ResetButton, 0, border=0, flag=0)
 
     def _init_coll_HeaderSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
@@ -90,7 +90,7 @@
         self.ResetButton = wx.lib.buttons.GenBitmapButton(
             self, bitmap=GetBitmap("reset"),
             size=wx.Size(28, 28), style=wx.NO_BORDER)
-        self.ResetButton.SetToolTipString(_("Reset search result"))
+        self.ResetButton.SetToolTip(_("Reset search result"))
         self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton)
 
         self._init_sizers()
--- a/controls/TextCtrlAutoComplete.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/TextCtrlAutoComplete.py	Wed Oct 20 08:57:07 2021 +0200
@@ -97,7 +97,7 @@
         parent_rect = wx.Rect(0, -parent_size[1], parent_size[0], parent_size[1])
         if selected != wx.NOT_FOUND:
             wx.CallAfter(self.Parent.SetValueFromSelected, self.ListBox.GetString(selected))
-        elif parent_rect.InsideXY(event.GetX(), event.GetY()):
+        elif parent_rect.Contains(event.GetX(), event.GetY()):
             result, x, y = self.Parent.HitTest(wx.Point(event.GetX(), event.GetY() + parent_size[1]))
             if result != wx.TE_HT_UNKNOWN:
                 self.Parent.SetInsertionPoint(self.Parent.XYToPosition(x, y))
--- a/controls/VariablePanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/controls/VariablePanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -200,8 +200,7 @@
                                              retain=self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output", "Global"],
                                              non_retain=self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output"])
                         if len(options) > 1:
-                            editor = wx.grid.GridCellChoiceEditor()
-                            editor.SetParameters(",".join(map(_, options)))
+                            editor = wx.grid.GridCellChoiceEditor(map(_, options))
                         else:
                             grid.SetReadOnly(row, col, True)
                     elif col != 0 and self._GetRowEdit(row):
@@ -212,8 +211,7 @@
                         elif colname == "Initial Value":
                             if var_class not in ["External", "InOut"]:
                                 if self.Parent.Controler.IsEnumeratedType(var_type):
-                                    editor = wx.grid.GridCellChoiceEditor()
-                                    editor.SetParameters(",".join([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type)))
+                                    editor = wx.grid.GridCellChoiceEditor([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type))
                                 else:
                                     editor = wx.grid.GridCellTextEditor()
                                 renderer = wx.grid.GridCellStringRenderer()
@@ -229,11 +227,10 @@
                             if len(self.Parent.ClassList) == 1:
                                 grid.SetReadOnly(row, col, True)
                             else:
-                                editor = wx.grid.GridCellChoiceEditor()
                                 excluded = []
                                 if self.Parent.IsFunctionBlockType(var_type):
                                     excluded.extend(["Local", "Temp"])
-                                editor.SetParameters(",".join([_(choice) for choice in self.Parent.ClassList if choice not in excluded]))
+                                editor = wx.grid.GridCellChoiceEditor([_(choice) for choice in self.Parent.ClassList if choice not in excluded])
                     elif colname != "Documentation":
                         grid.SetReadOnly(row, col, True)
 
@@ -456,32 +453,32 @@
         controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
         controls_sizer.AddGrowableCol(5)
         controls_sizer.AddGrowableRow(0)
-        self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW | wx.ALL)
+        self.MainSizer.Add(controls_sizer, border=5, flag=wx.GROW | wx.ALL)
 
         self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:'))
-        controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+        controls_sizer.Add(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.ReturnType = wx.ComboBox(self,
                                       size=wx.Size(145, -1), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType)
-        controls_sizer.AddWindow(self.ReturnType)
+        controls_sizer.Add(self.ReturnType)
 
         self.DescriptionLabel = wx.StaticText(self, label=_('Description:'))
-        controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+        controls_sizer.Add(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.Description = wx.TextCtrl(self,
                                        size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description)
         self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
-        controls_sizer.AddWindow(self.Description)
+        controls_sizer.Add(self.Description)
 
         class_filter_label = wx.StaticText(self, label=_('Class Filter:'))
-        controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
+        controls_sizer.Add(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.ClassFilter = wx.ComboBox(self,
                                        size=wx.Size(145, -1), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter)
-        controls_sizer.AddWindow(self.ClassFilter)
+        controls_sizer.Add(self.ClassFilter)
 
         for name, bitmap, help in [
                 ("AddButton", "add_element", _("Add variable")),
@@ -490,19 +487,19 @@
                 ("DownButton", "down", _("Move variable down"))]:
             button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            controls_sizer.AddWindow(button)
+            controls_sizer.Add(button)
 
         self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL | wx.HSCROLL)
         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
-        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING,
                                 self.OnVariablesGridCellChange)
         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
                                 self.OnVariablesGridCellLeftClick)
         self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
                                 self.OnVariablesGridEditorShown)
-        self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
+        self.MainSizer.Add(self.VariablesGrid, flag=wx.GROW)
 
         self.SetSizer(self.MainSizer)
 
@@ -848,7 +845,7 @@
         # build a submenu containing standard IEC types
         base_menu = wx.Menu(title='')
         for base_type in self.Controler.GetBaseTypes():
-            item = base_menu.Append(wx.ID_ANY, help='', kind=wx.ITEM_NORMAL, text=base_type)
+            item = base_menu.Append(wx.ID_ANY, helpString='', kind=wx.ITEM_NORMAL, item=base_type)
             self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), item)
 
         type_menu.AppendMenu(wx.ID_ANY, _("Base Types"), base_menu)
@@ -858,7 +855,7 @@
         datatype_menu = wx.Menu(title='')
         datatypes = self.Controler.GetDataTypes(basetypes=False, confnodetypes=False)
         for datatype in datatypes:
-            item = datatype_menu.Append(wx.ID_ANY, help='', kind=wx.ITEM_NORMAL, text=datatype)
+            item = datatype_menu.Append(wx.ID_ANY, helpString='', kind=wx.ITEM_NORMAL, item=datatype)
             self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), item)
 
         type_menu.AppendMenu(wx.ID_ANY, _("User Data Types"), datatype_menu)
@@ -869,7 +866,7 @@
                 # build a submenu containing confnode types
                 confnode_datatype_menu = wx.Menu(title='')
                 for datatype in category["list"]:
-                    item = confnode_datatype_menu.Append(wx.ID_ANY, help='', kind=wx.ITEM_NORMAL, text=datatype)
+                    item = confnode_datatype_menu.Append(wx.ID_ANY, helpString='', kind=wx.ITEM_NORMAL, item=datatype)
                     self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), item)
 
                 type_menu.AppendMenu(wx.ID_ANY, category["name"], confnode_datatype_menu)
@@ -883,13 +880,13 @@
             functionblock_menu = wx.Menu(title='')
             fbtypes = self.Controler.GetFunctionBlockTypes(self.TagName)
             for functionblock_type in fbtypes:
-                item = functionblock_menu.Append(wx.ID_ANY, help='', kind=wx.ITEM_NORMAL, text=functionblock_type)
+                item = functionblock_menu.Append(wx.ID_ANY, helpString='', kind=wx.ITEM_NORMAL, item=functionblock_type)
                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), item)
 
             type_menu.AppendMenu(wx.ID_ANY, _("Function Block Types"), functionblock_menu)
 
     def BuildArrayTypesMenu(self, type_menu):
-        item = type_menu.Append(wx.ID_ANY, help='', kind=wx.ITEM_NORMAL, text=_("Array"))
+        item = type_menu.Append(wx.ID_ANY, helpString='', kind=wx.ITEM_NORMAL, item=_("Array"))
         self.Bind(wx.EVT_MENU, self.VariableArrayTypeFunction, item)
 
     def OnVariablesGridEditorShown(self, event):
@@ -916,7 +913,7 @@
             corner_y = rect.y + self.VariablesGrid.GetColLabelSize()
 
             # pop up this new menu
-            self.VariablesGrid.PopupMenuXY(type_menu, corner_x, corner_y)
+            self.VariablesGrid.PopupMenu(type_menu, corner_x, corner_y)
             type_menu.Destroy()
             event.Veto()
             value = self.Values[row].Type
--- a/dialogs/ActionBlockDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/ActionBlockDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -85,29 +85,24 @@
                 readonly = False
                 colname = self.GetColLabelValue(col, False)
                 if colname == "Qualifier":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(self.Parent.QualifierList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.QualifierList)
                 if colname == "Duration":
                     editor = wx.grid.GridCellTextEditor()
                     renderer = wx.grid.GridCellStringRenderer()
                     readonly = not self.Parent.DurationList[self.data[row].qualifier]
                 elif colname == "Type":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(self.Parent.TypeList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.TypeList)
                 elif colname == "Value":
                     value_type = self.data[row].type
                     if value_type == "Action":
-                        editor = wx.grid.GridCellChoiceEditor()
-                        editor.SetParameters(self.Parent.ActionList)
+                        editor = wx.grid.GridCellChoiceEditor(self.Parent.ActionList)
                     elif value_type == "Variable":
-                        editor = wx.grid.GridCellChoiceEditor()
-                        editor.SetParameters(self.Parent.VariableList)
+                        editor = wx.grid.GridCellChoiceEditor(self.Parent.VariableList)
                     elif value_type == "Inline":
                         editor = wx.grid.GridCellTextEditor()
                         renderer = wx.grid.GridCellStringRenderer()
                 elif colname == "Indicator":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(self.Parent.VariableList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.VariableList)
 
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
@@ -133,11 +128,11 @@
         top_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         top_sizer.AddGrowableCol(0)
         top_sizer.AddGrowableRow(0)
-        main_sizer.AddSizer(top_sizer, border=20,
+        main_sizer.Add(top_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         actions_label = wx.StaticText(self, label=_('Actions:'))
-        top_sizer.AddWindow(actions_label, flag=wx.ALIGN_BOTTOM)
+        top_sizer.Add(actions_label, flag=wx.ALIGN_BOTTOM)
 
         for name, bitmap, help in [
                 ("AddButton", "add_element", _("Add action")),
@@ -147,21 +142,21 @@
             button = wx.lib.buttons.GenBitmapButton(
                 self, bitmap=GetBitmap(bitmap),
                 size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            top_sizer.AddWindow(button)
+            top_sizer.Add(button)
 
         self.ActionsGrid = CustomGrid(self, size=wx.Size(-1, 250), style=wx.VSCROLL)
         self.ActionsGrid.DisableDragGridSize()
         self.ActionsGrid.EnableScrolling(False, True)
-        self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+        self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING,
                               self.OnActionsGridCellChange)
-        main_sizer.AddSizer(self.ActionsGrid, border=20,
+        main_sizer.Add(self.ActionsGrid, border=20,
                             flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/ArrayTypeDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/ArrayTypeDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -50,31 +50,31 @@
         main_sizer.AddGrowableRow(1)
 
         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(top_sizer, border=20,
+        main_sizer.Add(top_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         basetype_label = wx.StaticText(self, label=_('Base Type:'))
-        top_sizer.AddWindow(basetype_label, 1, flag=wx.ALIGN_BOTTOM)
+        top_sizer.Add(basetype_label, 1, flag=wx.ALIGN_BOTTOM)
 
         self.BaseType = wx.ComboBox(self, style=wx.CB_READONLY)
-        top_sizer.AddWindow(self.BaseType, 1, flag=wx.GROW)
+        top_sizer.Add(self.BaseType, 1, flag=wx.GROW)
 
         self.Dimensions = CustomEditableListBox(self, label=_("Dimensions:"),
-                                                style=(wx.gizmos.EL_ALLOW_NEW |
-                                                       wx.gizmos.EL_ALLOW_EDIT |
-                                                       wx.gizmos.EL_ALLOW_DELETE))
+                                                style=(wx.adv.EL_ALLOW_NEW |
+                                                       wx.adv.EL_ALLOW_EDIT |
+                                                       wx.adv.EL_ALLOW_DELETE))
         for func in ["_OnLabelEndEdit",
                      "_OnAddButton",
                      "_OnDelButton",
                      "_OnUpButton",
                      "_OnDownButton"]:
             setattr(self.Dimensions, func, self.OnDimensionsChanged)
-        main_sizer.AddSizer(self.Dimensions, border=20,
+        main_sizer.Add(self.Dimensions, border=20,
                             flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/BlockPreviewDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/BlockPreviewDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -75,8 +75,7 @@
 
         # Add default dialog buttons sizer
         self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  self.ButtonSizer.GetAffirmativeButton())
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
 
         self.Element = None            # Graphic element to display in preview
         self.MinElementSize = None     # Graphic element minimal size
@@ -120,7 +119,7 @@
 
         # Create a sizer for dividing parameters in two columns
         self.ColumnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.MainSizer.AddSizer(self.ColumnSizer, border=20,
+        self.MainSizer.Add(self.ColumnSizer, border=20,
                                 flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         # Create a sizer for left column
@@ -129,7 +128,7 @@
         self.LeftGridSizer.AddGrowableCol(0)
         if left_growable_row is not None:
             self.LeftGridSizer.AddGrowableRow(left_growable_row)
-        self.ColumnSizer.AddSizer(self.LeftGridSizer, 1, border=5,
+        self.ColumnSizer.Add(self.LeftGridSizer, 1, border=5,
                                   flag=wx.GROW | wx.RIGHT | wx.EXPAND)
 
         # Create a sizer for right column
@@ -138,7 +137,7 @@
         self.RightGridSizer.AddGrowableCol(0)
         if right_growable_row is not None:
             self.RightGridSizer.AddGrowableRow(right_growable_row)
-        self.ColumnSizer.AddSizer(self.RightGridSizer, 1, border=5,
+        self.ColumnSizer.Add(self.RightGridSizer, 1, border=5,
                                   flag=wx.GROW | wx.LEFT)
 
         self.SetSizer(self.MainSizer)
--- a/dialogs/BrowseLocationsDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/BrowseLocationsDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -76,7 +76,7 @@
         main_sizer.AddGrowableRow(1)
 
         locations_label = wx.StaticText(self, label=_('Locations available:'))
-        main_sizer.AddWindow(locations_label, border=20,
+        main_sizer.Add(locations_label, border=20,
                              flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
         self.LocationsTree = wx.TreeCtrl(self,
@@ -88,7 +88,7 @@
         self.LocationsTree.SetInitialSize(wx.Size(-1, 300))
         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnLocationsTreeItemActivated,
                   self.LocationsTree)
-        main_sizer.AddWindow(self.LocationsTree, border=20,
+        main_sizer.Add(self.LocationsTree, border=20,
                              flag=wx.LEFT | wx.RIGHT | wx.GROW)
 
         self.RenameCheckBox = wx.CheckBox(self, label=_("Rename variable to signal name"))
@@ -97,37 +97,37 @@
         self.RenameCheckBox.SetValue(default_checked)
         self.do_rename = default_checked
 
-        main_sizer.AddWindow(self.RenameCheckBox, border=20,
+        main_sizer.Add(self.RenameCheckBox, border=20,
                              flag=wx.LEFT | wx.RIGHT | wx.GROW)
 
         button_gridsizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         button_gridsizer.AddGrowableCol(1)
         button_gridsizer.AddGrowableCol(3)
         button_gridsizer.AddGrowableRow(0)
-        main_sizer.AddSizer(button_gridsizer, border=20,
+        main_sizer.Add(button_gridsizer, border=20,
                             flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.GROW)
 
         direction_label = wx.StaticText(self, label=_('Direction:'))
-        button_gridsizer.AddWindow(direction_label,
+        button_gridsizer.Add(direction_label,
                                    flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.DirFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.DirFilterChoice)
-        button_gridsizer.AddWindow(self.DirFilterChoice,
+        button_gridsizer.Add(self.DirFilterChoice,
                                    flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
 
         filter_label = wx.StaticText(self, label=_('Type:'))
-        button_gridsizer.AddWindow(filter_label,
+        button_gridsizer.Add(filter_label,
                                    flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.TypeFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.TypeFilterChoice)
-        button_gridsizer.AddWindow(self.TypeFilterChoice,
+        button_gridsizer.Add(self.TypeFilterChoice,
                                    flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        button_gridsizer.AddSizer(button_sizer, flag=wx.ALIGN_RIGHT)
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        button_gridsizer.Add(button_sizer, flag=wx.ALIGN_RIGHT)
 
         self.SetSizer(main_sizer)
 
--- a/dialogs/BrowseValuesLibraryDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/BrowseValuesLibraryDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -51,13 +51,13 @@
 
         self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
 
-        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
 
         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
 
-        self.flexGridSizer1.AddWindow(self.staticText1,   0, border=20, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
-        self.flexGridSizer1.AddWindow(self.ValuesLibrary, 0, border=20, flag=wx.GROW | wx.LEFT | wx.RIGHT)
-        self.flexGridSizer1.AddSizer(self.ButtonSizer,    0, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+        self.flexGridSizer1.Add(self.staticText1,   0, border=20, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+        self.flexGridSizer1.Add(self.ValuesLibrary, 0, border=20, flag=wx.GROW | wx.LEFT | wx.RIGHT)
+        self.flexGridSizer1.Add(self.ButtonSizer,    0, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.flexGridSizer1.AddGrowableCol(0)
         self.flexGridSizer1.AddGrowableRow(1)
--- a/dialogs/ConnectionDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/ConnectionDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -59,7 +59,7 @@
 
         # Create label for connection type
         type_label = wx.StaticText(self, label=_('Type:'))
-        self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(type_label, flag=wx.GROW)
 
         # Create radio buttons for selecting connection type
         self.TypeRadioButtons = {}
@@ -70,27 +70,27 @@
                                           style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
-            self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
+            self.LeftGridSizer.Add(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
             first = False
 
         # Create label for connection name
         name_label = wx.StaticText(self, label=_('Name:'))
-        self.LeftGridSizer.AddWindow(name_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(name_label, flag=wx.GROW)
 
         # Create text control for defining connection name
         self.ConnectionName = wx.TextCtrl(self)
         self.ConnectionName.SetMinSize(wx.Size(200, -1))
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.ConnectionName)
-        self.LeftGridSizer.AddWindow(self.ConnectionName, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.ConnectionName, flag=wx.GROW)
 
         # Add preview panel and associated label to sizers
         self.Preview.SetMinSize(wx.Size(-1, 100))
-        self.LeftGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.LeftGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
         self.ColumnSizer.RemoveSizer(self.RightGridSizer)
@@ -99,10 +99,10 @@
         # of POU
         if apply_button:
             self.ApplyToAllButton = wx.Button(self, label=_("Propagate Name"))
-            self.ApplyToAllButton.SetToolTipString(
+            self.ApplyToAllButton.SetToolTip(
                 _("Apply name modification to all continuations with the same name"))
             self.Bind(wx.EVT_BUTTON, self.OnApplyToAll, self.ApplyToAllButton)
-            self.ButtonSizer.AddWindow(self.ApplyToAllButton, flag=wx.LEFT)
+            self.ButtonSizer.Add(self.ApplyToAllButton, flag=wx.LEFT)
         else:
             self.ConnectionName.ChangeValue(
                 controller.GenerateNewName(
--- a/dialogs/DurationEditorDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/DurationEditorDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -68,7 +68,7 @@
         main_sizer.AddGrowableRow(0)
 
         controls_sizer = wx.FlexGridSizer(cols=len(CONTROLS), hgap=10, rows=2, vgap=10)
-        main_sizer.AddSizer(controls_sizer, border=20,
+        main_sizer.Add(controls_sizer, border=20,
                             flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
         controls = []
@@ -85,14 +85,14 @@
             controls.append((st, txtctrl))
 
         for st, txtctrl in controls:
-            controls_sizer.AddWindow(st, flag=wx.GROW)
+            controls_sizer.Add(st, flag=wx.GROW)
 
         for st, txtctrl in controls:
-            controls_sizer.AddWindow(txtctrl, flag=wx.GROW)
+            controls_sizer.Add(txtctrl, flag=wx.GROW)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/FBDBlockDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/FBDBlockDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -68,7 +68,7 @@
         # Create static box around library panel
         type_staticbox = wx.StaticBox(self, label=_('Type:'))
         left_staticboxsizer = wx.StaticBoxSizer(type_staticbox, wx.VERTICAL)
-        self.LeftGridSizer.AddSizer(left_staticboxsizer, border=5, flag=wx.GROW)
+        self.LeftGridSizer.Add(left_staticboxsizer, border=5, flag=wx.GROW)
 
         # Create Library panel and add it to static box
         self.LibraryPanel = LibraryPanel(self)
@@ -77,65 +77,65 @@
         # Set function to call when selection in Library panel changed
         setattr(self.LibraryPanel, "_OnTreeItemSelected",
                 self.OnLibraryTreeItemSelected)
-        left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5,
+        left_staticboxsizer.Add(self.LibraryPanel, 1, border=5,
                                       flag=wx.GROW | wx.TOP)
 
         # Create sizer for other block parameters
         top_right_gridsizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=5)
         top_right_gridsizer.AddGrowableCol(1)
-        self.RightGridSizer.AddSizer(top_right_gridsizer, flag=wx.GROW)
+        self.RightGridSizer.Add(top_right_gridsizer, flag=wx.GROW)
 
         # Create label for block name
         name_label = wx.StaticText(self, label=_('Name:'))
-        top_right_gridsizer.AddWindow(name_label,
+        top_right_gridsizer.Add(name_label,
                                       flag=wx.ALIGN_CENTER_VERTICAL)
 
         # Create text control for defining block name
         self.BlockName = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.BlockName)
-        top_right_gridsizer.AddWindow(self.BlockName, flag=wx.GROW)
+        top_right_gridsizer.Add(self.BlockName, flag=wx.GROW)
 
         # Create label for extended block input number
         inputs_label = wx.StaticText(self, label=_('Inputs:'))
-        top_right_gridsizer.AddWindow(inputs_label,
+        top_right_gridsizer.Add(inputs_label,
                                       flag=wx.ALIGN_CENTER_VERTICAL)
 
         # Create spin control for defining extended block input number
         self.Inputs = wx.SpinCtrl(self, min=2, max=20,
                                   style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, self.Inputs)
-        top_right_gridsizer.AddWindow(self.Inputs, flag=wx.GROW)
+        top_right_gridsizer.Add(self.Inputs, flag=wx.GROW)
 
         # Create label for block execution order
         execution_order_label = wx.StaticText(self,
                                               label=_('Execution Order:'))
-        top_right_gridsizer.AddWindow(execution_order_label,
+        top_right_gridsizer.Add(execution_order_label,
                                       flag=wx.ALIGN_CENTER_VERTICAL)
 
         # Create spin control for defining block execution order
         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged,
                   self.ExecutionOrder)
-        top_right_gridsizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
+        top_right_gridsizer.Add(self.ExecutionOrder, flag=wx.GROW)
 
         # Create label for block execution control
         execution_control_label = wx.StaticText(self,
                                                 label=_('Execution Control:'))
-        top_right_gridsizer.AddWindow(execution_control_label,
+        top_right_gridsizer.Add(execution_control_label,
                                       flag=wx.ALIGN_CENTER_VERTICAL)
 
         # Create check box to enable block execution control
         self.ExecutionControl = wx.CheckBox(self)
         self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged,
                   self.ExecutionControl)
-        top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW)
+        top_right_gridsizer.Add(self.ExecutionControl, flag=wx.GROW)
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20,
+        self.MainSizer.Add(self.ButtonSizer, border=20,
                                 flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         # Dictionary containing correspondence between parameter exchanged and
--- a/dialogs/FBDVariableDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/FBDVariableDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -73,49 +73,49 @@
 
         # Create label for variable class
         class_label = wx.StaticText(self, label=_('Class:'))
-        self.LeftGridSizer.AddWindow(class_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(class_label, flag=wx.GROW)
 
         # Create a combo box for defining variable class
         self.Class = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, self.Class)
-        self.LeftGridSizer.AddWindow(self.Class, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.Class, flag=wx.GROW)
 
         # Create label for variable execution order
         execution_order_label = wx.StaticText(self,
                                               label=_('Execution Order:'))
-        self.LeftGridSizer.AddWindow(execution_order_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(execution_order_label, flag=wx.GROW)
 
         # Create spin control for defining variable execution order
         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged,
                   self.ExecutionOrder)
-        self.LeftGridSizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.ExecutionOrder, flag=wx.GROW)
 
         # Create label for variable expression
         name_label = wx.StaticText(self, label=_('Expression:'))
-        self.RightGridSizer.AddWindow(name_label, border=5,
+        self.RightGridSizer.Add(name_label, border=5,
                                       flag=wx.GROW | wx.BOTTOM)
 
         # Create text control for defining variable expression
         self.Expression = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, self.Expression)
-        self.RightGridSizer.AddWindow(self.Expression, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Expression, flag=wx.GROW)
 
         # Create a list box to selected variable expression in the list of
         # variables defined in POU
         self.VariableName = wx.ListBox(self, size=wx.Size(-1, 120),
                                        style=wx.LB_SINGLE | wx.LB_SORT)
         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
-        self.RightGridSizer.AddWindow(self.VariableName, border=4, flag=wx.GROW | wx.TOP)
+        self.RightGridSizer.Add(self.VariableName, border=4, flag=wx.GROW | wx.TOP)
 
         # Add preview panel and associated label to sizers
-        self.MainSizer.AddWindow(self.PreviewLabel, border=20,
+        self.MainSizer.Add(self.PreviewLabel, border=20,
                                  flag=wx.GROW | wx.LEFT | wx.RIGHT)
-        self.MainSizer.AddWindow(self.Preview, border=20,
+        self.MainSizer.Add(self.Preview, border=20,
                                  flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
--- a/dialogs/FindInPouDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/FindInPouDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -48,76 +48,76 @@
         main_sizer.AddGrowableRow(0)
 
         controls_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(controls_sizer, border=20,
+        main_sizer.Add(controls_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         patterns_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
         patterns_sizer.AddGrowableCol(1)
-        controls_sizer.AddSizer(patterns_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
+        controls_sizer.Add(patterns_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
 
         find_label = wx.StaticText(panel, label=_("Find:"))
-        patterns_sizer.AddWindow(find_label, flag=wx.ALIGN_CENTER_VERTICAL)
+        patterns_sizer.Add(find_label, flag=wx.ALIGN_CENTER_VERTICAL)
 
         self.FindPattern = wx.TextCtrl(panel)
         self.Bind(wx.EVT_TEXT, self.OnFindPatternChanged, self.FindPattern)
         self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
-        patterns_sizer.AddWindow(self.FindPattern, flag=wx.GROW)
+        patterns_sizer.Add(self.FindPattern, flag=wx.GROW)
 
         params_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        controls_sizer.AddSizer(params_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
+        controls_sizer.Add(params_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
 
         direction_staticbox = wx.StaticBox(panel, label=_("Direction"))
         direction_staticboxsizer = wx.StaticBoxSizer(
             direction_staticbox, wx.VERTICAL)
-        params_sizer.AddSizer(direction_staticboxsizer, 1, border=5,
+        params_sizer.Add(direction_staticboxsizer, 1, border=5,
                               flag=wx.GROW | wx.RIGHT)
 
         self.Forward = wx.RadioButton(panel, label=_("Forward"),
                                       style=wx.RB_GROUP)
-        direction_staticboxsizer.AddWindow(self.Forward, border=5,
+        direction_staticboxsizer.Add(self.Forward, border=5,
                                            flag=wx.ALL | wx.GROW)
 
         self.Backward = wx.RadioButton(panel, label=_("Backward"))
-        direction_staticboxsizer.AddWindow(self.Backward, border=5,
+        direction_staticboxsizer.Add(self.Backward, border=5,
                                            flag=wx.ALL | wx.GROW)
 
         options_staticbox = wx.StaticBox(panel, label=_("Options"))
         options_staticboxsizer = wx.StaticBoxSizer(
             options_staticbox, wx.VERTICAL)
-        params_sizer.AddSizer(options_staticboxsizer, 1, flag=wx.GROW)
+        params_sizer.Add(options_staticboxsizer, 1, flag=wx.GROW)
 
         self.CaseSensitive = wx.CheckBox(panel, label=_("Case sensitive"))
         self.CaseSensitive.SetValue(True)
-        options_staticboxsizer.AddWindow(self.CaseSensitive, border=5,
+        options_staticboxsizer.Add(self.CaseSensitive, border=5,
                                          flag=wx.ALL | wx.GROW)
 
         self.WrapSearch = wx.CheckBox(panel, label=_("Wrap search"))
         self.WrapSearch.SetValue(True)
-        options_staticboxsizer.AddWindow(self.WrapSearch, border=5,
+        options_staticboxsizer.Add(self.WrapSearch, border=5,
                                          flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
 
         self.RegularExpressions = wx.CheckBox(panel, label=_("Regular expressions"))
-        options_staticboxsizer.AddWindow(self.RegularExpressions, border=5,
+        options_staticboxsizer.Add(self.RegularExpressions, border=5,
                                          flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
 
         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(buttons_sizer, border=20,
+        main_sizer.Add(buttons_sizer, border=20,
                             flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
 
         self.FindButton = wx.Button(panel, label=_("Find"))
         self.FindButton.SetDefault()
         self.Bind(wx.EVT_BUTTON, self.OnFindButton, self.FindButton)
-        buttons_sizer.AddWindow(self.FindButton, border=5, flag=wx.RIGHT)
+        buttons_sizer.Add(self.FindButton, border=5, flag=wx.RIGHT)
 
         self.CloseButton = wx.Button(panel, label=_("Close"))
         self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton)
-        buttons_sizer.AddWindow(self.CloseButton)
+        buttons_sizer.Add(self.CloseButton)
 
         # set the longest message here, to use it length to calculate
         # optimal size of dialog window
         self.RegExpSyntaxErrMsg = _("Syntax error in regular expression of pattern to search!")
         self.StatusLabel = wx.StaticText(panel, label=self.RegExpSyntaxErrMsg)
-        controls_sizer.AddWindow(self.StatusLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+        controls_sizer.Add(self.StatusLabel)
 
         panel.SetSizer(main_sizer)
         main_sizer.Fit(self)
--- a/dialogs/ForceVariableDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/ForceVariableDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -189,7 +189,7 @@
         info_sizer = wx.BoxSizer(wx.VERTICAL)
 
         message_label = wx.StaticText(self, label=_("Forcing Variable Value"))
-        info_sizer.AddWindow(message_label, border=10,
+        info_sizer.Add(message_label, border=10,
                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         if GetTypeValue[self.IEC_Type] in [getinteger, getfloat]:
@@ -201,8 +201,8 @@
         self.GetEnteredValue = self.GetValueDefault
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        info_sizer.AddSizer(button_sizer, border=10, flag=wx.ALIGN_RIGHT | wx.ALL)
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        info_sizer.Add(button_sizer, border=10, flag=wx.ALIGN_RIGHT | wx.ALL)
 
         self.SetSizer(info_sizer)
         self.Fit()
@@ -216,7 +216,7 @@
         """Add simple text control to change variable of any type"""
         self.ValueCtrl = wx.TextCtrl(self)
         self.ValueCtrl.SetValue(defaultValue)
-        info_sizer.AddWindow(self.ValueCtrl, border=10, proportion=1,
+        info_sizer.Add(self.ValueCtrl, border=10, proportion=1,
                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
     def GetValueDefault(self):
@@ -235,11 +235,11 @@
         sizer = wx.BoxSizer(wx.HORIZONTAL)
         self.InitCtrlDefault(sizer, defaultValue)
         self.SpinButtonCtrl = wx.SpinButton(self, style=wx.HORIZONTAL | wx.SP_WRAP)
-        sizer.AddWindow(self.SpinButtonCtrl, border=10,
+        sizer.Add(self.SpinButtonCtrl, border=10,
                         flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND)
         self.Bind(wx.EVT_SPIN_UP, self.SpinButtonChanged)
         self.Bind(wx.EVT_SPIN_DOWN, self.SpinButtonChanged)
-        info_sizer.AddWindow(sizer, proportion=1, flag=wx.EXPAND)
+        info_sizer.Add(sizer, proportion=1, flag=wx.EXPAND)
 
     def SpinButtonChanged(self, evt):
         """Increment/decrement variable value"""
@@ -261,7 +261,7 @@
         if value is not None:
             self.ValueCtrl.SetValue(value)
 
-        info_sizer.AddWindow(self.ValueCtrl, border=10,
+        info_sizer.Add(self.ValueCtrl, border=10,
                              flag=wx.ALIGN_LEFT | wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
     def OnOK(self, event):
--- a/dialogs/IDMergeDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/IDMergeDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -15,11 +15,11 @@
         main_sizer = wx.BoxSizer(wx.VERTICAL)
 
         message = wx.StaticText(self, label=question)
-        main_sizer.AddWindow(message, border=20,
+        main_sizer.Add(message, border=20,
                              flag=wx.ALIGN_CENTER_HORIZONTAL | wx.TOP | wx.LEFT | wx.RIGHT)
 
         self.check = wx.CheckBox(self, label=optiontext)
-        main_sizer.AddWindow(self.check, border=20,
+        main_sizer.Add(self.check, border=20,
                              flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL)
 
         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
@@ -30,9 +30,9 @@
                 return lambda event: self.EndModal(_wxID)
 
             self.Bind(wx.EVT_BUTTON, OnButtonFactory(wxID), Button)
-            buttons_sizer.AddWindow(Button)
+            buttons_sizer.Add(Button)
 
-        main_sizer.AddSizer(buttons_sizer, border=20,
+        main_sizer.Add(buttons_sizer, border=20,
                             flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/LDElementDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/LDElementDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -63,7 +63,7 @@
 
         # Create label for LD element modifier
         modifier_label = wx.StaticText(self, label=_('Modifier:'))
-        self.LeftGridSizer.AddWindow(modifier_label, border=5,
+        self.LeftGridSizer.Add(modifier_label, border=5,
                                      flag=wx.GROW | wx.BOTTOM)
 
         # Create radio buttons for selecting LD element modifier
@@ -84,13 +84,13 @@
                                           style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnModifierChanged, radio_button)
-            self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
+            self.LeftGridSizer.Add(radio_button, flag=wx.GROW)
             self.ModifierRadioButtons[modifier] = radio_button
             first = False
 
         # Create label for LD element variable
         element_variable_label = wx.StaticText(self, label=_('Variable:'))
-        self.LeftGridSizer.AddWindow(element_variable_label, border=5,
+        self.LeftGridSizer.Add(element_variable_label, border=5,
                                      flag=wx.GROW | wx.TOP)
 
         # Create a combo box for defining LD element variable
@@ -99,15 +99,15 @@
                   self.ElementVariable)
         self.Bind(wx.EVT_TEXT, self.OnVariableChanged,
                   self.ElementVariable)
-        self.LeftGridSizer.AddWindow(self.ElementVariable, border=5,
+        self.LeftGridSizer.Add(self.ElementVariable, border=5,
                                      flag=wx.GROW | wx.TOP)
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20,
+        self.MainSizer.Add(self.ButtonSizer, border=20,
                                 flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         # Save LD element class
@@ -198,8 +198,9 @@
             self.GetElementModifier(),
             value)
 
-        button = self.ButtonSizer.GetAffirmativeButton()
-        button.Enable(value != "")
+        # FIXME : how to disable OK button when content is not valid
+        # button = self.ButtonSizer.GetAffirmativeButton()
+        # button.Enable(value != "")
 
         # Call BlockPreviewDialog function
         BlockPreviewDialog.DrawPreview(self)
--- a/dialogs/LDPowerRailDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/LDPowerRailDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -56,7 +56,7 @@
 
         # Create label for connection type
         type_label = wx.StaticText(self, label=_('Type:'))
-        self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(type_label, flag=wx.GROW)
 
         # Create radio buttons for selecting power rail type
         self.TypeRadioButtons = {}
@@ -67,27 +67,27 @@
                                           style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
-            self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
+            self.LeftGridSizer.Add(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
             first = False
 
         # Create label for power rail pin number
         pin_number_label = wx.StaticText(self, label=_('Pin number:'))
-        self.LeftGridSizer.AddWindow(pin_number_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(pin_number_label, flag=wx.GROW)
 
         # Create spin control for defining power rail pin number
         self.PinNumber = wx.SpinCtrl(self, min=1, max=50,
                                      style=wx.SP_ARROW_KEYS)
         self.PinNumber.SetValue(1)
         self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, self.PinNumber)
-        self.LeftGridSizer.AddWindow(self.PinNumber, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.PinNumber, flag=wx.GROW)
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
         self.Fit()
--- a/dialogs/PouActionDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/PouActionDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -50,27 +50,26 @@
 
         infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
         infos_sizer.AddGrowableCol(1)
-        main_sizer.AddSizer(infos_sizer, border=20,
+        main_sizer.Add(infos_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         actionname_label = wx.StaticText(self, label=_('Action Name:'))
-        infos_sizer.AddWindow(actionname_label, border=4,
+        infos_sizer.Add(actionname_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.ActionName = wx.TextCtrl(self, size=wx.Size(180, -1))
-        infos_sizer.AddWindow(self.ActionName, flag=wx.GROW)
+        infos_sizer.Add(self.ActionName, flag=wx.GROW)
 
         language_label = wx.StaticText(self, label=_('Language:'))
-        infos_sizer.AddWindow(language_label, border=4,
+        infos_sizer.Add(language_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
-        infos_sizer.AddWindow(self.Language, flag=wx.GROW)
+        infos_sizer.Add(self.Language, flag=wx.GROW)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/PouDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/PouDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -58,34 +58,34 @@
 
         infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
         infos_sizer.AddGrowableCol(1)
-        main_sizer.AddSizer(infos_sizer, border=20,
+        main_sizer.Add(infos_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         pouname_label = wx.StaticText(self, label=_('POU Name:'))
-        infos_sizer.AddWindow(pouname_label, border=4,
+        infos_sizer.Add(pouname_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.PouName = wx.TextCtrl(self)
-        infos_sizer.AddWindow(self.PouName, flag=wx.GROW)
+        infos_sizer.Add(self.PouName, flag=wx.GROW)
 
         poutype_label = wx.StaticText(self, label=_('POU Type:'))
-        infos_sizer.AddWindow(poutype_label, border=4,
+        infos_sizer.Add(poutype_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.PouType = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, self.PouType)
-        infos_sizer.AddWindow(self.PouType, flag=wx.GROW)
+        infos_sizer.Add(self.PouType, flag=wx.GROW)
 
         language_label = wx.StaticText(self, label=_('Language:'))
-        infos_sizer.AddWindow(language_label, border=4,
+        infos_sizer.Add(language_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
-        infos_sizer.AddWindow(self.Language, flag=wx.GROW)
+        infos_sizer.Add(self.Language, flag=wx.GROW)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/PouNameDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/PouNameDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -40,8 +40,7 @@
 
         self.PouNames = []
 
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
 
     def OnOK(self, event):
         message = None
--- a/dialogs/PouTransitionDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/PouTransitionDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -53,26 +53,26 @@
 
         infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=10)
         infos_sizer.AddGrowableCol(1)
-        main_sizer.AddSizer(infos_sizer, border=20,
+        main_sizer.Add(infos_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         transitionname_label = wx.StaticText(self, label=_('Transition Name:'))
-        infos_sizer.AddWindow(transitionname_label, border=4,
+        infos_sizer.Add(transitionname_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.TransitionName = wx.TextCtrl(self, size=wx.Size(180, -1))
-        infos_sizer.AddWindow(self.TransitionName, flag=wx.GROW)
+        infos_sizer.Add(self.TransitionName, flag=wx.GROW)
 
         language_label = wx.StaticText(self, label=_('Language:'))
-        infos_sizer.AddWindow(language_label, border=4,
+        infos_sizer.Add(language_label, border=4,
                               flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
-        infos_sizer.AddWindow(self.Language, flag=wx.GROW)
+        infos_sizer.Add(self.Language, flag=wx.GROW)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM)
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(button_sizer, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM)
 
         self.SetSizer(main_sizer)
 
--- a/dialogs/ProjectDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/ProjectDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -42,12 +42,11 @@
 
         self.ProjectProperties = ProjectPropertiesPanel(
             self, enable_required=enable_required, scrolling=False)
-        main_sizer.AddWindow(self.ProjectProperties, flag=wx.GROW)
+        main_sizer.Add(self.ProjectProperties, flag=wx.GROW)
 
         self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  self.ButtonSizer.GetAffirmativeButton())
-        main_sizer.AddSizer(self.ButtonSizer, border=20,
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
+        main_sizer.Add(self.ButtonSizer, border=20,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/dialogs/SFCDivergenceDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/SFCDivergenceDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -58,7 +58,7 @@
 
         # Create label for divergence type
         type_label = wx.StaticText(self, label=_('Type:'))
-        self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(type_label, flag=wx.GROW)
 
         # Create radio buttons for selecting divergence type
         divergence_buttons = [
@@ -80,7 +80,7 @@
                                           style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
-            self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
+            self.LeftGridSizer.Add(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
             if first:
                 focusbtn = type
@@ -89,19 +89,19 @@
         # Create label for number of divergence sequences
         sequences_label = wx.StaticText(self,
                                         label=_('Number of sequences:'))
-        self.LeftGridSizer.AddWindow(sequences_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(sequences_label, flag=wx.GROW)
 
         # Create spin control for defining number of divergence sequences
         self.Sequences = wx.SpinCtrl(self, min=2, max=20, initial=2)
         self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, self.Sequences)
-        self.LeftGridSizer.AddWindow(self.Sequences, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.Sequences, flag=wx.GROW)
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
--- a/dialogs/SFCStepDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/SFCStepDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -57,16 +57,16 @@
 
         # Create label for SFC step name
         name_label = wx.StaticText(self, label=_('Name:'))
-        self.LeftGridSizer.AddWindow(name_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(name_label, flag=wx.GROW)
 
         # Create text control for defining SFC step name
         self.StepName = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.StepName)
-        self.LeftGridSizer.AddWindow(self.StepName, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.StepName, flag=wx.GROW)
 
         # Create label for SFC step connectors
         connectors_label = wx.StaticText(self, label=_('Connectors:'))
-        self.LeftGridSizer.AddWindow(connectors_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(connectors_label, flag=wx.GROW)
 
         # Create check boxes for defining connectors available on SFC step
         self.ConnectorsCheckBox = {}
@@ -77,15 +77,15 @@
             if name == "output" or (name == "input" and not initial):
                 check_box.SetValue(True)
             self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, check_box)
-            self.LeftGridSizer.AddWindow(check_box, flag=wx.GROW)
+            self.LeftGridSizer.Add(check_box, flag=wx.GROW)
             self.ConnectorsCheckBox[name] = check_box
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
--- a/dialogs/SFCStepNameDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/SFCStepNameDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -42,8 +42,7 @@
         self.Variables = []
         self.StepNames = []
 
-        self.Bind(wx.EVT_BUTTON, self.OnOK,
-                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
+        self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
 
     def OnOK(self, event):
         message = None
--- a/dialogs/SFCTransitionDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/SFCTransitionDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -57,7 +57,7 @@
 
         # Create label for transition type
         type_label = wx.StaticText(self, label=_('Type:'))
-        self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(type_label, flag=wx.GROW)
 
         # Create combo box for selecting reference value
         reference = wx.ComboBox(self, style=wx.CB_READONLY)
@@ -80,28 +80,28 @@
                                           style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
-            self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
+            self.LeftGridSizer.Add(radio_button, flag=wx.GROW)
             if control is not None:
                 control.Enable(first)
-                self.LeftGridSizer.AddWindow(control, flag=wx.GROW)
+                self.LeftGridSizer.Add(control, flag=wx.GROW)
             self.TypeRadioButtons[type] = (radio_button, control)
             first = False
 
         # Create label for transition priority
         priority_label = wx.StaticText(self, label=_('Priority:'))
-        self.LeftGridSizer.AddWindow(priority_label, flag=wx.GROW)
+        self.LeftGridSizer.Add(priority_label, flag=wx.GROW)
 
         # Create spin control for defining priority value
         self.Priority = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_TEXT, self.OnPriorityChanged, self.Priority)
-        self.LeftGridSizer.AddWindow(self.Priority, flag=wx.GROW)
+        self.LeftGridSizer.Add(self.Priority, flag=wx.GROW)
 
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+        self.RightGridSizer.Add(self.PreviewLabel, flag=wx.GROW)
+        self.RightGridSizer.Add(self.Preview, flag=wx.GROW)
 
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(
+        self.MainSizer.Add(
             self.ButtonSizer, border=20,
             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
--- a/dialogs/SearchInProjectDialog.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/dialogs/SearchInProjectDialog.py	Wed Oct 20 08:57:07 2021 +0200
@@ -54,59 +54,59 @@
 
         pattern_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
         pattern_sizer.AddGrowableCol(0)
-        main_sizer.AddSizer(pattern_sizer, border=20,
+        main_sizer.Add(pattern_sizer, border=20,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         pattern_label = wx.StaticText(self, label=_('Pattern to search:'))
-        pattern_sizer.AddWindow(pattern_label, flag=wx.ALIGN_BOTTOM)
+        pattern_sizer.Add(pattern_label, flag=wx.ALIGN_BOTTOM)
 
         self.CaseSensitive = wx.CheckBox(self, label=_('Case sensitive'))
-        pattern_sizer.AddWindow(self.CaseSensitive, flag=wx.GROW)
+        pattern_sizer.Add(self.CaseSensitive, flag=wx.GROW)
 
         self.Pattern = wx.TextCtrl(self, size=wx.Size(250, -1))
         self.Bind(wx.EVT_TEXT, self.FindPatternChanged, self.Pattern)
-        pattern_sizer.AddWindow(self.Pattern, flag=wx.GROW)
+        pattern_sizer.Add(self.Pattern, flag=wx.GROW)
         self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
         self.RegularExpression = wx.CheckBox(self, label=_('Regular expression'))
-        pattern_sizer.AddWindow(self.RegularExpression, flag=wx.GROW)
+        pattern_sizer.Add(self.RegularExpression, flag=wx.GROW)
 
         scope_staticbox = wx.StaticBox(self, label=_('Scope'))
         scope_sizer = wx.StaticBoxSizer(scope_staticbox, wx.HORIZONTAL)
-        main_sizer.AddSizer(scope_sizer, border=20,
+        main_sizer.Add(scope_sizer, border=20,
                             flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         scope_selection_sizer = wx.BoxSizer(wx.VERTICAL)
-        scope_sizer.AddSizer(scope_selection_sizer, 1, border=5,
+        scope_sizer.Add(scope_selection_sizer, 1, border=5,
                              flag=wx.GROW | wx.TOP | wx.LEFT | wx.BOTTOM)
 
         self.WholeProject = wx.RadioButton(self, label=_('Whole Project'), style=wx.RB_GROUP)
         self.WholeProject.SetValue(True)
         self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.WholeProject)
-        scope_selection_sizer.AddWindow(self.WholeProject, border=5,
+        scope_selection_sizer.Add(self.WholeProject, border=5,
                                         flag=wx.GROW | wx.BOTTOM)
 
         self.OnlyElements = wx.RadioButton(self, label=_('Only Elements'))
         self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.OnlyElements)
         self.OnlyElements.SetValue(False)
-        scope_selection_sizer.AddWindow(self.OnlyElements, flag=wx.GROW)
+        scope_selection_sizer.Add(self.OnlyElements, flag=wx.GROW)
 
         self.ElementsList = wx.CheckListBox(self)
         self.ElementsList.Enable(False)
-        scope_sizer.AddWindow(self.ElementsList, 1, border=5,
+        scope_sizer.Add(self.ElementsList, 1, border=5,
                               flag=wx.GROW | wx.TOP | wx.RIGHT | wx.BOTTOM)
 
         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(buttons_sizer, border=20,
+        main_sizer.Add(buttons_sizer, border=20,
                             flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
 
         self.FindButton = wx.Button(self, label=_("Find"))
         self.FindButton.SetDefault()
         self.Bind(wx.EVT_BUTTON, self.OnFindButton, self.FindButton)
-        buttons_sizer.AddWindow(self.FindButton, border=5, flag=wx.RIGHT)
+        buttons_sizer.Add(self.FindButton, border=5, flag=wx.RIGHT)
 
         self.CloseButton = wx.Button(self, label=_("Close"))
         self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton)
-        buttons_sizer.AddWindow(self.CloseButton)
+        buttons_sizer.Add(self.CloseButton)
 
         self.SetSizer(main_sizer)
 
--- a/editors/CodeFileEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/CodeFileEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -291,17 +291,16 @@
         doc_end_pos = self.GetLength()
         for section in self.Controler.SECTIONS_NAMES:
             section_comments = self.SectionsComments[section]
-            start_pos = self.FindText(0, doc_end_pos, section_comments["comment"])
-            end_pos = start_pos + len(section_comments["comment"])
-            self.StartStyling(start_pos, 0xff)
+            start_pos, end_pos = self.FindText(0, doc_end_pos, section_comments["comment"])
+            self.StartStyling(start_pos)
             self.SetStyling(end_pos - start_pos, STC_CODE_SECTION)
             self.SetLineState(self.LineFromPosition(start_pos), 1)
 
-        self.StartStyling(end_pos, 0x00)
+        self.StartStyling(end_pos)
         self.SetStyling(doc_end_pos - end_pos, stc.STC_STYLE_DEFAULT)
 
     def DoGetBestSize(self):
-        return self.ParentWindow.GetPanelBestSize()
+        return self.ParentWindow.GetBestSize()
 
     def RefreshModel(self):
         text = self.GetText()
@@ -597,9 +596,9 @@
                 highlight_end_pos = end[1] + 1
             else:
                 highlight_end_pos = self.GetLineEndPosition(end[0] - 1) + end[1] + 2
-            self.StartStyling(highlight_start_pos, 0xff)
+            self.StartStyling(highlight_start_pos)
             self.SetStyling(highlight_end_pos - highlight_start_pos, highlight_type)
-            self.StartStyling(highlight_end_pos, 0x00)
+            self.StartStyling(highlight_end_pos)
             self.SetStyling(len(self.GetText()) - highlight_end_pos, stc.STC_STYLE_DEFAULT)
 
 
@@ -614,8 +613,7 @@
 
 class ClassGridCellEditor(wx.grid.GridCellChoiceEditor):
     def __init__(self, table, row, col):
-        wx.grid.GridCellChoiceEditor.__init__(self)
-        self.SetParameters("input,memory,output")
+        wx.grid.GridCellChoiceEditor.__init__(self,["input","memory","output"])
 
 
 class VariablesTable(CustomTable):
@@ -678,7 +676,7 @@
         main_sizer.AddGrowableRow(0)
 
         controls_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(controls_sizer, border=5, flag=wx.ALL)
+        main_sizer.Add(controls_sizer, border=5, flag=wx.ALL)
 
         for name, bitmap, help in [
                 ("AddVariableButton", "add_element", _("Add variable")),
@@ -687,15 +685,15 @@
                 ("DownVariableButton", "down", _("Move variable down"))]:
             button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            controls_sizer.AddWindow(button, border=5, flag=wx.BOTTOM)
+            controls_sizer.Add(button, border=5, flag=wx.BOTTOM)
 
         self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL)
-        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING, self.OnVariablesGridCellChange)
         self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
         self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
-        main_sizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
+        main_sizer.Add(self.VariablesGrid, flag=wx.GROW)
 
         self.SetSizer(main_sizer)
 
@@ -785,7 +783,7 @@
         self.VariablesGrid.RefreshButtons()
 
     def DoGetBestSize(self):
-        return self.ParentWindow.GetPanelBestSize()
+        return self.ParentWindow.GetBestSize()
 
     def ShowErrorMessage(self, message):
         dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
@@ -836,7 +834,7 @@
             type_menu.AppendMenu(wx.ID_ANY, "User Data Types", datatype_menu)
             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
 
-            self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
+            self.VariablesGrid.PopupMenu(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
             type_menu.Destroy()
             event.Veto()
         else:
--- a/editors/ConfTreeNodeEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/ConfTreeNodeEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -120,7 +120,7 @@
 
         bitmap = GetBitmap(bitmapname)
         if bitmap is None:
-            bitmap = wx.EmptyBitmap(0, 0)
+            bitmap = wx.Bitmap()
 
         wx.StaticBitmap.__init__(self, parent, ID,
                                  bitmap,
@@ -148,18 +148,18 @@
 
             if self.SHOW_BASE_PARAMS:
                 baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL)
-                self.MainSizer.AddSizer(baseparamseditor_sizer, border=5,
+                self.MainSizer.Add(baseparamseditor_sizer, border=5,
                                         flag=wx.GROW | wx.ALL)
 
                 self.FullIECChannel = wx.StaticText(self.Editor, -1)
                 self.FullIECChannel.SetFont(
                     wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL,
                             wx.BOLD, faceName=faces["helv"]))
-                baseparamseditor_sizer.AddWindow(self.FullIECChannel,
+                baseparamseditor_sizer.Add(self.FullIECChannel,
                                                  flag=wx.ALIGN_CENTER_VERTICAL)
 
                 updownsizer = wx.BoxSizer(wx.VERTICAL)
-                baseparamseditor_sizer.AddSizer(updownsizer, border=5,
+                baseparamseditor_sizer.Add(updownsizer, border=5,
                                                 flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
 
                 self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(
@@ -169,14 +169,14 @@
                     style=wx.NO_BORDER)
                 self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1),
                                        self.IECCUpButton)
-                updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT)
+                updownsizer.Add(self.IECCUpButton, flag=wx.ALIGN_LEFT)
 
                 self.IECCDownButton = wx.lib.buttons.GenBitmapButton(
                     self.Editor, bitmap=GetBitmap('IECCUp'),
                     size=wx.Size(16, 16), style=wx.NO_BORDER)
                 self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1),
                                          self.IECCDownButton)
-                updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT)
+                updownsizer.Add(self.IECCDownButton, flag=wx.ALIGN_LEFT)
 
                 self.ConfNodeName = wx.TextCtrl(self.Editor,
                                                 size=wx.Size(150, 25))
@@ -187,17 +187,17 @@
                     wx.EVT_TEXT,
                     self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True),
                     self.ConfNodeName)
-                baseparamseditor_sizer.AddWindow(
+                baseparamseditor_sizer.Add(
                     self.ConfNodeName, border=5,
                     flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
                 buttons_sizer = self.GenerateMethodButtonSizer()
-                baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER)
+                baseparamseditor_sizer.Add(buttons_sizer, flag=wx.ALIGN_CENTER)
 
             if tabs_num > 1:
                 self.ConfNodeNoteBook = wx.Notebook(self.Editor)
                 parent = self.ConfNodeNoteBook
-                self.MainSizer.AddWindow(self.ConfNodeNoteBook, 1, flag=wx.GROW)
+                self.MainSizer.Add(self.ConfNodeNoteBook, 1, flag=wx.GROW)
             else:
                 parent = self.Editor
                 self.ConfNodeNoteBook = None
@@ -212,7 +212,7 @@
             if self.ConfNodeNoteBook is not None:
                 self.ConfNodeNoteBook.AddPage(editor, title)
             elif self.SHOW_BASE_PARAMS:
-                self.MainSizer.AddWindow(editor, 1, flag=wx.GROW)
+                self.MainSizer.Add(editor, 1, flag=wx.GROW)
             else:
                 self.Editor = editor
 
@@ -232,7 +232,7 @@
             self.ParamsEditor.SetSizer(self.ParamsEditorSizer)
 
             self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL)
-            self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5,
+            self.ParamsEditorSizer.Add(self.ConfNodeParamsSizer, border=5,
                                             flag=wx.LEFT | wx.RIGHT | wx.BOTTOM)
 
             self.RefreshConfNodeParamsSizer()
@@ -240,7 +240,7 @@
             if self.ConfNodeNoteBook is not None:
                 self.ConfNodeNoteBook.AddPage(self.ParamsEditor, _("Config"))
             elif self.SHOW_BASE_PARAMS:
-                self.MainSizer.AddWindow(self.ParamsEditor, 1, flag=wx.GROW)
+                self.MainSizer.Add(self.ParamsEditor, 1, flag=wx.GROW)
             else:
                 self.Editor = self.ParamsEditor
         else:
@@ -317,7 +317,7 @@
                                              label=confnode_method["name"],
                                              style=wx.NO_BORDER)
                 button.SetFont(normal_bt_font)
-                button.SetToolTipString(confnode_method["tooltip"])
+                button.SetToolTip(confnode_method["tooltip"])
                 if confnode_method.get("push", False):
                     button.Bind(wx.EVT_LEFT_DOWN, self.GetButtonCallBackFunction(confnode_method["method"], True))
                 else:
@@ -335,7 +335,7 @@
                 # hack to force size to mini
                 if not confnode_method.get("enabled", True):
                     button.Disable()
-                msizer.AddWindow(button, flag=wx.ALIGN_CENTER)
+                msizer.Add(button, flag=wx.ALIGN_CENTER)
         return msizer
 
     def UriOptions(self, event):
@@ -380,32 +380,32 @@
                 flags = (wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
                 if first:
                     flags |= wx.TOP
-                sizer.AddSizer(staticboxsizer, border=5, flag=flags)
+                sizer.Add(staticboxsizer, border=5, flag=flags)
                 self.GenerateSizerElements(staticboxsizer,
                                            element_infos["children"],
                                            element_path)
             else:
-                boxsizer = wx.FlexGridSizer(cols=4, rows=1)
+                boxsizer = wx.FlexGridSizer(cols=4, rows=1, gap=wx.Size(0,0))
                 boxsizer.AddGrowableCol(1)
                 flags = (wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
                 if first:
                     flags |= wx.TOP
-                sizer.AddSizer(boxsizer, border=5, flag=flags)
+                sizer.Add(boxsizer, border=5, flag=flags)
                 staticbitmap = GenStaticBitmap(
                     ID=-1, bitmapname=element_infos["name"],
                     name="%s_bitmap" % element_infos["name"], parent=self.ParamsEditor,
                     pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
-                boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT)
+                boxsizer.Add(staticbitmap, border=5, flag=wx.RIGHT)
 
                 statictext = wx.StaticText(self.ParamsEditor,
                                            label="%s:" % _(element_infos["name"]))
-                boxsizer.AddWindow(statictext, border=5,
+                boxsizer.Add(statictext, border=5,
                                    flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
 
                 if isinstance(element_infos["type"], list):
                     if isinstance(element_infos["value"], tuple):
                         browse_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
-                        boxsizer.AddSizer(browse_boxsizer)
+                        boxsizer.Add(browse_boxsizer)
 
                         textctrl = wx.TextCtrl(self.ParamsEditor,
                                                size=wx.Size(275, -1), style=wx.TE_READONLY)
@@ -414,10 +414,10 @@
                             value_infos = element_infos["value"][1]
                         else:
                             value_infos = None
-                        browse_boxsizer.AddWindow(textctrl)
+                        browse_boxsizer.Add(textctrl)
 
                         button = wx.Button(self.ParamsEditor, label="...")
-                        browse_boxsizer.AddWindow(button)
+                        browse_boxsizer.Add(button)
                         button.Bind(wx.EVT_BUTTON,
                                     self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"],
                                                                    value_infos, element_path),
@@ -425,7 +425,7 @@
                     else:
                         combobox = wx.ComboBox(self.ParamsEditor,
                                                size=wx.Size(300, -1), style=wx.CB_READONLY)
-                        boxsizer.AddWindow(combobox)
+                        boxsizer.Add(combobox)
 
                         if element_infos["use"] == "optional":
                             combobox.Append("")
@@ -439,7 +439,7 @@
                                                      label="%s - %s" % (_(name), _(value)),
                                                      size=wx.Size(10, 0))
                             staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
-                            sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+                            sizer.Add(staticboxsizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
                             self.GenerateSizerElements(staticboxsizer, element_infos["children"], element_path)
                             callback = self.GetChoiceContentCallBackFunction(combobox, staticboxsizer, element_path)
                         else:
@@ -463,7 +463,7 @@
                                            size=wx.Size(300, -1),
                                            style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
                     spinctrl.SetRange(scmin, scmax)
-                    boxsizer.AddWindow(spinctrl)
+                    boxsizer.Add(spinctrl)
                     if element_infos["value"] is not None:
                         spinctrl.SetValue(element_infos["value"])
                     spinctrl.Bind(wx.EVT_SPINCTRL,
@@ -473,7 +473,7 @@
                 else:
                     if element_infos["type"] == "boolean":
                         checkbox = wx.CheckBox(self.ParamsEditor)
-                        boxsizer.AddWindow(checkbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
+                        boxsizer.Add(checkbox, flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
                         if element_infos["value"] is not None:
                             checkbox.SetValue(element_infos["value"])
                         checkbox.Bind(wx.EVT_CHECKBOX,
@@ -490,7 +490,7 @@
                                                size=wx.Size(300, -1),
                                                style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
                         spinctrl.SetRange(scmin, scmax)
-                        boxsizer.AddWindow(spinctrl)
+                        boxsizer.Add(spinctrl)
                         if element_infos["value"] is not None:
                             spinctrl.SetValue(element_infos["value"])
                         spinctrl.Bind(wx.EVT_SPINCTRL,
@@ -513,12 +513,12 @@
                             self.EditButton = wx.Button(self.ParamsEditor, label='...', size=wx.Size(30, -1))
                             self.Bind(wx.EVT_BUTTON, self.UriOptions, self.EditButton)
 
-                            uriSizer.AddWindow(textctrl, flag=wx.GROW)
-                            uriSizer.AddWindow(self.EditButton, flag=wx.GROW)
-
-                            boxsizer.AddWindow(uriSizer)
+                            uriSizer.Add(textctrl, flag=wx.GROW)
+                            uriSizer.Add(self.EditButton, flag=wx.GROW)
+
+                            boxsizer.Add(uriSizer)
                         else:
-                            boxsizer.AddWindow(textctrl)
+                            boxsizer.Add(textctrl)
 
                         if element_infos["value"] is not None:
                             textctrl.ChangeValue(str(element_infos["value"]))
@@ -535,7 +535,7 @@
                               self.GetResetFunction(element_path),
                               bt)
 
-                    boxsizer.AddWindow(bt, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT)
+                    boxsizer.Add(bt, border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT)
             first = False
         sizer.Layout()
         self.RefreshScrollbars()
--- a/editors/DataTypeEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/DataTypeEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -155,49 +155,49 @@
         self.MainSizer.AddGrowableRow(1)
 
         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.MainSizer.AddSizer(top_sizer, border=5,
+        self.MainSizer.Add(top_sizer, border=5,
                                 flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
-        top_sizer.AddWindow(derivation_type_label, border=5,
+        top_sizer.Add(derivation_type_label, border=5,
                             flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT)
 
         self.DerivationType = wx.ComboBox(self.Editor,
                                           size=wx.Size(200, -1), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
-        top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT)
+        top_sizer.Add(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT)
 
         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
-        self.MainSizer.AddSizer(typeinfos_sizer, border=5,
+        self.MainSizer.Add(typeinfos_sizer, border=5,
                                 flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         # Panel for Directly derived data types
 
         self.DirectlyPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
-        typeinfos_sizer.AddWindow(self.DirectlyPanel, 1)
+        typeinfos_sizer.Add(self.DirectlyPanel, 1)
 
         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
 
         directly_basetype_label = wx.StaticText(self.DirectlyPanel,
                                                 label=_('Base Type:'))
-        directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
+        directly_panel_sizer.Add(directly_basetype_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
-        directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
+        directly_panel_sizer.Add(self.DirectlyBaseType, 1, border=5,
                                        flag=wx.GROW | wx.ALL)
 
         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
                                                     label=_('Initial Value:'))
-        directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
+        directly_panel_sizer.Add(directly_initialvalue_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
                                                 style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
-        directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
+        directly_panel_sizer.Add(self.DirectlyInitialValue, 1, border=5,
                                        flag=wx.ALL)
 
         self.DirectlyPanel.SetSizer(directly_panel_sizer)
@@ -205,52 +205,52 @@
         # Panel for Subrange data types
 
         self.SubrangePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
-        typeinfos_sizer.AddWindow(self.SubrangePanel, 1)
+        typeinfos_sizer.Add(self.SubrangePanel, 1)
 
         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
 
         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
                                                 label=_('Base Type:'))
-        subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
+        subrange_panel_sizer.Add(subrange_basetype_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
                   self.SubrangeBaseType)
-        subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
+        subrange_panel_sizer.Add(self.SubrangeBaseType, 1, border=5,
                                        flag=wx.GROW | wx.ALL)
 
         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
                                                     label=_('Initial Value:'))
-        subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
+        subrange_panel_sizer.Add(subrange_initialvalue_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.SubrangeInitialValue = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
         self.SubrangeInitialValue.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnInfosChanged)
-        subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
+        subrange_panel_sizer.Add(self.SubrangeInitialValue, 1, border=5,
                                        flag=wx.GROW | wx.ALL)
 
         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
-        subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
+        subrange_panel_sizer.Add(subrange_minimum_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.SubrangeMinimum = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
         self.SubrangeMinimum.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnSubrangeMinimumChanged)
-        subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
+        subrange_panel_sizer.Add(self.SubrangeMinimum, 1, border=5,
                                        flag=wx.GROW | wx.ALL)
 
         for dummy in xrange(2):
-            subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
+            subrange_panel_sizer.Add(wx.Size(0, 0), 1)
 
         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
                                                label=_('Maximum:'))
-        subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
+        subrange_panel_sizer.Add(subrange_maximum_label, 1, border=5,
                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.SubrangeMaximum = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
         self.SubrangeMaximum.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnSubrangeMaximumChanged)
 
-        subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
+        subrange_panel_sizer.Add(self.SubrangeMaximum, 1, border=5,
                                        flag=wx.GROW | wx.ALL)
 
         self.SubrangePanel.SetSizer(subrange_panel_sizer)
@@ -258,35 +258,35 @@
         # Panel for Enumerated data types
 
         self.EnumeratedPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
-        typeinfos_sizer.AddWindow(self.EnumeratedPanel, 1)
+        typeinfos_sizer.Add(self.EnumeratedPanel, 1)
 
         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
 
         self.EnumeratedValues = CustomEditableListBox(
             self.EnumeratedPanel,
             label=_("Values:"),
-            style=(wx.gizmos.EL_ALLOW_NEW |
-                   wx.gizmos.EL_ALLOW_EDIT |
-                   wx.gizmos.EL_ALLOW_DELETE))
+            style=(wx.adv.EL_ALLOW_NEW |
+                   wx.adv.EL_ALLOW_EDIT |
+                   wx.adv.EL_ALLOW_DELETE))
         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
-        enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
+        enumerated_panel_sizer.Add(self.EnumeratedValues, 1, border=5,
                                          flag=wx.GROW | wx.ALL)
 
         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
-        enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
+        enumerated_panel_sizer.Add(enumerated_panel_rightsizer, 1)
 
         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
                                                       label=_('Initial Value:'))
-        enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
+        enumerated_panel_rightsizer.Add(enumerated_initialvalue_label, 1,
                                               border=5,
                                               flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
                                                   style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
-        enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
+        enumerated_panel_rightsizer.Add(self.EnumeratedInitialValue, 1,
                                               border=5, flag=wx.ALL)
 
         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
@@ -294,7 +294,7 @@
         # Panel for Array data types
 
         self.ArrayPanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
-        typeinfos_sizer.AddWindow(self.ArrayPanel, 1)
+        typeinfos_sizer.Add(self.ArrayPanel, 1)
 
         array_panel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
         array_panel_sizer.AddGrowableCol(0)
@@ -302,41 +302,41 @@
         array_panel_sizer.AddGrowableRow(1)
 
         array_panel_leftSizer = wx.BoxSizer(wx.HORIZONTAL)
-        array_panel_sizer.AddSizer(array_panel_leftSizer, flag=wx.GROW)
+        array_panel_sizer.Add(array_panel_leftSizer, flag=wx.GROW)
 
         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
-        array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
+        array_panel_leftSizer.Add(array_basetype_label, 1, border=5,
                                         flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
-        array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
+        array_panel_leftSizer.Add(self.ArrayBaseType, 1, border=5,
                                         flag=wx.GROW | wx.ALL)
 
         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
-        array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
+        array_panel_sizer.Add(array_panel_rightsizer, flag=wx.GROW)
 
         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
                                                  label=_('Initial Value:'))
-        array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
+        array_panel_rightsizer.Add(array_initialvalue_label, 1, border=5,
                                          flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
                                              style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
-        array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
+        array_panel_rightsizer.Add(self.ArrayInitialValue, 1, border=5,
                                          flag=wx.ALL)
 
         self.ArrayDimensions = CustomEditableListBox(
             self.ArrayPanel,
             label=_("Dimensions:"),
-            style=(wx.gizmos.EL_ALLOW_NEW |
-                   wx.gizmos.EL_ALLOW_EDIT |
-                   wx.gizmos.EL_ALLOW_DELETE))
+            style=(wx.adv.EL_ALLOW_NEW |
+                   wx.adv.EL_ALLOW_EDIT |
+                   wx.adv.EL_ALLOW_DELETE))
         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
                      "_OnUpButton", "_OnDownButton"]:
             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
-        array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
+        array_panel_sizer.Add(self.ArrayDimensions, 0, border=5,
                                     flag=wx.GROW | wx.ALL)
 
         self.ArrayPanel.SetSizer(array_panel_sizer)
@@ -344,7 +344,7 @@
         # Panel for Structure data types
 
         self.StructurePanel = wx.Panel(self.Editor, style=wx.TAB_TRAVERSAL)
-        typeinfos_sizer.AddWindow(self.StructurePanel, 1)
+        typeinfos_sizer.Add(self.StructurePanel, 1)
 
         structure_panel_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
         structure_panel_sizer.AddGrowableCol(0)
@@ -353,12 +353,12 @@
         structure_button_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         structure_button_sizer.AddGrowableCol(0)
         structure_button_sizer.AddGrowableRow(0)
-        structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
+        structure_panel_sizer.Add(structure_button_sizer, 0, border=5,
                                        flag=wx.ALL | wx.GROW)
 
         structure_elements_label = wx.StaticText(self.StructurePanel,
                                                  label=_('Elements :'))
-        structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
+        structure_button_sizer.Add(structure_elements_label, flag=wx.ALIGN_BOTTOM)
 
         for name, bitmap, help in [
                 ("StructureAddButton", "add_element", _("Add element")),
@@ -369,17 +369,17 @@
                                                     bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28),
                                                     style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            structure_button_sizer.AddWindow(button)
+            structure_button_sizer.Add(button)
 
         self.StructureElementsGrid = CustomGrid(self.StructurePanel,
                                                 size=wx.Size(0, 150), style=wx.VSCROLL)
-        self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+        self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING,
                                         self.OnStructureElementsGridCellChange)
         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
                                         self.OnStructureElementsGridEditorShown)
-        structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
+        structure_panel_sizer.Add(self.StructureElementsGrid, flag=wx.GROW)
 
         self.StructurePanel.SetSizer(structure_panel_sizer)
 
@@ -647,7 +647,7 @@
             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, new_entry)
 
             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
-            self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
+            self.StructureElementsGrid.PopupMenu(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
             type_menu.Destroy()
             event.Veto()
         else:
@@ -786,7 +786,7 @@
                 value = control.GetValueStr() if isinstance(control, CustomIntCtrl) else \
                         control.GetValue()
                 control.SetStyle(0, len(value), wx.TextAttr(wx.NullColour))
-            elif isinstance(control, wx.gizmos.EditableListBox):
+            elif isinstance(control, wx.adv.EditableListBox):
                 listctrl = control.GetListCtrl()
                 for i in xrange(listctrl.GetItemCount()):
                     listctrl.SetItemBackgroundColour(i, wx.NullColour)
@@ -811,7 +811,7 @@
                         control.SetForegroundColour(highlight_type[1])
                     elif isinstance(control, wx.TextCtrl):
                         control.SetStyle(start[1], end[1] + 1, wx.TextAttr(highlight_type[1], highlight_type[0]))
-                    elif isinstance(control, wx.gizmos.EditableListBox):
+                    elif isinstance(control, wx.adv.EditableListBox):
                         listctrl = control.GetListCtrl()
                         listctrl.SetItemBackgroundColour(infos[1], highlight_type[0])
                         listctrl.SetItemTextColour(infos[1], highlight_type[1])
--- a/editors/FileManagementPanel.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/FileManagementPanel.py	Wed Oct 20 08:57:07 2021 +0200
@@ -43,14 +43,14 @@
         main_sizer = wx.BoxSizer(wx.HORIZONTAL)
 
         left_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(left_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
+        main_sizer.Add(left_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
 
         managed_dir_label = wx.StaticText(self.Editor, label=_(self.TagName) + ":")
-        left_sizer.AddWindow(managed_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
+        left_sizer.Add(managed_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
 
         FILTER = _("All files (*.*)|*.*|CSV files (*.csv)|*.csv")
         self.ManagedDir = FolderTree(self.Editor, self.Folder, FILTER)
-        left_sizer.AddWindow(self.ManagedDir, 1, flag=wx.GROW)
+        left_sizer.Add(self.ManagedDir, 1, flag=wx.GROW)
 
         managed_treectrl = self.ManagedDir.GetTreeCtrl()
         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, managed_treectrl)
@@ -58,7 +58,7 @@
             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag, managed_treectrl)
 
         button_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(button_sizer, border=5,
+        main_sizer.Add(button_sizer, border=5,
                             flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL)
 
         for idx, (name, bitmap, help) in enumerate([
@@ -70,26 +70,26 @@
                 self.Editor,
                 bitmap=GetBitmap(bitmap),
                 size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
             if idx > 0:
                 flag = wx.TOP
             else:
                 flag = 0
             self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
-            button_sizer.AddWindow(button, border=20, flag=flag)
+            button_sizer.Add(button, border=20, flag=flag)
 
         right_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(right_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
+        main_sizer.Add(right_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
 
         if wx.Platform == '__WXMSW__':
             system_dir_label = wx.StaticText(self.Editor, label=_("My Computer:"))
         else:
             system_dir_label = wx.StaticText(self.Editor, label=_("Home Directory:"))
-        right_sizer.AddWindow(system_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
+        right_sizer.Add(system_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
 
         self.SystemDir = FolderTree(self.Editor, self.HomeDirectory, FILTER, False)
-        right_sizer.AddWindow(self.SystemDir, 1, flag=wx.GROW)
+        right_sizer.Add(self.SystemDir, 1, flag=wx.GROW)
 
         system_treectrl = self.SystemDir.GetTreeCtrl()
         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, system_treectrl)
--- a/editors/ProjectNodeEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/ProjectNodeEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -60,7 +60,7 @@
         ConfTreeNodeEditor.__init__(self, parent, controler, window, tagname)
 
         buttons_sizer = self.GenerateMethodButtonSizer()
-        self.MainSizer.InsertSizer(0, buttons_sizer, 0, border=5, flag=wx.ALL)
+        self.MainSizer.Insert(0, buttons_sizer, 0, border=5, flag=wx.ALL)
         self.MainSizer.Layout()
 
         self.VariableEditor = self.VariableEditorPanel
--- a/editors/ResourceEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/ResourceEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -76,10 +76,6 @@
     return [_("Interrupt"), _("Cyclic")]
 
 
-def SingleCellEditor(*x):
-    return wx.grid.GridCellChoiceEditor()
-
-
 def CheckSingle(single, varlist):
     return single in varlist
 
@@ -162,25 +158,21 @@
                     if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None:
                         error = True
                 elif colname == "Single":
-                    editor = SingleCellEditor(self, colname)
-                    editor.SetParameters(self.Parent.VariableList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.VariableList)
                     if self.GetValueByName(row, "Triggering") != "Interrupt":
                         grid.SetReadOnly(row, col, True)
                     single = self.GetValueByName(row, colname)
                     if single != "" and not CheckSingle(single, self.Parent.VariableList):
                         error = True
                 elif colname == "Triggering":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(",".join(map(_, GetTaskTriggeringOptions())))
+                    editor = wx.grid.GridCellChoiceEditor(map(_, GetTaskTriggeringOptions()))
                 elif colname == "Type":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(self.Parent.TypeList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.TypeList)
                 elif colname == "Priority":
                     editor = wx.grid.GridCellNumberEditor()
                     editor.SetParameters("0,65535")
                 elif colname == "Task":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters(self.Parent.TaskList)
+                    editor = wx.grid.GridCellChoiceEditor(self.Parent.TaskList)
 
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
@@ -230,16 +222,16 @@
         tasks_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         tasks_sizer.AddGrowableCol(0)
         tasks_sizer.AddGrowableRow(1)
-        main_sizer.AddSizer(tasks_sizer, border=5,
+        main_sizer.Add(tasks_sizer, border=5,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         tasks_buttons_sizer.AddGrowableCol(0)
         tasks_buttons_sizer.AddGrowableRow(0)
-        tasks_sizer.AddSizer(tasks_buttons_sizer, flag=wx.GROW)
+        tasks_sizer.Add(tasks_buttons_sizer, flag=wx.GROW)
 
         tasks_label = wx.StaticText(self.Editor, label=_(u'Tasks:'))
-        tasks_buttons_sizer.AddWindow(tasks_label, flag=wx.ALIGN_BOTTOM)
+        tasks_buttons_sizer.Add(tasks_label, flag=wx.ALIGN_BOTTOM)
 
         for name, bitmap, help in [
                 ("AddTaskButton", "add_element", _("Add task")),
@@ -250,27 +242,27 @@
                                                     bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28),
                                                     style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            tasks_buttons_sizer.AddWindow(button)
+            tasks_buttons_sizer.Add(button)
 
         self.TasksGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
-        self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnTasksGridCellChange)
-        tasks_sizer.AddWindow(self.TasksGrid, flag=wx.GROW)
+        self.TasksGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING, self.OnTasksGridCellChange)
+        tasks_sizer.Add(self.TasksGrid, flag=wx.GROW)
 
         instances_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         instances_sizer.AddGrowableCol(0)
         instances_sizer.AddGrowableRow(1)
-        main_sizer.AddSizer(instances_sizer, border=5,
+        main_sizer.Add(instances_sizer, border=5,
                             flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         instances_buttons_sizer.AddGrowableCol(0)
         instances_buttons_sizer.AddGrowableRow(0)
-        instances_sizer.AddSizer(instances_buttons_sizer, flag=wx.GROW)
+        instances_sizer.Add(instances_buttons_sizer, flag=wx.GROW)
 
         instances_label = wx.StaticText(self.Editor, label=_(u'Instances:'))
-        instances_buttons_sizer.AddWindow(instances_label, flag=wx.ALIGN_BOTTOM)
+        instances_buttons_sizer.Add(instances_label, flag=wx.ALIGN_BOTTOM)
 
         for name, bitmap, help in [
                 ("AddInstanceButton", "add_element", _("Add instance")),
@@ -280,13 +272,13 @@
             button = wx.lib.buttons.GenBitmapButton(
                 self.Editor, bitmap=GetBitmap(bitmap),
                 size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            instances_buttons_sizer.AddWindow(button)
+            instances_buttons_sizer.Add(button)
 
         self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
-        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange)
-        instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
+        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING, self.OnInstancesGridCellChange)
+        instances_sizer.Add(self.InstancesGrid, flag=wx.GROW)
 
         self.Editor.SetSizer(main_sizer)
 
@@ -405,20 +397,20 @@
         self.RefreshHighlightsTimer.Stop()
 
     def RefreshTypeList(self):
-        self.TypeList = ""
+        self.TypeList = []
         blocktypes = self.Controler.GetBlockResource()
         for blocktype in blocktypes:
-            self.TypeList += ",%s" % blocktype
+            self.TypeList.append(blocktype)
 
     def RefreshTaskList(self):
-        self.TaskList = ""
+        self.TaskList = []
         for row in xrange(self.TasksTable.GetNumberRows()):
-            self.TaskList += ",%s" % self.TasksTable.GetValueByName(row, "Name")
+            self.TaskList.append(self.TasksTable.GetValueByName(row, "Name"))
 
     def RefreshVariableList(self):
-        self.VariableList = ""
+        self.VariableList = []
         for variable in self.Controler.GetEditedResourceVariables(self.TagName):
-            self.VariableList += ",%s" % variable
+            self.VariableList.append(variable)
 
     def RefreshModel(self):
         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
@@ -481,7 +473,7 @@
                 wx.CallAfter(self.ShowErrorMessage, message)
                 return
 
-            tasklist = [name for name in self.TaskList.split(",") if name != ""]
+            tasklist = [name for name in self.TaskList if name != ""]
             for i in xrange(self.TasksTable.GetNumberRows()):
                 task = self.TasksTable.GetValueByName(i, "Name")
                 if task in tasklist:
--- a/editors/TextViewer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/TextViewer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -198,12 +198,20 @@
     def Colourise(self, start, end):
         self.Editor.Colourise(start, end)
 
-    def StartStyling(self, pos, mask):
-        self.Editor.StartStyling(pos, mask)
+    def StartStyling(self, pos):
+        self.Editor.StartStyling(pos)
+
+    INDIC0 = 0
+    INDIC1 = 1
+    INDIC2 = 2
 
     def SetStyling(self, length, style):
         self.Editor.SetStyling(length, style)
 
+    def SetIndicatorCurrentFillRange(start, length, indic):
+        self.Editor.SetIndicatorCurrent(indic)
+        self.Editor.IndicatorFillRange(start, length)
+
     def GetCurrentPos(self):
         return self.Editor.GetCurrentPos()
 
@@ -560,7 +568,7 @@
             start_pos = last_styled_pos = self.Editor.GetLineEndPosition(line_number - 1) + 1
         self.RefreshLineFolding(line_number)
         end_pos = event.GetPosition()
-        self.StartStyling(start_pos, 0xff)
+        self.StartStyling(start_pos)
 
         current_context = self.Variables
         current_call = None
@@ -595,9 +603,8 @@
                     else:
                         self.SetStyling(current_pos - last_styled_pos, STC_PLC_EMPTY)
                         if word not in ["]", ")"] and (self.GetCurrentPos() < last_styled_pos or self.GetCurrentPos() > current_pos):
-                            self.StartStyling(last_styled_pos, wx.stc.STC_INDICS_MASK)
-                            self.SetStyling(current_pos - last_styled_pos, wx.stc.STC_INDIC0_MASK)
-                            self.StartStyling(current_pos, 0xff)
+                            self.SetIndicatorCurrentFillRange(last_styled_pos, current_pos - last_styled_pos, self.INDIC0)
+                            self.StartStyling(current_pos)
                 else:
                     self.SetStyling(current_pos - last_styled_pos, STC_PLC_EMPTY)
                 last_styled_pos = current_pos
@@ -698,9 +705,8 @@
                     else:
                         self.SetStyling(current_pos - last_styled_pos, STC_PLC_EMPTY)
                         if word not in ["]", ")"] and (self.GetCurrentPos() < last_styled_pos or self.GetCurrentPos() > current_pos):
-                            self.StartStyling(last_styled_pos, wx.stc.STC_INDICS_MASK)
-                            self.SetStyling(current_pos - last_styled_pos, wx.stc.STC_INDIC0_MASK)
-                            self.StartStyling(current_pos, 0xff)
+                            self.SetIndicatorCurrentFillRange(last_styled_pos, current_pos - last_styled_pos, self.INDIC0)
+                            self.StartStyling(current_pos)
                     if char == '.':
                         if word != "]":
                             if current_context is not None:
@@ -956,8 +962,8 @@
             else:
                 highlight_end_pos = self.Editor.GetLineEndPosition(end[0] - 1) + end[1] - indent + 2
             if highlight_start_pos < end_pos and highlight_end_pos > start_pos:
-                self.StartStyling(highlight_start_pos, 0xff)
+                self.StartStyling(highlight_start_pos)
                 self.SetStyling(highlight_end_pos - highlight_start_pos, highlight_type)
-                self.StartStyling(highlight_start_pos, 0x00)
+                self.StartStyling(highlight_start_pos)
                 until_end = max(0, len(self.Editor.GetText()) - highlight_end_pos)
                 self.SetStyling(until_end, wx.stc.STC_STYLE_DEFAULT)
--- a/editors/Viewer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/editors/Viewer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -60,11 +60,11 @@
     global CURSORS
     if CURSORS is None:
         CURSORS = [wx.NullCursor,
-                   wx.StockCursor(wx.CURSOR_HAND),
-                   wx.StockCursor(wx.CURSOR_SIZENWSE),
-                   wx.StockCursor(wx.CURSOR_SIZENESW),
-                   wx.StockCursor(wx.CURSOR_SIZEWE),
-                   wx.StockCursor(wx.CURSOR_SIZENS)]
+                   wx.Cursor(wx.CURSOR_HAND),
+                   wx.Cursor(wx.CURSOR_SIZENWSE),
+                   wx.Cursor(wx.CURSOR_SIZENESW),
+                   wx.Cursor(wx.CURSOR_SIZEWE),
+                   wx.Cursor(wx.CURSOR_SIZENS)]
 
 
 if wx.Platform == '__WXMSW__':
@@ -410,7 +410,7 @@
                     if len(tree[0]) > 0:
                         menu = wx.Menu(title='')
                         self.GenerateTreeMenu(x, y, scaling, menu, "", var_class, [(values[0], values[2], tree)])
-                        self.ParentWindow.PopupMenuXY(menu)
+                        self.ParentWindow.PopupMenu(menu)
                     else:
                         self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, values[0], values[2])
                 else:
@@ -712,7 +712,7 @@
                 break
             faces["size"] -= 1
         self.Editor.SetFont(font)
-        self.MiniTextDC = wx.MemoryDC(wx.EmptyBitmap(1, 1))
+        self.MiniTextDC = wx.MemoryDC(wx.Bitmap(1, 1))
         self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName=faces["helv"]))
 
         self.CurrentScale = None
@@ -825,15 +825,14 @@
     def GetViewScale(self):
         return self.ViewScale
 
-    def GetLogicalDC(self, buffered=False):
-        if buffered:
-            bitmap = wx.EmptyBitmap(*self.Editor.GetClientSize())
-            dc = wx.MemoryDC(bitmap)
-        else:
-            dc = wx.ClientDC(self.Editor)
+    def PrepareDC(self, dc):
         dc.SetFont(self.GetFont())
         self.Editor.DoPrepareDC(dc)
         dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
+
+    def GetLogicalDC(self):
+        dc = wx.ClientDC(self.Editor)
+        self.PrepareDC(dc)
         return dc
 
     def RefreshRect(self, rect, eraseBackground=True):
@@ -1058,7 +1057,7 @@
             self.SelectedElement.SetSelected(False)
             self.SelectedElement = None
         if self.Mode == MODE_MOTION:
-            wx.CallAfter(self.Editor.SetCursor, wx.StockCursor(wx.CURSOR_HAND))
+            wx.CallAfter(self.Editor.SetCursor, wx.Cursor(wx.CURSOR_HAND))
             self.SavedMode = True
 
     # Return current drawing mode
@@ -1116,13 +1115,13 @@
             if self.DrawGrid:
                 width = max(2, int(scaling[0] * self.ViewScale[0]))
                 height = max(2, int(scaling[1] * self.ViewScale[1]))
-                bitmap = wx.EmptyBitmap(width, height)
+                bitmap = wx.Bitmap(width, height)
                 dc = wx.MemoryDC(bitmap)
                 dc.SetBackground(wx.Brush(self.Editor.GetBackgroundColour()))
                 dc.Clear()
                 dc.SetPen(MiterPen(wx.Colour(180, 180, 180)))
                 dc.DrawPoint(0, 0)
-                self.GridBrush = wx.BrushFromBitmap(bitmap)
+                self.GridBrush = wx.Brush(bitmap)
             else:
                 self.GridBrush = wx.TRANSPARENT_BRUSH
         else:
@@ -3379,7 +3378,7 @@
             element = self.ParentWindow.GetCopyBuffer()
             if bbx is None:
                 mouse_pos = self.Editor.ScreenToClient(wx.GetMousePosition())
-                middle = wx.Rect(0, 0, *self.Editor.GetClientSize()).InsideXY(mouse_pos.x, mouse_pos.y)
+                middle = wx.Rect(0, 0, *self.Editor.GetClientSize()).Contains(mouse_pos.x, mouse_pos.y)
                 if middle:
                     x, y = self.CalcUnscrolledPosition(mouse_pos.x, mouse_pos.y)
                 else:
@@ -3633,7 +3632,6 @@
         else:
             dc.SetBackground(wx.Brush(self.Editor.GetBackgroundColour()))
             dc.Clear()
-            dc.BeginDrawing()
         if self.Scaling is not None and self.DrawGrid and not printing:
             dc.SetPen(wx.TRANSPARENT_PEN)
             dc.SetBrush(self.GridBrush)
@@ -3680,12 +3678,15 @@
                 self.InstanceName.Draw(dc)
             if self.rubberBand.IsShown():
                 self.rubberBand.Draw(dc)
-            dc.EndDrawing()
 
     def OnPaint(self, event):
-        dc = self.GetLogicalDC(True)
+        event.Skip()
+        sx,sy = self.Editor.GetClientSize()
+        if sx <= 0 or sy <= 0 :
+            return
+        dc = wx.MemoryDC(wx.Bitmap(sx,sy))
+        self.PrepareDC(dc)
         self.DoDrawing(dc)
         wx.BufferedPaintDC(self.Editor, dc.GetAsBitmap())
         if self.Debug:
             DebugViewer.RefreshNewData(self)
-        event.Skip()
--- a/etherlab/ConfigEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/etherlab/ConfigEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -16,7 +16,7 @@
 
 import wx
 import wx.grid
-import wx.gizmos
+import wx.adv
 import wx.lib.buttons
 
 from plcopen.structures import IEC_KEYWORDS, TestIdentifier
@@ -81,9 +81,9 @@
         self.VariablesFilter.Bind(wx.EVT_COMBOBOX, self.OnVariablesFilterChanged)
         self.VariablesFilter.Bind(wx.EVT_TEXT_ENTER, self.OnVariablesFilterChanged)
         self.VariablesFilter.Bind(wx.EVT_CHAR, self.OnVariablesFilterKeyDown)
-        self.AddWindow(self.VariablesFilter, flag=wx.GROW)
-
-        self.VariablesGrid = wx.gizmos.TreeListCtrl(parent,
+        self.Add(self.VariablesFilter, flag=wx.GROW)
+
+        self.VariablesGrid = wx.adv.TreeListCtrl(parent,
                                                     style=wx.TR_DEFAULT_STYLE |
                                                     wx.TR_ROW_LINES |
                                                     wx.TR_COLUMN_LINES |
@@ -91,7 +91,7 @@
                                                     wx.TR_FULL_ROW_HIGHLIGHT)
         self.VariablesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
                                                 self.OnVariablesGridLeftClick)
-        self.AddWindow(self.VariablesGrid, flag=wx.GROW)
+        self.Add(self.VariablesGrid, flag=wx.GROW)
 
         self.Filters = []
         for desc, value in VARIABLES_FILTERS:
@@ -274,10 +274,10 @@
 
         variables_label = wx.StaticText(self.EthercatNodeEditor,
                                         label=_('Variable entries:'))
-        main_sizer.AddWindow(variables_label, border=10, flag=wx.TOP | wx.LEFT | wx.RIGHT)
+        main_sizer.Add(variables_label, border=10, flag=wx.TOP | wx.LEFT | wx.RIGHT)
 
         self.NodeVariables = NodeVariablesSizer(self.EthercatNodeEditor, self.Controler)
-        main_sizer.AddSizer(self.NodeVariables, border=10,
+        main_sizer.Add(self.NodeVariables, border=10,
                             flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.EthercatNodeEditor.SetSizer(main_sizer)
@@ -310,7 +310,7 @@
 
         self.EtherCATManagementTreebook = EtherCATManagementTreebook(self.EtherCATManagementEditor, self.Controler, self)
 
-        self.EtherCATManagermentEditor_Main_Sizer.AddSizer(self.EtherCATManagementTreebook, border=10, flag=wx.GROW)
+        self.EtherCATManagermentEditor_Main_Sizer.Add(self.EtherCATManagementTreebook, border=10, flag=wx.GROW)
 
         self.EtherCATManagementEditor.SetSizer(self.EtherCATManagermentEditor_Main_Sizer)
         return self.EtherCATManagementEditor
@@ -617,7 +617,7 @@
 
         self.MasterStateEditor_Panel = MasterStatePanelClass(self.MasterStateEditor, self.Controler)
 
-        self.MasterStateEditor_Panel_Main_Sizer.AddSizer(self.MasterStateEditor_Panel, border=10, flag=wx.GROW)
+        self.MasterStateEditor_Panel_Main_Sizer.Add(self.MasterStateEditor_Panel, border=10, flag=wx.GROW)
 
         self.MasterStateEditor.SetSizer(self.MasterStateEditor_Panel_Main_Sizer)
         return self.MasterStateEditor
@@ -651,7 +651,7 @@
 
         process_variables_label = wx.StaticText(self.EthercatMasterEditor,
                                                 label=_("Process variables mapped between nodes:"))
-        process_variables_header.AddWindow(process_variables_label, 1,
+        process_variables_header.Add(process_variables_label, 1,
                                            flag=wx.ALIGN_CENTER_VERTICAL)
 
         for name, bitmap, help in [
@@ -661,14 +661,14 @@
                 ("DownVariableButton", "down", _("Move process variable down"))]:
             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            process_variables_header.AddWindow(button, border=5, flag=wx.LEFT)
+            process_variables_header.Add(button, border=5, flag=wx.LEFT)
 
         self.ProcessVariablesGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
         self.ProcessVariablesGrid.SetMinSize(wx.Size(0, 150))
         self.ProcessVariablesGrid.SetDropTarget(ProcessVariableDropTarget(self))
-        self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+        self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING,
                                        self.OnProcessVariablesGridCellChange)
         self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
                                        self.OnProcessVariablesGridCellLeftClick)
@@ -678,7 +678,7 @@
 
         startup_commands_label = wx.StaticText(self.EthercatMasterEditor,
                                                label=_("Startup service variables assignments:"))
-        startup_commands_header.AddWindow(startup_commands_label, 1,
+        startup_commands_header.Add(startup_commands_label, 1,
                                           flag=wx.ALIGN_CENTER_VERTICAL)
 
         for name, bitmap, help in [
@@ -686,14 +686,14 @@
                 ("DeleteCommandButton", "remove_element", _("Remove startup service variable"))]:
             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
-            startup_commands_header.AddWindow(button, border=5, flag=wx.LEFT)
+            startup_commands_header.Add(button, border=5, flag=wx.LEFT)
 
         self.StartupCommandsGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
         self.StartupCommandsGrid.SetDropTarget(StartupCommandDropTarget(self))
         self.StartupCommandsGrid.SetMinSize(wx.Size(0, 150))
-        self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+        self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGING,
                                       self.OnStartupCommandsGridCellChange)
         self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
                                       self.OnStartupCommandsGridEditorShow)
@@ -702,29 +702,29 @@
 
         main_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Node filter:"))
         staticbox_sizer = wx.StaticBoxSizer(main_staticbox, wx.VERTICAL)
-        self.EthercatMasterEditorSizer.AddSizer(staticbox_sizer, 0, border=10, flag=wx.GROW | wx.ALL)
+        self.EthercatMasterEditorSizer.Add(staticbox_sizer, 0, border=10, flag=wx.GROW | wx.ALL)
 
         main_staticbox_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=0)
         main_staticbox_sizer.AddGrowableCol(0)
         main_staticbox_sizer.AddGrowableRow(2)
         main_staticbox_sizer.AddGrowableRow(4)
         main_staticbox_sizer.AddGrowableRow(5)
-        staticbox_sizer.AddSizer(main_staticbox_sizer, 1, flag=wx.GROW)
-        main_staticbox_sizer.AddWindow(self.NodesFilter, border=5, flag=wx.GROW | wx.ALL)
-        main_staticbox_sizer.AddSizer(process_variables_header, border=5,
+        staticbox_sizer.Add(main_staticbox_sizer, 1, flag=wx.GROW)
+        main_staticbox_sizer.Add(self.NodesFilter, border=5, flag=wx.GROW | wx.ALL)
+        main_staticbox_sizer.Add(process_variables_header, border=5,
                                       flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
-        main_staticbox_sizer.AddWindow(self.ProcessVariablesGrid, 1,
+        main_staticbox_sizer.Add(self.ProcessVariablesGrid, 1,
                                        border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
-        main_staticbox_sizer.AddSizer(startup_commands_header,
+        main_staticbox_sizer.Add(startup_commands_header,
                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
-        main_staticbox_sizer.AddWindow(self.StartupCommandsGrid, 1,
+        main_staticbox_sizer.Add(self.StartupCommandsGrid, 1,
                                        border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
 
         second_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Nodes variables filter:"))
         second_staticbox_sizer = wx.StaticBoxSizer(second_staticbox, wx.VERTICAL)
-        second_staticbox_sizer.AddSizer(self.NodesVariables, 1, border=5, flag=wx.GROW | wx.ALL)
-
-        main_staticbox_sizer.AddSizer(second_staticbox_sizer, 1,
+        second_staticbox_sizer.Add(self.NodesVariables, 1, border=5, flag=wx.GROW | wx.ALL)
+
+        main_staticbox_sizer.Add(second_staticbox_sizer, 1,
                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
 
         self.EthercatMasterEditor.SetSizer(self.EthercatMasterEditorSizer)
@@ -1113,21 +1113,21 @@
 
         ESI_files_label = wx.StaticText(parent,
                                         label=_("ESI Files:"))
-        self.AddWindow(ESI_files_label, border=10,
+        self.Add(ESI_files_label, border=10,
                        flag=wx.TOP | wx.LEFT | wx.RIGHT)
 
         folder_tree_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=0)
         folder_tree_sizer.AddGrowableCol(0)
         folder_tree_sizer.AddGrowableRow(0)
-        self.AddSizer(folder_tree_sizer, border=10,
+        self.Add(folder_tree_sizer, border=10,
                       flag=wx.GROW | wx.LEFT | wx.RIGHT)
 
         self.ESIFiles = FolderTree(parent, self.GetPath(), editable=False)
         self.ESIFiles.SetFilter(".xml")
-        folder_tree_sizer.AddWindow(self.ESIFiles, flag=wx.GROW)
+        folder_tree_sizer.Add(self.ESIFiles, flag=wx.GROW)
 
         buttons_sizer = wx.BoxSizer(wx.VERTICAL)
-        folder_tree_sizer.AddSizer(buttons_sizer,
+        folder_tree_sizer.Add(buttons_sizer,
                                    flag=wx.ALIGN_CENTER_VERTICAL)
 
         for idx, (name, bitmap, help, callback) in enumerate(buttons):
@@ -1135,7 +1135,7 @@
                                                     bitmap=GetBitmap(bitmap),
                                                     size=wx.Size(28, 28),
                                                     style=wx.NO_BORDER)
-            button.SetToolTipString(help)
+            button.SetToolTip(help)
             setattr(self, name, button)
             if idx > 0:
                 flag = wx.TOP
@@ -1145,14 +1145,14 @@
                 callback = getattr(self, "On" + name, None)
             if callback is not None:
                 parent.Bind(wx.EVT_BUTTON, callback, button)
-            buttons_sizer.AddWindow(button, border=10, flag=flag)
+            buttons_sizer.Add(button, border=10, flag=flag)
 
         modules_label = wx.StaticText(parent,
                                       label=_("Modules library:"))
-        self.AddSizer(modules_label, border=10,
+        self.Add(modules_label, border=10,
                       flag=wx.LEFT | wx.RIGHT)
 
-        self.ModulesGrid = wx.gizmos.TreeListCtrl(parent,
+        self.ModulesGrid = wx.adv.TreeListCtrl(parent,
                                                   style=wx.TR_DEFAULT_STYLE |
                                                   wx.TR_ROW_LINES |
                                                   wx.TR_COLUMN_LINES |
@@ -1166,7 +1166,7 @@
                               self.OnModulesGridEndLabelEdit)
         self.ModulesGrid.GetHeaderWindow().Bind(wx.EVT_MOTION,
                                                 self.OnModulesGridHeaderMotion)
-        self.AddWindow(self.ModulesGrid, border=10,
+        self.Add(self.ModulesGrid, border=10,
                        flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         for colname, colsize, colalign in zip(
@@ -1335,7 +1335,7 @@
         if col > 0 and self.LastToolTipCol != col:
             self.LastToolTipCol = col
             _param, param_infos = self.ModuleLibrary.MODULES_EXTRA_PARAMS[col - 1]
-            wx.CallAfter(self.ModulesGrid.GetHeaderWindow().SetToolTipString,
+            wx.CallAfter(self.ModulesGrid.GetHeaderWindow().SetToolTip,
                          param_infos["description"])
         event.Skip()
 
@@ -1359,13 +1359,14 @@
                 ("DeleteButton", "remove_element", _("Remove file from database"), None)
             ])
         self.DatabaseSizer.SetControlMinSize(wx.Size(0, 0))
-        main_sizer.AddSizer(self.DatabaseSizer, border=10,
+        main_sizer.Add(self.DatabaseSizer, border=10,
                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
-        button_sizer.GetAffirmativeButton().SetLabel(_("Add file to project"))
-        button_sizer.GetCancelButton().SetLabel(_("Close"))
-        main_sizer.AddSizer(button_sizer, border=10,
+        # FIXME: find a way to change buttons label compatible with wxPython 4.x
+        # button_sizer.GetAffirmativeButton().SetLabel(_("Add file to project"))
+        # button_sizer.GetCancelButton().SetLabel(_("Close"))
+        main_sizer.Add(button_sizer, border=10,
                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
--- a/etherlab/EtherCATManagementEditor.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/etherlab/EtherCATManagementEditor.py	Wed Oct 20 08:57:07 2021 +0200
@@ -15,7 +15,7 @@
 
 import wx
 import wx.grid
-import wx.gizmos
+import wx.adv
 import wx.lib.buttons
 
 # --------------------------------------------------------------------
@@ -135,7 +135,7 @@
             self.SizerDic["SlaveInfosDetailsInnerSizer"].AddMany([self.StaticTextDic[statictext_name],
                                                                   self.TextCtrlDic[textctrl_name]])
 
-        self.SizerDic["SlaveInfosDetailsBox"].AddSizer(self.SizerDic["SlaveInfosDetailsInnerSizer"])
+        self.SizerDic["SlaveInfosDetailsBox"].Add(self.SizerDic["SlaveInfosDetailsInnerSizer"])
 
         self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL)
 
@@ -153,7 +153,7 @@
         for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in buttons:
             self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label))
             self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
-            self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
+            self.ButtonDic[button_name].SetToolTip(button_tooltipstring)
             self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name])
             for statictext_name, statictext_label, textctrl_name in sub_item:
                 self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label))
@@ -166,7 +166,7 @@
                 ("StopTimerButton", "Stop State Monitoring", "Slave State Update Stop", self.CurrentStateThreadStop)]:
             self.ButtonDic[button_name] = wx.Button(self, label=_(button_label))
             self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
-            self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
+            self.ButtonDic[button_name].SetToolTip(button_tooltipstring)
             self.SizerDic["SlaveState_down_sizer"].Add(self.ButtonDic[button_name])
 
         self.SizerDic["SlaveState_sizer"].AddMany([self.SizerDic["SlaveState_up_sizer"],
@@ -1729,7 +1729,7 @@
 
         wx.Panel.__init__(self, parent, -1, size=(350, 500))
 
-        self.Tree = wx.gizmos.TreeListCtrl(self, -1, size=(350, 500),
+        self.Tree = wx.adv.TreeListCtrl(self, -1, size=(350, 500),
                                            style=(wx.TR_DEFAULT_STYLE |
                                                   wx.TR_FULL_ROW_HIGHLIGHT |
                                                   wx.TR_HIDE_ROOT |
@@ -2692,7 +2692,7 @@
             self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
             self.MasterStateSizer['innerMasterState'].AddMany([self.StaticText[key], self.TextCtrl[key]])
 
-        self.MasterStateSizer['masterState'].AddSizer(self.MasterStateSizer['innerMasterState'])
+        self.MasterStateSizer['masterState'].Add(self.MasterStateSizer['innerMasterState'])
 
         # ----------------------- Ethernet Network Card Information ---------------------------------------
         for key, label in [
@@ -2705,7 +2705,7 @@
             self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
             self.MasterStateSizer['innerDeviceInfo'].AddMany([self.StaticText[key], self.TextCtrl[key]])
 
-        self.MasterStateSizer['deviceInfo'].AddSizer(self.MasterStateSizer['innerDeviceInfo'])
+        self.MasterStateSizer['deviceInfo'].Add(self.MasterStateSizer['innerDeviceInfo'])
 
         # ----------------------- Network Frame Information -----------------------------------------------
         for key, label in [
@@ -2722,13 +2722,13 @@
                 self.TextCtrl[key][index] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
                 self.MasterStateSizer['innerFrameInfo'].Add(self.TextCtrl[key][index])
 
-        self.MasterStateSizer['frameInfo'].AddSizer(self.MasterStateSizer['innerFrameInfo'])
+        self.MasterStateSizer['frameInfo'].Add(self.MasterStateSizer['innerFrameInfo'])
 
         # ------------------------------- Slave Information  -----------------------------------------------
         self.SITreeListCtrl = SITreeListCtrl(self, self.Controler) 
         self.MasterStateSizer["innerSlaveInfo"].AddMany([self.SIUpdateButton,
                                                                self.SITreeListCtrl])
-        self.MasterStateSizer["slaveInfo"].AddSizer(
+        self.MasterStateSizer["slaveInfo"].Add(
                 self.MasterStateSizer["innerSlaveInfo"]) 
 
         # --------------------------------- Main Sizer ----------------------------------------------------
@@ -2743,7 +2743,7 @@
             ("main", [
                     "innerTop", "innerMiddle", "innerBottom"])]:
             for key2 in sub:
-                self.MasterStateSizer[key].AddSizer(self.MasterStateSizer[key2])
+                self.MasterStateSizer[key].Add(self.MasterStateSizer[key2])
 
         self.SetSizer(self.MasterStateSizer["main"])
     
@@ -2798,7 +2798,7 @@
 
         self.Controler=controler
         
-        self.Tree = wx.gizmos.TreeListCtrl(self, -1, size=wx.Size(750,350), 
+        self.Tree = wx.adv.TreeListCtrl(self, -1, size=wx.Size(750,350), 
                                                             style=wx.TR_HAS_BUTTONS
                                                             |wx.TR_HIDE_ROOT
                                                             |wx.TR_ROW_LINES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/first_steps/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_Python_Library="false"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/first_steps/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,1160 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2016-10-24T18:09:22"/>
+  <contentHeader name="First Steps" modificationDateTime="2018-09-26T12:52:51">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="AverageVal" pouType="function">
+        <interface>
+          <returnType>
+            <REAL/>
+          </returnType>
+          <inputVars>
+            <variable name="Cnt1">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt2">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt3">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt4">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt5">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="InputsNumber">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="5.0"/>
+              </initialValue>
+              <documentation>
+                <xhtml:p><![CDATA[Количество входных значений]]></xhtml:p>
+              </documentation>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[AverageVal := INT_TO_REAL(Cnt1+Cnt2+Cnt3+Cnt4+Cnt5)/InputsNumber;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+      <pou name="plc_prg" pouType="program">
+        <interface>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Cnt1">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt2">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt3">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt4">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt5">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="CounterST0">
+              <type>
+                <derived name="CounterST"/>
+              </type>
+            </variable>
+            <variable name="CounterFBD0">
+              <type>
+                <derived name="CounterFBD"/>
+              </type>
+            </variable>
+            <variable name="CounterSFC0">
+              <type>
+                <derived name="CounterSFC"/>
+              </type>
+            </variable>
+            <variable name="CounterIL0">
+              <type>
+                <derived name="CounterIL"/>
+              </type>
+            </variable>
+            <variable name="CounterLD0">
+              <type>
+                <derived name="CounterLD"/>
+              </type>
+            </variable>
+            <variable name="AVCnt">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="1" typeName="CounterST" instanceName="CounterST0" executionOrderId="0" height="60" width="125">
+              <position x="207" y="53"/>
+              <inputVariables>
+                <variable formalParameter="Reset">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="2">
+                      <position x="207" y="93"/>
+                      <position x="114" y="93"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="2" executionOrderId="0" height="30" width="79" negated="false">
+              <position x="35" y="78"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <block localId="4" typeName="CounterFBD" instanceName="CounterFBD0" executionOrderId="0" height="54" width="121">
+              <position x="211" y="146"/>
+              <inputVariables>
+                <variable formalParameter="Reset">
+                  <connectionPointIn>
+                    <relPosition x="0" y="37"/>
+                    <connection refLocalId="13">
+                      <position x="211" y="183"/>
+                      <position x="115" y="183"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="121" y="37"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="6" height="365" width="569">
+              <position x="620" y="130"/>
+              <content>
+                <xhtml:p><![CDATA[In this example function block with the same functionality 
+is created using all five IEC 61131-3 programing languages:
+- IL;
+- FBD;
+- LD;
+- ST;
+- SFC.
+
+
+
+
+Function block is a counter with reset control input.
+If reset is True counter value is reset to the value defined by
+global configuration constant ResetCounterValue. 
+If reset is False, counter is incremented every cycle.
+]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="7" typeName="CounterSFC" instanceName="CounterSFC0" executionOrderId="0" height="52" width="121">
+              <position x="211" y="237"/>
+              <inputVariables>
+                <variable formalParameter="Reset">
+                  <connectionPointIn>
+                    <relPosition x="0" y="36"/>
+                    <connection refLocalId="12">
+                      <position x="211" y="273"/>
+                      <position x="103" y="273"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="121" y="36"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="9" typeName="CounterIL" instanceName="CounterIL0" executionOrderId="0" height="62" width="121">
+              <position x="211" y="322"/>
+              <inputVariables>
+                <variable formalParameter="Reset">
+                  <connectionPointIn>
+                    <relPosition x="0" y="41"/>
+                    <connection refLocalId="10">
+                      <position x="211" y="363"/>
+                      <position x="101" y="363"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="121" y="41"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="10" executionOrderId="0" height="30" width="67" negated="false">
+              <position x="34" y="348"/>
+              <connectionPointOut>
+                <relPosition x="67" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <inVariable localId="12" executionOrderId="0" height="30" width="67" negated="false">
+              <position x="36" y="258"/>
+              <connectionPointOut>
+                <relPosition x="67" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <inVariable localId="13" executionOrderId="0" height="30" width="79" negated="false">
+              <position x="36" y="168"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <block localId="14" typeName="CounterLD" instanceName="CounterLD0" executionOrderId="0" height="62" width="124">
+              <position x="210" y="412"/>
+              <inputVariables>
+                <variable formalParameter="Reset">
+                  <connectionPointIn>
+                    <relPosition x="0" y="41"/>
+                    <connection refLocalId="16">
+                      <position x="210" y="453"/>
+                      <position x="100" y="453"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="124" y="41"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="16" executionOrderId="0" height="30" width="64" negated="false">
+              <position x="36" y="438"/>
+              <connectionPointOut>
+                <relPosition x="64" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <block localId="17" typeName="AverageVal" executionOrderId="0" height="470" width="100">
+              <position x="514" y="28"/>
+              <inputVariables>
+                <variable formalParameter="Cnt1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="3">
+                      <position x="514" y="93"/>
+                      <position x="474" y="93"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="155"/>
+                    <connection refLocalId="5">
+                      <position x="514" y="183"/>
+                      <position x="473" y="183"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="245"/>
+                    <connection refLocalId="8">
+                      <position x="514" y="273"/>
+                      <position x="472" y="273"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt4">
+                  <connectionPointIn>
+                    <relPosition x="0" y="335"/>
+                    <connection refLocalId="11">
+                      <position x="514" y="363"/>
+                      <position x="469" y="363"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt5">
+                  <connectionPointIn>
+                    <relPosition x="0" y="425"/>
+                    <connection refLocalId="15">
+                      <position x="514" y="453"/>
+                      <position x="469" y="453"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="100" y="65"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="18" executionOrderId="0" height="30" width="55" negated="false">
+              <position x="649" y="78"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="17" formalParameter="OUT">
+                  <position x="649" y="93"/>
+                  <position x="614" y="93"/>
+                </connection>
+              </connectionPointIn>
+              <expression>AVCnt</expression>
+            </outVariable>
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="106" negatedOut="false" negatedIn="false">
+              <position x="368" y="78"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="1" formalParameter="OUT">
+                  <position x="368" y="93"/>
+                  <position x="332" y="93"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt1</expression>
+            </inOutVariable>
+            <inOutVariable localId="5" executionOrderId="0" height="30" width="103" negatedOut="false" negatedIn="false">
+              <position x="370" y="168"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="4" formalParameter="OUT">
+                  <position x="370" y="183"/>
+                  <position x="332" y="183"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="103" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt2</expression>
+            </inOutVariable>
+            <inOutVariable localId="8" executionOrderId="0" height="30" width="97" negatedOut="false" negatedIn="false">
+              <position x="375" y="258"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="375" y="273"/>
+                  <position x="332" y="273"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="97" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt3</expression>
+            </inOutVariable>
+            <inOutVariable localId="11" executionOrderId="0" height="30" width="91" negatedOut="false" negatedIn="false">
+              <position x="378" y="348"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="9" formalParameter="OUT">
+                  <position x="378" y="363"/>
+                  <position x="332" y="363"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="91" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt4</expression>
+            </inOutVariable>
+            <inOutVariable localId="15" executionOrderId="0" height="30" width="88" negatedOut="false" negatedIn="false">
+              <position x="381" y="438"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="14" formalParameter="Out">
+                  <position x="381" y="453"/>
+                  <position x="334" y="453"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="88" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt5</expression>
+            </inOutVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="CounterST" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="Cnt">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <externalVars constant="true">
+            <variable name="ResetCounterValue">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[IF Reset THEN
+  Cnt := ResetCounterValue;
+ELSE
+  Cnt := Cnt + 1;
+END_IF;
+
+Out := Cnt;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+      <pou name="CounterFBD" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="Cnt">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars constant="true">
+            <variable name="ResetCounterValue">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
+              <position x="321" y="58"/>
+              <connectionPointOut>
+                <relPosition x="61" y="15"/>
+              </connectionPointOut>
+              <expression>Reset</expression>
+            </inVariable>
+            <outVariable localId="2" executionOrderId="0" height="30" width="39" negated="false">
+              <position x="675" y="137"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3">
+                  <position x="675" y="152"/>
+                  <position x="589" y="152"/>
+                </connection>
+              </connectionPointIn>
+              <expression>OUT</expression>
+            </outVariable>
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="37" negatedOut="false" negatedIn="false">
+              <position x="557" y="137"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="557" y="152"/>
+                  <position x="527" y="152"/>
+                  <position x="527" y="130"/>
+                  <position x="517" y="130"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="37" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt</expression>
+            </inOutVariable>
+            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="69">
+              <position x="328" y="115"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="6">
+                      <position x="328" y="150"/>
+                      <position x="275" y="150"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="3">
+                      <position x="328" y="180"/>
+                      <position x="317" y="180"/>
+                      <position x="317" y="213"/>
+                      <position x="604" y="213"/>
+                      <position x="604" y="152"/>
+                      <position x="594" y="152"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="69" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="5" executionOrderId="0" height="30" width="163" negated="false">
+              <position x="222" y="256"/>
+              <connectionPointOut>
+                <relPosition x="163" y="15"/>
+              </connectionPointOut>
+              <expression>ResetCounterValue</expression>
+            </inVariable>
+            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
+              <position x="254" y="135"/>
+              <connectionPointOut>
+                <relPosition x="21" y="15"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="69">
+              <position x="448" y="100"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="448" y="130"/>
+                      <position x="415" y="130"/>
+                      <position x="415" y="73"/>
+                      <position x="382" y="73"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="448" y="150"/>
+                      <position x="397" y="150"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="5">
+                      <position x="448" y="170"/>
+                      <position x="414" y="170"/>
+                      <position x="414" y="271"/>
+                      <position x="385" y="271"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="69" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="CounterSFC" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="Cnt">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars constant="true">
+            <variable name="ResetCounterValue">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <actions/>
+        <body>
+          <SFC>
+            <step localId="1" name="Start" initialStep="true" height="34" width="90">
+              <position x="241" y="14"/>
+              <connectionPointOut formalParameter="">
+                <relPosition x="45" y="34"/>
+              </connectionPointOut>
+            </step>
+            <selectionDivergence localId="2" height="1" width="431">
+              <position x="70" y="86"/>
+              <connectionPointIn>
+                <relPosition x="216" y="0"/>
+                <connection refLocalId="1">
+                  <position x="286" y="86"/>
+                  <position x="286" y="42"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="431" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="3" height="2" width="20">
+              <position x="491" y="132"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="2">
+                  <position x="501" y="132"/>
+                  <position x="501" y="87"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[Reset]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <transition localId="4" height="2" width="20" executionOrderId="0">
+              <position x="60" y="135"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="2">
+                  <position x="70" y="135"/>
+                  <position x="70" y="87"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[NOT Reset]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="5" name="ResetCounter" initialStep="false" height="30" width="134">
+              <position x="434" y="190"/>
+              <connectionPointIn>
+                <relPosition x="67" y="0"/>
+                <connection refLocalId="3">
+                  <position x="501" y="190"/>
+                  <position x="501" y="134"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="67" y="30"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="134" y="15"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="6" height="63" width="254">
+              <position x="641" y="190"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="5">
+                  <position x="641" y="205"/>
+                  <position x="568" y="205"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0">
+                <relPosition x="0" y="0"/>
+                <inline>
+                  <ST>
+                    <xhtml:p><![CDATA[Cnt := ResetCounterValue;]]></xhtml:p>
+                  </ST>
+                </inline>
+              </action>
+              <action localId="0">
+                <relPosition x="0" y="0"/>
+                <inline>
+                  <ST>
+                    <xhtml:p><![CDATA[OUT := Cnt;]]></xhtml:p>
+                  </ST>
+                </inline>
+              </action>
+            </actionBlock>
+            <step localId="7" name="Count" initialStep="false" height="30" width="85" executionOrderId="0">
+              <position x="28" y="191"/>
+              <connectionPointIn>
+                <relPosition x="42" y="0"/>
+                <connection refLocalId="4">
+                  <position x="70" y="191"/>
+                  <position x="70" y="137"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="42" y="30"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="85" y="15"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="8" height="52" width="164" executionOrderId="0">
+              <position x="154" y="191"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7">
+                  <position x="154" y="206"/>
+                  <position x="113" y="206"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0">
+                <relPosition x="0" y="0"/>
+                <inline>
+                  <ST>
+                    <xhtml:p><![CDATA[Cnt := Cnt + 1;]]></xhtml:p>
+                  </ST>
+                </inline>
+              </action>
+              <action localId="0">
+                <relPosition x="0" y="0"/>
+                <inline>
+                  <ST>
+                    <xhtml:p><![CDATA[OUT := Cnt;]]></xhtml:p>
+                  </ST>
+                </inline>
+              </action>
+            </actionBlock>
+            <selectionConvergence localId="10" height="1" width="431">
+              <position x="70" y="273"/>
+              <connectionPointIn>
+                <relPosition x="0" y="0"/>
+                <connection refLocalId="13">
+                  <position x="70" y="273"/>
+                  <position x="70" y="244"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointIn>
+                <relPosition x="431" y="0"/>
+                <connection refLocalId="14">
+                  <position x="501" y="273"/>
+                  <position x="501" y="250"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="216" y="1"/>
+              </connectionPointOut>
+            </selectionConvergence>
+            <jumpStep localId="12" targetName="Start" height="13" width="12">
+              <position x="280" y="317"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="10">
+                  <position x="286" y="317"/>
+                  <position x="286" y="274"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <transition localId="13" height="2" width="20" executionOrderId="0">
+              <position x="60" y="242"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="7">
+                  <position x="70" y="242"/>
+                  <position x="70" y="215"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[Reset]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <transition localId="14" height="2" width="20" executionOrderId="0">
+              <position x="491" y="248"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="5">
+                  <position x="501" y="248"/>
+                  <position x="501" y="220"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[NOT Reset]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+          </SFC>
+        </body>
+      </pou>
+      <pou name="CounterIL" pouType="functionBlock">
+        <interface>
+          <localVars>
+            <variable name="Cnt">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <externalVars constant="true">
+            <variable name="ResetCounterValue">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <IL>
+            <xhtml:p><![CDATA[LD Reset
+JMPC ResetCnt
+
+(* increment counter *)
+LD Cnt
+ADD 1
+JMP QuitFb
+
+ResetCnt:
+(* reset counter *)
+LD ResetCounterValue
+
+QuitFb:
+(* save results *)
+ST Cnt
+ST Out
+]]></xhtml:p>
+          </IL>
+        </body>
+      </pou>
+      <pou name="CounterLD" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Reset">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Out">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="Cnt">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars constant="true">
+            <variable name="ResetCounterValue">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <LD>
+            <outVariable localId="2" executionOrderId="0" height="30" width="34" negated="false">
+              <position x="527" y="87"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3">
+                  <position x="527" y="102"/>
+                  <position x="443" y="102"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Out</expression>
+            </outVariable>
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="34" negatedOut="false" negatedIn="false">
+              <position x="409" y="87"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="409" y="102"/>
+                  <position x="367" y="102"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="34" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt</expression>
+            </inOutVariable>
+            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="67">
+              <position x="180" y="87"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="6">
+                      <position x="180" y="122"/>
+                      <position x="127" y="122"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="3">
+                      <position x="180" y="152"/>
+                      <position x="169" y="152"/>
+                      <position x="169" y="185"/>
+                      <position x="453" y="185"/>
+                      <position x="453" y="102"/>
+                      <position x="443" y="102"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="5" executionOrderId="0" height="30" width="158" negated="false">
+              <position x="74" y="228"/>
+              <connectionPointOut>
+                <relPosition x="158" y="15"/>
+              </connectionPointOut>
+              <expression>ResetCounterValue</expression>
+            </inVariable>
+            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
+              <position x="106" y="107"/>
+              <connectionPointOut>
+                <relPosition x="21" y="15"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="67">
+              <position x="300" y="72"/>
+              <inputVariables>
+                <variable formalParameter="G">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="9">
+                      <position x="300" y="102"/>
+                      <position x="266" y="102"/>
+                      <position x="266" y="62"/>
+                      <position x="134" y="62"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="300" y="122"/>
+                      <position x="247" y="122"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="5">
+                      <position x="300" y="142"/>
+                      <position x="266" y="142"/>
+                      <position x="266" y="243"/>
+                      <position x="232" y="243"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <leftPowerRail localId="8" height="40" width="3">
+              <position x="46" y="42"/>
+              <connectionPointOut formalParameter="">
+                <relPosition x="3" y="20"/>
+              </connectionPointOut>
+            </leftPowerRail>
+            <contact localId="9" height="15" width="21" negated="false">
+              <position x="113" y="54"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="8">
+                  <position x="113" y="62"/>
+                  <position x="49" y="62"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="21" y="8"/>
+              </connectionPointOut>
+              <variable>Reset</variable>
+            </contact>
+          </LD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="plc_task" priority="1" interval="T#100ms">
+            <pouInstance name="plc_task_instance" typeName="plc_prg"/>
+          </task>
+        </resource>
+        <globalVars constant="true">
+          <variable name="ResetCounterValue">
+            <type>
+              <INT/>
+            </type>
+            <initialValue>
+              <simpleValue value="17"/>
+            </initialValue>
+          </variable>
+        </globalVars>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_Python_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/c_code@c_ext/baseconfnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams Name="c_code" IEC_Channel="1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/c_code@c_ext/cfile.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,75 @@
+<?xml version='1.0' encoding='utf-8'?>
+<CFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <includes>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </includes>
+  <variables>
+    <variable name="TestInput" type="SINT" initial="0"/>
+    <variable name="TestOutput" type="SINT"/>
+  </variables>
+  <globals>
+    <xhtml:p><![CDATA[
+volatile long Lock=0;
+volatile char PtoC=1,CtoP=2;
+
+extern long AtomicCompareExchange(long*,long, long);
+extern char *PLC_ID;
+
+int Simple_C_Call(int val){
+  return val+1;
+}
+
+int Python_to_C_Call(char toC, char *fromC){
+  /* Code called by python should never touch to 
+     variables modified by PLC thread directly
+
+     AtomicCompareExchange comes from 
+     beremiz' runtime implementation */
+
+  int res = 0;
+  if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
+    PtoC=toC;
+    *fromC=CtoP;
+    AtomicCompareExchange((long*)&Lock, 1, 0);
+    res=1;
+  }
+  printf("C code called by Python: toC %d fromC %d\n",toC,*fromC);
+  printf("PLC_ID id %s\n",PLC_ID);
+  return res;
+}
+
+int PLC_C_Call(char fromPLC, char *toPLC){
+  /* PLC also have to be realy carefull not to 
+     conflict with asynchronous python access */
+  if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
+      CtoP = fromPLC;
+      *toPLC = PtoC;
+      AtomicCompareExchange((long*)&Lock, 1, 0);
+      return 1;
+  }
+  return 0;
+}
+]]></xhtml:p>
+  </globals>
+  <initFunction>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </initFunction>
+  <cleanUpFunction>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </cleanUpFunction>
+  <retrieveFunction>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </retrieveFunction>
+  <publishFunction>
+    <xhtml:p><![CDATA[
+if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
+    TestInput = CtoP + PtoC + TestOutput;
+    AtomicCompareExchange((long*)&Lock, 1, 0);
+}
+]]></xhtml:p>
+  </publishFunction>
+</CFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/c_code@c_ext/confnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<CExtension CFLAGS="" LDFLAGS=""/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,1644 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz:&#10;&#10;   1. How to implement python extensions.&#10;   2. How to implement basic C extension.&#10;   3. How to use C code in IEC POUs.&#10;   4. How to call C functions from python code.&#10;   5. How to avoid race conditions between IEC, C and python code.&#10;   6. How to convert betweet different IEC types.&#10;"/>
+  <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2020-10-19T23:53:08">
+    <coordinateInfo>
+      <pageSize x="1024" y="1024"/>
+      <fbd>
+        <scaling x="5" y="5"/>
+      </fbd>
+      <ld>
+        <scaling x="5" y="5"/>
+      </ld>
+      <sfc>
+        <scaling x="5" y="5"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes>
+      <dataType name="CPLX_TYPE">
+        <baseType>
+          <struct>
+            <variable name="FIRSTBYTE">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+            <variable name="SECONDBYTE">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+          </struct>
+        </baseType>
+      </dataType>
+      <dataType name="StateMachine">
+        <baseType>
+          <enum>
+            <values>
+              <value name="STANDBY"/>
+              <value name="START"/>
+              <value name="STOP"/>
+            </values>
+          </enum>
+        </baseType>
+      </dataType>
+      <dataType name="datatype0">
+        <baseType>
+          <BOOL/>
+        </baseType>
+      </dataType>
+      <dataType name="blups">
+        <baseType>
+          <array>
+            <dimension lower="0" upper="31"/>
+            <baseType>
+              <derived name="CPLX_TYPE"/>
+            </baseType>
+          </array>
+        </baseType>
+      </dataType>
+    </dataTypes>
+    <pous>
+      <pou name="main_pytest" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="mux1_sel">
+              <type>
+                <INT/>
+              </type>
+              <initialValue>
+                <simpleValue value="3"/>
+              </initialValue>
+              <documentation>
+                <xhtml:p><![CDATA[blah]]></xhtml:p>
+              </documentation>
+            </variable>
+            <variable name="mux2_sel">
+              <type>
+                <INT/>
+              </type>
+              <initialValue>
+                <simpleValue value="3"/>
+              </initialValue>
+            </variable>
+            <variable name="pytest_var1">
+              <type>
+                <string/>
+              </type>
+            </variable>
+            <variable name="fefvsd">
+              <type>
+                <derived name="datatype0"/>
+              </type>
+            </variable>
+            <variable name="pytest_var2">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="py1">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="Block1">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="Block2">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="Block3">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="pytest_var3">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="FromC">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+            <variable name="C_Pragma0">
+              <type>
+                <derived name="C_Pragma"/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="TestInput">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+            <variable name="TestOutput">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="FromInput">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+            <variable name="Test_BCD">
+              <type>
+                <WORD/>
+              </type>
+              <initialValue>
+                <simpleValue value="151"/>
+              </initialValue>
+            </variable>
+            <variable name="Test_BCD_WRONG">
+              <type>
+                <WORD/>
+              </type>
+              <initialValue>
+                <simpleValue value="154"/>
+              </initialValue>
+            </variable>
+            <variable name="Test_BCD_CONVERTED">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Test_BCD_RESULT">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="Test_BCD_WRONG_RESULT">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="Test_DT">
+              <type>
+                <DT/>
+              </type>
+              <initialValue>
+                <simpleValue value="DT#2013-02-23-22:35:46"/>
+              </initialValue>
+            </variable>
+            <variable name="Test_TOD">
+              <type>
+                <TOD/>
+              </type>
+            </variable>
+            <variable name="Test_TOD_STRING">
+              <type>
+                <string/>
+              </type>
+            </variable>
+            <variable name="Test_Date">
+              <type>
+                <DATE/>
+              </type>
+            </variable>
+            <variable name="Test_String">
+              <type>
+                <string/>
+              </type>
+              <initialValue>
+                <simpleValue value="test"/>
+              </initialValue>
+            </variable>
+            <variable name="Test_Bool">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="Global_RS">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+            <variable name="TUTU">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="TOTO">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Test_Python_Var">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Second_Python_Var">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Grumpf">
+              <type>
+                <string/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="RTC0">
+              <type>
+                <derived name="RTC"/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="SomeVarName">
+              <type>
+                <DINT/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="4" height="30" width="160" executionOrderId="0" negated="false">
+              <position x="295" y="450"/>
+              <connectionPointOut>
+                <relPosition x="160" y="15"/>
+              </connectionPointOut>
+              <expression>'666'</expression>
+            </inVariable>
+            <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0">
+              <position x="686" y="400"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="7" formalParameter="OUT">
+                      <position x="686" y="435"/>
+                      <position x="285" y="435"/>
+                      <position x="285" y="480"/>
+                      <position x="250" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="4">
+                      <position x="686" y="465"/>
+                      <position x="455" y="465"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="125" y="35"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="RESULT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="65"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="7" width="70" height="45" typeName="NOT" executionOrderId="0">
+              <position x="180" y="450"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="3">
+                      <position x="180" y="480"/>
+                      <position x="155" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inOutVariable localId="3" height="30" width="120" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="35" y="465"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="35" y="480"/>
+                  <position x="25" y="480"/>
+                  <position x="25" y="440"/>
+                  <position x="270" y="440"/>
+                  <position x="270" y="480"/>
+                  <position x="250" y="480"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="120" y="15"/>
+              </connectionPointOut>
+              <expression>pytest_var2</expression>
+            </inOutVariable>
+            <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0">
+              <position x="686" y="545"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="7" formalParameter="OUT">
+                      <position x="686" y="580"/>
+                      <position x="285" y="580"/>
+                      <position x="285" y="480"/>
+                      <position x="250" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="9">
+                      <position x="686" y="610"/>
+                      <position x="665" y="610"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="125" y="35"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="RESULT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="65"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="9" height="30" width="370" executionOrderId="0" negated="false">
+              <position x="295" y="595"/>
+              <connectionPointOut>
+                <relPosition x="370" y="15"/>
+              </connectionPointOut>
+              <expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
+            </inVariable>
+            <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
+              <position x="295" y="735"/>
+              <connectionPointOut>
+                <relPosition x="290" y="15"/>
+              </connectionPointOut>
+              <expression>'PLCBinary.Simple_C_Call(5678)'</expression>
+            </inVariable>
+            <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0">
+              <position x="686" y="687"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="33"/>
+                    <connection refLocalId="7" formalParameter="OUT">
+                      <position x="686" y="720"/>
+                      <position x="285" y="720"/>
+                      <position x="285" y="480"/>
+                      <position x="250" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="63"/>
+                    <connection refLocalId="11">
+                      <position x="686" y="750"/>
+                      <position x="585" y="750"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="125" y="33"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="RESULT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="63"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false">
+              <position x="290" y="885"/>
+              <connectionPointOut>
+                <relPosition x="290" y="15"/>
+              </connectionPointOut>
+              <expression>'MyPythonFunc(42)'</expression>
+            </inVariable>
+            <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0">
+              <position x="686" y="837"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="33"/>
+                    <connection refLocalId="7" formalParameter="OUT">
+                      <position x="686" y="870"/>
+                      <position x="285" y="870"/>
+                      <position x="285" y="480"/>
+                      <position x="250" y="480"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="63"/>
+                    <connection refLocalId="14">
+                      <position x="686" y="900"/>
+                      <position x="580" y="900"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="125" y="33"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="RESULT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="63"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="16" height="90" width="680">
+              <position x="35" y="275"/>
+              <content>
+                <xhtml:p><![CDATA[This part of the example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0">
+              <position x="1101" y="790"/>
+              <inputVariables>
+                <variable formalParameter="K">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="18">
+                      <position x="1101" y="820"/>
+                      <position x="1076" y="820"/>
+                      <position x="1076" y="810"/>
+                      <position x="1060" y="810"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5" formalParameter="RESULT">
+                      <position x="1101" y="840"/>
+                      <position x="941" y="840"/>
+                      <position x="941" y="465"/>
+                      <position x="811" y="465"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="8" formalParameter="RESULT">
+                      <position x="1101" y="860"/>
+                      <position x="926" y="860"/>
+                      <position x="926" y="610"/>
+                      <position x="811" y="610"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="12" formalParameter="RESULT">
+                      <position x="1101" y="880"/>
+                      <position x="911" y="880"/>
+                      <position x="911" y="750"/>
+                      <position x="811" y="750"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="15" formalParameter="RESULT">
+                      <position x="1101" y="900"/>
+                      <position x="811" y="900"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="80" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false">
+              <position x="1271" y="805"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="17" formalParameter="OUT">
+                  <position x="1271" y="820"/>
+                  <position x="1181" y="820"/>
+                </connection>
+              </connectionPointIn>
+              <expression>pytest_var1</expression>
+            </outVariable>
+            <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0">
+              <position x="1106" y="385"/>
+              <inputVariables>
+                <variable formalParameter="K">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="22">
+                      <position x="1106" y="415"/>
+                      <position x="1076" y="415"/>
+                      <position x="1076" y="405"/>
+                      <position x="1055" y="405"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="5" formalParameter="ACK">
+                      <position x="1106" y="435"/>
+                      <position x="811" y="435"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="8" formalParameter="ACK">
+                      <position x="1106" y="455"/>
+                      <position x="841" y="455"/>
+                      <position x="841" y="580"/>
+                      <position x="811" y="580"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="12" formalParameter="ACK">
+                      <position x="1106" y="475"/>
+                      <position x="856" y="475"/>
+                      <position x="856" y="720"/>
+                      <position x="811" y="720"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="15" formalParameter="ACK">
+                      <position x="1106" y="495"/>
+                      <position x="871" y="495"/>
+                      <position x="871" y="870"/>
+                      <position x="811" y="870"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="80" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="22" height="30" width="74" executionOrderId="0" negated="false">
+              <position x="981" y="390"/>
+              <connectionPointOut>
+                <relPosition x="74" y="15"/>
+              </connectionPointOut>
+              <expression>mux1_sel</expression>
+            </inVariable>
+            <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false">
+              <position x="1271" y="400"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="21" formalParameter="OUT">
+                  <position x="1271" y="415"/>
+                  <position x="1186" y="415"/>
+                </connection>
+              </connectionPointIn>
+              <expression>pytest_var3</expression>
+            </outVariable>
+            <outVariable localId="25" height="30" width="60" executionOrderId="0" negated="false">
+              <position x="320" y="1075"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="26" formalParameter="OUT">
+                  <position x="320" y="1090"/>
+                  <position x="265" y="1090"/>
+                </connection>
+              </connectionPointIn>
+              <expression>FromC</expression>
+            </outVariable>
+            <inVariable localId="1" height="30" width="30" executionOrderId="0" negated="false">
+              <position x="105" y="1075"/>
+              <connectionPointOut>
+                <relPosition x="30" y="15"/>
+              </connectionPointOut>
+              <expression>23</expression>
+            </inVariable>
+            <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0" executionOrderId="0">
+              <position x="185" y="1060"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="185" y="1090"/>
+                      <position x="135" y="1090"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="80" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="27" height="30" width="90" executionOrderId="0" negated="false">
+              <position x="100" y="1190"/>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>TestInput</expression>
+            </inVariable>
+            <outVariable localId="28" height="30" width="105" executionOrderId="0" negated="false">
+              <position x="195" y="1125"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="2">
+                  <position x="195" y="1140"/>
+                  <position x="140" y="1140"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TestOutput</expression>
+            </outVariable>
+            <outVariable localId="29" height="30" width="85" executionOrderId="0" negated="false">
+              <position x="215" y="1190"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="27">
+                  <position x="215" y="1205"/>
+                  <position x="190" y="1205"/>
+                </connection>
+              </connectionPointIn>
+              <expression>FromInput</expression>
+            </outVariable>
+            <inVariable localId="2" height="30" width="30" executionOrderId="0" negated="false">
+              <position x="110" y="1125"/>
+              <connectionPointOut>
+                <relPosition x="30" y="15"/>
+              </connectionPointOut>
+              <expression>10</expression>
+            </inVariable>
+            <comment localId="30" height="105" width="465">
+              <position x="50" y="925"/>
+              <content>
+                <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal  to 75.
+Happy hacking! ]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="31" height="90" width="345">
+              <position x="295" y="485"/>
+              <content>
+                <xhtml:p><![CDATA[Sleep here is bad. It blocks other py_eval instances. Whith a wxGlade GUI, GUI freeze for a second.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="6" height="80" width="345">
+              <position x="295" y="630"/>
+              <content>
+                <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="10" height="85" width="345">
+              <position x="295" y="770"/>
+              <content>
+                <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="32" height="145" width="235">
+              <position x="25" y="505"/>
+              <content>
+                <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
+              </content>
+            </comment>
+            <outVariable localId="33" height="30" width="133" executionOrderId="0" negated="false">
+              <position x="580" y="1564"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="35" formalParameter="OUT">
+                  <position x="580" y="1580"/>
+                  <position x="371" y="1580"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_BCD_RESULT</expression>
+            </outVariable>
+            <inVariable localId="34" height="30" width="75" executionOrderId="0" negated="false">
+              <position x="60" y="1564"/>
+              <connectionPointOut>
+                <relPosition x="75" y="16"/>
+              </connectionPointOut>
+              <expression>Test_BCD</expression>
+            </inVariable>
+            <block localId="35" width="106" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
+              <position x="265" y="1539"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="41"/>
+                    <connection refLocalId="34">
+                      <position x="265" y="1580"/>
+                      <position x="135" y="1580"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="106" y="41"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="36" height="30" width="66" executionOrderId="0" negated="false">
+              <position x="60" y="1774"/>
+              <connectionPointOut>
+                <relPosition x="66" y="16"/>
+              </connectionPointOut>
+              <expression>Test_DT</expression>
+            </inVariable>
+            <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY" executionOrderId="0">
+              <position x="265" y="1759"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="31"/>
+                    <connection refLocalId="36">
+                      <position x="265" y="1790"/>
+                      <position x="125" y="1790"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="255" y="31"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE" executionOrderId="0">
+              <position x="265" y="1834"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="31"/>
+                    <connection refLocalId="36">
+                      <position x="265" y="1865"/>
+                      <position x="242" y="1865"/>
+                      <position x="242" y="1790"/>
+                      <position x="125" y="1790"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="195" y="31"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="40" height="30" width="82" executionOrderId="0" negated="false">
+              <position x="580" y="1849"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="38" formalParameter="OUT">
+                  <position x="580" y="1865"/>
+                  <position x="460" y="1865"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_Date</expression>
+            </outVariable>
+            <outVariable localId="42" height="30" width="98" executionOrderId="0" negated="false">
+              <position x="465" y="1944"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="46" formalParameter="OUT">
+                  <position x="465" y="1960"/>
+                  <position x="395" y="1960"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_String</expression>
+            </outVariable>
+            <outVariable localId="43" height="30" width="82" executionOrderId="0" negated="false">
+              <position x="465" y="2014"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="44" formalParameter="OUT">
+                  <position x="465" y="2030"/>
+                  <position x="400" y="2030"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_Bool</expression>
+            </outVariable>
+            <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL" executionOrderId="0">
+              <position x="265" y="1999"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="31"/>
+                    <connection refLocalId="45">
+                      <position x="265" y="2030"/>
+                      <position x="115" y="2030"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="135" y="31"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="45" height="30" width="58" executionOrderId="0" negated="false">
+              <position x="60" y="2014"/>
+              <connectionPointOut>
+                <relPosition x="58" y="16"/>
+              </connectionPointOut>
+              <expression>'True'</expression>
+            </inVariable>
+            <block localId="46" width="130" height="45" typeName="INT_TO_STRING" executionOrderId="0">
+              <position x="265" y="1929"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="31"/>
+                    <connection refLocalId="58">
+                      <position x="265" y="1960"/>
+                      <position x="205" y="1960"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="130" y="31"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="50" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="75" y="2275"/>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
+              </connectionPointOut>
+              <expression>Global_RS.Q1</expression>
+            </inVariable>
+            <block localId="51" width="70" height="85" typeName="AND" executionOrderId="0">
+              <position x="240" y="2255"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="50">
+                      <position x="240" y="2290"/>
+                      <position x="180" y="2290"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="52">
+                      <position x="240" y="2325"/>
+                      <position x="180" y="2325"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="52" height="30" width="105" executionOrderId="0" negated="false">
+              <position x="75" y="2310"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>BOOL#TRUE</expression>
+            </inVariable>
+            <outVariable localId="13" height="30" width="105" executionOrderId="0" negated="false">
+              <position x="385" y="2275"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="51" formalParameter="OUT">
+                  <position x="385" y="2290"/>
+                  <position x="310" y="2290"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Global_RS.S</expression>
+            </outVariable>
+            <outVariable localId="20" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="385" y="2390"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="41" formalParameter="OUT">
+                  <position x="385" y="2405"/>
+                  <position x="310" y="2405"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Global_RS.R1</expression>
+            </outVariable>
+            <inVariable localId="24" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="75" y="2390"/>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
+              </connectionPointOut>
+              <expression>Global_RS.Q1</expression>
+            </inVariable>
+            <block localId="41" width="70" height="85" typeName="OR" executionOrderId="0">
+              <position x="240" y="2370"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="24">
+                      <position x="240" y="2405"/>
+                      <position x="180" y="2405"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="48">
+                      <position x="240" y="2440"/>
+                      <position x="180" y="2440"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="48" height="30" width="105" executionOrderId="0" negated="false">
+              <position x="75" y="2425"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>BOOL#FALSE</expression>
+            </inVariable>
+            <outVariable localId="54" height="30" width="135" executionOrderId="0" negated="false">
+              <position x="930" y="1774"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="55" formalParameter="OUT">
+                  <position x="930" y="1790"/>
+                  <position x="855" y="1790"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_TOD_STRING</expression>
+            </outVariable>
+            <block localId="55" width="125" height="45" typeName="TOD_TO_STRING" executionOrderId="0">
+              <position x="730" y="1759"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="31"/>
+                    <connection refLocalId="39">
+                      <position x="730" y="1790"/>
+                      <position x="655" y="1790"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="125" y="31"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inOutVariable localId="39" height="30" width="75" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="580" y="1774"/>
+              <connectionPointIn>
+                <relPosition x="0" y="16"/>
+                <connection refLocalId="37" formalParameter="OUT">
+                  <position x="580" y="1790"/>
+                  <position x="520" y="1790"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="75" y="16"/>
+              </connectionPointOut>
+              <expression>Test_TOD</expression>
+            </inOutVariable>
+            <inVariable localId="49" height="30" width="30" executionOrderId="0" negated="false">
+              <position x="160" y="2510"/>
+              <connectionPointOut>
+                <relPosition x="30" y="15"/>
+              </connectionPointOut>
+              <expression>42</expression>
+            </inVariable>
+            <outVariable localId="57" height="30" width="50" executionOrderId="0" negated="false">
+              <position x="240" y="2510"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="49">
+                  <position x="240" y="2525"/>
+                  <position x="190" y="2525"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TOTO</expression>
+            </outVariable>
+            <outVariable localId="56" height="30" width="50" executionOrderId="0" negated="false">
+              <position x="240" y="2550"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="49">
+                  <position x="240" y="2565"/>
+                  <position x="215" y="2565"/>
+                  <position x="215" y="2525"/>
+                  <position x="190" y="2525"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TUTU</expression>
+            </outVariable>
+            <inVariable localId="58" height="30" width="146" executionOrderId="0" negated="false">
+              <position x="60" y="1944"/>
+              <connectionPointOut>
+                <relPosition x="146" y="16"/>
+              </connectionPointOut>
+              <expression>Second_Python_Var</expression>
+            </inVariable>
+            <inVariable localId="59" height="30" width="30" executionOrderId="0" negated="false">
+              <position x="100" y="1385"/>
+              <connectionPointOut>
+                <relPosition x="30" y="15"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <block localId="61" typeName="function0" executionOrderId="0" height="45" width="111">
+              <position x="760" y="1170"/>
+              <inputVariables>
+                <variable formalParameter="LocalVar0">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="62">
+                      <position x="760" y="1200"/>
+                      <position x="723" y="1200"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="111" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="62" executionOrderId="0" height="30" width="58" negated="false">
+              <position x="665" y="1185"/>
+              <connectionPointOut>
+                <relPosition x="58" y="15"/>
+              </connectionPointOut>
+              <expression>fefvsd</expression>
+            </inVariable>
+            <outVariable localId="63" executionOrderId="0" height="30" width="58" negated="false">
+              <position x="905" y="1185"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="61" formalParameter="OUT">
+                  <position x="905" y="1200"/>
+                  <position x="871" y="1200"/>
+                </connection>
+              </connectionPointIn>
+              <expression>fefvsd</expression>
+            </outVariable>
+            <comment localId="53" height="80" width="420">
+              <position x="75" y="2160"/>
+              <content>
+                <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="18" height="30" width="74" executionOrderId="0" negated="false">
+              <position x="986" y="795"/>
+              <connectionPointOut>
+                <relPosition x="74" y="15"/>
+              </connectionPointOut>
+              <expression>mux2_sel</expression>
+            </inVariable>
+            <comment localId="60" height="45" width="930">
+              <position x="60" y="1480"/>
+              <content>
+                <xhtml:p><![CDATA[Here is shown how to convert values between different types (BCD, DT, TOD, STRING and others) using standard functions.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="64" height="55" width="300">
+              <position x="665" y="1095"/>
+              <content>
+                <xhtml:p><![CDATA[Example of usage of user-defined function.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="65" height="45" width="410">
+              <position x="55" y="1315"/>
+              <content>
+                <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="66" height="30" width="137" executionOrderId="0" negated="false">
+              <position x="60" y="1685"/>
+              <connectionPointOut>
+                <relPosition x="137" y="15"/>
+              </connectionPointOut>
+              <expression>Test_BCD_WRONG</expression>
+            </inVariable>
+            <block localId="67" width="106" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
+              <position x="265" y="1620"/>
+              <inputVariables>
+                <variable formalParameter="EN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="66">
+                      <position x="265" y="1700"/>
+                      <position x="255" y="1700"/>
+                      <position x="255" y="1700"/>
+                      <position x="345" y="1700"/>
+                      <position x="345" y="1700"/>
+                      <position x="197" y="1700"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ENO">
+                  <connectionPointOut>
+                    <relPosition x="106" y="40"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="106" y="80"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="68" height="30" width="196" executionOrderId="0" negated="false">
+              <position x="580" y="1685"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="67" formalParameter="OUT">
+                  <position x="580" y="1700"/>
+                  <position x="371" y="1700"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_BCD_WRONG_RESULT</expression>
+            </outVariable>
+            <comment localId="69" height="165" width="375">
+              <position x="795" y="1590"/>
+              <content>
+                <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT.
+
+151 (16#97) is good BCD number , but 
+154 (16#9A) is not.  
+
+Try this out and look at value of  Test_BCD_CONVERTED variable.
+
+
+]]></xhtml:p>
+              </content>
+            </comment>
+            <outVariable localId="70" height="30" width="185" executionOrderId="0" negated="false">
+              <position x="580" y="1645"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="67" formalParameter="ENO">
+                  <position x="580" y="1660"/>
+                  <position x="370" y="1660"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_BCD_CONVERTED</expression>
+            </outVariable>
+            <comment localId="71" height="215" width="680">
+              <position x="35" y="30"/>
+              <content>
+                <xhtml:p><![CDATA[This example shows many features in Beremiz:
+
+   1. How to implement python extensions.
+   2. How to implement basic C extension.
+   3. How to use C code in IEC POUs.
+   4. How to call C functions from python code.
+   5. How to avoid race conditions between IEC, C and python code.
+   6. How to convert betweet different IEC types.
+]]></xhtml:p>
+              </content>
+            </comment>
+            <outVariable localId="72" executionOrderId="0" height="30" width="60" negated="false">
+              <position x="1065" y="1970"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="76" formalParameter="OUT">
+                  <position x="1065" y="1985"/>
+                  <position x="1025" y="1985"/>
+                  <position x="1025" y="1995"/>
+                  <position x="985" y="1995"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Grumpf</expression>
+            </outVariable>
+            <inVariable localId="73" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="625" y="1940"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>BOOL#TRUE</expression>
+            </inVariable>
+            <inVariable localId="74" executionOrderId="0" height="30" width="70" negated="false">
+              <position x="625" y="1975"/>
+              <connectionPointOut>
+                <relPosition x="70" y="15"/>
+              </connectionPointOut>
+              <expression>Test_DT</expression>
+            </inVariable>
+            <block localId="75" typeName="RTC" instanceName="RTC0" executionOrderId="0" height="90" width="65">
+              <position x="760" y="1925"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="73">
+                      <position x="760" y="1960"/>
+                      <position x="735" y="1960"/>
+                      <position x="735" y="1955"/>
+                      <position x="710" y="1955"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PDT">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="74">
+                      <position x="760" y="1995"/>
+                      <position x="727" y="1995"/>
+                      <position x="727" y="1990"/>
+                      <position x="695" y="1990"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="65" y="35"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CDT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="70"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="76" typeName="DT_TO_STRING" executionOrderId="0" height="40" width="110">
+              <position x="875" y="1965"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="75" formalParameter="CDT">
+                      <position x="875" y="1995"/>
+                      <position x="825" y="1995"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="110" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="77" typeName="ADD" executionOrderId="0" height="60" width="65">
+              <position x="170" y="1370"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="59">
+                      <position x="170" y="1400"/>
+                      <position x="130" y="1400"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="78">
+                      <position x="170" y="1420"/>
+                      <position x="160" y="1420"/>
+                      <position x="160" y="1450"/>
+                      <position x="390" y="1450"/>
+                      <position x="390" y="1400"/>
+                      <position x="380" y="1400"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="65" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="47" executionOrderId="0" height="30" width="130" negated="false">
+              <position x="625" y="1335"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="79">
+                  <position x="625" y="1350"/>
+                  <position x="590" y="1350"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Test_Python_Var</expression>
+            </outVariable>
+            <inVariable localId="79" executionOrderId="0" height="25" width="30" negated="false">
+              <position x="560" y="1340"/>
+              <connectionPointOut>
+                <relPosition x="30" y="10"/>
+              </connectionPointOut>
+              <expression>23</expression>
+            </inVariable>
+            <inOutVariable localId="78" executionOrderId="0" height="30" width="100" negatedOut="false" negatedIn="false">
+              <position x="280" y="1385"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="77" formalParameter="OUT">
+                  <position x="280" y="1400"/>
+                  <position x="235" y="1400"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="100" y="15"/>
+              </connectionPointOut>
+              <expression>SomeVarName</expression>
+            </inOutVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="C_Pragma" pouType="functionBlock">
+        <interface>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="IN">
+              <type>
+                <SINT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="COORDS">
+              <type>
+                <array>
+                  <dimension lower="0" upper="5"/>
+                  <baseType>
+                    <SINT/>
+                  </baseType>
+                </array>
+              </type>
+              <initialValue>
+                <arrayValue>
+                  <value>
+                    <simpleValue value="54"/>
+                  </value>
+                  <value>
+                    <simpleValue value="55"/>
+                  </value>
+                  <value>
+                    <simpleValue value="56"/>
+                  </value>
+                  <value>
+                    <simpleValue value="57"/>
+                  </value>
+                  <value>
+                    <simpleValue value="58"/>
+                  </value>
+                  <value>
+                    <simpleValue value="59"/>
+                  </value>
+                </arrayValue>
+              </initialValue>
+            </variable>
+            <variable name="SMURF">
+              <type>
+                <derived name="CPLX_TYPE"/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="Global_RS">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+            <variable name="Dudiduda">
+              <type>
+                <derived name="blups"/>
+              </type>
+            </variable>
+          </externalVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[(* hereafter is a C pragma accessing FB interface in a clean way *)
+{{
+  char toPLC;
+  char fromPLC = GetFbVar(IN);
+  extern int PLC_C_Call(char, char *);
+  if(PLC_C_Call(fromPLC, &toPLC)){
+    SetFbVar(OUT, toPLC);
+  }
+  if(0){
+    /* that code demonstrate C access to complex types */
+    char somebyte = GetFbVar(COORDS, .table[3]);
+    SetFbVar(SMURF, somebyte, .FIRSTBYTE);
+    SetFbVar(COORDS, somebyte, .table[4]);
+  }
+}}
+(* If you do not use GetFbVar and SetFbVar macros, expect unexpected behaviour*)
+Global_RS();
+
+(* testing access to global struct array *)
+Dudiduda[2].FIRSTBYTE := 0;
+]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+      <pou name="norm" pouType="function">
+        <interface>
+          <returnType>
+            <REAL/>
+          </returnType>
+          <inputVars>
+            <variable name="IN1">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="IN2">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </inputVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[NORM := SQRT(IN1 * IN1 + IN2 * IN2);]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+      <pou name="function0" pouType="function">
+        <interface>
+          <returnType>
+            <derived name="datatype0"/>
+          </returnType>
+          <inputVars>
+            <variable name="LocalVar0">
+              <type>
+                <derived name="datatype0"/>
+              </type>
+            </variable>
+          </inputVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[function0 := LocalVar0;
+]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="res_pytest">
+          <task name="pytest_task" priority="0" interval="T#500ms"/>
+          <globalVars>
+            <variable name="TOTO">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </globalVars>
+          <pouInstance name="pytest_instance" typeName="main_pytest"/>
+        </resource>
+        <globalVars>
+          <variable name="Global_RS">
+            <type>
+              <derived name="RS"/>
+            </type>
+          </variable>
+          <variable name="Dudiduda">
+            <type>
+              <derived name="blups"/>
+            </type>
+          </variable>
+          <variable name="TUTU">
+            <type>
+              <INT/>
+            </type>
+          </variable>
+        </globalVars>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/py_ext_0@py_ext/baseconfnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="2" Name="py_ext_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/py_ext_0@py_ext/pyfile.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <variables>
+    <variable name="SomeVarName" type="DINT" onchange="MyFunc, SomeChange"/>
+    <variable name="Grumpf" type="STRING" initial="'mhoo'" onchange="MyFunc, MyOtherFunc"/>
+  </variables>
+  <globals>
+    <xhtml:p><![CDATA[
+print "All python PLC globals variables :", PLCGlobalsDesc
+print "Current extention name :", __ext_name__
+
+def MyFunc(*args):
+    print args
+
+def MyOtherFunc(*args):
+    print "other", args
+
+def SomeChange(*args):
+    print "count",OnChange.SomeVarName.count
+    print "first",OnChange.SomeVarName.first
+    print "last",OnChange.SomeVarName.last
+
+
+]]></xhtml:p>
+  </globals>
+  <init>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </init>
+  <cleanup>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </cleanup>
+  <start>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </start>
+  <stop>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </stop>
+</PyFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/python@py_ext/baseconfnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams Name="python" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/python/python@py_ext/pyfile.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,69 @@
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <variables>
+    <variable name="Test_Python_Var" type="INT" initial="4"/>
+    <variable name="Second_Python_Var" type="INT" initial="5"/>
+  </variables>
+  <globals>
+    <xhtml:p><![CDATA[
+import time,sys,ctypes
+Python_to_C_Call = PLCBinary.Python_to_C_Call
+Python_to_C_Call.restype = ctypes.c_int
+Python_to_C_Call.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_int)]
+
+def MyPythonFunc(arg):
+    i = ctypes.c_int()
+    if(Python_to_C_Call(arg, i)):
+        res = i.value
+        print "toC:", arg, "from C:", res, "FBID:", FBID
+    else:
+        print "Failed Python_to_C_Call failed"
+        res = None
+    print "Python read PLC global :",PLCGlobals.Test_Python_Var
+    print "Python read PLC global Grumpf :",PLCGlobals.Grumpf
+    PLCGlobals.Second_Python_Var = 789
+    sys.stdout.flush()
+    return res
+
+async_error_test_code = """
+def badaboom():
+    tuple()[0]
+
+import wx
+def badaboomwx():
+    wx.CallAfter(badaboom)
+
+from threading import Timer
+a = Timer(3, badaboom)
+a.start()
+
+b = Timer(6, badaboomwx)
+b.start()
+"""
+]]></xhtml:p>
+  </globals>
+  <init>
+    <xhtml:p><![CDATA[
+global x, y
+x = 2
+y = 5
+print "py_runtime init:", x, ",", y
+]]></xhtml:p>
+  </init>
+  <cleanup>
+    <xhtml:p><![CDATA[
+print "py_runtime cleanup"
+]]></xhtml:p>
+  </cleanup>
+  <start>
+    <xhtml:p><![CDATA[
+global x, y
+print "py_runtime start", x * x + y * y
+]]></xhtml:p>
+  </start>
+  <stop>
+    <xhtml:p><![CDATA[
+print "py_runtime stop"
+]]></xhtml:p>
+  </stop>
+</PyFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_SVGHMI_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,1428 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Beremiz" productName="Unnamed" productVersion="1" creationDateTime="2012-09-04T16:16:33"/>
+  <contentHeader name="traffic_lights" modificationDateTime="2021-10-01T22:28:55">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="traffic_light_sequence" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="SWITCH_BUTTON">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="PEDESTRIAN_BUTTON">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="RED_LIGHT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ORANGE_LIGHT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="GREEN_LIGHT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="PEDESTRIAN_RED_LIGHT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="PEDESTRIAN_GREEN_LIGHT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="TON1">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="TON2">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="ALLOW_CARS">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="WARN_CARS">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="STOP_CARS">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ALLOW_PEDESTRIANS">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="STOP_PEDESTRIANS">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="TON3">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="R_TRIG0">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+            <variable name="R_TRIG1">
+              <type>
+                <derived name="R_TRIG"/>
+              </type>
+            </variable>
+            <variable name="SR0">
+              <type>
+                <derived name="SR"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <actions>
+          <action name="BLINK_ORANGE_LIGHT">
+            <body>
+              <LD>
+                <leftPowerRail localId="1" height="40" width="3">
+                  <position x="54" y="123"/>
+                  <connectionPointOut formalParameter="">
+                    <relPosition x="3" y="20"/>
+                  </connectionPointOut>
+                </leftPowerRail>
+                <contact localId="2" height="15" width="21" negated="true">
+                  <position x="121" y="135"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="8"/>
+                    <connection refLocalId="1">
+                      <position x="121" y="143"/>
+                      <position x="56" y="143"/>
+                    </connection>
+                  </connectionPointIn>
+                  <connectionPointOut>
+                    <relPosition x="21" y="8"/>
+                  </connectionPointOut>
+                  <variable>ORANGE_LIGHT</variable>
+                </contact>
+                <block localId="3" width="97" height="102" typeName="TON" instanceName="TON1">
+                  <position x="216" y="103"/>
+                  <inputVariables>
+                    <variable formalParameter="IN">
+                      <connectionPointIn>
+                        <relPosition x="0" y="40"/>
+                        <connection refLocalId="2">
+                          <position x="216" y="143"/>
+                          <position x="142" y="143"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                    <variable formalParameter="PT">
+                      <connectionPointIn>
+                        <relPosition x="0" y="81"/>
+                        <connection refLocalId="4">
+                          <position x="216" y="184"/>
+                          <position x="151" y="184"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                  </inputVariables>
+                  <inOutVariables/>
+                  <outputVariables>
+                    <variable formalParameter="Q">
+                      <connectionPointOut>
+                        <relPosition x="97" y="40"/>
+                      </connectionPointOut>
+                    </variable>
+                    <variable formalParameter="ET">
+                      <connectionPointOut>
+                        <relPosition x="97" y="81"/>
+                      </connectionPointOut>
+                    </variable>
+                  </outputVariables>
+                </block>
+                <inVariable localId="4" height="37" width="76" negated="false">
+                  <position x="75" y="166"/>
+                  <connectionPointOut>
+                    <relPosition x="76" y="18"/>
+                  </connectionPointOut>
+                  <expression>T#500ms</expression>
+                </inVariable>
+                <block localId="5" width="97" height="106" typeName="TON" instanceName="TON2">
+                  <position x="216" y="251"/>
+                  <inputVariables>
+                    <variable formalParameter="IN">
+                      <connectionPointIn>
+                        <relPosition x="0" y="41"/>
+                        <connection refLocalId="14">
+                          <position x="216" y="292"/>
+                          <position x="155" y="292"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                    <variable formalParameter="PT">
+                      <connectionPointIn>
+                        <relPosition x="0" y="84"/>
+                        <connection refLocalId="15">
+                          <position x="216" y="335"/>
+                          <position x="162" y="335"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                  </inputVariables>
+                  <inOutVariables/>
+                  <outputVariables>
+                    <variable formalParameter="Q">
+                      <connectionPointOut>
+                        <relPosition x="97" y="41"/>
+                      </connectionPointOut>
+                    </variable>
+                    <variable formalParameter="ET">
+                      <connectionPointOut>
+                        <relPosition x="97" y="84"/>
+                      </connectionPointOut>
+                    </variable>
+                  </outputVariables>
+                </block>
+                <coil localId="6" height="15" width="21" storage="reset">
+                  <position x="517" y="284"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="8"/>
+                    <connection refLocalId="10" formalParameter="Q">
+                      <position x="517" y="292"/>
+                      <position x="427" y="292"/>
+                    </connection>
+                  </connectionPointIn>
+                  <connectionPointOut>
+                    <relPosition x="21" y="8"/>
+                  </connectionPointOut>
+                  <variable>ORANGE_LIGHT</variable>
+                </coil>
+                <rightPowerRail localId="7" height="40" width="3">
+                  <position x="598" y="123"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="20"/>
+                    <connection refLocalId="8">
+                      <position x="598" y="143"/>
+                      <position x="530" y="143"/>
+                    </connection>
+                  </connectionPointIn>
+                </rightPowerRail>
+                <coil localId="8" height="15" width="21" storage="set">
+                  <position x="509" y="135"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="8"/>
+                    <connection refLocalId="11" formalParameter="Q">
+                      <position x="509" y="143"/>
+                      <position x="428" y="143"/>
+                    </connection>
+                  </connectionPointIn>
+                  <connectionPointOut>
+                    <relPosition x="21" y="8"/>
+                  </connectionPointOut>
+                  <variable>ORANGE_LIGHT</variable>
+                </coil>
+                <comment localId="9" height="52" width="318">
+                  <position x="51" y="11"/>
+                  <content>
+                    <xhtml:p><![CDATA[This action makes the orange light blink]]></xhtml:p>
+                  </content>
+                </comment>
+                <block localId="10" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG0">
+                  <position x="370" y="262"/>
+                  <inputVariables>
+                    <variable formalParameter="CLK">
+                      <connectionPointIn>
+                        <relPosition x="0" y="30"/>
+                        <connection refLocalId="5" formalParameter="Q">
+                          <position x="370" y="292"/>
+                          <position x="313" y="292"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                  </inputVariables>
+                  <inOutVariables/>
+                  <outputVariables>
+                    <variable formalParameter="Q">
+                      <connectionPointOut>
+                        <relPosition x="58" y="30"/>
+                      </connectionPointOut>
+                    </variable>
+                  </outputVariables>
+                </block>
+                <block localId="11" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG1">
+                  <position x="371" y="113"/>
+                  <inputVariables>
+                    <variable formalParameter="CLK">
+                      <connectionPointIn>
+                        <relPosition x="0" y="30"/>
+                        <connection refLocalId="3" formalParameter="Q">
+                          <position x="371" y="143"/>
+                          <position x="313" y="143"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                  </inputVariables>
+                  <inOutVariables/>
+                  <outputVariables>
+                    <variable formalParameter="Q">
+                      <connectionPointOut>
+                        <relPosition x="58" y="30"/>
+                      </connectionPointOut>
+                    </variable>
+                  </outputVariables>
+                </block>
+                <rightPowerRail localId="12" height="40" width="3">
+                  <position x="597" y="272"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="20"/>
+                    <connection refLocalId="6">
+                      <position x="597" y="292"/>
+                      <position x="538" y="292"/>
+                    </connection>
+                  </connectionPointIn>
+                </rightPowerRail>
+                <leftPowerRail localId="13" height="40" width="3">
+                  <position x="67" y="272"/>
+                  <connectionPointOut formalParameter="">
+                    <relPosition x="3" y="20"/>
+                  </connectionPointOut>
+                </leftPowerRail>
+                <contact localId="14" height="15" width="21">
+                  <position x="134" y="284"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="8"/>
+                    <connection refLocalId="13">
+                      <position x="134" y="292"/>
+                      <position x="69" y="292"/>
+                    </connection>
+                  </connectionPointIn>
+                  <connectionPointOut>
+                    <relPosition x="21" y="8"/>
+                  </connectionPointOut>
+                  <variable>ORANGE_LIGHT</variable>
+                </contact>
+                <inVariable localId="15" height="36" width="77" negated="false">
+                  <position x="85" y="317"/>
+                  <connectionPointOut>
+                    <relPosition x="77" y="18"/>
+                  </connectionPointOut>
+                  <expression>T#500ms</expression>
+                </inVariable>
+              </LD>
+            </body>
+          </action>
+        </actions>
+        <transitions>
+          <transition name="STOP">
+            <body>
+              <FBD>
+                <block localId="42" width="59" height="53" typeName="NOT" executionOrderId="0">
+                  <position x="237" y="31"/>
+                  <inputVariables>
+                    <variable formalParameter="IN">
+                      <connectionPointIn>
+                        <relPosition x="0" y="36"/>
+                        <connection refLocalId="43">
+                          <position x="237" y="67"/>
+                          <position x="202" y="67"/>
+                        </connection>
+                      </connectionPointIn>
+                    </variable>
+                  </inputVariables>
+                  <inOutVariables/>
+                  <outputVariables>
+                    <variable formalParameter="OUT">
+                      <connectionPointOut>
+                        <relPosition x="59" y="36"/>
+                      </connectionPointOut>
+                    </variable>
+                  </outputVariables>
+                </block>
+                <inVariable localId="43" height="39" width="164" executionOrderId="0" negated="false">
+                  <position x="38" y="48"/>
+                  <connectionPointOut>
+                    <relPosition x="164" y="19"/>
+                  </connectionPointOut>
+                  <expression>SWITCH_BUTTON</expression>
+                </inVariable>
+                <outVariable localId="44" height="40" width="46" executionOrderId="0" negated="false">
+                  <position x="351" y="47"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="20"/>
+                    <connection refLocalId="42" formalParameter="OUT">
+                      <position x="351" y="67"/>
+                      <position x="296" y="67"/>
+                    </connection>
+                  </connectionPointIn>
+                  <expression>STOP</expression>
+                </outVariable>
+              </FBD>
+            </body>
+          </transition>
+        </transitions>
+        <body>
+          <SFC>
+            <step localId="1" height="37" width="121" name="Standstill" initialStep="true">
+              <position x="509" y="31"/>
+              <connectionPointIn>
+                <relPosition x="60" y="0"/>
+                <connection refLocalId="39">
+                  <position x="569" y="31"/>
+                  <position x="569" y="11"/>
+                  <position x="963" y="11"/>
+                  <position x="963" y="1151"/>
+                  <position x="776" y="1151"/>
+                  <position x="776" y="1097"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="60" y="37"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="121" y="18"/>
+              </connectionPointOutAction>
+            </step>
+            <transition localId="2" height="2" width="20">
+              <position x="559" y="222"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="1">
+                  <position x="569" y="222"/>
+                  <position x="569" y="68"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[SWITCH_BUTTON]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="3" height="30" width="118" name="ORANGE">
+              <position x="510" y="250"/>
+              <connectionPointIn>
+                <relPosition x="59" y="0"/>
+                <connection refLocalId="2">
+                  <position x="569" y="250"/>
+                  <position x="569" y="224"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="59" y="30"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="118" y="15"/>
+              </connectionPointOutAction>
+            </step>
+            <transition localId="6" height="2" width="20">
+              <position x="559" y="376"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="15">
+                  <position x="569" y="376"/>
+                  <position x="569" y="336"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[STOP_CARS]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <actionBlock localId="8" width="231" height="162">
+              <position x="711" y="34"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="1">
+                  <position x="711" y="49"/>
+                  <position x="630" y="49"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="P">
+                <relPosition x="0" y="0"/>
+                <inline>
+                  <ST>
+                    <xhtml:p><![CDATA[ORANGE_LIGHT := 1;]]></xhtml:p>
+                  </ST>
+                </inline>
+              </action>
+              <action localId="0">
+                <relPosition x="0" y="0"/>
+                <reference name="BLINK_ORANGE_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="GREEN_LIGHT"/>
+              </action>
+            </actionBlock>
+            <actionBlock localId="9" width="232" height="125">
+              <position x="711" y="250"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3">
+                  <position x="711" y="265"/>
+                  <position x="628" y="265"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="GREEN_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="ORANGE_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="D" duration="T#2s">
+                <relPosition x="0" y="0"/>
+                <reference name="STOP_CARS"/>
+              </action>
+            </actionBlock>
+            <step localId="10" height="34" width="92" name="RED">
+              <position x="523" y="411"/>
+              <connectionPointIn>
+                <relPosition x="46" y="0"/>
+                <connection refLocalId="6">
+                  <position x="569" y="411"/>
+                  <position x="569" y="378"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="46" y="34"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="92" y="17"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="11" width="235" height="103">
+              <position x="710" y="413"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="10">
+                  <position x="710" y="428"/>
+                  <position x="615" y="428"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="ORANGE_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="D" duration="T#2s">
+                <relPosition x="0" y="0"/>
+                <reference name="ALLOW_PEDESTRIANS"/>
+              </action>
+            </actionBlock>
+            <transition localId="12" height="2" width="20">
+              <position x="559" y="533"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="7">
+                  <position x="569" y="533"/>
+                  <position x="569" y="487"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[ALLOW_PEDESTRIANS]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <selectionDivergence localId="15" height="1" width="154">
+              <position x="415" y="335"/>
+              <connectionPointIn>
+                <relPosition x="154" y="0"/>
+                <connection refLocalId="3">
+                  <position x="569" y="335"/>
+                  <position x="569" y="280"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="154" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="16" height="2" width="20">
+              <position x="405" y="377"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="15">
+                  <position x="415" y="377"/>
+                  <position x="415" y="336"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <reference name="STOP"/>
+              </condition>
+            </transition>
+            <jumpStep localId="17" height="13" width="12" targetName="Standstill">
+              <position x="409" y="418"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="16">
+                  <position x="415" y="418"/>
+                  <position x="415" y="379"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <transition localId="4" height="2" width="20">
+              <position x="400" y="528"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="7">
+                  <position x="410" y="528"/>
+                  <position x="410" y="487"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <reference name="STOP"/>
+              </condition>
+            </transition>
+            <jumpStep localId="5" height="13" width="12" targetName="Standstill">
+              <position x="404" y="553"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="4">
+                  <position x="410" y="553"/>
+                  <position x="410" y="530"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <selectionDivergence localId="7" height="1" width="159">
+              <position x="410" y="486"/>
+              <connectionPointIn>
+                <relPosition x="159" y="0"/>
+                <connection refLocalId="10">
+                  <position x="569" y="486"/>
+                  <position x="569" y="445"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="159" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <step localId="18" height="32" width="177" name="PEDESTRIAN_GREEN">
+              <position x="481" y="572"/>
+              <connectionPointIn>
+                <relPosition x="88" y="0"/>
+                <connection refLocalId="12">
+                  <position x="569" y="572"/>
+                  <position x="569" y="535"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="88" y="32"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="177" y="16"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="19" width="247" height="110">
+              <position x="708" y="573"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="18">
+                  <position x="708" y="588"/>
+                  <position x="658" y="588"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="D" duration="T#10s">
+                <relPosition x="0" y="0"/>
+                <reference name="STOP_PEDESTRIANS"/>
+              </action>
+            </actionBlock>
+            <transition localId="20" height="2" width="20">
+              <position x="400" y="653"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="22">
+                  <position x="410" y="653"/>
+                  <position x="410" y="626"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <jumpStep localId="21" height="13" width="12" targetName="Standstill">
+              <position x="404" y="694"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="20">
+                  <position x="410" y="694"/>
+                  <position x="410" y="655"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <selectionDivergence localId="22" height="1" width="159">
+              <position x="410" y="625"/>
+              <connectionPointIn>
+                <relPosition x="159" y="0"/>
+                <connection refLocalId="18">
+                  <position x="569" y="625"/>
+                  <position x="569" y="615"/>
+                  <position x="569" y="615"/>
+                  <position x="569" y="604"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="159" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="23" height="2" width="20">
+              <position x="559" y="709"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="22">
+                  <position x="569" y="709"/>
+                  <position x="569" y="626"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[STOP_PEDESTRIANS]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="24" height="30" width="148" name="PEDESTRIAN_RED">
+              <position x="495" y="748"/>
+              <connectionPointIn>
+                <relPosition x="74" y="0"/>
+                <connection refLocalId="23">
+                  <position x="569" y="748"/>
+                  <position x="569" y="711"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="74" y="30"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="148" y="15"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="25" width="239" height="110">
+              <position x="708" y="748"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="24">
+                  <position x="708" y="763"/>
+                  <position x="643" y="763"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="D" duration="T#2s">
+                <relPosition x="0" y="0"/>
+                <reference name="ALLOW_CARS"/>
+              </action>
+            </actionBlock>
+            <transition localId="26" height="2" width="20">
+              <position x="400" y="857"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="28">
+                  <position x="410" y="857"/>
+                  <position x="410" y="816"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <connectionPointIn>
+                  <connection refLocalId="48">
+                    <position x="400" y="858"/>
+                    <position x="290" y="858"/>
+                  </connection>
+                </connectionPointIn>
+              </condition>
+            </transition>
+            <jumpStep localId="27" height="13" width="12" targetName="Standstill">
+              <position x="404" y="898"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="26">
+                  <position x="410" y="898"/>
+                  <position x="410" y="859"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <selectionDivergence localId="28" height="1" width="159">
+              <position x="410" y="815"/>
+              <connectionPointIn>
+                <relPosition x="159" y="0"/>
+                <connection refLocalId="24">
+                  <position x="569" y="815"/>
+                  <position x="569" y="778"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="159" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="29" height="2" width="20">
+              <position x="559" y="879"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="28">
+                  <position x="569" y="879"/>
+                  <position x="569" y="816"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[ALLOW_CARS]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <step localId="30" height="33" width="92" name="GREEN">
+              <position x="523" y="930"/>
+              <connectionPointIn>
+                <relPosition x="46" y="0"/>
+                <connection refLocalId="29">
+                  <position x="569" y="930"/>
+                  <position x="569" y="881"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="46" y="33"/>
+              </connectionPointOut>
+              <connectionPointOutAction formalParameter="">
+                <relPosition x="92" y="16"/>
+              </connectionPointOutAction>
+            </step>
+            <actionBlock localId="31" width="227" height="110">
+              <position x="709" y="931"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="30">
+                  <position x="709" y="946"/>
+                  <position x="615" y="946"/>
+                </connection>
+              </connectionPointIn>
+              <action localId="0" qualifier="S">
+                <relPosition x="0" y="0"/>
+                <reference name="GREEN_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="R">
+                <relPosition x="0" y="0"/>
+                <reference name="RED_LIGHT"/>
+              </action>
+              <action localId="0" qualifier="D" duration="T#20s">
+                <relPosition x="0" y="0"/>
+                <reference name="WARN_CARS"/>
+              </action>
+            </actionBlock>
+            <block localId="32" width="89" height="94" typeName="TON" instanceName="TON3">
+              <position x="308" y="1053"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="44" formalParameter="Q1">
+                      <position x="308" y="1091"/>
+                      <position x="291" y="1091"/>
+                      <position x="291" y="1065"/>
+                      <position x="275" y="1065"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PT">
+                  <connectionPointIn>
+                    <relPosition x="0" y="75"/>
+                    <connection refLocalId="34">
+                      <position x="308" y="1128"/>
+                      <position x="270" y="1128"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="89" y="38"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ET">
+                  <connectionPointOut>
+                    <relPosition x="89" y="75"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="33" height="36" width="168" negated="false">
+              <position x="15" y="1047"/>
+              <connectionPointOut>
+                <relPosition x="168" y="18"/>
+              </connectionPointOut>
+              <expression>PEDESTRIAN_BUTTON</expression>
+            </inVariable>
+            <inVariable localId="34" height="33" width="53" negated="false">
+              <position x="217" y="1112"/>
+              <connectionPointOut>
+                <relPosition x="53" y="16"/>
+              </connectionPointOut>
+              <expression>T#2s</expression>
+            </inVariable>
+            <block localId="35" width="67" height="60" typeName="OR">
+              <position x="459" y="1061"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="32" formalParameter="Q">
+                      <position x="459" y="1091"/>
+                      <position x="397" y="1091"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="36">
+                      <position x="459" y="1111"/>
+                      <position x="427" y="1111"/>
+                      <position x="427" y="1195"/>
+                      <position x="260" y="1195"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="36" height="30" width="97" negated="false">
+              <position x="163" y="1182"/>
+              <connectionPointOut>
+                <relPosition x="97" y="15"/>
+              </connectionPointOut>
+              <expression>WARN_CARS</expression>
+            </inVariable>
+            <transition localId="37" height="2" width="20">
+              <position x="559" y="1090"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="38">
+                  <position x="569" y="1090"/>
+                  <position x="569" y="1060"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <connectionPointIn>
+                  <connection refLocalId="35" formalParameter="OUT">
+                    <position x="559" y="1091"/>
+                    <position x="526" y="1091"/>
+                  </connection>
+                </connectionPointIn>
+              </condition>
+            </transition>
+            <selectionDivergence localId="38" height="1" width="207">
+              <position x="569" y="1059"/>
+              <connectionPointIn>
+                <relPosition x="0" y="0"/>
+                <connection refLocalId="30">
+                  <position x="569" y="1059"/>
+                  <position x="569" y="963"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut formalParameter="">
+                <relPosition x="0" y="1"/>
+              </connectionPointOut>
+              <connectionPointOut formalParameter="">
+                <relPosition x="207" y="1"/>
+              </connectionPointOut>
+            </selectionDivergence>
+            <transition localId="39" height="2" width="20">
+              <position x="766" y="1095"/>
+              <connectionPointIn>
+                <relPosition x="10" y="0"/>
+                <connection refLocalId="38">
+                  <position x="776" y="1095"/>
+                  <position x="776" y="1060"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="10" y="2"/>
+              </connectionPointOut>
+              <condition>
+                <inline name="">
+                  <ST>
+                    <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
+                  </ST>
+                </inline>
+              </condition>
+            </transition>
+            <jumpStep localId="41" height="13" width="12" targetName="ORANGE">
+              <position x="563" y="1137"/>
+              <connectionPointIn>
+                <relPosition x="6" y="0"/>
+                <connection refLocalId="37">
+                  <position x="569" y="1137"/>
+                  <position x="569" y="1092"/>
+                </connection>
+              </connectionPointIn>
+            </jumpStep>
+            <block localId="44" width="51" height="60" typeName="SR" instanceName="SR0">
+              <position x="224" y="1035"/>
+              <inputVariables>
+                <variable formalParameter="S1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="33">
+                      <position x="224" y="1065"/>
+                      <position x="183" y="1065"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="32" formalParameter="Q">
+                      <position x="224" y="1085"/>
+                      <position x="203" y="1085"/>
+                      <position x="203" y="1167"/>
+                      <position x="416" y="1167"/>
+                      <position x="416" y="1091"/>
+                      <position x="397" y="1091"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="51" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="45" height="767" width="753">
+              <position x="973" y="21"/>
+              <content>
+                <xhtml:p><![CDATA[*** Description of SFC action qualifiers ***
+
+N : non-stored - The action code body is executed or the Boolean variable is set as
+long as the step is active.
+
+R : overriding reset &#8211; When the step has previously been executed with the S
+(including DS, DS, and SL) qualifier, the R qualifier will stop the execution of the
+code or reset the Boolean variable.
+
+S : set (stored) - The action code body is executed or the Boolean variable is set.
+This state is stored as soon as the step becomes active. It can only be reset
+explicitly by associating the same action to a different step using the qualifier 'R'.
+
+L : time limited - The action code body is executed or the Boolean variable is set as
+long as the step is active but maximal for the fixed time interval.
+
+D : time delayed - The action code body is executed or the Boolean variable is set
+after the fixed delay time has elapsed. The action remains active as long as the step
+is active. If the step is active shorter than the fixed delay time the action does not
+become active.
+
+P : pulse - As soon as the step is active the action code body is executed or the
+Boolean variable is set for one operating cycle. (Note: The code body will then
+execute for one additional operating cycle with the Step.X variable FALSE.)
+
+SD : stored and time delayed - the action code body is executed or the Boolean
+variable is stored and set when the fixed delay time has elapsed after the step
+activation, even if the step becomes inactive. The action remains active until it is
+reset. If the step is active shorter than the fixed delay time the action becomes active
+anyway.
+
+DS : delayed and stored - The action code body is executed or the Boolean variable
+is set when the fixed delay time has elapsed after the step activation. The action
+remains active until it is reset. If the step is active shorter than the fixed delay time
+the action does not become active.
+
+SL : stored and time limited - The action code body is executed or the Boolean
+variable is set and stored for a fixed time interval as soon as the step is active. If the
+step is active shorter than the time interval the action is active for the whole time
+interval anyway. If the action is reset during the time interval the action becomes
+inactive as soon as the action is reset.
+]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="46" height="224" width="375">
+              <position x="8" y="326"/>
+              <content>
+                <xhtml:p><![CDATA[Conditions can be written in any IEC 61131-3 language.
+They can be implemented in defferent ways:
+- reference to external implementation;
+- inline implementation;
+- written in FBD or LD on SFC diagram and connected to the condition.
+
+See below examples of all these types.]]></xhtml:p>
+              </content>
+            </comment>
+            <leftPowerRail localId="47" height="40" width="3">
+              <position x="189" y="838"/>
+              <connectionPointOut formalParameter="">
+                <relPosition x="3" y="20"/>
+              </connectionPointOut>
+            </leftPowerRail>
+            <contact localId="48" height="15" width="21" negated="true">
+              <position x="269" y="850"/>
+              <connectionPointIn>
+                <relPosition x="0" y="8"/>
+                <connection refLocalId="47">
+                  <position x="269" y="858"/>
+                  <position x="192" y="858"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="21" y="8"/>
+              </connectionPointOut>
+              <variable>SWITCH_BUTTON</variable>
+            </contact>
+            <comment localId="13" height="86" width="379">
+              <position x="9" y="28"/>
+              <content>
+                <xhtml:p><![CDATA[Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p>
+              </content>
+            </comment>
+          </SFC>
+        </body>
+      </pou>
+      <pou name="main_program" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="trafic_light_sequence0">
+              <type>
+                <derived name="traffic_light_sequence"/>
+              </type>
+            </variable>
+            <variable name="SwitchButton">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="PedestrianButton">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="RedLight">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="OrangeLight">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="GreenLight">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="PedestrianRedLight">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+            <variable name="PedestrianGreenLight">
+              <type>
+                <derived name="HMI_BOOL"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="1" width="350" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0">
+              <position x="494" y="462"/>
+              <inputVariables>
+                <variable formalParameter="SWITCH_BUTTON">
+                  <connectionPointIn>
+                    <relPosition x="0" y="101"/>
+                    <connection refLocalId="103">
+                      <position x="494" y="563"/>
+                      <position x="446" y="563"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PEDESTRIAN_BUTTON">
+                  <connectionPointIn>
+                    <relPosition x="0" y="264"/>
+                    <connection refLocalId="104">
+                      <position x="494" y="726"/>
+                      <position x="438" y="726"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="RED_LIGHT">
+                  <connectionPointOut>
+                    <relPosition x="350" y="101"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ORANGE_LIGHT">
+                  <connectionPointOut>
+                    <relPosition x="350" y="264"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="GREEN_LIGHT">
+                  <connectionPointOut>
+                    <relPosition x="350" y="427"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="PEDESTRIAN_RED_LIGHT">
+                  <connectionPointOut>
+                    <relPosition x="350" y="590"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="PEDESTRIAN_GREEN_LIGHT">
+                  <connectionPointOut>
+                    <relPosition x="350" y="753"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="24" height="287" width="1008">
+              <position x="22" y="13"/>
+              <content>
+                <xhtml:p><![CDATA[This example implements control of traffic lights.
+
+Basically it shows following features of Beremiz:
+- web interface (SCADA) using integrated web server in SVGHMI extension;
+- interaction with web UI;
+- functional blocks in SFC language.
+
+
+
+
+SVGHMI is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!!
+
+As the program is running in PLC, web UI will be available at http://localhost:8009/.
+
+Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: SVGHMI extension. 
+Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately.
+]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="102" height="134" width="734">
+              <position x="21" y="303"/>
+              <content>
+                <xhtml:p><![CDATA[In this example FB like 'Button', 'Led' and 'Text' are used. 
+Back_id and sele_id inputs of these blocks are IDs  of graphic primitives in SVG file.
+This is the way how elements in SVG are bound to elements in PLC program.
+You can find out or edit these IDs in Inkscape.]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="103" executionOrderId="0" height="24" width="106" negated="false">
+              <position x="340" y="551"/>
+              <connectionPointOut>
+                <relPosition x="106" y="12"/>
+              </connectionPointOut>
+              <expression>SwitchButton</expression>
+            </inVariable>
+            <inVariable localId="104" executionOrderId="0" height="24" width="138" negated="false">
+              <position x="300" y="714"/>
+              <connectionPointOut>
+                <relPosition x="138" y="12"/>
+              </connectionPointOut>
+              <expression>PedestrianButton</expression>
+            </inVariable>
+            <outVariable localId="105" executionOrderId="0" height="24" width="74" negated="false">
+              <position x="891" y="551"/>
+              <connectionPointIn>
+                <relPosition x="0" y="12"/>
+                <connection refLocalId="1" formalParameter="RED_LIGHT">
+                  <position x="891" y="563"/>
+                  <position x="844" y="563"/>
+                </connection>
+              </connectionPointIn>
+              <expression>RedLight</expression>
+            </outVariable>
+            <outVariable localId="106" executionOrderId="0" height="24" width="98" negated="false">
+              <position x="880" y="714"/>
+              <connectionPointIn>
+                <relPosition x="0" y="12"/>
+                <connection refLocalId="1" formalParameter="ORANGE_LIGHT">
+                  <position x="880" y="726"/>
+                  <position x="844" y="726"/>
+                </connection>
+              </connectionPointIn>
+              <expression>OrangeLight</expression>
+            </outVariable>
+            <outVariable localId="107" executionOrderId="0" height="24" width="90" negated="false">
+              <position x="881" y="877"/>
+              <connectionPointIn>
+                <relPosition x="0" y="12"/>
+                <connection refLocalId="1" formalParameter="GREEN_LIGHT">
+                  <position x="881" y="889"/>
+                  <position x="844" y="889"/>
+                </connection>
+              </connectionPointIn>
+              <expression>GreenLight</expression>
+            </outVariable>
+            <outVariable localId="108" executionOrderId="0" height="24" width="154" negated="false">
+              <position x="882" y="1040"/>
+              <connectionPointIn>
+                <relPosition x="0" y="12"/>
+                <connection refLocalId="1" formalParameter="PEDESTRIAN_RED_LIGHT">
+                  <position x="882" y="1052"/>
+                  <position x="844" y="1052"/>
+                </connection>
+              </connectionPointIn>
+              <expression>PedestrianRedLight</expression>
+            </outVariable>
+            <outVariable localId="109" executionOrderId="0" height="24" width="170" negated="false">
+              <position x="873" y="1203"/>
+              <connectionPointIn>
+                <relPosition x="0" y="12"/>
+                <connection refLocalId="1" formalParameter="PEDESTRIAN_GREEN_LIGHT">
+                  <position x="873" y="1215"/>
+                  <position x="844" y="1215"/>
+                </connection>
+              </connectionPointIn>
+              <expression>PedestrianGreenLight</expression>
+            </outVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="test_task" interval="T#100ms" priority="0">
+            <pouInstance name="main_instance" typeName="main_program"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/svghmi_0@svghmi/baseconfnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="svghmi_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/svghmi_0@svghmi/confnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema" OnWatchdog="echo Watchdog for {name} !" WatchdogInitial="10" WatchdogInterval="5" EnableWatchdog="true" Path="{name}"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exemples/svghmi_traffic_light/svghmi_0@svghmi/svghmi.svg	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,1541 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="320"
+   height="240"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   sodipodi:docname="svghmi.svg">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23716" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23669" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23629" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23580" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23540" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23506" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23466" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23432" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23330" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23257" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23226" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23189" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23118" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23081" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective23044" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22995" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22946" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22891" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22866" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22829" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22795" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22692" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22661" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22630" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22569" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22532" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22501" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22470" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22403" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22318" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22290" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22265" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22090" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective22002" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21911" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21856" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21831" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21776" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21745" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21654" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21626" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21580" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21549" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21518" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21418" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21338" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective21250" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19662" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19613" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19555" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19494" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19325" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19285" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19247" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19201" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19155" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19106" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective19050" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18979" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18945" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18911" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18841" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18807" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18767" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18727" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18693" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18662" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18613" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18555" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18518" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18475" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18429" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18377" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18322" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18273" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18239" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18193" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18150" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18104" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18061" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective18021" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17978" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17950" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17868" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17840" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17812" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17784" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17756" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17728" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17700" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17636" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17605" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17574" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17543" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17512" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17475" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17420" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17386" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17322" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17261" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17212" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17163" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17120" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17074" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective17046" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16994" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16951" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16896" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16856" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16822" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16794" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16766" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16738" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16689" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16640" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16594" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16548" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16493" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16438" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16401" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16370" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16321" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16242" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16187" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16156" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16101" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16061" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective16027" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15972" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15860" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15826" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15789" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15737" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15676" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15627" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15569" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15532" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15477" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15440" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15403" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15360" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15320" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15283" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15207" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15158" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15121" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15084" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective15041" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14998" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14949" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14906" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14863" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14823" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14783" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14743" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14703" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14642" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14572" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14461" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14421" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14365" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14328" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14291" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14254" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14217" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14174" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14137" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14100" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14057" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective14020" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective13983" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective13946" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective13909" />
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective13862" />
+    <inkscape:perspective
+       id="perspective13880"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.979899"
+     inkscape:cx="205.65994"
+     inkscape:cy="103.00174"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1600"
+     inkscape:window-height="836"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(37.474617,-760.93329)">
+    <path
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#282828;fill-opacity:1;stroke:none;stroke-width:2.04116011;marker:none;enable-background:accumulate"
+       d="m 114.28125,14.28125 v 130 h 18.9375 v 93.5625 h 5.71875 V 176.4375 h 8.90625 v 15.71875 h 36.4375 v -32.5 h -36.4375 v 12.125 h -8.90625 v -27.5 h 21.78125 v -130 z"
+       transform="translate(0,752.36228)"
+       id="rect2985"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccccc" />
+    <rect
+       style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ffac2c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04116011;marker:none;enable-background:accumulate"
+       id="rect3761"
+       width="19.642857"
+       height="18.928572"
+       x="126.07143"
+       y="954.8623"
+       ry="3.5714285" />
+    <g
+       id="g244"
+       inkscape:label="HMI:Switch@/REDLIGHT">
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.071429,724.14799)"
+         id="RED_OFF"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="false" />
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.07143,724.14799)"
+         id="RED_ON"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="true" />
+    </g>
+    <g
+       id="g248"
+       inkscape:label="HMI:Switch@/ORANGELIGHT">
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.071429,764.14799)"
+         id="ORANGE_OFF"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="false" />
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.07143,764.14799)"
+         id="ORANGE_ON"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#f06414;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="true" />
+    </g>
+    <g
+       id="g240"
+       inkscape:label="HMI:Switch@/GREENLIGHT">
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.071429,804.14799)"
+         id="GREEN_OFF"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="false" />
+      <circle
+         r="13.214286"
+         cy="63.92857"
+         cx="76.071426"
+         transform="translate(61.07143,804.14799)"
+         id="GREEN_ON"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="true" />
+    </g>
+    <g
+       id="g224"
+       inkscape:label="HMI:Button@/PEDESTRIANBUTTON"
+       transform="translate(0,-40)">
+      <circle
+         r="5.3571429"
+         cy="252.5"
+         cx="136.78572"
+         transform="matrix(1.3666667,0,0,1.3666667,-51.047621,659.24323)"
+         id="PEDESTRIAN_OFF"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="inactive" />
+      <circle
+         r="5.3571429"
+         cy="252.5"
+         cx="136.78572"
+         transform="matrix(1.2333334,0,0,1.2333334,-32.809525,692.9099)"
+         id="PEDESTRIAN_ON"
+         style="color:#000000;overflow:visible;visibility:visible;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;enable-background:accumulate"
+         inkscape:label="active" />
+    </g>
+    <g
+       id="g232"
+       inkscape:label="HMI:Switch@/PEDESTRIANREDLIGHT"
+       transform="translate(0,-20)">
+      <path
+         inkscape:connector-curvature="0"
+         id="PEDESTRIAN_RED_OFF"
+         style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
+         inkscape:label="false" />
+      <path
+         inkscape:connector-curvature="0"
+         id="PEDESTRIAN_RED_ON"
+         style="fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
+         inkscape:label="true" />
+    </g>
+    <g
+       id="g228"
+       inkscape:label="HMI:Switch@/PEDESTRIANGREENLIGHT"
+       transform="translate(0,-20)">
+      <path
+         inkscape:connector-curvature="0"
+         id="PEDESTRIAN_GREEN_OFF"
+         style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
+         inkscape:label="false" />
+      <path
+         inkscape:connector-curvature="0"
+         id="PEDESTRIAN_GREEN_ON"
+         style="fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
+         inkscape:label="true" />
+    </g>
+    <g
+       id="g220"
+       inkscape:label="HMI:ToggleButton@/SWITCHBUTTON">
+      <g
+         transform="rotate(-90,37.09909,809.86228)"
+         id="SWITCH_OFF"
+         inkscape:label="inactive">
+        <circle
+           r="16.785715"
+           cy="57.5"
+           cx="37.142857"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+           id="path4546"
+           transform="translate(0,752.36228)" />
+        <ellipse
+           ry="3.75"
+           rx="16.964287"
+           cy="57.857143"
+           cx="38.214287"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+           id="path4548"
+           transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)" />
+        <path
+           sodipodi:type="star"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+           id="path4552"
+           sodipodi:sides="3"
+           sodipodi:cx="52.142857"
+           sodipodi:cy="89.285713"
+           sodipodi:r1="2.7027807"
+           sodipodi:r2="1.4117311"
+           sodipodi:arg1="-0.0025098425"
+           sodipodi:arg2="1.0446877"
+           inkscape:flatsided="false"
+           inkscape:rounded="0"
+           inkscape:randomized="0"
+           d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
+           transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
+           inkscape:transform-center-x="-0.012953186"
+           inkscape:transform-center-y="-0.16341378" />
+      </g>
+      <g
+         id="SWITCH_ON"
+         inkscape:label="active">
+        <circle
+           r="16.785715"
+           cy="57.5"
+           cx="37.142857"
+           transform="translate(0,752.36228)"
+           id="path4576"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" />
+        <ellipse
+           ry="3.75"
+           rx="16.964287"
+           cy="57.857143"
+           cx="38.214287"
+           transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)"
+           id="path4578"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+        <path
+           inkscape:transform-center-y="-0.16341378"
+           inkscape:transform-center-x="-0.012953186"
+           transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
+           d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
+           inkscape:randomized="0"
+           inkscape:rounded="0"
+           inkscape:flatsided="false"
+           sodipodi:arg2="1.0446877"
+           sodipodi:arg1="-0.0025098425"
+           sodipodi:r2="1.4117311"
+           sodipodi:r1="2.7027807"
+           sodipodi:cy="89.285713"
+           sodipodi:cx="52.142857"
+           sodipodi:sides="3"
+           id="path4580"
+           style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+           sodipodi:type="star" />
+      </g>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 37.67857,786.29085 v 3.75"
+       id="path4582"
+       inkscape:connector-curvature="0" />
+    <g
+       style="font-style:normal;font-weight:bold;font-size:6.32609415px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       id="text4584">
+      <path
+         d="m 33.828224,780.67935 c -0.362435,10e-6 -0.643526,0.13386 -0.843274,0.40156 -0.199751,0.26771 -0.299626,0.64456 -0.299624,1.13055 -2e-6,0.48393 0.09987,0.85974 0.299624,1.12745 0.199748,0.26771 0.480839,0.40156 0.843274,0.40156 0.364488,0 0.646609,-0.13385 0.846362,-0.40156 0.199746,-0.26771 0.299621,-0.64352 0.299624,-1.12745 -3e-6,-0.48599 -0.09988,-0.86284 -0.299624,-1.13055 -0.199753,-0.2677 -0.481874,-0.40155 -0.846362,-0.40156 m 0,-0.8618 c 0.741335,0 1.32205,0.21211 1.742147,0.63631 0.420087,0.42422 0.630133,1.01008 0.630138,1.7576 -5e-6,0.74545 -0.210051,1.33029 -0.630138,1.7545 -0.420097,0.42421 -1.000812,0.63631 -1.742147,0.63631 -0.739282,0 -1.319997,-0.2121 -1.742147,-0.63631 -0.420093,-0.42421 -0.630139,-1.00905 -0.630139,-1.7545 0,-0.74752 0.210046,-1.33338 0.630139,-1.7576 0.42215,-0.4242 1.002865,-0.63631 1.742147,-0.63631"
+         id="path4589"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 37.096294,779.90095 h 3.209381 v 0.89887 h -2.020149 v 0.85872 h 1.899681 v 0.89887 h -1.899681 v 1.95529 h -1.189232 v -4.61175"
+         id="path4591"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 41.420773,779.90095 h 3.209381 v 0.89887 h -2.020149 v 0.85872 h 1.899681 v 0.89887 h -1.899681 v 1.95529 h -1.189232 v -4.61175"
+         id="path4593"
+         inkscape:connector-curvature="0" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 60.982143,810.04086 h -3.75"
+       id="path4582-4"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:bold;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       x="62.818459"
+       y="812.17749"
+       id="text4613"><tspan
+         sodipodi:role="line"
+         id="tspan4615"
+         x="62.818459"
+         y="812.17749"
+         style="font-size:6.17188501px;line-height:1.25;font-family:sans-serif">ON</tspan></text>
+    <rect
+       style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
+       id="rect250"
+       width="320"
+       height="240"
+       x="-37.474617"
+       y="760.93329"
+       inkscape:label="HMI:Page:Home" />
+  </g>
+</svg>
--- a/features.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/features.py	Wed Oct 20 08:57:07 2021 +0200
@@ -12,10 +12,10 @@
     ('Native', 'NativeLib.NativeLibrary', True),
     ('Python', 'py_ext.PythonLibrary', True),
     ('Etherlab', 'etherlab.EthercatMaster.EtherlabLibrary', False),
-    ('SVGUI', 'svgui.SVGUILibrary', False),
     ('SVGHMI', 'svghmi.SVGHMILibrary', False)]
 
 catalog = [
+    ('opcua', _('OPC-UA client'), _('Map OPC-UA server as located variables'), 'opc_ua.OPCUAClient'),
     ('canfestival', _('CANopen support'), _('Map located variables over CANopen'), 'canfestival.canfestival.RootClass'),
     ('bacnet', _('Bacnet support'), _('Map located variables over Bacnet'), 'bacnet.bacnet.RootClass'),
     ('etherlab', _('EtherCAT master'), _('Map located variables over EtherCAT'), 'etherlab.etherlab.RootClass'),
@@ -23,7 +23,6 @@
     ('c_ext', _('C extension'), _('Add C code accessing located variables synchronously'), 'c_ext.CFile'),
     ('py_ext', _('Python file'), _('Add Python code executed asynchronously'), 'py_ext.PythonFile'),
     ('wxglade_hmi', _('WxGlade GUI'), _('Add a simple WxGlade based GUI.'), 'wxglade_hmi.WxGladeHMI'),
-    ('svgui', _('SVGUI'), _('Experimental web based HMI'), 'svgui.SVGUI'),
     ('svghmi', _('SVGHMI'), _('SVG based HMI'), 'svghmi.SVGHMI')]
 
 file_editors = []
--- a/graphics/FBD_Objects.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/graphics/FBD_Objects.py	Wed Oct 20 08:57:07 2021 +0200
@@ -122,10 +122,10 @@
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
         if self.Name != "":
-            test_text = self.GetTextBoundingBox().InsideXY(pt.x, pt.y)
+            test_text = self.GetTextBoundingBox().Contains(pt.x, pt.y)
         else:
             test_text = False
-        test_block = self.GetBlockBoundingBox(connectors).InsideXY(pt.x, pt.y)
+        test_block = self.GetBlockBoundingBox(connectors).Contains(pt.x, pt.y)
         return test_text or test_block
 
     # Returns the bounding box of the name outside the block
@@ -392,7 +392,7 @@
 #            pos = event.GetLogicalPosition(dc)
 #            for input in self.Inputs:
 #                rect = input.GetRedrawRect()
-#                if rect.InsideXY(pos.x, pos.y):
+#                if rect.Contains(pos.x, pos.y):
 #                    print "Find input"
 #                    tip = wx.TipWindow(self.Parent, "Test")
 #                    tip.SetBoundingRect(rect)
--- a/graphics/GraphicCommons.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/graphics/GraphicCommons.py	Wed Oct 20 08:57:07 2021 +0200
@@ -388,11 +388,11 @@
             rect = self.BoundingBox
         else:
             rect = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0], self.Size[1])
-        return rect.InsideXY(pt.x, pt.y)
+        return rect.Contains(pt.x, pt.y)
 
     # Returns if the point given is in the bounding box
     def IsInSelection(self, rect):
-        return rect.InsideXY(self.BoundingBox.x, self.BoundingBox.y) and rect.InsideXY(self.BoundingBox.x + self.BoundingBox.width, self.BoundingBox.y + self.BoundingBox.height)
+        return rect.Contains(self.BoundingBox.x, self.BoundingBox.y) and rect.Contains(self.BoundingBox.x + self.BoundingBox.width, self.BoundingBox.y + self.BoundingBox.height)
 
     # Override this method for refreshing the bounding box
     def RefreshBoundingBox(self):
@@ -448,7 +448,7 @@
         intern_rect = wx.Rect(left + HANDLE_SIZE, top + HANDLE_SIZE, right - left - HANDLE_SIZE, bottom - top - HANDLE_SIZE)
 
         # Verify that this element is selected
-        if self.Selected and extern_rect.InsideXY(pt.x, pt.y) and not intern_rect.InsideXY(pt.x, pt.y):
+        if self.Selected and extern_rect.Contains(pt.x, pt.y) and not intern_rect.Contains(pt.x, pt.y):
             # Find if point is on a handle horizontally
             if left <= pt.x < left + HANDLE_SIZE:
                 handle_x = 1
@@ -1401,7 +1401,7 @@
             width = ANCHOR_DISTANCE * 2 + abs(self.Direction[0]) * CONNECTOR_SIZE
             height = ANCHOR_DISTANCE * 2 + abs(self.Direction[1]) * CONNECTOR_SIZE
             rect = wx.Rect(x, y, width, height)
-            inside = rect.InsideXY(pt.x, pt.y)
+            inside = rect.Contains(pt.x, pt.y)
 
         return inside
 
@@ -1933,7 +1933,7 @@
             # Calculate a rectangle around the segment
             rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
                            abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
-            test |= rect.InsideXY(pt.x, pt.y)
+            test |= rect.Contains(pt.x, pt.y)
         return test
 
     # Returns the wire start or end point if the point given is on one of them
@@ -1941,13 +1941,13 @@
         # Test the wire start point
         rect = wx.Rect(self.Points[0].x - ANCHOR_DISTANCE, self.Points[0].y - ANCHOR_DISTANCE,
                        2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
-        if rect.InsideXY(pt.x, pt.y):
+        if rect.Contains(pt.x, pt.y):
             return 0
         # Test the wire end point
         if len(self.Points) > 1:
             rect = wx.Rect(self.Points[-1].x - ANCHOR_DISTANCE, self.Points[-1].y - ANCHOR_DISTANCE,
                            2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
-            if rect.InsideXY(pt.x, pt.y):
+            if rect.Contains(pt.x, pt.y):
                 return -1
         return None
 
@@ -1961,7 +1961,7 @@
                 # Calculate a rectangle around the segment
                 rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
                                abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
-                if rect.InsideXY(pt.x, pt.y):
+                if rect.Contains(pt.x, pt.y):
                     return i, self.Segments[i]
         return None
 
--- a/graphics/RubberBand.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/graphics/RubberBand.py	Wed Oct 20 08:57:07 2021 +0200
@@ -94,7 +94,7 @@
 
         # Change viewer mouse cursor to reflect a rubberband bounding box is
         # edited
-        self.DrawingSurface.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))
+        self.DrawingSurface.SetCursor(wx.Cursor(wx.CURSOR_CROSS))
 
         self.Redraw()
 
@@ -195,3 +195,25 @@
         """
         # Erase last bbox and draw current bbox
         self.DrawBoundingBoxes([self.CurrentBBox], dc)
+
+
+def PatchRubberBandForGTK3():
+    """
+    GTK3 implementation of DC doesn't support SetLogicalFuntion(XOR)
+    Then Rubberband can't be erased by just redrawing it on the same place
+    So this is a complete refresh instead, eating a lot of CPU.
+    """
+    def Redraw(self, dc=None):
+        self.Viewer.Refresh()
+        self.Draw()
+
+    RubberBand.Redraw = Redraw
+
+    def Erase(self, dc=None):
+        self.Viewer.Refresh()
+
+    RubberBand.Erase = Erase
+
+
+if "gtk3" in wx.PlatformInfo:
+    PatchRubberBandForGTK3()
--- a/graphics/SFC_Objects.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/graphics/SFC_Objects.py	Wed Oct 20 08:57:07 2021 +0200
@@ -719,7 +719,7 @@
                                self.Pos.y + (self.Size[1] - text_height) // 2,
                                text_width,
                                text_height)
-            test_text = text_bbx.InsideXY(pt.x, pt.y)
+            test_text = text_bbx.Contains(pt.x, pt.y)
         else:
             test_text = False
         return test_text or Graphic_Element.HitTest(self, pt, connectors)
@@ -1204,7 +1204,7 @@
 
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
-        return self.BoundingBox.InsideXY(pt.x, pt.y) or self.TestConnector(pt, exclude=False) is not None
+        return self.BoundingBox.Contains(pt.x, pt.y) or self.TestConnector(pt, exclude=False) is not None
 
     # Refresh the divergence bounding box
     def RefreshBoundingBox(self):
@@ -1592,7 +1592,7 @@
                            self.Pos.y + (self.Size[1] - text_height) // 2,
                            text_width,
                            text_height)
-        return text_bbx.InsideXY(pt.x, pt.y) or Graphic_Element.HitTest(self, pt, connectors)
+        return text_bbx.Contains(pt.x, pt.y) or Graphic_Element.HitTest(self, pt, connectors)
 
     # Refresh the jump bounding box
     def RefreshBoundingBox(self):
--- a/i18n/Beremiz_bn_BD.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_bn_BD.po	Wed Oct 20 08:57:07 2021 +0200
@@ -972,10 +972,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1300,10 +1296,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2084,10 +2076,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2154,10 +2142,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2706,11 +2690,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2804,10 +2783,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3400,14 +3375,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4202,12 +4169,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_de_DE.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_de_DE.po	Wed Oct 20 08:57:07 2021 +0200
@@ -980,10 +980,6 @@
 msgid "Character string"
 msgstr "Zeichenkette"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Wählen Sie eine SVG-Datei"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1318,10 +1314,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Konnte SPS nicht anhalten !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "HMI erstellen"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Neuer Baustein"
@@ -2109,10 +2101,6 @@
 msgid "Import ESI file"
 msgstr "Importiere ESI Datei"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Importiere SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "Importiere Datei zu ESI Datenbank"
@@ -2181,10 +2169,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Inline"
@@ -2741,11 +2725,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Kein SVG-File namens: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2840,10 +2819,6 @@
 msgid "Open"
 msgstr "Öffnen"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "öffne Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3448,14 +3423,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST Dateien (*.st)|*.st|Alle Dateien|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG Dateien (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4277,14 +4244,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Sie haben keine Schreibberechtigung.\n"
-"soll Inkscape trotzdem geöffnet werden ?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_es_ES.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_es_ES.po	Wed Oct 20 08:57:07 2021 +0200
@@ -986,10 +986,6 @@
 msgid "Character string"
 msgstr "Cadena de caracteres"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Elegir un archivo SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1324,10 +1320,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "¡No se pudo detener el PLC!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Crear un HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Crear un nuevo POU"
@@ -2116,10 +2108,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Importar SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2188,10 +2176,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "InkScape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "En línea"
@@ -2754,11 +2738,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "No existe el archivo SVG: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2854,10 +2833,6 @@
 msgid "Open"
 msgstr "Abrir"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Abrir Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3464,14 +3439,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "Archivos ST (*.st)|*.st|Todos los archivos|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Archivos SVG (*.svg)|*.svg|Todos los archivos|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4290,14 +4257,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"No tiene permisos de escritura.\n"
-"¿Desea abrir Inkscape de todos modos?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_eu.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_eu.po	Wed Oct 20 08:57:07 2021 +0200
@@ -960,10 +960,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1288,10 +1284,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2072,10 +2064,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2142,10 +2130,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2694,11 +2678,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2792,10 +2771,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3388,14 +3363,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4190,12 +4157,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_fr_FR.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_fr_FR.po	Wed Oct 20 08:57:07 2021 +0200
@@ -987,10 +987,6 @@
 msgid "Character string"
 msgstr "Chaîne de caractères"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Choisissez un fichier SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1324,10 +1320,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Impossible d'arrêter l'automate !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Créer une IHM"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Créer un nouveau POU"
@@ -2117,10 +2109,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Importer un SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2189,10 +2177,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Inline"
@@ -2752,11 +2736,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Fichier SVG inconnu : %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2851,10 +2830,6 @@
 msgid "Open"
 msgstr "Ouvrir"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Ouverture de Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3461,14 +3436,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "Fichiers ST (*.st)|*.st|Tous les fichiers|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Fichiers SVG (*.svg)|*.svg|Tous les fichiers|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4286,14 +4253,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Vous n'avez pas les permissions d'écriture.\n"
-"Ouvrir Inkscape tout de même ?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_hr.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_hr.po	Wed Oct 20 08:57:07 2021 +0200
@@ -956,10 +956,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1284,10 +1280,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2068,10 +2060,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2138,10 +2126,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2690,11 +2674,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2788,10 +2767,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3384,14 +3359,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4186,12 +4153,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_hu_HU.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_hu_HU.po	Wed Oct 20 08:57:07 2021 +0200
@@ -977,10 +977,6 @@
 msgid "Character string"
 msgstr "Karakter sztring"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Válasszon SVG fájlt"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1305,10 +1301,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "PLC nem állt le!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "HMI létrehozása"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Új Program Szervezési Egység (POU) létrehozása"
@@ -2095,10 +2087,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "SVG importálás"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2165,10 +2153,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Inline"
@@ -2721,11 +2705,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Nincs ilyen SVG fájl: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2819,10 +2798,6 @@
 msgid "Open"
 msgstr "Megnyit"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Inkscape Megnyitás"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3425,14 +3400,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4236,12 +4203,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_it_IT.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_it_IT.po	Wed Oct 20 08:57:07 2021 +0200
@@ -966,10 +966,6 @@
 msgid "Character string"
 msgstr "Stringa di caratteri"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Scegliere un file SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1300,10 +1296,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Impossibile arrestare il PLC !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Creare HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Creare un nuovo POU"
@@ -2088,10 +2080,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2158,10 +2146,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2710,11 +2694,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2808,10 +2787,6 @@
 msgid "Open"
 msgstr "Apri"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Apri Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3404,14 +3379,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST files (*.st)|*.st|All files|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|All files|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4209,14 +4176,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Non il permesso di scrittura.\n"
-"Aprire Inkscape comunque?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_ko_KR.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_ko_KR.po	Wed Oct 20 08:57:07 2021 +0200
@@ -977,10 +977,6 @@
 msgid "Character string"
 msgstr "문자열"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "SVG 파일 선택"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1313,10 +1309,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "PLC 를 정지 할 수 없습니다!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "HMI 생성"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "새로운 POU 생성"
@@ -2099,10 +2091,6 @@
 msgid "Import ESI file"
 msgstr "ESI 파일 불러오기"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "SVG 가져오기"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "파일을 ESI 파일 데이터베이스로 불러오기"
@@ -2169,10 +2157,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr "네트워크 위치 변수의 드래그 앤 드랍 초기화"
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "인라인"
@@ -2729,11 +2713,6 @@
 msgid "No slave defined at position %d!"
 msgstr "위치 %d에 정의된 슬레이브가 없습니다!"
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "선택하신 %s SVG 파일은 없습니다\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2827,10 +2806,6 @@
 msgid "Open"
 msgstr "프로젝트 불러오기"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "잉크스케이프 열기"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3432,14 +3407,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST 파일 (*.st)|*.st|모든 파일|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG 파일 (*.svg)|*svg|모든 파일|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4247,14 +4214,6 @@
 msgid "You cannot SDO download this state"
 msgstr "현재 상태에서는 SDO 다운로드를 할 수 없습니다."
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"현재 쓰기 권한이 없습니다\n"
-"그래도 Inkscape를 열까요?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_nl_NL.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_nl_NL.po	Wed Oct 20 08:57:07 2021 +0200
@@ -967,10 +967,6 @@
 msgid "Character string"
 msgstr "Karakterstreng"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Kies een SVG-bestand"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1303,10 +1299,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Kan PLC niet stoppen!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Maak HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Maak een nieuwe POU"
@@ -2095,10 +2087,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2165,10 +2153,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2717,11 +2701,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2815,10 +2794,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3411,14 +3386,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4213,12 +4180,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_pl.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_pl.po	Wed Oct 20 08:57:07 2021 +0200
@@ -974,10 +974,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1302,10 +1298,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2086,10 +2078,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2156,10 +2144,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2708,11 +2692,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2806,10 +2785,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3402,14 +3377,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4204,12 +4171,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_pt.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_pt.po	Wed Oct 20 08:57:07 2021 +0200
@@ -969,10 +969,6 @@
 msgid "Character string"
 msgstr "Cadeia de caracteres"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Escolha um ficheiro SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1304,10 +1300,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Não foi possível parar o PLC!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Criar HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Criar uma nova POU"
@@ -2090,10 +2082,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2160,10 +2148,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2712,11 +2696,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2810,10 +2789,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3406,14 +3381,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4208,12 +4175,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_pt_BR.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_pt_BR.po	Wed Oct 20 08:57:07 2021 +0200
@@ -977,10 +977,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Escolha um arquivo SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1308,10 +1304,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Não foi possível parar o CLP!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Criar IHM"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Criar um novo POU"
@@ -2096,10 +2088,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Importar SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2166,10 +2154,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2730,11 +2714,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Nenhum arquivo SVG: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2828,10 +2807,6 @@
 msgid "Open"
 msgstr "Abrir"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Abrir Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3434,14 +3409,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4248,14 +4215,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Você não possui permissão de escrita.\n"
-"Abrir mesmo assim?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_ro_RO.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_ro_RO.po	Wed Oct 20 08:57:07 2021 +0200
@@ -960,10 +960,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1288,10 +1284,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2072,10 +2064,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2142,10 +2130,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2694,11 +2678,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2792,10 +2771,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3388,14 +3363,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4190,12 +4157,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_ru_RU.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_ru_RU.po	Wed Oct 20 08:57:07 2021 +0200
@@ -981,10 +981,6 @@
 msgid "Character string"
 msgstr "Строковые операции"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Выберите SVG-файл"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1318,10 +1314,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Невозможно остановить ПЛК!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Создать HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Создать новый POU"
@@ -2118,10 +2110,6 @@
 msgid "Import ESI file"
 msgstr "Импортировать файл ESI"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Импорт SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "Импортировать файл в базу данных файлов ESI"
@@ -2191,10 +2179,6 @@
 msgstr ""
 "Инициировать перетаскивание отображаемой переменной сетевого положения"
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Непосредственно"
@@ -2756,11 +2740,6 @@
 msgid "No slave defined at position %d!"
 msgstr "Для позиции %d не определено ведомое устройство!"
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Нет такого SVG файла: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2855,10 +2834,6 @@
 msgid "Open"
 msgstr "Открыть"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Открыть Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3464,14 +3439,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST файлы (*.st)|*.st|Все файлы|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG файлы (*.svg)|*.svg|Все файлы|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4293,14 +4260,6 @@
 msgid "You cannot SDO download this state"
 msgstr "Вы не можете загрузить это состояние через SDO"
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"У вас недостаточно прав для записи.\n"
-"Открыть Inkscape все равно?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_sl_SI.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_sl_SI.po	Wed Oct 20 08:57:07 2021 +0200
@@ -978,10 +978,6 @@
 msgid "Character string"
 msgstr "Niz znakov"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Izberi SVG datoteko"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1312,10 +1308,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Ne morem ustaviti krmilnika !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Kreiraj HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Ustvari nov POU"
@@ -2101,10 +2093,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Uvoz SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2171,10 +2159,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Vstavljen"
@@ -2735,11 +2719,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Ni take SVG datoteke: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2836,10 +2815,6 @@
 msgid "Open"
 msgstr "Odpri"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Odpri Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3441,14 +3416,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST datoteke (*.st)|*.st|Vse datoteke|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG datoteke (*.svg)|*.svg|Vse datoteke|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4259,14 +4226,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Nimaš dovoljenja za pisanje.\n"
-"Vseeno odprem Inkscape ?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_tr_TR.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_tr_TR.po	Wed Oct 20 08:57:07 2021 +0200
@@ -980,10 +980,6 @@
 msgid "Character string"
 msgstr "Karakter dizesi"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "SVG dosyası seç"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1316,10 +1312,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "PLC durduramadı!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "HMI oluştur"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Yeni bir POU oluştur"
@@ -2114,10 +2106,6 @@
 msgid "Import ESI file"
 msgstr "ESI dosyasını içe aktar"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "SVG'yi içe aktar"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "ESI dosya veritabanına dosya içe aktar"
@@ -2185,10 +2173,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr "Ağ konumu bulunan değişkenin Drag'n düşüşünü başlat"
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Çizgide"
@@ -2750,11 +2734,6 @@
 msgid "No slave defined at position %d!"
 msgstr "%d konumunda hiçbir slave tanımlanmamış!"
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Böyle bir SVG dosyası yok: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2850,10 +2829,6 @@
 msgid "Open"
 msgstr "Açık"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Inkscape'i aç"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3457,14 +3432,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST dosyaları (* .st) | * .st | Tüm dosyalar | *. *"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG dosyaları (* .svg) | * .svg | Tüm dosyalar | *. *"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4280,14 +4247,6 @@
 msgid "You cannot SDO download this state"
 msgstr "SDO bu durumu indiremezsiniz"
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Yazma yetkiniz yok.\n"
-"Yine de Inkscape'i açtın mı?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_vi_VN.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_vi_VN.po	Wed Oct 20 08:57:07 2021 +0200
@@ -974,10 +974,6 @@
 msgid "Character string"
 msgstr "Chuỗi kí tự"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Chọn một tệp SVG"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1306,10 +1302,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Không thể dừng PLC !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Tạo HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Tạo một đơn vị tổ chức chương trình mới"
@@ -2092,10 +2084,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2163,10 +2151,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2721,11 +2705,6 @@
 msgid "No slave defined at position %d!"
 msgstr "Chưa khai báo trạm tớ tại địa chỉ %d!"
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "Không có tệp SVG: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2819,10 +2798,6 @@
 msgid "Open"
 msgstr "Mở"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Mở Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3424,14 +3399,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST tệp (*.st)|*.st|Tất cả tệp|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "Tệp SVG (*.svg)|*.svg|Tất cả tệp|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4240,14 +4207,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"Bạn không có quyền ghi.\n"
-"Vẫn mở Inkscape ?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/Beremiz_zh_CN.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/Beremiz_zh_CN.po	Wed Oct 20 08:57:07 2021 +0200
@@ -980,10 +980,6 @@
 msgid "Character string"
 msgstr "字符串"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "选择一个SVG文件"
-
 #: ../etherlab/EtherCATManagementEditor.py:911
 #: ../etherlab/EtherCATManagementEditor.py:1306
 msgid "Choose a binary file"
@@ -1316,10 +1312,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "无法停止PLC!\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "新建 HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "新建一个POU"
@@ -2102,10 +2094,6 @@
 msgid "Import ESI file"
 msgstr "导入ESI文件"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "导入 SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "导入文件到ESI文件数据库"
@@ -2172,10 +2160,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "在线"
@@ -2730,11 +2714,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "没有这样的SVG文件:%s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2828,10 +2807,6 @@
 msgid "Open"
 msgstr "打开"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "打开 Inkscape"
-
 #: ../version.py:88
 msgid ""
 "Open Source framework for automation, implemented IEC 61131 IDE with "
@@ -3431,14 +3406,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG 文件 (*.svg)|*.svg|All files|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4247,14 +4214,6 @@
 msgid "You cannot SDO download this state"
 msgstr "你不能SDO下载这个状态"
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"你没有写入的许可。\n"
-"无论如何都打开Inkscape?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/app.fil	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/app.fil	Wed Oct 20 08:57:07 2021 +0200
@@ -129,9 +129,6 @@
 ../util/misc.py
 ../util/ProcessLogger.py
 ../features.py
-../svgui/svgui.py
-../svgui/svgui_server.py
-../svgui/svguilib.py
 ../plcopen/InstancesPathCollector.py
 ../plcopen/types_enums.py
 ../plcopen/InstanceTagnameCollector.py
--- a/i18n/messages.po	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/messages.po	Wed Oct 20 08:57:07 2021 +0200
@@ -967,10 +967,6 @@
 msgid "Character string"
 msgstr "Character string"
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr "Choose a SVG file"
-
 #: ../etherlab/EtherCATManagementEditor.py:912
 #: ../etherlab/EtherCATManagementEditor.py:1307
 msgid "Choose a binary file"
@@ -1303,10 +1299,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr "Couldn't stop PLC !\n"
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr "Create HMI"
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr "Create a new POU"
@@ -2079,10 +2071,6 @@
 msgid "Import ESI file"
 msgstr "Import ESI file"
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr "Import SVG"
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr "Import file to ESI files database"
@@ -2149,10 +2137,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr "Initiate Drag'n drop of Network position located variable"
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr "Inkscape"
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Inline"
@@ -2705,11 +2689,6 @@
 msgid "No slave defined at position %d!"
 msgstr "No slave defined at position %d!"
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr "No such SVG file: %s\n"
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2807,10 +2786,6 @@
 msgid "Open"
 msgstr "Open"
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr "Open Inkscape"
-
 #: ../version.py:88
 msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
 msgstr "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
@@ -3407,14 +3382,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST files (*.st)|*.st|All files|*.*"
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|All files|*.*"
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr "SVGUI"
-
 #: ../BeremizIDE.py:246 ../BeremizIDE.py:277 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4215,14 +4182,6 @@
 msgid "You cannot SDO download this state"
 msgstr "You cannot SDO download this state"
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
--- a/i18n/messages.pot	Tue Oct 19 15:15:03 2021 +0200
+++ b/i18n/messages.pot	Wed Oct 20 08:57:07 2021 +0200
@@ -952,10 +952,6 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "Choose a SVG file"
-msgstr ""
-
 #: ../etherlab/EtherCATManagementEditor.py:912
 #: ../etherlab/EtherCATManagementEditor.py:1307
 msgid "Choose a binary file"
@@ -1280,10 +1276,6 @@
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../svgui/svgui.py:57
-msgid "Create HMI"
-msgstr ""
-
 #: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
@@ -2054,10 +2046,6 @@
 msgid "Import ESI file"
 msgstr ""
 
-#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
-msgid "Import SVG"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1352
 msgid "Import file to ESI files database"
 msgstr ""
@@ -2124,10 +2112,6 @@
 msgid "Initiate Drag'n drop of Network position located variable"
 msgstr ""
 
-#: ../svgui/svgui.py:56
-msgid "Inkscape"
-msgstr ""
-
 #: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
@@ -2672,11 +2656,6 @@
 msgid "No slave defined at position %d!"
 msgstr ""
 
-#: ../svgui/svgui.py:142
-#, python-format
-msgid "No such SVG file: %s\n"
-msgstr ""
-
 #: ../etherlab/ConfigEditor.py:1245
 #, python-format
 msgid "No such XML file: %s\n"
@@ -2774,10 +2753,6 @@
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:151
-msgid "Open Inkscape"
-msgstr ""
-
 #: ../version.py:88
 msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
 msgstr ""
@@ -3367,14 +3342,6 @@
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:136
-msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr ""
-
-#: ../features.py:25
-msgid "SVGUI"
-msgstr ""
-
 #: ../BeremizIDE.py:246 ../BeremizIDE.py:277 ../PLCOpenEditor.py:84
 #: ../PLCOpenEditor.py:119
 msgid "Save"
@@ -4161,12 +4128,6 @@
 msgid "You cannot SDO download this state"
 msgstr ""
 
-#: ../svgui/svgui.py:150
-msgid ""
-"You don't have write permissions.\n"
-"Open Inkscape anyway ?"
-msgstr ""
-
 #: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
Binary file locale/de_DE/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/es_ES/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/fr_FR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/hu_HU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/it_IT/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ko_KR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/nl_NL/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt_BR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ru_RU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/sl_SI/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/tr_TR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/vi_VN/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/zh_CN/LC_MESSAGES/Beremiz.mo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/opc_ua/__init__.py	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,13 @@
+# opcua/__init__.py
+
+from __future__ import absolute_import
+
+from .client import OPCUAClient
+
+# class RootClass(object):
+#     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+#     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+#     </xsd:schema>
+#     """
+#     CTNChildrenTypes = [("OPCUAClient", OPCUAClient, "OPCUA Client")]
+# 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/opc_ua/client.py	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,112 @@
+# opcua/client.py
+
+from __future__ import absolute_import
+
+import os
+
+from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
+from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT
+from .opcua_client_maker import OPCUAClientPanel, OPCUAClientModel, UA_IEC_types
+
+import util.paths as paths
+
+# Paths to open62541 assume that 
+# - open62541 directory is aside beremiz directory
+# - open62541 was just built (not installed)
+
+Open62541Path = paths.ThirdPartyPath("open62541")
+Open62541LibraryPath = os.path.join(Open62541Path,"build","bin") 
+Open62541IncludePaths = [os.path.join(Open62541Path, *dirs) for dirs in [
+    ("plugins","include"),
+    ("build","src_generated"),
+    ("include",),
+    ("arch",)]]
+
+class OPCUAClientEditor(ConfTreeNodeEditor):
+    CONFNODEEDITOR_TABS = [
+        (_("OPC-UA Client"), "CreateOPCUAClient_UI")]
+
+    def Log(self, msg):
+        self.Controler.GetCTRoot().logger.write(msg)
+
+    def UriGetter(self):
+        return self.Controler.GetServerURI() 
+
+    def CreateOPCUAClient_UI(self, parent):
+        return OPCUAClientPanel(parent, self.Controler.GetModelData(), self.Log, self.UriGetter)
+
+class OPCUAClient(object):
+    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <xsd:element name="OPCUAClient">
+        <xsd:complexType>
+          <xsd:attribute name="Server_URI" type="xsd:string" use="optional" default="opc.tcp://localhost:4840"/>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:schema>
+    """
+
+    EditorType = OPCUAClientEditor
+
+    def __init__(self):
+        self.modeldata = OPCUAClientModel()
+
+        filepath = self.GetFileName()
+        if os.path.isfile(filepath):
+            self.modeldata.LoadCSV(filepath)
+
+    def GetModelData(self):
+        return self.modeldata
+    
+    def GetServerURI(self):
+        return self.GetParamsAttributes("OPCUAClient.Server_URI")["value"]
+
+    def GetFileName(self):
+        return os.path.join(self.CTNPath(), 'selected.csv')
+
+    def OnCTNSave(self, from_project_path=None):
+        self.modeldata.SaveCSV(self.GetFileName())
+        return True
+
+    def CTNGenerate_C(self, buildpath, locations):
+        current_location = self.GetCurrentLocation()
+        locstr = "_".join(map(str, current_location))
+        c_path = os.path.join(buildpath, "opcua_client__%s.c" % locstr)
+
+        c_code = self.modeldata.GenerateC(c_path, locstr, 
+            self.GetParamsAttributes("OPCUAClient.Server_URI")["value"])
+
+        with open(c_path, 'wb') as c_file:
+            c_file.write(c_code)
+
+        LDFLAGS = [' "' + os.path.join(Open62541LibraryPath, "libopen62541.a") + '"']
+
+        CFLAGS = ' '.join(['-I"' + path + '"' for path in Open62541IncludePaths])
+
+        return [(c_path, CFLAGS)], LDFLAGS, True
+
+    def GetVariableLocationTree(self):
+        current_location = self.GetCurrentLocation()
+        locstr = "_".join(map(str, current_location))
+        name = self.BaseParams.getName()
+        entries = []
+        for direction, data in self.modeldata.iteritems():
+            iec_direction_prefix = {"input": "__I", "output": "__Q"}[direction]
+            for row in data:
+                dname, ua_nsidx, ua_nodeid_type, _ua_node_id, ua_type, iec_number = row
+                iec_type, C_type, iec_size_prefix, ua_type_enum, ua_type = UA_IEC_types[ua_type]
+                c_loc_name = iec_direction_prefix + iec_size_prefix + locstr + "_" + str(iec_number)
+                entries.append({
+                    "name": dname,
+                    "type": {"input": LOCATION_VAR_INPUT, "output": LOCATION_VAR_OUTPUT}[direction],
+                    "size": {"X":1, "B":8, "W":16, "D":32, "L":64}[iec_size_prefix],
+                    "IEC_type": iec_type,
+                    "var_name": c_loc_name,
+                    "location": iec_size_prefix + ".".join([str(i) for i in current_location]) + "." + str(iec_number),
+                    "description": "",
+                    "children": []})
+        return {"name": name,
+                "type": LOCATION_CONFNODE,
+                "location": ".".join([str(i) for i in current_location]) + ".x",
+                "children": entries}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/opc_ua/opcua_client_maker.py	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,694 @@
+from __future__ import print_function
+from __future__ import absolute_import
+
+import csv
+
+from opcua import Client
+from opcua import ua
+
+import wx
+import wx.lib.gizmos as gizmos  # Formerly wx.gizmos in Classic
+import wx.dataview as dv
+
+
+UA_IEC_types = dict(
+#   pyopcua | IEC61131|  C  type  | sz |  open62541  enum  | open62541
+    Boolean = ("BOOL" , "uint8_t" , "X", "UA_TYPES_BOOLEAN", "UA_Boolean"),
+    SByte   = ("SINT" , "int8_t"  , "B", "UA_TYPES_SBYTE"  , "UA_SByte"  ),
+    Byte    = ("USINT", "uint8_t" , "B", "UA_TYPES_BYTE"   , "UA_Byte"   ),
+    Int16   = ("INT"  , "int16_t" , "W", "UA_TYPES_INT16"  , "UA_Int16"  ),
+    UInt16  = ("UINT" , "uint16_t", "W", "UA_TYPES_UINT16" , "UA_UInt16" ),
+    Int32   = ("DINT" , "uint32_t", "D", "UA_TYPES_INT32"  , "UA_Int32"  ),
+    UInt32  = ("UDINT", "int32_t" , "D", "UA_TYPES_UINT32" , "UA_UInt32" ),
+    Int64   = ("LINT" , "int64_t" , "L", "UA_TYPES_INT64"  , "UA_Int64"  ),
+    UInt64  = ("ULINT", "uint64_t", "L", "UA_TYPES_UINT64" , "UA_UInt64" ),
+    Float   = ("REAL" , "float"   , "D", "UA_TYPES_FLOAT"  , "UA_Float"  ),
+    Double  = ("LREAL", "double"  , "L", "UA_TYPES_DOUBLE" , "UA_Double" ),
+)
+
+UA_NODE_ID_types = {
+    "int"   : ("UA_NODEID_NUMERIC", "{}"  ),
+    "str"   : ("UA_NODEID_STRING" , '"{}"'),
+    "UUIS"  : ("UA_NODEID_UUID"   , '"{}"'),
+}
+
+lstcolnames  = [  "Name", "NSIdx", "IdType", "Id", "Type", "IEC"]
+lstcolwidths = [     100,      50,      100,  100,    100,    50]
+lstcoltypess = [     str,     int,      str,  str,    str,   int]
+
+directions = ["input", "output"]
+
+class OPCUASubListModel(dv.DataViewIndexListModel):
+    def __init__(self, data, log):
+        dv.DataViewIndexListModel.__init__(self, len(data))
+        self.data = data
+        self.log = log
+
+    def GetColumnType(self, col):
+        return "string"
+
+    def GetValueByRow(self, row, col):
+        return str(self.data[row][col])
+
+    # This method is called when the user edits a data item in the view.
+    def SetValueByRow(self, value, row, col):
+        expectedtype = lstcoltypess[col]
+
+        try:
+            v = expectedtype(value)
+        except ValueError: 
+            self.log("String {} is invalid for type {}\n".format(value,expectedtype.__name__))
+            return False
+
+        if col == lstcolnames.index("IdType") and v not in UA_NODE_ID_types:
+            self.log("{} is invalid for IdType\n".format(value))
+            return False
+
+        self.data[row][col] = v
+        return True
+
+    # Report how many columns this model provides data for.
+    def GetColumnCount(self):
+        return len(lstcolnames)
+
+    # Report the number of rows in the model
+    def GetCount(self):
+        #self.log.write('GetCount')
+        return len(self.data)
+
+    # Called to check if non-standard attributes should be used in the
+    # cell at (row, col)
+    def GetAttrByRow(self, row, col, attr):
+        if col == 5:
+            attr.SetColour('blue')
+            attr.SetBold(True)
+            return True
+        return False
+
+
+    def DeleteRows(self, rows):
+        # make a copy since we'll be sorting(mutating) the list
+        # use reverse order so the indexes don't change as we remove items
+        rows = sorted(rows, reverse=True)
+
+        for row in rows:
+            # remove it from our data structure
+            del self.data[row]
+            # notify the view(s) using this model that it has been removed
+            self.RowDeleted(row)
+
+
+    def AddRow(self, value):
+        v = dict(zip(lstcolnames, value))
+
+        if type(v["IEC"]) != int:
+            if len(self.data) == 0:
+                v["IEC"] = 0
+            else:
+                iecnums = set(zip(*self.data)[lstcolnames.index("IEC")])
+                greatest = max(iecnums)
+                holes = set(range(greatest)) - iecnums
+                v["IEC"] = min(holes) if holes else greatest+1
+
+        if v["IdType"] not in UA_NODE_ID_types:
+            self.log("Unknown IdType\n".format(value))
+            return
+
+        try:
+            for t,n in zip(lstcoltypess, lstcolnames):
+                v[n] = t(v[n]) 
+        except ValueError: 
+            self.log("Variable {} (Id={}) has invalid type\n".format(v["Name"],v["Id"]))
+            return
+
+        if len(self.data)>0 and v["Id"] in zip(*self.data)[lstcolnames.index("Id")]:
+            self.log("Variable {} (Id={}) already in list\n".format(v["Name"],v["Id"]))
+            return
+
+        self.data.append([v[n] for n in lstcolnames])
+
+        # notify views
+        self.RowAppended()
+    
+    def ResetData(self):
+        self.Reset(len(self.data))
+
+OPCUAClientDndMagicWord = "text/beremiz-opcuaclient"
+
+class NodeDropTarget(wx.DropTarget):
+
+    def __init__(self, parent):
+        data = wx.CustomDataObject(OPCUAClientDndMagicWord)
+        wx.DropTarget.__init__(self, data)
+        self.ParentWindow = parent
+
+    def OnDrop(self, x, y):
+        self.ParentWindow.OnNodeDnD()
+        return True
+
+class OPCUASubListPanel(wx.Panel):
+    def __init__(self, parent, log, model, direction):
+        self.log = log
+        wx.Panel.__init__(self, parent, -1)
+
+        self.dvc = dv.DataViewCtrl(self,
+                                   style=wx.BORDER_THEME
+                                   | dv.DV_ROW_LINES
+                                   | dv.DV_HORIZ_RULES
+                                   | dv.DV_VERT_RULES
+                                   | dv.DV_MULTIPLE
+                                   )
+
+        self.model = model
+
+        self.dvc.AssociateModel(self.model)
+
+        for idx,(colname,width) in enumerate(zip(lstcolnames,lstcolwidths)):
+            self.dvc.AppendTextColumn(colname,  idx, width=width, mode=dv.DATAVIEW_CELL_EDITABLE)
+
+        DropTarget = NodeDropTarget(self)
+        self.dvc.SetDropTarget(DropTarget)
+
+        self.Sizer = wx.BoxSizer(wx.VERTICAL)
+
+        self.direction =  direction
+        titlestr = direction + " variables"
+
+        title = wx.StaticText(self, label = titlestr)
+
+        delbt = wx.Button(self, label="Delete Row(s)")
+        self.Bind(wx.EVT_BUTTON, self.OnDeleteRows, delbt)
+
+        topsizer = wx.BoxSizer(wx.HORIZONTAL)
+        topsizer.Add(title, 1, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
+        topsizer.Add(delbt, 0, wx.LEFT|wx.RIGHT, 5)
+        self.Sizer.Add(topsizer, 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
+        self.Sizer.Add(self.dvc, 1, wx.EXPAND)
+
+
+
+    def OnDeleteRows(self, evt):
+        items = self.dvc.GetSelections()
+        rows = [self.model.GetRow(item) for item in items]
+        self.model.DeleteRows(rows)
+
+
+    def OnNodeDnD(self):
+        # Have to find OPC-UA client extension panel from here 
+        # in order to avoid keeping reference (otherwise __del__ isn't called)
+        #             splitter.        panel.      splitter
+        ClientPanel = self.GetParent().GetParent().GetParent()
+        nodes = ClientPanel.GetSelectedNodes()
+        for node in nodes:
+            cname = node.get_node_class().name
+            dname = node.get_display_name().to_string()
+            if cname != "Variable":
+                self.log("Node {} ignored (not a variable)".format(dname))
+                continue
+
+            tname = node.get_data_type_as_variant_type().name
+            if tname not in UA_IEC_types:
+                self.log("Node {} ignored (unsupported type)".format(dname))
+                continue
+
+            access = node.get_access_level()
+            if {"input":ua.AccessLevel.CurrentRead,
+                "output":ua.AccessLevel.CurrentWrite}[self.direction] not in access:
+                self.log("Node {} ignored because of insuficient access rights".format(dname))
+                continue
+
+            nsid = node.nodeid.NamespaceIndex
+            nid =  node.nodeid.Identifier
+            nid_type =  type(nid).__name__
+            iecid = nid
+
+            value = [dname,
+                     nsid,
+                     nid_type,
+                     nid,
+                     tname,
+                     iecid]
+            self.model.AddRow(value)
+
+
+
+il = None
+fldridx = None    
+fldropenidx = None
+fileidx = None
+smileidx = None
+isz = (16,16)
+
+treecolnames  = [  "Name", "Class", "NSIdx", "Id"]
+treecolwidths = [     250,     100,      50,  200]
+
+
+def prepare_image_list():
+    global il, fldridx, fldropenidx, fileidx, smileidx    
+
+    if il is not None: 
+        return
+
+    il = wx.ImageList(isz[0], isz[1])
+    fldridx     = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
+    fldropenidx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
+    fileidx     = il.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
+    smileidx    = il.Add(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_OTHER, isz))
+
+
+class OPCUAClientPanel(wx.SplitterWindow):
+    def __init__(self, parent, modeldata, log, uri_getter):
+        self.log = log
+        wx.SplitterWindow.__init__(self, parent, -1)
+
+        self.ordered_nodes = []
+
+        self.inout_panel = wx.Panel(self)
+        self.inout_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+        self.inout_sizer.AddGrowableCol(0)
+        self.inout_sizer.AddGrowableRow(1)
+
+        self.client = None
+        self.uri_getter = uri_getter
+
+        self.connect_button = wx.ToggleButton(self.inout_panel, -1, "Browse Server")
+
+        self.selected_splitter = wx.SplitterWindow(self.inout_panel, style=wx.SUNKEN_BORDER | wx.SP_3D)
+
+        self.selected_datas = modeldata
+        self.selected_models = { direction:OPCUASubListModel(self.selected_datas[direction], log) for direction in directions }
+        self.selected_lists = { direction:OPCUASubListPanel(
+                self.selected_splitter, log, 
+                self.selected_models[direction], direction) 
+            for direction in directions }
+
+        self.selected_splitter.SplitHorizontally(*[self.selected_lists[direction] for direction in directions]+[300])
+
+        self.inout_sizer.Add(self.connect_button, flag=wx.GROW)
+        self.inout_sizer.Add(self.selected_splitter, flag=wx.GROW)
+        self.inout_sizer.Layout()
+        self.inout_panel.SetAutoLayout(True)
+        self.inout_panel.SetSizer(self.inout_sizer)
+
+        self.Initialize(self.inout_panel)
+
+        self.Bind(wx.EVT_TOGGLEBUTTON, self.OnConnectButton, self.connect_button)
+
+    def OnClose(self):
+        if self.client is not None:
+            self.client.disconnect()
+            self.client = None
+
+    def __del__(self):
+        self.OnClose()
+
+    def OnConnectButton(self, event):
+        if self.connect_button.GetValue():
+            
+            self.tree_panel = wx.Panel(self)
+            self.tree_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+            self.tree_sizer.AddGrowableCol(0)
+            self.tree_sizer.AddGrowableRow(0)
+
+            self.tree = gizmos.TreeListCtrl(self.tree_panel, -1, style=0, agwStyle=
+                                            gizmos.TR_DEFAULT_STYLE
+                                            | gizmos.TR_MULTIPLE
+                                            | gizmos.TR_FULL_ROW_HIGHLIGHT
+                                       )
+
+            prepare_image_list()
+            self.tree.SetImageList(il)
+
+            for idx,(colname, width) in enumerate(zip(treecolnames, treecolwidths)):
+                self.tree.AddColumn(colname)
+                self.tree.SetColumnWidth(idx, width)
+
+            self.tree.SetMainColumn(0)
+
+            self.client = Client(self.uri_getter())
+            self.client.connect()
+            self.client.load_type_definitions()  # load definition of server specific structures/extension objects
+            rootnode = self.client.get_root_node()
+
+            rootitem = self.AddNodeItem(self.tree.AddRoot, rootnode)
+
+            # Populate first level so that root can be expanded
+            self.CreateSubItems(rootitem)
+
+            self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnExpand)
+
+            self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeNodeSelection)
+            self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag)
+
+            self.tree.Expand(rootitem)
+
+            hint = wx.StaticText(self, label = "Drag'n'drop desired variables from tree to Input or Output list")
+
+            self.tree_sizer.Add(self.tree, flag=wx.GROW)
+            self.tree_sizer.Add(hint, flag=wx.GROW)
+            self.tree_sizer.Layout()
+            self.tree_panel.SetAutoLayout(True)
+            self.tree_panel.SetSizer(self.tree_sizer)
+
+            self.SplitVertically(self.tree_panel, self.inout_panel, 500)
+        else:
+            self.client.disconnect()
+            self.client = None
+            self.Unsplit(self.tree_panel)
+            self.tree_panel.Destroy()
+
+
+    def CreateSubItems(self, item):
+        node, browsed = self.tree.GetPyData(item)
+        if not browsed:
+            for subnode in node.get_children():
+                self.AddNodeItem(lambda n: self.tree.AppendItem(item, n), subnode)
+            self.tree.SetPyData(item,(node, True))
+
+    def AddNodeItem(self, item_creation_func, node):
+        nsid = node.nodeid.NamespaceIndex
+        nid =  node.nodeid.Identifier
+        dname = node.get_display_name().Text
+        cname = node.get_node_class().name
+
+        item = item_creation_func(dname)
+
+        if cname == "Variable":
+            access = node.get_access_level()
+            normalidx = fileidx
+            r = ua.AccessLevel.CurrentRead in access
+            w = ua.AccessLevel.CurrentWrite in access
+            if r and w:
+                ext = "RW"
+            elif r:
+                ext = "RO"
+            elif w:
+                ext = "WO"  # not sure this one exist
+            else:
+                ext = "no access"  # not sure this one exist
+            cname = "Var "+node.get_data_type_as_variant_type().name+" (" + ext + ")"
+        else:
+            normalidx = fldridx
+
+        self.tree.SetPyData(item,(node, False))
+        self.tree.SetItemText(item, cname, 1)
+        self.tree.SetItemText(item, str(nsid), 2)
+        self.tree.SetItemText(item, type(nid).__name__+": "+str(nid), 3)
+        self.tree.SetItemImage(item, normalidx, which = wx.TreeItemIcon_Normal)
+        self.tree.SetItemImage(item, fldropenidx, which = wx.TreeItemIcon_Expanded)
+
+        return item
+
+    def OnExpand(self, evt):
+        for item in evt.GetItem().GetChildren():
+            self.CreateSubItems(item)
+
+    # def OnActivate(self, evt):
+    #     item = evt.GetItem()
+    #     node, browsed = self.tree.GetPyData(item)
+
+    def OnTreeNodeSelection(self, event):
+        items = self.tree.GetSelections()
+        items_pydata = [self.tree.GetPyData(item) for item in items]
+
+        nodes = [node for node, _unused in items_pydata]
+
+        # append new nodes to ordered list
+        for node in nodes:
+            if node not in self.ordered_nodes:
+                self.ordered_nodes.append(node)
+
+        # filter out vanished items
+        self.ordered_nodes = [
+            node 
+            for node in self.ordered_nodes 
+            if node in nodes]
+
+    def GetSelectedNodes(self):
+        return self.ordered_nodes 
+
+    def OnTreeBeginDrag(self, event):
+        """
+        Called when a drag is started in tree
+        @param event: wx.TreeEvent
+        """
+        if self.ordered_nodes:
+            # Just send a recognizable mime-type, drop destination
+            # will get python data from parent
+            data = wx.CustomDataObject(OPCUAClientDndMagicWord)
+            dragSource = wx.DropSource(self)
+            dragSource.SetData(data)
+            dragSource.DoDragDrop()
+
+    def Reset(self):
+        for direction in directions:
+            self.selected_models[direction].ResetData() 
+        
+
+class OPCUAClientModel(dict):
+    def __init__(self):
+        for direction in directions:
+            self[direction] = list()
+
+    def LoadCSV(self,path):
+        with open(path, 'rb') as csvfile:
+            reader = csv.reader(csvfile, delimiter=',', quotechar='"')
+            buf = {direction:[] for direction, _model in self.iteritems()}
+            for row in reader:
+                direction = row[0]
+                buf[direction].append(row[1:])
+            for direction, model in self.iteritems():
+                self[direction][:] = buf[direction]
+
+    def SaveCSV(self,path):
+        with open(path, 'wb') as csvfile:
+            for direction, data in self.iteritems():
+                writer = csv.writer(csvfile, delimiter=',',
+                                quotechar='"', quoting=csv.QUOTE_MINIMAL)
+                for row in data:
+                    writer.writerow([direction] + row)
+
+    def GenerateC(self, path, locstr, server_uri):
+        template = """/* code generated by beremiz OPC-UA extension */
+
+#include <open62541/client_config_default.h>
+#include <open62541/client_highlevel.h>
+#include <open62541/plugin/log_stdout.h>
+
+UA_Client *client;
+
+#define DECL_VAR(ua_type, C_type, c_loc_name)                                                       \\
+UA_Variant *c_loc_name##_variant;                                                                   \\
+C_type c_loc_name##_buf = 0;                                                                        \\
+C_type *c_loc_name = &c_loc_name##_buf;
+
+%(decl)s
+
+#define FREE_VARIANT(ua_type, c_loc_name)                                                           \\
+    UA_Variant_delete(c_loc_name##_variant);
+
+void __cleanup_%(locstr)s(void)
+{
+    UA_Client_disconnect(client);
+    UA_Client_delete(client);
+%(cleanup)s
+}
+
+
+#define ALLOC_VARIANT(ua_type, c_loc_name)                                                          \\
+    c_loc_name##_variant = UA_Variant_new();
+
+int __init_%(locstr)s(int argc,char **argv)
+{
+    UA_StatusCode retval;
+    client = UA_Client_new();
+    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
+%(init)s
+
+    /* Connect to server */
+    retval = UA_Client_connect(client, "%(uri)s");
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_Client_delete(client);
+        return EXIT_FAILURE;
+    }
+}
+
+#define READ_VALUE(ua_type, ua_type_enum, c_loc_name, ua_nodeid_type, ua_nsidx, ua_node_id)         \\
+    retval = UA_Client_readValueAttribute(                                                          \\
+        client, ua_nodeid_type(ua_nsidx, ua_node_id), c_loc_name##_variant);                        \\
+    if(retval == UA_STATUSCODE_GOOD && UA_Variant_isScalar(c_loc_name##_variant) &&                 \\
+       c_loc_name##_variant->type == &UA_TYPES[ua_type_enum]) {                                     \\
+            c_loc_name##_buf = *(ua_type*)c_loc_name##_variant->data;                               \\
+    }
+
+void __retrieve_%(locstr)s(void)
+{
+    UA_StatusCode retval;
+%(retrieve)s
+}
+
+#define WRITE_VALUE(ua_type, ua_type_enum, c_loc_name, ua_nodeid_type, ua_nsidx, ua_node_id)        \\
+    UA_Variant_setScalarCopy(c_loc_name##_variant, (ua_type*)c_loc_name, &UA_TYPES[ua_type_enum]);  \\
+    UA_Client_writeValueAttribute(client, ua_nodeid_type(ua_nsidx, ua_node_id), c_loc_name##_variant);
+
+void __publish_%(locstr)s(void)
+{
+%(publish)s
+}
+
+"""
+        
+        formatdict = dict(
+            locstr   = locstr,
+            uri      = server_uri,
+            decl     = "",
+            cleanup  = "",
+            init     = "",
+            retrieve = "",
+            publish  = "" 
+        )
+        for direction, data in self.iteritems():
+            iec_direction_prefix = {"input": "__I", "output": "__Q"}[direction]
+            for row in data:
+                name, ua_nsidx, ua_nodeid_type, _ua_node_id, ua_type, iec_number = row
+                iec_type, C_type, iec_size_prefix, ua_type_enum, ua_type = UA_IEC_types[ua_type]
+                c_loc_name = iec_direction_prefix + iec_size_prefix + locstr + "_" + str(iec_number)
+                ua_nodeid_type, id_formating = UA_NODE_ID_types[ua_nodeid_type]
+                ua_node_id = id_formating.format(_ua_node_id)
+
+                formatdict["decl"] += """
+DECL_VAR({ua_type}, {C_type}, {c_loc_name})""".format(**locals())
+                formatdict["cleanup"] += """
+    FREE_VARIANT({ua_type}, {c_loc_name})""".format(**locals())
+                formatdict["init"] +="""
+    ALLOC_VARIANT({ua_type}, {c_loc_name})""".format(**locals())
+                formatdict["retrieve"] += """
+    READ_VALUE({ua_type}, {ua_type_enum}, {c_loc_name}, {ua_nodeid_type}, {ua_nsidx}, {ua_node_id})""".format(**locals())
+                formatdict["publish"] += """
+    WRITE_VALUE({ua_type}, {ua_type_enum}, {c_loc_name}, {ua_nodeid_type}, {ua_nsidx}, {ua_node_id})""".format(**locals())
+
+        Ccode = template%formatdict
+        
+        return Ccode
+
+if __name__ == "__main__":
+
+    import wx.lib.mixins.inspection as wit
+    import sys,os
+
+    app = wit.InspectableApp()
+
+    frame = wx.Frame(None, -1, "OPCUA Client Test App", size=(800,600))
+
+    uri = sys.argv[1] if len(sys.argv)>1 else "opc.tcp://localhost:4840"
+
+    test_panel = wx.Panel(frame)
+    test_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
+    test_sizer.AddGrowableCol(0)
+    test_sizer.AddGrowableRow(0)
+
+    modeldata = OPCUAClientModel()
+
+    opcuatestpanel = OPCUAClientPanel(test_panel, modeldata, print, lambda:uri)
+
+    def OnGenerate(evt):
+        dlg = wx.FileDialog(
+            frame, message="Generate file as ...", defaultDir=os.getcwd(),
+            defaultFile="", 
+            wildcard="C (*.c)|*.c", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
+            )
+
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            Ccode = """
+/*
+In case open62541 was built just aside beremiz, you can build this test with:
+gcc %s -o %s \\
+    -I ../../open62541/plugins/include/ \\
+    -I ../../open62541/build/src_generated/ \\
+    -I ../../open62541/include/ \\
+    -I ../../open62541/arch/ ../../open62541/build/bin/libopen62541.a
+*/
+
+"""%(path, path[:-2]) + modeldata.GenerateC(path, "test", uri) + """
+
+int main(int argc, char *argv[]) {
+
+    __init_test(arc,argv);
+   
+    __retrieve_test();
+   
+    __publish_test();
+
+    __cleanup_test();
+
+    return EXIT_SUCCESS;
+}
+"""
+
+            with open(path, 'wb') as Cfile:
+                Cfile.write(Ccode)
+
+
+        dlg.Destroy()
+
+    def OnLoad(evt):
+        dlg = wx.FileDialog(
+            frame, message="Choose a file",
+            defaultDir=os.getcwd(),
+            defaultFile="",
+            wildcard="CSV (*.csv)|*.csv",
+            style=wx.FD_OPEN | wx.FD_CHANGE_DIR | wx.FD_FILE_MUST_EXIST )
+
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            modeldata.LoadCSV(path)
+            opcuatestpanel.Reset()
+
+        dlg.Destroy()
+
+    def OnSave(evt):
+        dlg = wx.FileDialog(
+            frame, message="Save file as ...", defaultDir=os.getcwd(),
+            defaultFile="", 
+            wildcard="CSV (*.csv)|*.csv", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT
+            )
+
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            modeldata.SaveCSV(path)
+
+        dlg.Destroy()
+
+    test_sizer.Add(opcuatestpanel, flag=wx.GROW)
+
+    testbt_sizer = wx.BoxSizer(wx.HORIZONTAL)
+
+    loadbt = wx.Button(test_panel, label="Load")
+    test_panel.Bind(wx.EVT_BUTTON, OnLoad, loadbt)
+
+    savebt = wx.Button(test_panel, label="Save")
+    test_panel.Bind(wx.EVT_BUTTON, OnSave, savebt)
+
+    genbt = wx.Button(test_panel, label="Generate")
+    test_panel.Bind(wx.EVT_BUTTON, OnGenerate, genbt)
+
+    testbt_sizer.Add(loadbt, 0, wx.LEFT|wx.RIGHT, 5)
+    testbt_sizer.Add(savebt, 0, wx.LEFT|wx.RIGHT, 5)
+    testbt_sizer.Add(genbt, 0, wx.LEFT|wx.RIGHT, 5)
+
+    test_sizer.Add(testbt_sizer, flag=wx.GROW)
+    test_sizer.Layout()
+    test_panel.SetAutoLayout(True)
+    test_panel.SetSizer(test_sizer)
+
+    def OnClose(evt):
+        opcuatestpanel.OnClose()
+        evt.Skip()
+
+    frame.Bind(wx.EVT_CLOSE, OnClose)
+
+    frame.Show()
+
+    app.MainLoop()
+
--- a/runtime/PyroServer.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/runtime/PyroServer.py	Wed Oct 20 08:57:07 2021 +0200
@@ -62,8 +62,15 @@
             self.daemon.connect(pyro_obj, "PLCObject")
 
             when_ready()
-            self.piper, self.pipew = os.pipe()
-            self.daemon.requestLoop(others=[self.piper], callback=lambda x: None)
+
+            # "pipe to self" trick to to accelerate runtime shutdown 
+            # instead of waiting for arbitrary pyro timeout.
+            others = []
+            if not sys.platform.startswith('win'):
+                self.piper, self.pipew = os.pipe()
+                others.append(self.piper)
+
+            self.daemon.requestLoop(others=others, callback=lambda x: None)
             self.piper, self.pipew = None, None
             if hasattr(self, 'sock'):
                 self.daemon.sock.close()
@@ -76,8 +83,9 @@
         self.continueloop = False
         self.daemon.shutdown(True)
         self.daemon.closedown()
-        if self.pipew is not None:
-            os.write(self.pipew, "goodbye")
+        if not sys.platform.startswith('win'):
+            if self.pipew is not None:
+                os.write(self.pipew, "goodbye")
 
     def Publish(self):
         self.servicepublisher = ServicePublisher("PYRO")
--- a/svghmi/analyse_widget.xslt	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/analyse_widget.xslt	Wed Oct 20 08:57:07 2021 +0200
@@ -221,14 +221,16 @@
 </xsl:text>
       <xsl:text>in between 0 and 100.
 </xsl:text>
-      <xsl:text>
-</xsl:text>
-      <xsl:text>If "value" labeled text is found, then its content is replaced by value.
-</xsl:text>
     </longdesc>
     <shortdesc>
       <xsl:text>Change end angle of Inkscape's arc</xsl:text>
     </shortdesc>
+    <arg name="min" count="optional" accepts="int,real">
+      <xsl:text>minimum value</xsl:text>
+    </arg>
+    <arg name="max" count="optional" accepts="int,real">
+      <xsl:text>maximum value</xsl:text>
+    </arg>
     <path name="value" accepts="HMI_INT,HMI_REAL">
       <xsl:text>Value to display</xsl:text>
     </path>
@@ -339,9 +341,11 @@
 </xsl:text>
       <xsl:text>
 </xsl:text>
-      <xsl:text>It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*),
-</xsl:text>
-      <xsl:text>and "highlight" (svg:rect) labeled elements.
+      <xsl:text>It needs "text" (svg:text or svg:use referring to svg:text),
+</xsl:text>
+      <xsl:text>"box" (svg:rect), "button" (svg:*), and "highlight" (svg:rect)
+</xsl:text>
+      <xsl:text>labeled elements.
 </xsl:text>
       <xsl:text>
 </xsl:text>
@@ -353,11 +357,19 @@
 </xsl:text>
       <xsl:text>
 </xsl:text>
-      <xsl:text>When only one argument is given, and argment contains "#langs" then list of
-</xsl:text>
-      <xsl:text>texts is automatically set to the list of human-readable languages supported
-</xsl:text>
-      <xsl:text>by this HMI. 
+      <xsl:text>When only one argument is given and argment contains "#langs" then list of
+</xsl:text>
+      <xsl:text>texts is automatically set to the human-readable list of supported
+</xsl:text>
+      <xsl:text>languages by this HMI. 
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>If "text" labeled element is of type svg:use and refers to a svg:text 
+</xsl:text>
+      <xsl:text>element part of a TextList widget, no argument is expected. In that case
+</xsl:text>
+      <xsl:text>list of texts is set to TextList content.
 </xsl:text>
     </longdesc>
     <shortdesc>
@@ -529,6 +541,30 @@
     <type>
       <xsl:value-of select="@type"/>
     </type>
+    <longdesc>
+      <xsl:text>List widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a List, clone (svg:use) one of the items inside the widget that
+</xsl:text>
+      <xsl:text>expects a List.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>Positions of items are relative to each other, and they must all be in the
+</xsl:text>
+      <xsl:text>same place. In order to make editing easier it is therefore recommanded to
+</xsl:text>
+      <xsl:text>make stacked clones of svg elements spread nearby the list.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of named graphical elements</xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
   </xsl:template>
   <xsl:template match="widget[@type='Meter']" mode="widget_desc">
     <type>
@@ -549,10 +585,6 @@
 </xsl:text>
       <xsl:text>in between 0 and 100.
 </xsl:text>
-      <xsl:text>
-</xsl:text>
-      <xsl:text>If "value" labeled text is found, then its content is replaced by value.
-</xsl:text>
     </longdesc>
     <shortdesc>
       <xsl:text>Moves "needle" along "range"</xsl:text>
@@ -567,12 +599,39 @@
       <xsl:text>Value to display</xsl:text>
     </path>
   </xsl:template>
+  <xsl:template match="widget[@type='PathSlider']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>PathSlider - 
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>Slide an SVG element along a path by dragging it</xsl:text>
+    </shortdesc>
+    <path name="value" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>value</xsl:text>
+    </path>
+    <path name="min" count="optional" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>min</xsl:text>
+    </path>
+    <path name="max" count="optional" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>max</xsl:text>
+    </path>
+    <arg name="min" count="optional" accepts="int,real">
+      <xsl:text>minimum value</xsl:text>
+    </arg>
+    <arg name="max" count="optional" accepts="int,real">
+      <xsl:text>maximum value</xsl:text>
+    </arg>
+  </xsl:template>
   <xsl:template match="widget[@type='ScrollBar']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
     </type>
     <longdesc>
-      <xsl:text>ScrollBar - documentation to be written
+      <xsl:text>ScrollBar - svg:rect based scrollbar
 </xsl:text>
     </longdesc>
     <shortdesc>
@@ -634,6 +693,58 @@
       <xsl:text>value to compare to labels</xsl:text>
     </path>
   </xsl:template>
+  <xsl:template match="widget[@type='TextList']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>TextList widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a TextList, clone (svg:use) one of the items inside the widget 
+</xsl:text>
+      <xsl:text>that expects a TextList.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>In this list, (translated) text content is what matters. Nevertheless
+</xsl:text>
+      <xsl:text>text style of the cloned item will be applied in client widget.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of ordered texts </xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
+  </xsl:template>
+  <xsl:template match="widget[@type='TextStyleList']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>TextStyleList widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a TextStyleList, clone (svg:use) one of the items inside the widget 
+</xsl:text>
+      <xsl:text>that expects a TextStyleList.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>In this list, only style matters. Text content is ignored.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of named texts</xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
+  </xsl:template>
   <xsl:template match="widget[@type='ToggleButton']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
--- a/svghmi/detachable_pages.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/detachable_pages.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -88,10 +88,7 @@
 const "required_page_elements",
     "func:required_elements($hmi_pages | $keypads)/ancestor-or-self::svg:*";
 
-const "hmi_lists_descs", "$parsed_widgets/widget[@type = 'List']";
-const "hmi_lists", "$hmi_elements[@id = $hmi_lists_descs/@id]";
-
-const "required_list_elements", "func:refered_elements($hmi_lists[@id = $required_page_elements/@id])";
+const "required_list_elements", "func:refered_elements(($hmi_lists | $hmi_textlists)[@id = $required_page_elements/@id])";
 
 const "required_elements", "$defs | $required_list_elements | $required_page_elements";
 
--- a/svghmi/gen_index_xhtml.xslt	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/gen_index_xhtml.xslt	Wed Oct 20 08:57:07 2021 +0200
@@ -432,6 +432,29 @@
     <xsl:variable name="candidates" select="$geometry[@Id != $elt/@id]"/>
     <func:result select="$candidates[(@Id = $groups/@id and (func:intersect($g, .) = 9)) or &#10;                          (not(@Id = $groups/@id) and (func:intersect($g, .) &gt; 0 ))]"/>
   </func:function>
+  <xsl:variable name="hmi_lists_descs" select="$parsed_widgets/widget[@type = 'List']"/>
+  <xsl:variable name="hmi_lists" select="$hmi_elements[@id = $hmi_lists_descs/@id]"/>
+  <xsl:variable name="hmi_textlists_descs" select="$parsed_widgets/widget[@type = 'TextList']"/>
+  <xsl:variable name="hmi_textlists" select="$hmi_elements[@id = $hmi_textlists_descs/@id]"/>
+  <xsl:variable name="hmi_textstylelists_descs" select="$parsed_widgets/widget[@type = 'TextStyleList']"/>
+  <xsl:variable name="hmi_textstylelists" select="$hmi_elements[@id = $hmi_textstylelists_descs/@id]"/>
+  <xsl:variable name="textstylelist_related">
+    <xsl:for-each select="$hmi_textstylelists">
+      <list>
+        <xsl:attribute name="listid">
+          <xsl:value-of select="@id"/>
+        </xsl:attribute>
+        <xsl:for-each select="func:refered_elements(.)">
+          <elt>
+            <xsl:attribute name="eltid">
+              <xsl:value-of select="@id"/>
+            </xsl:attribute>
+          </elt>
+        </xsl:for-each>
+      </list>
+    </xsl:for-each>
+  </xsl:variable>
+  <xsl:variable name="textstylelist_related_ns" select="exsl:node-set($textstylelist_related)"/>
   <xsl:variable name="hmi_pages_descs" select="$parsed_widgets/widget[@type = 'Page']"/>
   <xsl:variable name="hmi_pages" select="$hmi_elements[@id = $hmi_pages_descs/@id]"/>
   <xsl:variable name="default_page">
@@ -526,9 +549,7 @@
     </xsl:choose>
   </func:function>
   <xsl:variable name="required_page_elements" select="func:required_elements($hmi_pages | $keypads)/ancestor-or-self::svg:*"/>
-  <xsl:variable name="hmi_lists_descs" select="$parsed_widgets/widget[@type = 'List']"/>
-  <xsl:variable name="hmi_lists" select="$hmi_elements[@id = $hmi_lists_descs/@id]"/>
-  <xsl:variable name="required_list_elements" select="func:refered_elements($hmi_lists[@id = $required_page_elements/@id])"/>
+  <xsl:variable name="required_list_elements" select="func:refered_elements(($hmi_lists | $hmi_textlists)[@id = $required_page_elements/@id])"/>
   <xsl:variable name="required_elements" select="$defs | $required_list_elements | $required_page_elements"/>
   <xsl:variable name="discardable_elements" select="//svg:*[not(@id = $required_elements/@id)]"/>
   <func:function name="func:sumarized_elements">
@@ -2381,14 +2402,16 @@
 </xsl:text>
       <xsl:text>in between 0 and 100.
 </xsl:text>
-      <xsl:text>
-</xsl:text>
-      <xsl:text>If "value" labeled text is found, then its content is replaced by value.
-</xsl:text>
     </longdesc>
     <shortdesc>
       <xsl:text>Change end angle of Inkscape's arc</xsl:text>
     </shortdesc>
+    <arg name="min" count="optional" accepts="int,real">
+      <xsl:text>minimum value</xsl:text>
+    </arg>
+    <arg name="max" count="optional" accepts="int,real">
+      <xsl:text>maximum value</xsl:text>
+    </arg>
     <path name="value" accepts="HMI_INT,HMI_REAL">
       <xsl:text>Value to display</xsl:text>
     </path>
@@ -2456,6 +2479,12 @@
 </xsl:text>
     <xsl:text>    init() {
 </xsl:text>
+    <xsl:text>        if(this.args.length &gt;= 2)
+</xsl:text>
+    <xsl:text>            [this.min, this.max]=this.args;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
     <xsl:text>        let [start, end, cx, cy, rx, ry] = ["start", "end", "cx", "cy", "rx", "ry"].
 </xsl:text>
     <xsl:text>            map(tag=&gt;Number(this.path_elt.getAttribute('sodipodi:'+tag)))
@@ -2504,7 +2533,7 @@
     <xsl:call-template name="defs_by_labels">
       <xsl:with-param name="hmi_element" select="$hmi_element"/>
       <xsl:with-param name="labels">
-        <xsl:text>value min max</xsl:text>
+        <xsl:text>min max</xsl:text>
       </xsl:with-param>
       <xsl:with-param name="mandatory" select="'no'"/>
     </xsl:call-template>
@@ -3227,483 +3256,6 @@
 </xsl:text>
     </xsl:if>
   </xsl:template>
-  <preamble:display/>
-  <xsl:template match="preamble:display">
-    <xsl:text>
-</xsl:text>
-    <xsl:text>/* </xsl:text>
-    <xsl:value-of select="local-name()"/>
-    <xsl:text> */
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */
-</xsl:text>
-    <xsl:text>/* global window, exports, define */
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>!function() {
-</xsl:text>
-    <xsl:text>    'use strict'
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    var re = {
-</xsl:text>
-    <xsl:text>        not_string: /[^s]/,
-</xsl:text>
-    <xsl:text>        not_bool: /[^t]/,
-</xsl:text>
-    <xsl:text>        not_type: /[^T]/,
-</xsl:text>
-    <xsl:text>        not_primitive: /[^v]/,
-</xsl:text>
-    <xsl:text>        number: /[diefg]/,
-</xsl:text>
-    <xsl:text>        numeric_arg: /[bcdiefguxX]/,
-</xsl:text>
-    <xsl:text>        json: /[j]/,
-</xsl:text>
-    <xsl:text>        not_json: /[^j]/,
-</xsl:text>
-    <xsl:text>        text: /^[^%]+/,
-</xsl:text>
-    <xsl:text>        modulo: /^%{2}/,
-</xsl:text>
-    <xsl:text>        placeholder: /^%(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
-</xsl:text>
-    <xsl:text>        key: /^([a-z_][a-z_\d]*)/i,
-</xsl:text>
-    <xsl:text>        key_access: /^\.([a-z_][a-z_\d]*)/i,
-</xsl:text>
-    <xsl:text>        index_access: /^\[(\d+)\]/,
-</xsl:text>
-    <xsl:text>        sign: /^[+-]/
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    function sprintf(key) {
-</xsl:text>
-    <xsl:text>        // arguments is not an array, but should be fine for this call
-</xsl:text>
-    <xsl:text>        return sprintf_format(sprintf_parse(key), arguments)
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    function vsprintf(fmt, argv) {
-</xsl:text>
-    <xsl:text>        return sprintf.apply(null, [fmt].concat(argv || []))
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    function sprintf_format(parse_tree, argv) {
-</xsl:text>
-    <xsl:text>        var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
-</xsl:text>
-    <xsl:text>        for (i = 0; i &lt; tree_length; i++) {
-</xsl:text>
-    <xsl:text>            if (typeof parse_tree[i] === 'string') {
-</xsl:text>
-    <xsl:text>                output += parse_tree[i]
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>            else if (typeof parse_tree[i] === 'object') {
-</xsl:text>
-    <xsl:text>                ph = parse_tree[i] // convenience purposes only
-</xsl:text>
-    <xsl:text>                if (ph.keys) { // keyword argument
-</xsl:text>
-    <xsl:text>                    arg = argv[cursor]
-</xsl:text>
-    <xsl:text>                    for (k = 0; k &lt; ph.keys.length; k++) {
-</xsl:text>
-    <xsl:text>                        if (arg == undefined) {
-</xsl:text>
-    <xsl:text>                            throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
-</xsl:text>
-    <xsl:text>                        }
-</xsl:text>
-    <xsl:text>                        arg = arg[ph.keys[k]]
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                else if (ph.param_no) { // positional argument (explicit)
-</xsl:text>
-    <xsl:text>                    arg = argv[ph.param_no]
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                else { // positional argument (implicit)
-</xsl:text>
-    <xsl:text>                    arg = argv[cursor++]
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>                if (re.not_type.test(ph.type) &amp;&amp; re.not_primitive.test(ph.type) &amp;&amp; arg instanceof Function) {
-</xsl:text>
-    <xsl:text>                    arg = arg()
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>                if (re.numeric_arg.test(ph.type) &amp;&amp; (typeof arg !== 'number' &amp;&amp; isNaN(arg))) {
-</xsl:text>
-    <xsl:text>                    throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>                if (re.number.test(ph.type)) {
-</xsl:text>
-    <xsl:text>                    is_positive = arg &gt;= 0
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>                switch (ph.type) {
-</xsl:text>
-    <xsl:text>                    case 'b':
-</xsl:text>
-    <xsl:text>                        arg = parseInt(arg, 10).toString(2)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'c':
-</xsl:text>
-    <xsl:text>                        arg = String.fromCharCode(parseInt(arg, 10))
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'd':
-</xsl:text>
-    <xsl:text>                    case 'i':
-</xsl:text>
-    <xsl:text>                        arg = parseInt(arg, 10)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'j':
-</xsl:text>
-    <xsl:text>                        arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'e':
-</xsl:text>
-    <xsl:text>                        arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'f':
-</xsl:text>
-    <xsl:text>                        arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'g':
-</xsl:text>
-    <xsl:text>                        arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'o':
-</xsl:text>
-    <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(8)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 's':
-</xsl:text>
-    <xsl:text>                        arg = String(arg)
-</xsl:text>
-    <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 't':
-</xsl:text>
-    <xsl:text>                        arg = String(!!arg)
-</xsl:text>
-    <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'T':
-</xsl:text>
-    <xsl:text>                        arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
-</xsl:text>
-    <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'u':
-</xsl:text>
-    <xsl:text>                        arg = parseInt(arg, 10) &gt;&gt;&gt; 0
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'v':
-</xsl:text>
-    <xsl:text>                        arg = arg.valueOf()
-</xsl:text>
-    <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'x':
-</xsl:text>
-    <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(16)
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                    case 'X':
-</xsl:text>
-    <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(16).toUpperCase()
-</xsl:text>
-    <xsl:text>                        break
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                if (re.json.test(ph.type)) {
-</xsl:text>
-    <xsl:text>                    output += arg
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                else {
-</xsl:text>
-    <xsl:text>                    if (re.number.test(ph.type) &amp;&amp; (!is_positive || ph.sign)) {
-</xsl:text>
-    <xsl:text>                        sign = is_positive ? '+' : '-'
-</xsl:text>
-    <xsl:text>                        arg = arg.toString().replace(re.sign, '')
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                    else {
-</xsl:text>
-    <xsl:text>                        sign = ''
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                    pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
-</xsl:text>
-    <xsl:text>                    pad_length = ph.width - (sign + arg).length
-</xsl:text>
-    <xsl:text>                    pad = ph.width ? (pad_length &gt; 0 ? pad_character.repeat(pad_length) : '') : ''
-</xsl:text>
-    <xsl:text>                    output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>        return output
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    var sprintf_cache = Object.create(null)
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    function sprintf_parse(fmt) {
-</xsl:text>
-    <xsl:text>        if (sprintf_cache[fmt]) {
-</xsl:text>
-    <xsl:text>            return sprintf_cache[fmt]
-</xsl:text>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>        var _fmt = fmt, match, parse_tree = [], arg_names = 0
-</xsl:text>
-    <xsl:text>        while (_fmt) {
-</xsl:text>
-    <xsl:text>            if ((match = re.text.exec(_fmt)) !== null) {
-</xsl:text>
-    <xsl:text>                parse_tree.push(match[0])
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>            else if ((match = re.modulo.exec(_fmt)) !== null) {
-</xsl:text>
-    <xsl:text>                parse_tree.push('%')
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>            else if ((match = re.placeholder.exec(_fmt)) !== null) {
-</xsl:text>
-    <xsl:text>                if (match[2]) {
-</xsl:text>
-    <xsl:text>                    arg_names |= 1
-</xsl:text>
-    <xsl:text>                    var field_list = [], replacement_field = match[2], field_match = []
-</xsl:text>
-    <xsl:text>                    if ((field_match = re.key.exec(replacement_field)) !== null) {
-</xsl:text>
-    <xsl:text>                        field_list.push(field_match[1])
-</xsl:text>
-    <xsl:text>                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
-</xsl:text>
-    <xsl:text>                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
-</xsl:text>
-    <xsl:text>                                field_list.push(field_match[1])
-</xsl:text>
-    <xsl:text>                            }
-</xsl:text>
-    <xsl:text>                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
-</xsl:text>
-    <xsl:text>                                field_list.push(field_match[1])
-</xsl:text>
-    <xsl:text>                            }
-</xsl:text>
-    <xsl:text>                            else {
-</xsl:text>
-    <xsl:text>                                throw new SyntaxError('[sprintf] failed to parse named argument key')
-</xsl:text>
-    <xsl:text>                            }
-</xsl:text>
-    <xsl:text>                        }
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                    else {
-</xsl:text>
-    <xsl:text>                        throw new SyntaxError('[sprintf] failed to parse named argument key')
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                    match[2] = field_list
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                else {
-</xsl:text>
-    <xsl:text>                    arg_names |= 2
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>                if (arg_names === 3) {
-</xsl:text>
-    <xsl:text>                    throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>                parse_tree.push(
-</xsl:text>
-    <xsl:text>                    {
-</xsl:text>
-    <xsl:text>                        placeholder: match[0],
-</xsl:text>
-    <xsl:text>                        param_no:    match[1],
-</xsl:text>
-    <xsl:text>                        keys:        match[2],
-</xsl:text>
-    <xsl:text>                        sign:        match[3],
-</xsl:text>
-    <xsl:text>                        pad_char:    match[4],
-</xsl:text>
-    <xsl:text>                        align:       match[5],
-</xsl:text>
-    <xsl:text>                        width:       match[6],
-</xsl:text>
-    <xsl:text>                        precision:   match[7],
-</xsl:text>
-    <xsl:text>                        type:        match[8]
-</xsl:text>
-    <xsl:text>                    }
-</xsl:text>
-    <xsl:text>                )
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>            else {
-</xsl:text>
-    <xsl:text>                throw new SyntaxError('[sprintf] unexpected placeholder')
-</xsl:text>
-    <xsl:text>            }
-</xsl:text>
-    <xsl:text>            _fmt = _fmt.substring(match[0].length)
-</xsl:text>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>        return sprintf_cache[fmt] = parse_tree
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>    /**
-</xsl:text>
-    <xsl:text>     * export to either browser or node.js
-</xsl:text>
-    <xsl:text>     */
-</xsl:text>
-    <xsl:text>    /* eslint-disable quote-props */
-</xsl:text>
-    <xsl:text>    if (typeof exports !== 'undefined') {
-</xsl:text>
-    <xsl:text>        exports['sprintf'] = sprintf
-</xsl:text>
-    <xsl:text>        exports['vsprintf'] = vsprintf
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    if (typeof window !== 'undefined') {
-</xsl:text>
-    <xsl:text>        window['sprintf'] = sprintf
-</xsl:text>
-    <xsl:text>        window['vsprintf'] = vsprintf
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>        if (typeof define === 'function' &amp;&amp; define['amd']) {
-</xsl:text>
-    <xsl:text>            define(function() {
-</xsl:text>
-    <xsl:text>                return {
-</xsl:text>
-    <xsl:text>                    'sprintf': sprintf,
-</xsl:text>
-    <xsl:text>                    'vsprintf': vsprintf
-</xsl:text>
-    <xsl:text>                }
-</xsl:text>
-    <xsl:text>            })
-</xsl:text>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    /* eslint-enable quote-props */
-</xsl:text>
-    <xsl:text>}(); // eslint-disable-line    
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-  </xsl:template>
   <xsl:template match="widget[@type='DropDown']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
@@ -3715,9 +3267,11 @@
 </xsl:text>
       <xsl:text>
 </xsl:text>
-      <xsl:text>It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*),
-</xsl:text>
-      <xsl:text>and "highlight" (svg:rect) labeled elements.
+      <xsl:text>It needs "text" (svg:text or svg:use referring to svg:text),
+</xsl:text>
+      <xsl:text>"box" (svg:rect), "button" (svg:*), and "highlight" (svg:rect)
+</xsl:text>
+      <xsl:text>labeled elements.
 </xsl:text>
       <xsl:text>
 </xsl:text>
@@ -3729,11 +3283,19 @@
 </xsl:text>
       <xsl:text>
 </xsl:text>
-      <xsl:text>When only one argument is given, and argment contains "#langs" then list of
-</xsl:text>
-      <xsl:text>texts is automatically set to the list of human-readable languages supported
-</xsl:text>
-      <xsl:text>by this HMI. 
+      <xsl:text>When only one argument is given and argment contains "#langs" then list of
+</xsl:text>
+      <xsl:text>texts is automatically set to the human-readable list of supported
+</xsl:text>
+      <xsl:text>languages by this HMI. 
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>If "text" labeled element is of type svg:use and refers to a svg:text 
+</xsl:text>
+      <xsl:text>element part of a TextList widget, no argument is expected. In that case
+</xsl:text>
+      <xsl:text>list of texts is set to TextList content.
 </xsl:text>
     </longdesc>
     <shortdesc>
@@ -3759,6 +3321,8 @@
 </xsl:text>
     <xsl:text>        init() {
 </xsl:text>
+    <xsl:text>            this.init_specific();
+</xsl:text>
     <xsl:text>            this.button_elt.onclick = this.on_button_click.bind(this);
 </xsl:text>
     <xsl:text>            // Save original size of rectangle
@@ -3849,7 +3413,7 @@
 </xsl:text>
     <xsl:text>                // if valid selection resolve content
 </xsl:text>
-    <xsl:text>                display_str = this.content[value];
+    <xsl:text>                display_str = gettext(this.content[value]);
 </xsl:text>
     <xsl:text>                this.last_selection = value;
 </xsl:text>
@@ -4061,7 +3625,7 @@
 </xsl:text>
     <xsl:text>                let span=spans[c];
 </xsl:text>
-    <xsl:text>                span.textContent = item;
+    <xsl:text>                span.textContent = gettext(item);
 </xsl:text>
     <xsl:text>                let sel = c;
 </xsl:text>
@@ -4193,7 +3757,7 @@
 </xsl:text>
     <xsl:text>                }else{
 </xsl:text>
-    <xsl:text>                    span.textContent = this.content[i];
+    <xsl:text>                    span.textContent = gettext(this.content[i]);
 </xsl:text>
     <xsl:text>                    let sel = i;
 </xsl:text>
@@ -4411,16 +3975,54 @@
     <xsl:call-template name="defs_by_labels">
       <xsl:with-param name="hmi_element" select="$hmi_element"/>
       <xsl:with-param name="labels">
-        <xsl:text>text box button highlight</xsl:text>
+        <xsl:text>box button highlight</xsl:text>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:text>  content:</xsl:text>
+    <xsl:variable name="text_elt" select="$hmi_element//*[@inkscape:label='text'][1]"/>
+    <xsl:text>init_specific: function() {
+</xsl:text>
     <xsl:choose>
       <xsl:when test="count(arg) = 1 and arg[1]/@value = '#langs'">
-        <xsl:text>langs</xsl:text>
+        <xsl:text>  this.text_elt = id("</xsl:text>
+        <xsl:value-of select="$text_elt/@id"/>
+        <xsl:text>");
+</xsl:text>
+        <xsl:text>  this.content = langs;
+</xsl:text>
+      </xsl:when>
+      <xsl:when test="count(arg) = 0">
+        <xsl:if test="not($text_elt[self::svg:use])">
+          <xsl:message terminate="yes">
+            <xsl:text>No argrument for HMI:DropDown widget id="</xsl:text>
+            <xsl:value-of select="$hmi_element/@id"/>
+            <xsl:text>" and "text" labeled element is not a svg:use element</xsl:text>
+          </xsl:message>
+        </xsl:if>
+        <xsl:variable name="real_text_elt" select="$result_widgets[@id = $hmi_element/@id]//*[@original=$text_elt/@id]/svg:text"/>
+        <xsl:text>  this.text_elt = id("</xsl:text>
+        <xsl:value-of select="$real_text_elt/@id"/>
+        <xsl:text>");
+</xsl:text>
+        <xsl:variable name="from_list_id" select="substring-after($text_elt/@xlink:href,'#')"/>
+        <xsl:variable name="from_list" select="$hmi_textlists[(@id | */@id) = $from_list_id]"/>
+        <xsl:if test="count($from_list) = 0">
+          <xsl:message terminate="yes">
+            <xsl:text>HMI:DropDown widget id="</xsl:text>
+            <xsl:value-of select="$hmi_element/@id"/>
+            <xsl:text>" "text" labeled element does not point to a svg:text owned by a HMI:List widget</xsl:text>
+          </xsl:message>
+        </xsl:if>
+        <xsl:text>  this.content = hmi_widgets["</xsl:text>
+        <xsl:value-of select="$from_list/@id"/>
+        <xsl:text>"].texts;
+</xsl:text>
       </xsl:when>
       <xsl:otherwise>
-        <xsl:text>[
+        <xsl:text>  this.text_elt = id("</xsl:text>
+        <xsl:value-of select="$text_elt/@id"/>
+        <xsl:text>");
+</xsl:text>
+        <xsl:text>  this.content = [
 </xsl:text>
         <xsl:for-each select="arg">
           <xsl:text>"</xsl:text>
@@ -4428,10 +4030,36 @@
           <xsl:text>",
 </xsl:text>
         </xsl:for-each>
-        <xsl:text>  ]</xsl:text>
+        <xsl:text>  ];
+</xsl:text>
       </xsl:otherwise>
     </xsl:choose>
-    <xsl:text>,
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
+  <declarations:DropDown/>
+  <xsl:template match="declarations:DropDown">
+    <xsl:text>
+</xsl:text>
+    <xsl:text>/* </xsl:text>
+    <xsl:value-of select="local-name()"/>
+    <xsl:text> */
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>function gettext(o) {
+</xsl:text>
+    <xsl:text>    if(typeof(o) == "string"){
+</xsl:text>
+    <xsl:text>        return o;
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    return svg_text_to_multiline(o);
+</xsl:text>
+    <xsl:text>};
+</xsl:text>
+    <xsl:text>
 </xsl:text>
   </xsl:template>
   <xsl:template match="widget[@type='ForEach']" mode="widget_desc">
@@ -5116,25 +4744,6 @@
       <xsl:text>.</xsl:text>
     </xsl:message>
   </xsl:template>
-  <xsl:variable name="hmi_textstylelists_descs" select="$parsed_widgets/widget[@type = 'TextStyleList']"/>
-  <xsl:variable name="hmi_textstylelists" select="$hmi_elements[@id = $hmi_textstylelists_descs/@id]"/>
-  <xsl:variable name="textstylelist_related">
-    <xsl:for-each select="$hmi_textstylelists">
-      <list>
-        <xsl:attribute name="listid">
-          <xsl:value-of select="@id"/>
-        </xsl:attribute>
-        <xsl:for-each select="func:refered_elements(.)">
-          <elt>
-            <xsl:attribute name="eltid">
-              <xsl:value-of select="@id"/>
-            </xsl:attribute>
-          </elt>
-        </xsl:for-each>
-      </list>
-    </xsl:for-each>
-  </xsl:variable>
-  <xsl:variable name="textstylelist_related_ns" select="exsl:node-set($textstylelist_related)"/>
   <func:function name="func:json_expressions">
     <xsl:param name="expressions"/>
     <xsl:param name="label"/>
@@ -6009,6 +5618,30 @@
     <type>
       <xsl:value-of select="@type"/>
     </type>
+    <longdesc>
+      <xsl:text>List widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a List, clone (svg:use) one of the items inside the widget that
+</xsl:text>
+      <xsl:text>expects a List.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>Positions of items are relative to each other, and they must all be in the
+</xsl:text>
+      <xsl:text>same place. In order to make editing easier it is therefore recommanded to
+</xsl:text>
+      <xsl:text>make stacked clones of svg elements spread nearby the list.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of named graphical elements</xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
   </xsl:template>
   <xsl:template match="widget[@type='List']" mode="widget_defs">
     <xsl:param name="hmi_element"/>
@@ -6025,25 +5658,6 @@
     <xsl:text>    },
 </xsl:text>
   </xsl:template>
-  <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs">
-    <xsl:param name="hmi_element"/>
-  </xsl:template>
-  <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs">
-    <xsl:param name="hmi_element"/>
-    <xsl:text>    styles: {
-</xsl:text>
-    <xsl:for-each select="$hmi_element/*[@inkscape:label]">
-      <xsl:variable name="style" select="func:refered_elements(.)[self::svg:text]/@style"/>
-      <xsl:text>        </xsl:text>
-      <xsl:value-of select="@inkscape:label"/>
-      <xsl:text>: "</xsl:text>
-      <xsl:value-of select="$style"/>
-      <xsl:text>",
-</xsl:text>
-    </xsl:for-each>
-    <xsl:text>    },
-</xsl:text>
-  </xsl:template>
   <xsl:template match="widget[@type='Meter']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
@@ -6063,10 +5677,6 @@
 </xsl:text>
       <xsl:text>in between 0 and 100.
 </xsl:text>
-      <xsl:text>
-</xsl:text>
-      <xsl:text>If "value" labeled text is found, then its content is replaced by value.
-</xsl:text>
     </longdesc>
     <shortdesc>
       <xsl:text>Moves "needle" along "range"</xsl:text>
@@ -6152,7 +5762,7 @@
     <xsl:call-template name="defs_by_labels">
       <xsl:with-param name="hmi_element" select="$hmi_element"/>
       <xsl:with-param name="labels">
-        <xsl:text>value min max</xsl:text>
+        <xsl:text>min max</xsl:text>
       </xsl:with-param>
       <xsl:with-param name="mandatory" select="'no'"/>
     </xsl:call-template>
@@ -6301,12 +5911,352 @@
     <xsl:text>    ],
 </xsl:text>
   </xsl:template>
+  <xsl:template match="widget[@type='PathSlider']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>PathSlider - 
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>Slide an SVG element along a path by dragging it</xsl:text>
+    </shortdesc>
+    <path name="value" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>value</xsl:text>
+    </path>
+    <path name="min" count="optional" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>min</xsl:text>
+    </path>
+    <path name="max" count="optional" accepts="HMI_INT,HMI_REAL">
+      <xsl:text>max</xsl:text>
+    </path>
+    <arg name="min" count="optional" accepts="int,real">
+      <xsl:text>minimum value</xsl:text>
+    </arg>
+    <arg name="max" count="optional" accepts="int,real">
+      <xsl:text>maximum value</xsl:text>
+    </arg>
+  </xsl:template>
+  <xsl:template match="widget[@type='PathSlider']" mode="widget_class">
+    <xsl:text>class </xsl:text>
+    <xsl:text>PathSliderWidget</xsl:text>
+    <xsl:text> extends Widget{
+</xsl:text>
+    <xsl:text>    frequency = 10;
+</xsl:text>
+    <xsl:text>    position = undefined;
+</xsl:text>
+    <xsl:text>    min = 0;
+</xsl:text>
+    <xsl:text>    max = 100;
+</xsl:text>
+    <xsl:text>    scannedPoints = [];
+</xsl:text>
+    <xsl:text>    pathLength = undefined;
+</xsl:text>
+    <xsl:text>    precision = undefined;
+</xsl:text>
+    <xsl:text>    origPt = undefined;
+</xsl:text>
+    <xsl:text>    
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    scanPath() {
+</xsl:text>
+    <xsl:text>      this.pathLength = this.path_elt.getTotalLength();
+</xsl:text>
+    <xsl:text>      this.precision = Math.floor(this.pathLength / 10);
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>      // save linear scan for coarse approximation
+</xsl:text>
+    <xsl:text>      for (var scanLength = 0; scanLength &lt;= this.pathLength; scanLength += this.precision) {
+</xsl:text>
+    <xsl:text>        this.scannedPoints.push([this.path_elt.getPointAtLength(scanLength), scanLength]);
+</xsl:text>
+    <xsl:text>      }
+</xsl:text>
+    <xsl:text>      [this.origPt,] = this.scannedPoints[0];
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    closestPoint(point) {
+</xsl:text>
+    <xsl:text>      var bestPoint,
+</xsl:text>
+    <xsl:text>          bestLength,
+</xsl:text>
+    <xsl:text>          bestDistance = Infinity,
+</xsl:text>
+    <xsl:text>          scanDistance;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>      // use linear scan for coarse approximation
+</xsl:text>
+    <xsl:text>      for (let [scanPoint, scanLength] of this.scannedPoints){
+</xsl:text>
+    <xsl:text>        if ((scanDistance = distance2(scanPoint)) &lt; bestDistance) {
+</xsl:text>
+    <xsl:text>          bestPoint = scanPoint,
+</xsl:text>
+    <xsl:text>          bestLength = scanLength,
+</xsl:text>
+    <xsl:text>          bestDistance = scanDistance;
+</xsl:text>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>      }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>      // binary search for more precise estimate
+</xsl:text>
+    <xsl:text>      let precision = this.precision / 2;
+</xsl:text>
+    <xsl:text>      while (precision &gt; 0.5) {
+</xsl:text>
+    <xsl:text>        var beforePoint,
+</xsl:text>
+    <xsl:text>            afterPoint,
+</xsl:text>
+    <xsl:text>            beforeLength,
+</xsl:text>
+    <xsl:text>            afterLength,
+</xsl:text>
+    <xsl:text>            beforeDistance,
+</xsl:text>
+    <xsl:text>            afterDistance;
+</xsl:text>
+    <xsl:text>        if ((beforeLength = bestLength - precision) &gt;= 0 &amp;&amp;
+</xsl:text>
+    <xsl:text>            (beforeDistance = distance2(beforePoint = this.path_elt.getPointAtLength(beforeLength))) &lt; bestDistance) {
+</xsl:text>
+    <xsl:text>          bestPoint = beforePoint,
+</xsl:text>
+    <xsl:text>          bestLength = beforeLength,
+</xsl:text>
+    <xsl:text>          bestDistance = beforeDistance;
+</xsl:text>
+    <xsl:text>        } else if ((afterLength = bestLength + precision) &lt;= this.pathLength &amp;&amp; 
+</xsl:text>
+    <xsl:text>                   (afterDistance = distance2(afterPoint = this.path_elt.getPointAtLength(afterLength))) &lt; bestDistance) {
+</xsl:text>
+    <xsl:text>          bestPoint = afterPoint,
+</xsl:text>
+    <xsl:text>          bestLength = afterLength,
+</xsl:text>
+    <xsl:text>          bestDistance = afterDistance;
+</xsl:text>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>        precision /= 2;
+</xsl:text>
+    <xsl:text>      }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>      return [bestPoint, bestLength];
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>      function distance2(p) {
+</xsl:text>
+    <xsl:text>        var dx = p.x - point.x,
+</xsl:text>
+    <xsl:text>            dy = p.y - point.y;
+</xsl:text>
+    <xsl:text>        return dx * dx + dy * dy;
+</xsl:text>
+    <xsl:text>      }
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    dispatch(value,oldval, index) {
+</xsl:text>
+    <xsl:text>        switch(index) {
+</xsl:text>
+    <xsl:text>            case 0:
+</xsl:text>
+    <xsl:text>                this.position = value;
+</xsl:text>
+    <xsl:text>                break;
+</xsl:text>
+    <xsl:text>            case 1:
+</xsl:text>
+    <xsl:text>                this.min = value;
+</xsl:text>
+    <xsl:text>                break;
+</xsl:text>
+    <xsl:text>            case 2:
+</xsl:text>
+    <xsl:text>                this.max = value;
+</xsl:text>
+    <xsl:text>                break;
+</xsl:text>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.request_animate();
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    get_current_point(){
+</xsl:text>
+    <xsl:text>        let currLength = this.pathLength * (this.position - this.min) / (this.max - this.min)
+</xsl:text>
+    <xsl:text>        return this.path_elt.getPointAtLength(currLength);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    animate(){
+</xsl:text>
+    <xsl:text>        if(this.position == undefined)
+</xsl:text>
+    <xsl:text>            return;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        let currPt = this.get_current_point();
+</xsl:text>
+    <xsl:text>        this.cursor_transform.setTranslate(currPt.x - this.origPt.x, currPt.y - this.origPt.y);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        if(this.args.length == 2)
+</xsl:text>
+    <xsl:text>            [this.min, this.max]=this.args;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.scanPath();
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.cursor_transform = svg_root.createSVGTransform();
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.cursor_elt.transform.baseVal.appendItem(this.cursor_transform);
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.cursor_elt.onpointerdown = (e) =&gt; this.on_cursor_down(e);
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        this.bound_drag = this.drag.bind(this);
+</xsl:text>
+    <xsl:text>        this.bound_drop = this.drop.bind(this);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    start_dragging_from_event(e){
+</xsl:text>
+    <xsl:text>        let clientPoint = new DOMPoint(e.clientX, e.clientY);
+</xsl:text>
+    <xsl:text>        let point = clientPoint.matrixTransform(this.invctm);
+</xsl:text>
+    <xsl:text>        let currPt = this.get_current_point();
+</xsl:text>
+    <xsl:text>        this.draggingOffset = new DOMPoint(point.x - currPt.x , point.y - currPt.y);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    apply_position_from_event(e){
+</xsl:text>
+    <xsl:text>        let clientPoint = new DOMPoint(e.clientX, e.clientY);
+</xsl:text>
+    <xsl:text>        let rawPoint = clientPoint.matrixTransform(this.invctm);
+</xsl:text>
+    <xsl:text>        let point = new DOMPoint(rawPoint.x - this.draggingOffset.x , rawPoint.y - this.draggingOffset.y);
+</xsl:text>
+    <xsl:text>        let [closestPoint, closestLength] = this.closestPoint(point);
+</xsl:text>
+    <xsl:text>        let new_position = this.min + (this.max - this.min) * closestLength / this.pathLength;
+</xsl:text>
+    <xsl:text>        this.position = Math.round(Math.max(Math.min(new_position, this.max), this.min));
+</xsl:text>
+    <xsl:text>        this.apply_hmi_value(0, this.position);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    on_cursor_down(e){
+</xsl:text>
+    <xsl:text>        // get scrollbar -&gt; root transform
+</xsl:text>
+    <xsl:text>        let ctm = this.path_elt.getCTM();
+</xsl:text>
+    <xsl:text>        // root -&gt; path transform
+</xsl:text>
+    <xsl:text>        this.invctm = ctm.inverse();
+</xsl:text>
+    <xsl:text>        this.start_dragging_from_event(e);
+</xsl:text>
+    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_drop, true);
+</xsl:text>
+    <xsl:text>        svg_root.addEventListener("pointermove", this.bound_drag, true);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    drop(e) {
+</xsl:text>
+    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_drop, true);
+</xsl:text>
+    <xsl:text>        svg_root.removeEventListener("pointermove", this.bound_drag, true);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>    drag(e) {
+</xsl:text>
+    <xsl:text>        this.apply_position_from_event(e);
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
+  <xsl:template match="widget[@type='PathSlider']" mode="widget_defs">
+    <xsl:param name="hmi_element"/>
+    <xsl:call-template name="defs_by_labels">
+      <xsl:with-param name="hmi_element" select="$hmi_element"/>
+      <xsl:with-param name="labels">
+        <xsl:text>cursor path</xsl:text>
+      </xsl:with-param>
+    </xsl:call-template>
+  </xsl:template>
   <xsl:template match="widget[@type='ScrollBar']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
     </type>
     <longdesc>
-      <xsl:text>ScrollBar - documentation to be written
+      <xsl:text>ScrollBar - svg:rect based scrollbar
 </xsl:text>
     </longdesc>
     <shortdesc>
@@ -6375,15 +6325,13 @@
 </xsl:text>
     <xsl:text>        let range = this.range;
 </xsl:text>
-    <xsl:text>        let size = Math.max(this.range * this.mincursize, Math.min(this.size, range));
+    <xsl:text>        let size = Math.max(range * this.mincursize, Math.min(this.size, range));
 </xsl:text>
     <xsl:text>        let maxh = this.range_elt.height.baseVal.value;
 </xsl:text>
     <xsl:text>        let pixels = maxh;
 </xsl:text>
-    <xsl:text>        let units = range;
-</xsl:text>
-    <xsl:text>        return [size, maxh, range, pixels, units];
+    <xsl:text>        return [size, maxh, range, pixels];
 </xsl:text>
     <xsl:text>    }
 </xsl:text>
@@ -6395,11 +6343,11 @@
 </xsl:text>
     <xsl:text>            return;
 </xsl:text>
-    <xsl:text>        let [size, maxh, range, pixels, units] = this.get_ratios();
-</xsl:text>
-    <xsl:text>
-</xsl:text>
-    <xsl:text>        let new_y = this.range_elt.y.baseVal.value + Math.round(Math.min(this.position,range-size) * pixels / units);
+    <xsl:text>        let [size, maxh, range, pixels] = this.get_ratios();
+</xsl:text>
+    <xsl:text>
+</xsl:text>
+    <xsl:text>        let new_y = this.range_elt.y.baseVal.value + Math.round(Math.min(this.position,range-size) * pixels / range);
 </xsl:text>
     <xsl:text>        let new_height = Math.round(maxh * size/range);
 </xsl:text>
@@ -6485,7 +6433,7 @@
 </xsl:text>
     <xsl:text>    drag(e) {
 </xsl:text>
-    <xsl:text>        let [size, maxh, range, pixels, units] = this.get_ratios();
+    <xsl:text>        let [size, maxh, range, pixels] = this.get_ratios();
 </xsl:text>
     <xsl:text>        if(pixels == 0) return;
 </xsl:text>
@@ -6493,7 +6441,7 @@
 </xsl:text>
     <xsl:text>        let movement = point.matrixTransform(this.invctm).y;
 </xsl:text>
-    <xsl:text>        this.dragpos += movement * units / pixels;
+    <xsl:text>        this.dragpos += movement * range / pixels;
 </xsl:text>
     <xsl:text>        this.apply_position(this.dragpos);
 </xsl:text>
@@ -7332,6 +7280,87 @@
     <xsl:text>    ],
 </xsl:text>
   </xsl:template>
+  <xsl:template match="widget[@type='TextList']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>TextList widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a TextList, clone (svg:use) one of the items inside the widget 
+</xsl:text>
+      <xsl:text>that expects a TextList.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>In this list, (translated) text content is what matters. Nevertheless
+</xsl:text>
+      <xsl:text>text style of the cloned item will be applied in client widget.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of ordered texts </xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
+  </xsl:template>
+  <xsl:template match="widget[@type='TextList']" mode="widget_defs">
+    <xsl:param name="hmi_element"/>
+    <xsl:text>    texts: [
+</xsl:text>
+    <xsl:for-each select="func:refered_elements($hmi_element/*[@inkscape:label])[self::svg:text]">
+      <xsl:text>        id("</xsl:text>
+      <xsl:value-of select="@id"/>
+      <xsl:text>"),
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>    ].reverse(),
+</xsl:text>
+  </xsl:template>
+  <xsl:template match="widget[@type='TextStyleList']" mode="widget_desc">
+    <type>
+      <xsl:value-of select="@type"/>
+    </type>
+    <longdesc>
+      <xsl:text>TextStyleList widget is a svg:group, list items are labeled elements
+</xsl:text>
+      <xsl:text>in that group.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>To use a TextStyleList, clone (svg:use) one of the items inside the widget 
+</xsl:text>
+      <xsl:text>that expects a TextStyleList.
+</xsl:text>
+      <xsl:text>
+</xsl:text>
+      <xsl:text>In this list, only style matters. Text content is ignored.
+</xsl:text>
+    </longdesc>
+    <shortdesc>
+      <xsl:text>A named list of named texts</xsl:text>
+    </shortdesc>
+    <arg name="listname"/>
+  </xsl:template>
+  <xsl:template match="widget[@type='TextStyleList']" mode="widget_defs">
+    <xsl:param name="hmi_element"/>
+    <xsl:text>    styles: {
+</xsl:text>
+    <xsl:for-each select="$hmi_element/*[@inkscape:label]">
+      <xsl:variable name="style" select="func:refered_elements(.)[self::svg:text]/@style"/>
+      <xsl:text>        </xsl:text>
+      <xsl:value-of select="@inkscape:label"/>
+      <xsl:text>: "</xsl:text>
+      <xsl:value-of select="$style"/>
+      <xsl:text>",
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>    },
+</xsl:text>
+  </xsl:template>
   <xsl:template match="widget[@type='ToggleButton']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
@@ -7488,6 +7517,470 @@
 //
 </xsl:text>
           <xsl:apply-templates select="document('')/*/epilogue:*"/>
+          <xsl:text>/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */
+</xsl:text>
+          <xsl:text>/* global window, exports, define */
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>!function() {
+</xsl:text>
+          <xsl:text>    'use strict'
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    var re = {
+</xsl:text>
+          <xsl:text>        not_string: /[^s]/,
+</xsl:text>
+          <xsl:text>        not_bool: /[^t]/,
+</xsl:text>
+          <xsl:text>        not_type: /[^T]/,
+</xsl:text>
+          <xsl:text>        not_primitive: /[^v]/,
+</xsl:text>
+          <xsl:text>        number: /[diefg]/,
+</xsl:text>
+          <xsl:text>        numeric_arg: /[bcdiefguxX]/,
+</xsl:text>
+          <xsl:text>        json: /[j]/,
+</xsl:text>
+          <xsl:text>        not_json: /[^j]/,
+</xsl:text>
+          <xsl:text>        text: /^[^%]+/,
+</xsl:text>
+          <xsl:text>        modulo: /^%{2}/,
+</xsl:text>
+          <xsl:text>        placeholder: /^%(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
+</xsl:text>
+          <xsl:text>        key: /^([a-z_][a-z_\d]*)/i,
+</xsl:text>
+          <xsl:text>        key_access: /^\.([a-z_][a-z_\d]*)/i,
+</xsl:text>
+          <xsl:text>        index_access: /^\[(\d+)\]/,
+</xsl:text>
+          <xsl:text>        sign: /^[+-]/
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    function sprintf(key) {
+</xsl:text>
+          <xsl:text>        // arguments is not an array, but should be fine for this call
+</xsl:text>
+          <xsl:text>        return sprintf_format(sprintf_parse(key), arguments)
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    function vsprintf(fmt, argv) {
+</xsl:text>
+          <xsl:text>        return sprintf.apply(null, [fmt].concat(argv || []))
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    function sprintf_format(parse_tree, argv) {
+</xsl:text>
+          <xsl:text>        var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
+</xsl:text>
+          <xsl:text>        for (i = 0; i &lt; tree_length; i++) {
+</xsl:text>
+          <xsl:text>            if (typeof parse_tree[i] === 'string') {
+</xsl:text>
+          <xsl:text>                output += parse_tree[i]
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>            else if (typeof parse_tree[i] === 'object') {
+</xsl:text>
+          <xsl:text>                ph = parse_tree[i] // convenience purposes only
+</xsl:text>
+          <xsl:text>                if (ph.keys) { // keyword argument
+</xsl:text>
+          <xsl:text>                    arg = argv[cursor]
+</xsl:text>
+          <xsl:text>                    for (k = 0; k &lt; ph.keys.length; k++) {
+</xsl:text>
+          <xsl:text>                        if (arg == undefined) {
+</xsl:text>
+          <xsl:text>                            throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
+</xsl:text>
+          <xsl:text>                        }
+</xsl:text>
+          <xsl:text>                        arg = arg[ph.keys[k]]
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                else if (ph.param_no) { // positional argument (explicit)
+</xsl:text>
+          <xsl:text>                    arg = argv[ph.param_no]
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                else { // positional argument (implicit)
+</xsl:text>
+          <xsl:text>                    arg = argv[cursor++]
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>                if (re.not_type.test(ph.type) &amp;&amp; re.not_primitive.test(ph.type) &amp;&amp; arg instanceof Function) {
+</xsl:text>
+          <xsl:text>                    arg = arg()
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>                if (re.numeric_arg.test(ph.type) &amp;&amp; (typeof arg !== 'number' &amp;&amp; isNaN(arg))) {
+</xsl:text>
+          <xsl:text>                    throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>                if (re.number.test(ph.type)) {
+</xsl:text>
+          <xsl:text>                    is_positive = arg &gt;= 0
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>                switch (ph.type) {
+</xsl:text>
+          <xsl:text>                    case 'b':
+</xsl:text>
+          <xsl:text>                        arg = parseInt(arg, 10).toString(2)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'c':
+</xsl:text>
+          <xsl:text>                        arg = String.fromCharCode(parseInt(arg, 10))
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'd':
+</xsl:text>
+          <xsl:text>                    case 'i':
+</xsl:text>
+          <xsl:text>                        arg = parseInt(arg, 10)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'j':
+</xsl:text>
+          <xsl:text>                        arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'e':
+</xsl:text>
+          <xsl:text>                        arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'f':
+</xsl:text>
+          <xsl:text>                        arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'g':
+</xsl:text>
+          <xsl:text>                        arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'o':
+</xsl:text>
+          <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(8)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 's':
+</xsl:text>
+          <xsl:text>                        arg = String(arg)
+</xsl:text>
+          <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 't':
+</xsl:text>
+          <xsl:text>                        arg = String(!!arg)
+</xsl:text>
+          <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'T':
+</xsl:text>
+          <xsl:text>                        arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
+</xsl:text>
+          <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'u':
+</xsl:text>
+          <xsl:text>                        arg = parseInt(arg, 10) &gt;&gt;&gt; 0
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'v':
+</xsl:text>
+          <xsl:text>                        arg = arg.valueOf()
+</xsl:text>
+          <xsl:text>                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'x':
+</xsl:text>
+          <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(16)
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                    case 'X':
+</xsl:text>
+          <xsl:text>                        arg = (parseInt(arg, 10) &gt;&gt;&gt; 0).toString(16).toUpperCase()
+</xsl:text>
+          <xsl:text>                        break
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                if (re.json.test(ph.type)) {
+</xsl:text>
+          <xsl:text>                    output += arg
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                else {
+</xsl:text>
+          <xsl:text>                    if (re.number.test(ph.type) &amp;&amp; (!is_positive || ph.sign)) {
+</xsl:text>
+          <xsl:text>                        sign = is_positive ? '+' : '-'
+</xsl:text>
+          <xsl:text>                        arg = arg.toString().replace(re.sign, '')
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                    else {
+</xsl:text>
+          <xsl:text>                        sign = ''
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                    pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
+</xsl:text>
+          <xsl:text>                    pad_length = ph.width - (sign + arg).length
+</xsl:text>
+          <xsl:text>                    pad = ph.width ? (pad_length &gt; 0 ? pad_character.repeat(pad_length) : '') : ''
+</xsl:text>
+          <xsl:text>                    output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
+          <xsl:text>        return output
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    var sprintf_cache = Object.create(null)
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    function sprintf_parse(fmt) {
+</xsl:text>
+          <xsl:text>        if (sprintf_cache[fmt]) {
+</xsl:text>
+          <xsl:text>            return sprintf_cache[fmt]
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>        var _fmt = fmt, match, parse_tree = [], arg_names = 0
+</xsl:text>
+          <xsl:text>        while (_fmt) {
+</xsl:text>
+          <xsl:text>            if ((match = re.text.exec(_fmt)) !== null) {
+</xsl:text>
+          <xsl:text>                parse_tree.push(match[0])
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>            else if ((match = re.modulo.exec(_fmt)) !== null) {
+</xsl:text>
+          <xsl:text>                parse_tree.push('%')
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>            else if ((match = re.placeholder.exec(_fmt)) !== null) {
+</xsl:text>
+          <xsl:text>                if (match[2]) {
+</xsl:text>
+          <xsl:text>                    arg_names |= 1
+</xsl:text>
+          <xsl:text>                    var field_list = [], replacement_field = match[2], field_match = []
+</xsl:text>
+          <xsl:text>                    if ((field_match = re.key.exec(replacement_field)) !== null) {
+</xsl:text>
+          <xsl:text>                        field_list.push(field_match[1])
+</xsl:text>
+          <xsl:text>                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+</xsl:text>
+          <xsl:text>                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+</xsl:text>
+          <xsl:text>                                field_list.push(field_match[1])
+</xsl:text>
+          <xsl:text>                            }
+</xsl:text>
+          <xsl:text>                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+</xsl:text>
+          <xsl:text>                                field_list.push(field_match[1])
+</xsl:text>
+          <xsl:text>                            }
+</xsl:text>
+          <xsl:text>                            else {
+</xsl:text>
+          <xsl:text>                                throw new SyntaxError('[sprintf] failed to parse named argument key')
+</xsl:text>
+          <xsl:text>                            }
+</xsl:text>
+          <xsl:text>                        }
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                    else {
+</xsl:text>
+          <xsl:text>                        throw new SyntaxError('[sprintf] failed to parse named argument key')
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                    match[2] = field_list
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                else {
+</xsl:text>
+          <xsl:text>                    arg_names |= 2
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>                if (arg_names === 3) {
+</xsl:text>
+          <xsl:text>                    throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>                parse_tree.push(
+</xsl:text>
+          <xsl:text>                    {
+</xsl:text>
+          <xsl:text>                        placeholder: match[0],
+</xsl:text>
+          <xsl:text>                        param_no:    match[1],
+</xsl:text>
+          <xsl:text>                        keys:        match[2],
+</xsl:text>
+          <xsl:text>                        sign:        match[3],
+</xsl:text>
+          <xsl:text>                        pad_char:    match[4],
+</xsl:text>
+          <xsl:text>                        align:       match[5],
+</xsl:text>
+          <xsl:text>                        width:       match[6],
+</xsl:text>
+          <xsl:text>                        precision:   match[7],
+</xsl:text>
+          <xsl:text>                        type:        match[8]
+</xsl:text>
+          <xsl:text>                    }
+</xsl:text>
+          <xsl:text>                )
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>            else {
+</xsl:text>
+          <xsl:text>                throw new SyntaxError('[sprintf] unexpected placeholder')
+</xsl:text>
+          <xsl:text>            }
+</xsl:text>
+          <xsl:text>            _fmt = _fmt.substring(match[0].length)
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
+          <xsl:text>        return sprintf_cache[fmt] = parse_tree
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>    /**
+</xsl:text>
+          <xsl:text>     * export to either browser or node.js
+</xsl:text>
+          <xsl:text>     */
+</xsl:text>
+          <xsl:text>    /* eslint-disable quote-props */
+</xsl:text>
+          <xsl:text>    if (typeof exports !== 'undefined') {
+</xsl:text>
+          <xsl:text>        exports['sprintf'] = sprintf
+</xsl:text>
+          <xsl:text>        exports['vsprintf'] = vsprintf
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>    if (typeof window !== 'undefined') {
+</xsl:text>
+          <xsl:text>        window['sprintf'] = sprintf
+</xsl:text>
+          <xsl:text>        window['vsprintf'] = vsprintf
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>        if (typeof define === 'function' &amp;&amp; define['amd']) {
+</xsl:text>
+          <xsl:text>            define(function() {
+</xsl:text>
+          <xsl:text>                return {
+</xsl:text>
+          <xsl:text>                    'sprintf': sprintf,
+</xsl:text>
+          <xsl:text>                    'vsprintf': vsprintf
+</xsl:text>
+          <xsl:text>                }
+</xsl:text>
+          <xsl:text>            })
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
+          <xsl:text>    }
+</xsl:text>
+          <xsl:text>    /* eslint-enable quote-props */
+</xsl:text>
+          <xsl:text>}(); // eslint-disable-line    
+</xsl:text>
           <xsl:text>// svghmi.js
 </xsl:text>
           <xsl:text>
--- a/svghmi/gen_index_xhtml.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/gen_index_xhtml.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -49,6 +49,8 @@
 
     include geometry.ysl2
 
+    include lists.ysl2
+
     include detachable_pages.ysl2
 
     include inline_svg.ysl2
@@ -92,6 +94,8 @@
                     | \n//\n//\n// Statements that needs to be at the end \n//\n//
                     apply "document('')/*/epilogue:*";
 
+                    include text sprintf.js
+
                     include text svghmi.js
 
                 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/lists.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,33 @@
+// lists.ysl2
+//
+// compute list widget related constants
+// for details, refer to :
+//    widget_list.ysl2
+//    widget_textlist.ysl2
+//    widget_textstulelist.ysl2
+
+
+// List widgets
+
+const "hmi_lists_descs", "$parsed_widgets/widget[@type = 'List']";
+const "hmi_lists", "$hmi_elements[@id = $hmi_lists_descs/@id]";
+
+
+// TextList widget
+
+const "hmi_textlists_descs", "$parsed_widgets/widget[@type = 'TextList']";
+const "hmi_textlists", "$hmi_elements[@id = $hmi_textlists_descs/@id]";
+
+// TextStyleList widgets
+
+const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']";
+const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]";
+
+const "textstylelist_related" foreach "$hmi_textstylelists" list {
+    attrib "listid" value "@id";
+    foreach "func:refered_elements(.)" elt {
+        attrib "eltid" value "@id";
+    }
+}
+const "textstylelist_related_ns", "exsl:node-set($textstylelist_related)";
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/sprintf.js	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,232 @@
+/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */
+/* global window, exports, define */
+
+!function() {
+    'use strict'
+
+    var re = {
+        not_string: /[^s]/,
+        not_bool: /[^t]/,
+        not_type: /[^T]/,
+        not_primitive: /[^v]/,
+        number: /[diefg]/,
+        numeric_arg: /[bcdiefguxX]/,
+        json: /[j]/,
+        not_json: /[^j]/,
+        text: /^[^\x25]+/,
+        modulo: /^\x25{2}/,
+        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
+        key: /^([a-z_][a-z_\d]*)/i,
+        key_access: /^\.([a-z_][a-z_\d]*)/i,
+        index_access: /^\[(\d+)\]/,
+        sign: /^[+-]/
+    }
+
+    function sprintf(key) {
+        // arguments is not an array, but should be fine for this call
+        return sprintf_format(sprintf_parse(key), arguments)
+    }
+
+    function vsprintf(fmt, argv) {
+        return sprintf.apply(null, [fmt].concat(argv || []))
+    }
+
+    function sprintf_format(parse_tree, argv) {
+        var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
+        for (i = 0; i < tree_length; i++) {
+            if (typeof parse_tree[i] === 'string') {
+                output += parse_tree[i]
+            }
+            else if (typeof parse_tree[i] === 'object') {
+                ph = parse_tree[i] // convenience purposes only
+                if (ph.keys) { // keyword argument
+                    arg = argv[cursor]
+                    for (k = 0; k < ph.keys.length; k++) {
+                        if (arg == undefined) {
+                            throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
+                        }
+                        arg = arg[ph.keys[k]]
+                    }
+                }
+                else if (ph.param_no) { // positional argument (explicit)
+                    arg = argv[ph.param_no]
+                }
+                else { // positional argument (implicit)
+                    arg = argv[cursor++]
+                }
+
+                if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
+                    arg = arg()
+                }
+
+                if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) {
+                    throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
+                }
+
+                if (re.number.test(ph.type)) {
+                    is_positive = arg >= 0
+                }
+
+                switch (ph.type) {
+                    case 'b':
+                        arg = parseInt(arg, 10).toString(2)
+                        break
+                    case 'c':
+                        arg = String.fromCharCode(parseInt(arg, 10))
+                        break
+                    case 'd':
+                    case 'i':
+                        arg = parseInt(arg, 10)
+                        break
+                    case 'j':
+                        arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
+                        break
+                    case 'e':
+                        arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
+                        break
+                    case 'f':
+                        arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
+                        break
+                    case 'g':
+                        arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
+                        break
+                    case 'o':
+                        arg = (parseInt(arg, 10) >>> 0).toString(8)
+                        break
+                    case 's':
+                        arg = String(arg)
+                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+                        break
+                    case 't':
+                        arg = String(!!arg)
+                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+                        break
+                    case 'T':
+                        arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
+                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+                        break
+                    case 'u':
+                        arg = parseInt(arg, 10) >>> 0
+                        break
+                    case 'v':
+                        arg = arg.valueOf()
+                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
+                        break
+                    case 'x':
+                        arg = (parseInt(arg, 10) >>> 0).toString(16)
+                        break
+                    case 'X':
+                        arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()
+                        break
+                }
+                if (re.json.test(ph.type)) {
+                    output += arg
+                }
+                else {
+                    if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
+                        sign = is_positive ? '+' : '-'
+                        arg = arg.toString().replace(re.sign, '')
+                    }
+                    else {
+                        sign = ''
+                    }
+                    pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
+                    pad_length = ph.width - (sign + arg).length
+                    pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''
+                    output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
+                }
+            }
+        }
+        return output
+    }
+
+    var sprintf_cache = Object.create(null)
+
+    function sprintf_parse(fmt) {
+        if (sprintf_cache[fmt]) {
+            return sprintf_cache[fmt]
+        }
+
+        var _fmt = fmt, match, parse_tree = [], arg_names = 0
+        while (_fmt) {
+            if ((match = re.text.exec(_fmt)) !== null) {
+                parse_tree.push(match[0])
+            }
+            else if ((match = re.modulo.exec(_fmt)) !== null) {
+                parse_tree.push('%')
+            }
+            else if ((match = re.placeholder.exec(_fmt)) !== null) {
+                if (match[2]) {
+                    arg_names |= 1
+                    var field_list = [], replacement_field = match[2], field_match = []
+                    if ((field_match = re.key.exec(replacement_field)) !== null) {
+                        field_list.push(field_match[1])
+                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+                                field_list.push(field_match[1])
+                            }
+                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+                                field_list.push(field_match[1])
+                            }
+                            else {
+                                throw new SyntaxError('[sprintf] failed to parse named argument key')
+                            }
+                        }
+                    }
+                    else {
+                        throw new SyntaxError('[sprintf] failed to parse named argument key')
+                    }
+                    match[2] = field_list
+                }
+                else {
+                    arg_names |= 2
+                }
+                if (arg_names === 3) {
+                    throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
+                }
+
+                parse_tree.push(
+                    {
+                        placeholder: match[0],
+                        param_no:    match[1],
+                        keys:        match[2],
+                        sign:        match[3],
+                        pad_char:    match[4],
+                        align:       match[5],
+                        width:       match[6],
+                        precision:   match[7],
+                        type:        match[8]
+                    }
+                )
+            }
+            else {
+                throw new SyntaxError('[sprintf] unexpected placeholder')
+            }
+            _fmt = _fmt.substring(match[0].length)
+        }
+        return sprintf_cache[fmt] = parse_tree
+    }
+
+    /**
+     * export to either browser or node.js
+     */
+    /* eslint-disable quote-props */
+    if (typeof exports !== 'undefined') {
+        exports['sprintf'] = sprintf
+        exports['vsprintf'] = vsprintf
+    }
+    if (typeof window !== 'undefined') {
+        window['sprintf'] = sprintf
+        window['vsprintf'] = vsprintf
+
+        if (typeof define === 'function' && define['amd']) {
+            define(function() {
+                return {
+                    'sprintf': sprintf,
+                    'vsprintf': vsprintf
+                }
+            })
+        }
+    }
+    /* eslint-enable quote-props */
+}(); // eslint-disable-line    
--- a/svghmi/svghmi.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/svghmi.py	Wed Oct 20 08:57:07 2021 +0200
@@ -294,14 +294,19 @@
 
         return ret
 
+if wx.Platform == '__WXMSW__':
+    browser_launch_cmd="cmd.exe /c 'start msedge {url}'"
+else:
+    browser_launch_cmd="chromium {url}"
+
 class SVGHMI(object):
     XSD = """<?xml version="1.0" encoding="utf-8" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="SVGHMI">
         <xsd:complexType>
-          <xsd:attribute name="OnStart" type="xsd:string" use="optional" default="chromium {url}"/>
-          <xsd:attribute name="OnStop" type="xsd:string" use="optional" default="echo 'please close chromium window at {url}'"/>
-          <xsd:attribute name="OnWatchdog" type="xsd:string" use="optional" default="echo 'Watchdog for {name} !'"/>
+          <xsd:attribute name="OnStart" type="xsd:string" use="optional" default="%s"/>
+          <xsd:attribute name="OnStop" type="xsd:string" use="optional" default=""/>
+          <xsd:attribute name="OnWatchdog" type="xsd:string" use="optional" default=""/>
           <xsd:attribute name="EnableWatchdog" type="xsd:boolean" use="optional" default="false"/>
           <xsd:attribute name="WatchdogInitial" use="optional" default="30">
             <xsd:simpleType>
@@ -333,7 +338,7 @@
         </xsd:complexType>
       </xsd:element>
     </xsd:schema>
-    """
+    """%browser_launch_cmd
 
     EditorType = SVGHMIEditor
 
--- a/svghmi/svghmi_server.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/svghmi_server.py	Wed Oct 20 08:57:07 2021 +0200
@@ -241,6 +241,9 @@
 svghmi_servers = {}
 svghmi_send_thread = None
 
+# python's errno on windows seems to have no ENODATA
+ENODATA = errno.ENODATA if hasattr(errno,"ENODATA") else None
+
 def SendThreadProc():
     global svghmi_session_manager
     size = ctypes.c_uint32()
@@ -255,7 +258,7 @@
             if res == 0:
                 svghmi_session.sendMessage(
                     ctypes.string_at(ptr.value,size.value))
-            elif res == errno.ENODATA:
+            elif res == ENODATA:
                 # this happens when there is no data after wakeup
                 # because of hmi data refresh period longer than
                 # PLC common ticktime
--- a/svghmi/ui.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/ui.py	Wed Oct 20 08:57:07 2021 +0200
@@ -57,13 +57,13 @@
                 display_name = ('{} (class={})'.format(c.name, c.hmiclass)) \
                                if c.hmiclass is not None else c.name
                 tc_child = self.AppendItem(current_tc_root, display_name)
-                self.SetPyData(tc_child, c)
+                self.SetItemData(tc_child, c)
 
                 self._recurseTree(c,tc_child)
             else:
                 display_name = '{} {}'.format(c.nodetype[4:], c.name)
                 tc_child = self.AppendItem(current_tc_root, display_name)
-                self.SetPyData(tc_child, c)
+                self.SetItemData(tc_child, c)
 
     def OnTreeNodeSelection(self, event):
         items = self.GetSelections()
@@ -105,7 +105,7 @@
         root_display_name = _("Please build to see HMI Tree") \
             if hmi_tree_root is None else "HMI"
         self.root = self.AddRoot(root_display_name)
-        self.SetPyData(self.root, hmi_tree_root)
+        self.SetItemData(self.root, hmi_tree_root)
 
         if hmi_tree_root is not None:
             self._recurseTree(hmi_tree_root, self.root)
@@ -145,11 +145,11 @@
                     for d in dirlist:
                         current_tc_root = self.AppendItem(current_tc_root, d)
                         res.append(current_tc_root)
-                        self.SetPyData(current_tc_root, None)
+                        self.SetItemData(current_tc_root, None)
                     dirlist = []
                     res.pop()
                 tc_child = self.AppendItem(current_tc_root, f)
-                self.SetPyData(tc_child, p)
+                self.SetItemData(tc_child, p)
         return res
 
     def MakeTree(self, lib_dir = None):
@@ -162,7 +162,7 @@
         root_display_name = _("Please select widget library directory") \
             if lib_dir is None else os.path.basename(lib_dir)
         self.root = self.AddRoot(root_display_name)
-        self.SetPyData(self.root, None)
+        self.SetItemData(self.root, None)
 
         if lib_dir is not None and os.path.exists(lib_dir):
             self._recurseTree(lib_dir, self.root, [])
--- a/svghmi/widget_circularbar.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_circularbar.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -9,14 +9,12 @@
     If "min" a "max" labeled texts are provided, then they are used as
     respective minimum and maximum value. Otherwise, value is expected to be
     in between 0 and 100.
-
-    If "value" labeled text is found, then its content is replaced by value.
     ||
 
     shortdesc > Change end angle of Inkscape's arc
 
-    // TODO: add min/max arguments
-    // TODO: add printf-like format
+    arg name="min" count="optional" accepts="int,real" > minimum value
+    arg name="max" count="optional" accepts="int,real" > maximum value
 
     path name="value" accepts="HMI_INT,HMI_REAL" > Value to display
     
@@ -52,6 +50,9 @@
         }
 
         init() {
+            if(this.args.length >= 2)
+                [this.min, this.max]=this.args;
+
             let [start, end, cx, cy, rx, ry] = ["start", "end", "cx", "cy", "rx", "ry"].
                 map(tag=>Number(this.path_elt.getAttribute('sodipodi:'+tag)))
 
@@ -74,5 +75,5 @@
 
 widget_defs("CircularBar") {
     labels("path");
-    optional_labels("value min max");
+    optional_labels("min max");
 }
--- a/svghmi/widget_display.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_display.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -72,239 +72,3 @@
     |     },
     }
 }
-
-emit "preamble:display"
-||
-/* https://github.com/alexei/sprintf.js/blob/master/src/sprintf.js */
-/* global window, exports, define */
-
-!function() {
-    'use strict'
-
-    var re = {
-        not_string: /[^s]/,
-        not_bool: /[^t]/,
-        not_type: /[^T]/,
-        not_primitive: /[^v]/,
-        number: /[diefg]/,
-        numeric_arg: /[bcdiefguxX]/,
-        json: /[j]/,
-        not_json: /[^j]/,
-        text: /^[^\x25]+/,
-        modulo: /^\x25{2}/,
-        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
-        key: /^([a-z_][a-z_\d]*)/i,
-        key_access: /^\.([a-z_][a-z_\d]*)/i,
-        index_access: /^\[(\d+)\]/,
-        sign: /^[+-]/
-    }
-
-    function sprintf(key) {
-        // arguments is not an array, but should be fine for this call
-        return sprintf_format(sprintf_parse(key), arguments)
-    }
-
-    function vsprintf(fmt, argv) {
-        return sprintf.apply(null, [fmt].concat(argv || []))
-    }
-
-    function sprintf_format(parse_tree, argv) {
-        var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
-        for (i = 0; i < tree_length; i++) {
-            if (typeof parse_tree[i] === 'string') {
-                output += parse_tree[i]
-            }
-            else if (typeof parse_tree[i] === 'object') {
-                ph = parse_tree[i] // convenience purposes only
-                if (ph.keys) { // keyword argument
-                    arg = argv[cursor]
-                    for (k = 0; k < ph.keys.length; k++) {
-                        if (arg == undefined) {
-                            throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
-                        }
-                        arg = arg[ph.keys[k]]
-                    }
-                }
-                else if (ph.param_no) { // positional argument (explicit)
-                    arg = argv[ph.param_no]
-                }
-                else { // positional argument (implicit)
-                    arg = argv[cursor++]
-                }
-
-                if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
-                    arg = arg()
-                }
-
-                if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) {
-                    throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
-                }
-
-                if (re.number.test(ph.type)) {
-                    is_positive = arg >= 0
-                }
-
-                switch (ph.type) {
-                    case 'b':
-                        arg = parseInt(arg, 10).toString(2)
-                        break
-                    case 'c':
-                        arg = String.fromCharCode(parseInt(arg, 10))
-                        break
-                    case 'd':
-                    case 'i':
-                        arg = parseInt(arg, 10)
-                        break
-                    case 'j':
-                        arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
-                        break
-                    case 'e':
-                        arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
-                        break
-                    case 'f':
-                        arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
-                        break
-                    case 'g':
-                        arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
-                        break
-                    case 'o':
-                        arg = (parseInt(arg, 10) >>> 0).toString(8)
-                        break
-                    case 's':
-                        arg = String(arg)
-                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-                        break
-                    case 't':
-                        arg = String(!!arg)
-                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-                        break
-                    case 'T':
-                        arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
-                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-                        break
-                    case 'u':
-                        arg = parseInt(arg, 10) >>> 0
-                        break
-                    case 'v':
-                        arg = arg.valueOf()
-                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
-                        break
-                    case 'x':
-                        arg = (parseInt(arg, 10) >>> 0).toString(16)
-                        break
-                    case 'X':
-                        arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()
-                        break
-                }
-                if (re.json.test(ph.type)) {
-                    output += arg
-                }
-                else {
-                    if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
-                        sign = is_positive ? '+' : '-'
-                        arg = arg.toString().replace(re.sign, '')
-                    }
-                    else {
-                        sign = ''
-                    }
-                    pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
-                    pad_length = ph.width - (sign + arg).length
-                    pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''
-                    output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
-                }
-            }
-        }
-        return output
-    }
-
-    var sprintf_cache = Object.create(null)
-
-    function sprintf_parse(fmt) {
-        if (sprintf_cache[fmt]) {
-            return sprintf_cache[fmt]
-        }
-
-        var _fmt = fmt, match, parse_tree = [], arg_names = 0
-        while (_fmt) {
-            if ((match = re.text.exec(_fmt)) !== null) {
-                parse_tree.push(match[0])
-            }
-            else if ((match = re.modulo.exec(_fmt)) !== null) {
-                parse_tree.push('%')
-            }
-            else if ((match = re.placeholder.exec(_fmt)) !== null) {
-                if (match[2]) {
-                    arg_names |= 1
-                    var field_list = [], replacement_field = match[2], field_match = []
-                    if ((field_match = re.key.exec(replacement_field)) !== null) {
-                        field_list.push(field_match[1])
-                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
-                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
-                                field_list.push(field_match[1])
-                            }
-                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
-                                field_list.push(field_match[1])
-                            }
-                            else {
-                                throw new SyntaxError('[sprintf] failed to parse named argument key')
-                            }
-                        }
-                    }
-                    else {
-                        throw new SyntaxError('[sprintf] failed to parse named argument key')
-                    }
-                    match[2] = field_list
-                }
-                else {
-                    arg_names |= 2
-                }
-                if (arg_names === 3) {
-                    throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
-                }
-
-                parse_tree.push(
-                    {
-                        placeholder: match[0],
-                        param_no:    match[1],
-                        keys:        match[2],
-                        sign:        match[3],
-                        pad_char:    match[4],
-                        align:       match[5],
-                        width:       match[6],
-                        precision:   match[7],
-                        type:        match[8]
-                    }
-                )
-            }
-            else {
-                throw new SyntaxError('[sprintf] unexpected placeholder')
-            }
-            _fmt = _fmt.substring(match[0].length)
-        }
-        return sprintf_cache[fmt] = parse_tree
-    }
-
-    /**
-     * export to either browser or node.js
-     */
-    /* eslint-disable quote-props */
-    if (typeof exports !== 'undefined') {
-        exports['sprintf'] = sprintf
-        exports['vsprintf'] = vsprintf
-    }
-    if (typeof window !== 'undefined') {
-        window['sprintf'] = sprintf
-        window['vsprintf'] = vsprintf
-
-        if (typeof define === 'function' && define['amd']) {
-            define(function() {
-                return {
-                    'sprintf': sprintf,
-                    'vsprintf': vsprintf
-                }
-            })
-        }
-    }
-    /* eslint-enable quote-props */
-}(); // eslint-disable-line    
-||
--- a/svghmi/widget_dropdown.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_dropdown.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -7,16 +7,21 @@
     DropDown widget let user select an entry in a list of texts, given as
     arguments. Single variable path is index of selection.
 
-    It needs "text" (svg:text), "box" (svg:rect), "button" (svg:*),
-    and "highlight" (svg:rect) labeled elements.
+    It needs "text" (svg:text or svg:use referring to svg:text),
+    "box" (svg:rect), "button" (svg:*), and "highlight" (svg:rect)
+    labeled elements.
 
     When user clicks on "button", "text" is duplicated to display enties in the
     limit of available space in page, and "box" is extended to contain all
     texts. "highlight" is moved over pre-selected entry.
 
-    When only one argument is given, and argment contains "#langs" then list of
-    texts is automatically set to the list of human-readable languages supported
-    by this HMI. 
+    When only one argument is given and argment contains "#langs" then list of
+    texts is automatically set to the human-readable list of supported
+    languages by this HMI. 
+
+    If "text" labeled element is of type svg:use and refers to a svg:text 
+    element part of a TextList widget, no argument is expected. In that case
+    list of texts is set to TextList content.
     ||
 
     shortdesc > Let user select text entry in a drop-down menu
@@ -34,6 +39,7 @@
             if(!this.opened) this.set_selection(value);
         }
         init() {
+            this.init_specific();
             this.button_elt.onclick = this.on_button_click.bind(this);
             // Save original size of rectangle
             this.box_bbox = this.box_elt.getBBox()
@@ -79,7 +85,7 @@
             let display_str;
             if(value >= 0 && value < this.content.length){
                 // if valid selection resolve content
-                display_str = this.content[value];
+                display_str = gettext(this.content[value]);
                 this.last_selection = value;
             } else {
                 // otherwise show problem
@@ -185,7 +191,7 @@
             let c = 0;
             for(let item of this.content){
                 let span=spans[c];
-                span.textContent = item;
+                span.textContent = gettext(item);
                 let sel = c;
                 this.make_clickable(span, (evt) => this.bound_on_selection_click(sel));
                 c++;
@@ -251,7 +257,7 @@
                     span.setAttribute("dx", (m.width - o.width)/2);
                 // otherwise normal content
                 }else{
-                    span.textContent = this.content[i];
+                    span.textContent = gettext(this.content[i]);
                     let sel = i;
                     onclickfunc = (evt) => this.bound_on_selection_click(sel);
                     span.removeAttribute("dx");
@@ -360,19 +366,43 @@
 }
 
 widget_defs("DropDown") {
-    labels("text box button highlight");
+    labels("box button highlight");
     // It is assumed that list content conforms to Array interface.
-    >   content:
+    const "text_elt","$hmi_element//*[@inkscape:label='text'][1]";
+    | init_specific: function() {
     choose{
         // special case when used for language selection
         when "count(arg) = 1 and arg[1]/@value = '#langs'" {
-            > langs
+            |   this.text_elt = id("«$text_elt/@id»");
+            |   this.content = langs;
+        }
+        when "count(arg) = 0"{ 
+            if "not($text_elt[self::svg:use])"
+                error > No argrument for HMI:DropDown widget id="«$hmi_element/@id»" and "text" labeled element is not a svg:use element
+            const "real_text_elt","$result_widgets[@id = $hmi_element/@id]//*[@original=$text_elt/@id]/svg:text";
+            |   this.text_elt = id("«$real_text_elt/@id»");
+            const "from_list_id", "substring-after($text_elt/@xlink:href,'#')";
+            const "from_list", "$hmi_textlists[(@id | */@id) = $from_list_id]";
+            if "count($from_list) = 0"
+                error > HMI:DropDown widget id="«$hmi_element/@id»" "text" labeled element does not point to a svg:text owned by a HMI:List widget
+            |   this.content = hmi_widgets["«$from_list/@id»"].texts;
         }
         otherwise {
-            > [\n
+            |   this.text_elt = id("«$text_elt/@id»");
+            |   this.content = [
             foreach "arg" | "«@value»",
-            >   ]
+            |   ];
         }
     }
-    > ,\n
+    | }
 }
+
+emit "declarations:DropDown"
+||
+function gettext(o) {
+    if(typeof(o) == "string"){
+        return o;
+    }
+    return svg_text_to_multiline(o);
+};
+||
--- a/svghmi/widget_jsontable.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_jsontable.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -108,17 +108,6 @@
 }
 
 
-const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']";
-const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]";
-
-const "textstylelist_related" foreach "$hmi_textstylelists" list {
-    attrib "listid" value "@id";
-    foreach "func:refered_elements(.)" elt {
-        attrib "eltid" value "@id";
-    }
-}
-const "textstylelist_related_ns", "exsl:node-set($textstylelist_related)";
-
 def "func:json_expressions" {
     param "expressions";
     param "label";
--- a/svghmi/widget_list.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_list.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -1,6 +1,22 @@
 // widget_list.ysl2
+
 widget_desc("List") {
-    // TODO
+    longdesc
+    ||
+    List widget is a svg:group, list items are labeled elements
+    in that group.
+
+    To use a List, clone (svg:use) one of the items inside the widget that
+    expects a List.
+
+    Positions of items are relative to each other, and they must all be in the
+    same place. In order to make editing easier it is therefore recommanded to
+    make stacked clones of svg elements spread nearby the list.
+    ||
+
+    shortdesc > A named list of named graphical elements
+
+    arg name="listname"
 }
 
 widget_defs("List") {
@@ -11,15 +27,3 @@
     |     },
 }
 
-widget_defs("TextStyleList") {
-    // TODO
-}
-
-widget_defs("TextStyleList") {
-    |     styles: {
-    foreach "$hmi_element/*[@inkscape:label]" {
-        const "style", "func:refered_elements(.)[self::svg:text]/@style";
-    |         «@inkscape:label»: "«$style»",
-    }
-    |     },
-}
--- a/svghmi/widget_meter.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_meter.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -10,8 +10,6 @@
     are provided, or if first and second argument are given, then they are used
     as respective minimum and maximum value. Otherwise, value is expected to be
     in between 0 and 100.
-
-    If "value" labeled text is found, then its content is replaced by value.
     ||
 
     shortdesc > Moves "needle" along "range"
@@ -20,8 +18,6 @@
 
     arg name="max" count="optional" accepts="int,real" > maximum value
 
-    // TODO: add printf-like format
-
     path name="value" accepts="HMI_INT,HMI_REAL" > Value to display
     
 }
@@ -59,7 +55,7 @@
 
 widget_defs("Meter") {
     labels("needle range");
-    optional_labels("value min max");
+    optional_labels("min max");
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_pathslider.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,173 @@
+// widget_pathslider.ysl2
+widget_desc("PathSlider") {
+    longdesc
+    || 
+    PathSlider - 
+    ||
+
+    shortdesc > Slide an SVG element along a path by dragging it
+
+    path name="value" accepts="HMI_INT,HMI_REAL" > value
+    path name="min" count="optional" accepts="HMI_INT,HMI_REAL" > min
+    path name="max" count="optional" accepts="HMI_INT,HMI_REAL" > max
+    
+    arg name="min" count="optional" accepts="int,real" > minimum value
+    arg name="max" count="optional" accepts="int,real" > maximum value
+}
+
+widget_class("PathSlider") {
+    ||
+        frequency = 10;
+        position = undefined;
+        min = 0;
+        max = 100;
+        scannedPoints = [];
+        pathLength = undefined;
+        precision = undefined;
+        origPt = undefined;
+        
+
+        scanPath() {
+          this.pathLength = this.path_elt.getTotalLength();
+          this.precision = Math.floor(this.pathLength / 10);
+
+          // save linear scan for coarse approximation
+          for (var scanLength = 0; scanLength <= this.pathLength; scanLength += this.precision) {
+            this.scannedPoints.push([this.path_elt.getPointAtLength(scanLength), scanLength]);
+          }
+          [this.origPt,] = this.scannedPoints[0];
+        }
+
+        closestPoint(point) {
+          var bestPoint,
+              bestLength,
+              bestDistance = Infinity,
+              scanDistance;
+
+          // use linear scan for coarse approximation
+          for (let [scanPoint, scanLength] of this.scannedPoints){
+            if ((scanDistance = distance2(scanPoint)) < bestDistance) {
+              bestPoint = scanPoint,
+              bestLength = scanLength,
+              bestDistance = scanDistance;
+            }
+          }
+
+          // binary search for more precise estimate
+          let precision = this.precision / 2;
+          while (precision > 0.5) {
+            var beforePoint,
+                afterPoint,
+                beforeLength,
+                afterLength,
+                beforeDistance,
+                afterDistance;
+            if ((beforeLength = bestLength - precision) >= 0 &&
+                (beforeDistance = distance2(beforePoint = this.path_elt.getPointAtLength(beforeLength))) < bestDistance) {
+              bestPoint = beforePoint,
+              bestLength = beforeLength,
+              bestDistance = beforeDistance;
+            } else if ((afterLength = bestLength + precision) <= this.pathLength && 
+                       (afterDistance = distance2(afterPoint = this.path_elt.getPointAtLength(afterLength))) < bestDistance) {
+              bestPoint = afterPoint,
+              bestLength = afterLength,
+              bestDistance = afterDistance;
+            }
+            precision /= 2;
+          }
+
+          return [bestPoint, bestLength];
+
+          function distance2(p) {
+            var dx = p.x - point.x,
+                dy = p.y - point.y;
+            return dx * dx + dy * dy;
+          }
+        }
+
+        dispatch(value,oldval, index) {
+            switch(index) {
+                case 0:
+                    this.position = value;
+                    break;
+                case 1:
+                    this.min = value;
+                    break;
+                case 2:
+                    this.max = value;
+                    break;
+            }
+
+            this.request_animate();
+        }
+
+        get_current_point(){
+            let currLength = this.pathLength * (this.position - this.min) / (this.max - this.min)
+            return this.path_elt.getPointAtLength(currLength);
+        }
+
+        animate(){
+            if(this.position == undefined)
+                return;
+
+            let currPt = this.get_current_point();
+            this.cursor_transform.setTranslate(currPt.x - this.origPt.x, currPt.y - this.origPt.y);
+        }
+
+        init() {
+            if(this.args.length == 2)
+                [this.min, this.max]=this.args;
+
+            this.scanPath();
+
+            this.cursor_transform = svg_root.createSVGTransform();
+
+            this.cursor_elt.transform.baseVal.appendItem(this.cursor_transform);
+
+            this.cursor_elt.onpointerdown = (e) => this.on_cursor_down(e);
+
+            this.bound_drag = this.drag.bind(this);
+            this.bound_drop = this.drop.bind(this);
+        }
+
+        start_dragging_from_event(e){
+            let clientPoint = new DOMPoint(e.clientX, e.clientY);
+            let point = clientPoint.matrixTransform(this.invctm);
+            let currPt = this.get_current_point();
+            this.draggingOffset = new DOMPoint(point.x - currPt.x , point.y - currPt.y);
+        }
+
+        apply_position_from_event(e){
+            let clientPoint = new DOMPoint(e.clientX, e.clientY);
+            let rawPoint = clientPoint.matrixTransform(this.invctm);
+            let point = new DOMPoint(rawPoint.x - this.draggingOffset.x , rawPoint.y - this.draggingOffset.y);
+            let [closestPoint, closestLength] = this.closestPoint(point);
+            let new_position = this.min + (this.max - this.min) * closestLength / this.pathLength;
+            this.position = Math.round(Math.max(Math.min(new_position, this.max), this.min));
+            this.apply_hmi_value(0, this.position);
+        }
+
+        on_cursor_down(e){
+            // get scrollbar -> root transform
+            let ctm = this.path_elt.getCTM();
+            // root -> path transform
+            this.invctm = ctm.inverse();
+            this.start_dragging_from_event(e);
+            svg_root.addEventListener("pointerup", this.bound_drop, true);
+            svg_root.addEventListener("pointermove", this.bound_drag, true);
+        }
+
+        drop(e) {
+            svg_root.removeEventListener("pointerup", this.bound_drop, true);
+            svg_root.removeEventListener("pointermove", this.bound_drag, true);
+        }
+
+        drag(e) {
+            this.apply_position_from_event(e);
+        }
+    ||
+}
+
+widget_defs("PathSlider") {
+    labels("cursor path");
+}
--- a/svghmi/widget_scrollbar.ysl2	Tue Oct 19 15:15:03 2021 +0200
+++ b/svghmi/widget_scrollbar.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -2,7 +2,7 @@
 widget_desc("ScrollBar") {
     longdesc
     || 
-    ScrollBar - documentation to be written
+    ScrollBar - svg:rect based scrollbar
     ||
 
     shortdesc > ScrollBar
@@ -39,19 +39,18 @@
 
         get_ratios() {
             let range = this.range;
-            let size = Math.max(this.range * this.mincursize, Math.min(this.size, range));
+            let size = Math.max(range * this.mincursize, Math.min(this.size, range));
             let maxh = this.range_elt.height.baseVal.value;
             let pixels = maxh;
-            let units = range;
-            return [size, maxh, range, pixels, units];
+            return [size, maxh, range, pixels];
         }
 
         animate(){
             if(this.position == undefined || this.range == undefined || this.size == undefined)
                 return;
-            let [size, maxh, range, pixels, units] = this.get_ratios();
+            let [size, maxh, range, pixels] = this.get_ratios();
 
-            let new_y = this.range_elt.y.baseVal.value + Math.round(Math.min(this.position,range-size) * pixels / units);
+            let new_y = this.range_elt.y.baseVal.value + Math.round(Math.min(this.position,range-size) * pixels / range);
             let new_height = Math.round(maxh * size/range);
 
             this.cursor_elt.y.baseVal.value = new_y;
@@ -94,11 +93,11 @@
         }
 
         drag(e) {
-            let [size, maxh, range, pixels, units] = this.get_ratios();
+            let [size, maxh, range, pixels] = this.get_ratios();
             if(pixels == 0) return;
             let point = new DOMPoint(e.movementX, e.movementY);
             let movement = point.matrixTransform(this.invctm).y;
-            this.dragpos += movement * units / pixels;
+            this.dragpos += movement * range / pixels;
             this.apply_position(this.dragpos);
         }
     ||
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_textlist.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,28 @@
+// widget_textlist.ysl2
+
+widget_desc("TextList") {
+    longdesc
+    ||
+    TextList widget is a svg:group, list items are labeled elements
+    in that group.
+
+    To use a TextList, clone (svg:use) one of the items inside the widget 
+    that expects a TextList.
+
+    In this list, (translated) text content is what matters. Nevertheless
+    text style of the cloned item will be applied in client widget.
+    ||
+
+    shortdesc > A named list of ordered texts 
+
+    arg name="listname"
+}
+
+widget_defs("TextList") {
+    |     texts: [
+    foreach "func:refered_elements($hmi_element/*[@inkscape:label])[self::svg:text]" {
+    |         id("«@id»"),
+    }
+    // could find a proper way in xpath to reverse()
+    |     ].reverse(),
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_textstylelist.ysl2	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,28 @@
+// widget_textstylelist.ysl2
+
+widget_desc("TextStyleList") {
+    longdesc
+    ||
+    TextStyleList widget is a svg:group, list items are labeled elements
+    in that group.
+
+    To use a TextStyleList, clone (svg:use) one of the items inside the widget 
+    that expects a TextStyleList.
+
+    In this list, only style matters. Text content is ignored.
+    ||
+
+    shortdesc > A named list of named texts
+
+    arg name="listname"
+}
+
+widget_defs("TextStyleList") {
+    |     styles: {
+    foreach "$hmi_element/*[@inkscape:label]" {
+        const "style", "func:refered_elements(.)[self::svg:text]/@style";
+    |         «@inkscape:label»: "«$style»",
+    }
+    |     },
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widgetlib/dropdown.svg	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   viewBox="0 0 210 297"
+   version="1.1"
+   id="svg1109"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   sodipodi:docname="dropdown.svg">
+  <defs
+     id="defs1103" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="48.571429"
+     inkscape:cy="537.14286"
+     inkscape:document-units="mm"
+     inkscape:current-layer="svg1109"
+     showgrid="false"
+     inkscape:window-width="3840"
+     inkscape:window-height="2096"
+     inkscape:window-x="1600"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata1106">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="g14237"
+     inkscape:label="HMI:DropDown:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27@/SELECTION"
+     transform="matrix(0.21561215,0,0,0.21561215,-108.35425,-53.167319)"
+     style="stroke-width:0.35083869">
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#53676c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419343;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect14212"
+       width="391.99988"
+       height="130.9433"
+       x="864.00842"
+       y="923.98993"
+       rx="2.4558709"
+       ry="2.4558709"
+       inkscape:label="box" />
+    <rect
+       inkscape:label="highlight"
+       ry="2.4558709"
+       rx="2.4558709"
+       y="943.10553"
+       x="864.00842"
+       height="92.71212"
+       width="391.99988"
+       id="rect5497"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419331;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <text
+       id="text14183"
+       y="1011.9975"
+       x="881.44226"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d42aff;fill-opacity:1;stroke:none;stroke-width:0.35083869px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"
+       inkscape:label="text"><tspan
+         style="text-align:start;text-anchor:start;fill:#d42aff;stroke-width:0.35083869px"
+         y="1011.9975"
+         x="881.44226"
+         sodipodi:role="line"
+         id="tspan421">sel_0</tspan></text>
+    <path
+       sodipodi:type="star"
+       style="opacity:1;vector-effect:none;fill:#a7a5a6;fill-opacity:1;stroke:none;stroke-width:0.12376806;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path424"
+       sodipodi:sides="3"
+       sodipodi:cx="1200.5"
+       sodipodi:cy="975"
+       sodipodi:r1="43.683521"
+       sodipodi:r2="21.841761"
+       sodipodi:arg1="1.5707963"
+       sodipodi:arg2="2.6179939"
+       inkscape:flatsided="false"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 1200.5,1018.6835 -18.9155,-32.76262 -18.9155,-32.76264 37.831,0 37.831,0 -18.9155,32.76264 z"
+       inkscape:transform-center-y="10.92088"
+       inkscape:label="button" />
+  </g>
+</svg>
--- a/svgui/README	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-SVGUI HMI
\ No newline at end of file
--- a/svgui/__init__.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-from __future__ import absolute_import
-from svgui.svgui import *
--- a/svgui/livesvg.js	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-// import Nevow.Athena
-// import Divmod.Base
-
-function updateAttr(id, param, value) {
-  Nevow.Athena.Widget.fromAthenaID(1).callRemote('HMIexec', 'setattr', id, param, value);
-}
-
-var svguiWidgets = new Array();
-
-var currentObject = null;
-function setCurrentObject(obj) {
-	currentObject = obj;
-}
-function isCurrentObject(obj) {
-	return currentObject == obj;
-}
-
-function getSVGElementById(id) {
-	return document.getElementById(id);
-}
-
-function blockSVGElementDrag(element) {
-	element.addEventListener("draggesture", function(event){event.stopPropagation()}, true);
-}
-
-LiveSVGPage.LiveSVGWidget = Nevow.Athena.Widget.subclass('LiveSVGPage.LiveSVGWidget');
-LiveSVGPage.LiveSVGWidget.methods(
-
-    function handleEvent(self, evt) {
-        if (currentObject != null) {
-            currentObject.handleEvent(evt);
-        }
-    },
-
-    function receiveData(self, data){
-        dataReceived = json_parse(data);
-        gadget = svguiWidgets[dataReceived.id]
-        if (gadget) {
-        	gadget.updateValues(json_parse(dataReceived.kwargs));
-        }
-        //console.log("OBJET : " + dataReceived.back_id + " STATE : " + newState);
-    },
-    
-    function init(self, arg1){
-        //console.log("Object received : " + arg1);
-        for (ind in arg1) {
-            gad = json_parse(arg1[ind]);
-            args = json_parse(gad.kwargs);
-            gadget = new svguilib[gad.__class__](self, gad.id, args);
-            svguiWidgets[gadget.id]=gadget;
-            //console.log('GADGET :' + gadget);
-        }
-        var elements = document.getElementsByTagName("svg");
-        for (var i = 0; i < elements.length; i++) {
-        	elements[i].addEventListener("mouseup", self, false);
-        }
-        //console.log("SVGUIWIDGETS : " + svguiWidgets);
-    }
-);
--- a/svgui/pous.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1428 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://www.plcopen.org/xml/tc6.xsd"
-         xmlns:xhtml="http://www.w3.org/1999/xhtml"
-         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
-  <fileHeader companyName="Beremiz"
-              productName="Beremiz"
-              productVersion="0.0"
-              creationDateTime="2008-12-14T16:53:26"/>
-  <contentHeader name="Beremiz non-standard POUs library"
-                 modificationDateTime="2009-08-12T15:35:33">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="GetBoolString" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="VALUE">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="CODE">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </outputVars>
-        </interface>
-        <body>
-          <ST>
-<![CDATA[IF VALUE THEN
-  CODE := 'True';
-ELSE
-  CODE := 'False';
-END_IF;]]>
-          </ST>
-        </body>
-      </pou>
-      <pou name="TextCtrl" pouType="functionBlock">
-        <interface>
-          <localVars>
-            <variable name="ID">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </localVars>
-          <inputVars>
-            <variable name="back_id">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="set_text">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="text">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="SVGUI_TEXTCTRL">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="setstate_Command">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="1" width="193" height="160" typeName="CONCAT">
-              <position x="626" y="122"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="43"/>
-                    <connection refLocalId="2">
-                      <position x="626" y="165"/>
-                      <position x="535" y="165"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="89"/>
-                    <connection refLocalId="3">
-                      <position x="626" y="211"/>
-                      <position x="535" y="211"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="135"/>
-                    <connection refLocalId="6">
-                      <position x="626" y="257"/>
-                      <position x="532" y="257"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="193" y="43"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="2" height="30" width="460">
-              <position x="75" y="150"/>
-              <connectionPointOut>
-                <relPosition x="460" y="15"/>
-              </connectionPointOut>
-              <expression>'createSVGUIControl("textControl", back_id="'</expression>
-            </inVariable>
-            <inVariable localId="3" height="35" width="85">
-              <position x="450" y="196"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>back_id</expression>
-            </inVariable>
-            <inVariable localId="6" height="30" width="50">
-              <position x="482" y="242"/>
-              <connectionPointOut>
-                <relPosition x="50" y="15"/>
-              </connectionPointOut>
-              <expression>'")'</expression>
-            </inVariable>
-            <block localId="7" width="125" height="115" typeName="python_eval" instanceName="SVGUI_TEXTCTRL">
-              <position x="909" y="75"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="45"/>
-                    <connection refLocalId="9">
-                      <position x="909" y="120"/>
-                      <position x="886" y="120"/>
-                      <position x="886" y="85"/>
-                      <position x="869" y="85"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="90"/>
-                    <connection refLocalId="1" formalParameter="OUT">
-                      <position x="909" y="165"/>
-                      <position x="819" y="165"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="45"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="90"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="9" height="30" width="70">
-              <position x="799" y="70"/>
-              <connectionPointOut>
-                <relPosition x="70" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <outVariable localId="10" height="30" width="30">
-              <position x="1094" y="150"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="RESULT">
-                  <position x="1094" y="165"/>
-                  <position x="1034" y="165"/>
-                </connection>
-              </connectionPointIn>
-              <expression>ID</expression>
-            </outVariable>
-            <connector name="CREATED" localId="11" height="30" width="110">
-              <position x="1096" y="105"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="ACK">
-                  <position x="1096" y="120"/>
-                  <position x="1034" y="120"/>
-                </connection>
-              </connectionPointIn>
-            </connector>
-            <block localId="4" width="125" height="140" typeName="python_eval" instanceName="setstate_Command">
-              <position x="957" y="472"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="31" formalParameter="OUT">
-                      <position x="957" y="522"/>
-                      <position x="909" y="522"/>
-                      <position x="909" y="444"/>
-                      <position x="857" y="444"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="12" formalParameter="OUT">
-                      <position x="957" y="582"/>
-                      <position x="822" y="582"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <continuation name="CREATED" localId="5" height="30" width="110">
-              <position x="589" y="429"/>
-              <connectionPointOut>
-                <relPosition x="110" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <block localId="12" width="186" height="288" typeName="CONCAT">
-              <position x="636" y="536"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="46"/>
-                    <connection refLocalId="14">
-                      <position x="636" y="582"/>
-                      <position x="526" y="582"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="99"/>
-                    <connection refLocalId="8">
-                      <position x="636" y="635"/>
-                      <position x="526" y="635"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="152"/>
-                    <connection refLocalId="15">
-                      <position x="636" y="688"/>
-                      <position x="527" y="688"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="205"/>
-                    <connection refLocalId="32">
-                      <position x="636" y="741"/>
-                      <position x="528" y="741"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="258"/>
-                    <connection refLocalId="16">
-                      <position x="636" y="794"/>
-                      <position x="528" y="794"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="186" y="46"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="8" height="30" width="53">
-              <position x="473" y="620"/>
-              <connectionPointOut>
-                <relPosition x="53" y="15"/>
-              </connectionPointOut>
-              <expression>ID</expression>
-            </inVariable>
-            <inVariable localId="13" height="35" width="100">
-              <position x="599" y="469"/>
-              <connectionPointOut>
-                <relPosition x="100" y="17"/>
-              </connectionPointOut>
-              <expression>set_text</expression>
-            </inVariable>
-            <inVariable localId="14" height="30" width="120">
-              <position x="406" y="567"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'setAttr('</expression>
-            </inVariable>
-            <inVariable localId="15" height="30" width="122">
-              <position x="405" y="673"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>',"text","'</expression>
-            </inVariable>
-            <inVariable localId="16" height="30" width="50">
-              <position x="478" y="779"/>
-              <connectionPointOut>
-                <relPosition x="50" y="15"/>
-              </connectionPointOut>
-              <expression>'")'</expression>
-            </inVariable>
-            <block localId="31" width="75" height="105" typeName="AND">
-              <position x="782" y="403"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="5">
-                      <position x="782" y="444"/>
-                      <position x="699" y="444"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="83"/>
-                    <connection refLocalId="13">
-                      <position x="782" y="486"/>
-                      <position x="699" y="486"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="75" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="32" height="30" width="90">
-              <position x="438" y="726"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-              <expression>text</expression>
-            </inVariable>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="Button" pouType="functionBlock">
-        <interface>
-          <localVars>
-            <variable name="ID">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </localVars>
-          <inputVars>
-            <variable name="back_id">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="sele_id">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="toggle">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="set_state">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="state_in">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="state_out">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="init_Command">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="GetButtonState">
-              <type>
-                <derived name="GetBoolString"/>
-              </type>
-            </variable>
-            <variable name="setstate_Command">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="getstate_Command">
-              <type>
-                <derived name="python_poll"/>
-              </type>
-            </variable>
-            <variable name="GetButtonToggle">
-              <type>
-                <derived name="GetBoolString"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="1" width="125" height="140" typeName="python_eval" instanceName="init_Command">
-              <position x="838" y="32"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="10">
-                      <position x="838" y="82"/>
-                      <position x="781" y="82"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="2" formalParameter="OUT">
-                      <position x="838" y="142"/>
-                      <position x="641" y="142"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="2" width="150" height="442" typeName="CONCAT">
-              <position x="491" y="92"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="3">
-                      <position x="491" y="142"/>
-                      <position x="433" y="142"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="11">
-                      <position x="491" y="202"/>
-                      <position x="431" y="202"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="170"/>
-                    <connection refLocalId="5">
-                      <position x="491" y="262"/>
-                      <position x="431" y="262"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="230"/>
-                    <connection refLocalId="12">
-                      <position x="491" y="322"/>
-                      <position x="430" y="322"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="290"/>
-                    <connection refLocalId="23">
-                      <position x="491" y="382"/>
-                      <position x="463" y="382"/>
-                      <position x="463" y="370"/>
-                      <position x="430" y="370"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN6">
-                  <connectionPointIn>
-                    <relPosition x="0" y="350"/>
-                    <connection refLocalId="24" formalParameter="CODE">
-                      <position x="491" y="442"/>
-                      <position x="429" y="442"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN7">
-                  <connectionPointIn>
-                    <relPosition x="0" y="410"/>
-                    <connection refLocalId="9">
-                      <position x="491" y="502"/>
-                      <position x="430" y="502"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="150" y="50"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="3" height="30" width="400">
-              <position x="33" y="127"/>
-              <connectionPointOut>
-                <relPosition x="400" y="15"/>
-              </connectionPointOut>
-              <expression>'createSVGUIControl("button",back_id="'</expression>
-            </inVariable>
-            <inVariable localId="5" height="30" width="140">
-              <position x="291" y="247"/>
-              <connectionPointOut>
-                <relPosition x="140" y="15"/>
-              </connectionPointOut>
-              <expression>'",sele_id="'</expression>
-            </inVariable>
-            <inVariable localId="9" height="30" width="180">
-              <position x="250" y="487"/>
-              <connectionPointOut>
-                <relPosition x="180" y="15"/>
-              </connectionPointOut>
-              <expression>',active=True)'</expression>
-            </inVariable>
-            <inVariable localId="10" height="30" width="70">
-              <position x="711" y="67"/>
-              <connectionPointOut>
-                <relPosition x="70" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <inVariable localId="11" height="35" width="85">
-              <position x="346" y="187"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>back_id</expression>
-            </inVariable>
-            <inVariable localId="12" height="35" width="85">
-              <position x="345" y="307"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>sele_id</expression>
-            </inVariable>
-            <inVariable localId="13" height="35" width="100">
-              <position x="452" y="639"/>
-              <connectionPointOut>
-                <relPosition x="100" y="15"/>
-              </connectionPointOut>
-              <expression>set_state</expression>
-            </inVariable>
-            <block localId="28" width="140" height="40" typeName="GetBoolString" instanceName="GetButtonState">
-              <position x="239" y="897"/>
-              <inputVariables>
-                <variable formalParameter="VALUE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="32">
-                      <position x="239" y="927"/>
-                      <position x="181" y="927"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="CODE">
-                  <connectionPointOut>
-                    <relPosition x="140" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="29" height="30" width="53">
-              <position x="1015" y="127"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1" formalParameter="RESULT">
-                  <position x="1015" y="142"/>
-                  <position x="963" y="142"/>
-                </connection>
-              </connectionPointIn>
-              <expression>ID</expression>
-            </outVariable>
-            <block localId="4" width="125" height="140" typeName="python_eval" instanceName="setstate_Command">
-              <position x="810" y="640"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="31" formalParameter="OUT">
-                      <position x="810" y="690"/>
-                      <position x="762" y="690"/>
-                      <position x="762" y="612"/>
-                      <position x="710" y="612"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="810" y="750"/>
-                      <position x="643" y="750"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <connector name="CREATED" localId="30" height="30" width="110">
-              <position x="1014" y="67"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1" formalParameter="ACK">
-                  <position x="1014" y="82"/>
-                  <position x="963" y="82"/>
-                </connection>
-              </connectionPointIn>
-            </connector>
-            <continuation name="CREATED" localId="6" height="30" width="110">
-              <position x="442" y="597"/>
-              <connectionPointOut>
-                <relPosition x="110" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <block localId="31" width="75" height="105" typeName="AND">
-              <position x="635" y="571"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="6">
-                      <position x="635" y="612"/>
-                      <position x="552" y="612"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="83"/>
-                    <connection refLocalId="13">
-                      <position x="635" y="654"/>
-                      <position x="552" y="654"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="75" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="32" height="30" width="90">
-              <position x="91" y="912"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-              <expression>state_in</expression>
-            </inVariable>
-            <outVariable localId="33" height="30" width="100">
-              <position x="1334" y="1184"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="26" formalParameter="OUT">
-                  <position x="1334" y="1199"/>
-                  <position x="1286" y="1199"/>
-                </connection>
-              </connectionPointIn>
-              <expression>state_out</expression>
-            </outVariable>
-            <block localId="7" width="150" height="319" typeName="CONCAT">
-              <position x="493" y="701"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="49"/>
-                    <connection refLocalId="14">
-                      <position x="493" y="750"/>
-                      <position x="379" y="750"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="108"/>
-                    <connection refLocalId="8">
-                      <position x="493" y="809"/>
-                      <position x="435" y="809"/>
-                      <position x="435" y="803"/>
-                      <position x="379" y="803"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="167"/>
-                    <connection refLocalId="15">
-                      <position x="493" y="868"/>
-                      <position x="435" y="868"/>
-                      <position x="435" y="855"/>
-                      <position x="379" y="855"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="226"/>
-                    <connection refLocalId="28" formalParameter="CODE">
-                      <position x="493" y="927"/>
-                      <position x="379" y="927"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="285"/>
-                    <connection refLocalId="16">
-                      <position x="493" y="986"/>
-                      <position x="377" y="986"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="150" y="49"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="8" height="30" width="53">
-              <position x="326" y="788"/>
-              <connectionPointOut>
-                <relPosition x="53" y="15"/>
-              </connectionPointOut>
-              <expression>ID</expression>
-            </inVariable>
-            <inVariable localId="14" height="30" width="120">
-              <position x="259" y="735"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'setAttr('</expression>
-            </inVariable>
-            <inVariable localId="15" height="30" width="122">
-              <position x="257" y="840"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>',"state",'</expression>
-            </inVariable>
-            <inVariable localId="16" height="30" width="41">
-              <position x="336" y="971"/>
-              <connectionPointOut>
-                <relPosition x="41" y="15"/>
-              </connectionPointOut>
-              <expression>')'</expression>
-            </inVariable>
-            <block localId="17" width="125" height="140" typeName="python_poll" instanceName="getstate_Command">
-              <position x="801" y="1089"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="18">
-                      <position x="801" y="1139"/>
-                      <position x="763" y="1139"/>
-                      <position x="763" y="1099"/>
-                      <position x="720" y="1099"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="22" formalParameter="OUT">
-                      <position x="801" y="1199"/>
-                      <position x="643" y="1199"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="25" width="145" height="45" typeName="STRING_TO_INT">
-              <position x="966" y="1169"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="17" formalParameter="RESULT">
-                      <position x="966" y="1199"/>
-                      <position x="926" y="1199"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="145" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="26" width="125" height="45" typeName="INT_TO_BOOL">
-              <position x="1161" y="1169"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="25" formalParameter="OUT">
-                      <position x="1161" y="1199"/>
-                      <position x="1111" y="1199"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <continuation name="CREATED" localId="18" height="30" width="110">
-              <position x="610" y="1084"/>
-              <connectionPointOut>
-                <relPosition x="110" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <inVariable localId="19" height="30" width="53">
-              <position x="383" y="1238"/>
-              <connectionPointOut>
-                <relPosition x="53" y="15"/>
-              </connectionPointOut>
-              <expression>ID</expression>
-            </inVariable>
-            <inVariable localId="20" height="30" width="150">
-              <position x="286" y="1184"/>
-              <connectionPointOut>
-                <relPosition x="150" y="15"/>
-              </connectionPointOut>
-              <expression>'int(getAttr('</expression>
-            </inVariable>
-            <inVariable localId="21" height="30" width="190">
-              <position x="246" y="1292"/>
-              <connectionPointOut>
-                <relPosition x="190" y="15"/>
-              </connectionPointOut>
-              <expression>',"state",False))'</expression>
-            </inVariable>
-            <block localId="22" width="150" height="183" typeName="CONCAT">
-              <position x="493" y="1152"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="47"/>
-                    <connection refLocalId="20">
-                      <position x="493" y="1199"/>
-                      <position x="436" y="1199"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="101"/>
-                    <connection refLocalId="19">
-                      <position x="493" y="1253"/>
-                      <position x="436" y="1253"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="155"/>
-                    <connection refLocalId="21">
-                      <position x="493" y="1307"/>
-                      <position x="483" y="1307"/>
-                      <position x="483" y="1307"/>
-                      <position x="436" y="1307"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="150" y="47"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="23" height="30" width="130">
-              <position x="300" y="355"/>
-              <connectionPointOut>
-                <relPosition x="130" y="15"/>
-              </connectionPointOut>
-              <expression>'",toggle='</expression>
-            </inVariable>
-            <block localId="24" width="140" height="40" typeName="GetBoolString" instanceName="GetButtonToggle">
-              <position x="289" y="412"/>
-              <inputVariables>
-                <variable formalParameter="VALUE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="27">
-                      <position x="289" y="442"/>
-                      <position x="220" y="442"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="CODE">
-                  <connectionPointOut>
-                    <relPosition x="140" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="27" height="30" width="90">
-              <position x="130" y="427"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-              <expression>toggle</expression>
-            </inVariable>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="Led" pouType="functionBlock">
-        <interface>
-          <localVars>
-            <variable name="ID">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </localVars>
-          <inputVars>
-            <variable name="back_id">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="sele_id">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="state_in">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="init_Command">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="setstate_Command">
-              <type>
-                <derived name="python_poll"/>
-              </type>
-            </variable>
-            <variable name="GetLedState">
-              <type>
-                <derived name="GetBoolString"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="1" width="125" height="140" typeName="python_eval" instanceName="init_Command">
-              <position x="810" y="30"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="10">
-                      <position x="810" y="80"/>
-                      <position x="753" y="80"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="2" formalParameter="OUT">
-                      <position x="810" y="140"/>
-                      <position x="640" y="140"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="2" width="150" height="322" typeName="CONCAT">
-              <position x="490" y="90"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="3">
-                      <position x="490" y="140"/>
-                      <position x="415" y="140"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="11">
-                      <position x="490" y="200"/>
-                      <position x="415" y="200"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="170"/>
-                    <connection refLocalId="5">
-                      <position x="490" y="260"/>
-                      <position x="415" y="260"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="230"/>
-                    <connection refLocalId="12">
-                      <position x="490" y="320"/>
-                      <position x="414" y="320"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="290"/>
-                    <connection refLocalId="9">
-                      <position x="490" y="380"/>
-                      <position x="414" y="380"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="150" y="50"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="3" height="30" width="400">
-              <position x="15" y="125"/>
-              <connectionPointOut>
-                <relPosition x="400" y="15"/>
-              </connectionPointOut>
-              <expression>'createSVGUIControl("button",back_id="'</expression>
-            </inVariable>
-            <block localId="4" width="125" height="140" typeName="python_poll" instanceName="setstate_Command">
-              <position x="782" y="536"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="6">
-                      <position x="782" y="586"/>
-                      <position x="653" y="586"/>
-                      <position x="653" y="552"/>
-                      <position x="602" y="552"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="782" y="646"/>
-                      <position x="615" y="646"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="50"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="110"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="5" height="30" width="140">
-              <position x="275" y="245"/>
-              <connectionPointOut>
-                <relPosition x="140" y="15"/>
-              </connectionPointOut>
-              <expression>'",sele_id="'</expression>
-            </inVariable>
-            <continuation name="CREATED" localId="6" height="30" width="110">
-              <position x="492" y="537"/>
-              <connectionPointOut>
-                <relPosition x="110" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <block localId="7" width="150" height="319" typeName="CONCAT">
-              <position x="465" y="597"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="49"/>
-                    <connection refLocalId="14">
-                      <position x="465" y="646"/>
-                      <position x="351" y="646"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="108"/>
-                    <connection refLocalId="8">
-                      <position x="465" y="705"/>
-                      <position x="407" y="705"/>
-                      <position x="407" y="699"/>
-                      <position x="351" y="699"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="167"/>
-                    <connection refLocalId="15">
-                      <position x="465" y="764"/>
-                      <position x="407" y="764"/>
-                      <position x="407" y="751"/>
-                      <position x="351" y="751"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="226"/>
-                    <connection refLocalId="28" formalParameter="CODE">
-                      <position x="465" y="823"/>
-                      <position x="351" y="823"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="285"/>
-                    <connection refLocalId="16">
-                      <position x="465" y="882"/>
-                      <position x="407" y="882"/>
-                      <position x="407" y="883"/>
-                      <position x="351" y="883"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="150" y="49"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="8" height="30" width="53">
-              <position x="298" y="684"/>
-              <connectionPointOut>
-                <relPosition x="53" y="15"/>
-              </connectionPointOut>
-              <expression>ID</expression>
-            </inVariable>
-            <inVariable localId="9" height="30" width="300">
-              <position x="124" y="365"/>
-              <connectionPointOut>
-                <relPosition x="300" y="15"/>
-              </connectionPointOut>
-              <expression>'",toggle=True,active=False)'</expression>
-            </inVariable>
-            <inVariable localId="10" height="30" width="70">
-              <position x="683" y="65"/>
-              <connectionPointOut>
-                <relPosition x="70" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <inVariable localId="11" height="35" width="85">
-              <position x="330" y="185"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>back_id</expression>
-            </inVariable>
-            <inVariable localId="12" height="35" width="85">
-              <position x="329" y="305"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>sele_id</expression>
-            </inVariable>
-            <inVariable localId="14" height="30" width="120">
-              <position x="231" y="631"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'setAttr('</expression>
-            </inVariable>
-            <inVariable localId="15" height="30" width="122">
-              <position x="229" y="736"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>',"state",'</expression>
-            </inVariable>
-            <inVariable localId="16" height="30" width="41">
-              <position x="310" y="868"/>
-              <connectionPointOut>
-                <relPosition x="41" y="15"/>
-              </connectionPointOut>
-              <expression>')'</expression>
-            </inVariable>
-            <block localId="28" width="140" height="40" typeName="GetBoolString" instanceName="GetLedState">
-              <position x="211" y="793"/>
-              <inputVariables>
-                <variable formalParameter="VALUE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="32">
-                      <position x="211" y="823"/>
-                      <position x="153" y="823"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="CODE">
-                  <connectionPointOut>
-                    <relPosition x="140" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="29" height="30" width="53">
-              <position x="987" y="125"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1" formalParameter="RESULT">
-                  <position x="987" y="140"/>
-                  <position x="935" y="140"/>
-                </connection>
-              </connectionPointIn>
-              <expression>ID</expression>
-            </outVariable>
-            <connector name="CREATED" localId="30" height="30" width="110">
-              <position x="986" y="65"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1" formalParameter="ACK">
-                  <position x="986" y="80"/>
-                  <position x="935" y="80"/>
-                </connection>
-              </connectionPointIn>
-            </connector>
-            <inVariable localId="32" height="30" width="90">
-              <position x="63" y="808"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-              <expression>state_in</expression>
-            </inVariable>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations/>
-  </instances>
-</project>
--- a/svgui/pyjs/__init__.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-from __future__ import absolute_import
-from svgui.pyjs.pyjs import *
--- a/svgui/pyjs/build.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,774 +0,0 @@
-#!/usr/bin/env python
-
-
-from __future__ import absolute_import
-from __future__ import print_function
-import sys
-import shutil
-import re
-import os
-from os.path import join, basename, abspath, split, isfile, isdir
-from hashlib import md5
-from optparse import OptionParser
-from six.moves import cStringIO
-
-from svgui.pyjs import pyjs
-
-
-usage = """
-  usage: %prog [options] <application module name or path>
-
-This is the command line builder for the pyjamas project, which can
-be used to build Ajax applications from Python.
-For more information, see the website at http://pyjs.org/
-"""
-
-# GWT1.2 Impl  | GWT1.2 Output         | Pyjamas 0.2 Platform | Pyjamas 0.2 Output
-# -------------+-----------------------+----------------------+----------------------
-# IE6          | ie6                   | IE6                  | ie6
-# Opera        | opera                 | Opera                | opera
-# Safari       | safari                | Safari               | safari
-# --           | gecko1_8              | Mozilla              | mozilla
-# --           | gecko                 | OldMoz               | oldmoz
-# Standard     | all                   | (default code)       | all
-# Mozilla      | gecko1_8, gecko       | --                   | --
-# Old          | safari, gecko, opera  | --                   | --
-
-version = "%prog pyjamas version 2006-08-19"
-
-# these names in lowercase need match the strings
-# returned by "provider$user.agent" in order to be selected corretly
-app_platforms = ['IE6', 'Opera', 'OldMoz', 'Safari', 'Mozilla']
-
-# usually defaults to e.g. /usr/share/pyjamas
-_data_dir = os.path.join(pyjs.prefix, "share/pyjamas")
-
-
-# .cache.html files produces look like this
-CACHE_HTML_PAT = re.compile(r'^[a-z]*.[0-9a-f]{32}\.cache\.html$')
-
-# ok these are the three "default" library directories, containing
-# the builtins (str, List, Dict, ord, round, len, range etc.)
-# the main pyjamas libraries (pyjamas.ui, pyjamas.Window etc.)
-# and the contributed addons
-
-for p in ["library/builtins",
-          "library",
-          "addons"]:
-    p = os.path.join(_data_dir, p)
-    if os.path.isdir(p):
-        pyjs.path.append(p)
-
-
-def read_boilerplate(data_dir, filename):
-    return open(join(data_dir, "builder/boilerplate", filename)).read()
-
-
-def copy_boilerplate(data_dir, filename, output_dir):
-    filename = join(data_dir, "builder/boilerplate", filename)
-    shutil.copy(filename, output_dir)
-
-
-# taken and modified from python2.4
-def copytree_exists(src, dst, symlinks=False):
-    if not os.path.exists(src):
-        return
-
-    names = os.listdir(src)
-    try:
-        os.mkdir(dst)
-    except Exception:
-        pass
-
-    errors = []
-    for name in names:
-        if name.startswith('CVS'):
-            continue
-        if name.startswith('.git'):
-            continue
-        if name.startswith('.svn'):
-            continue
-
-        srcname = os.path.join(src, name)
-        dstname = os.path.join(dst, name)
-        try:
-            if symlinks and os.path.islink(srcname):
-                linkto = os.readlink(srcname)
-                os.symlink(linkto, dstname)
-            elif isdir(srcname):
-                copytree_exists(srcname, dstname, symlinks)
-            else:
-                shutil.copy2(srcname, dstname)
-        except (IOError, os.error) as why:
-            errors.append((srcname, dstname, why))
-    if errors:
-        print(errors)
-
-
-def check_html_file(source_file, dest_path):
-    """ Checks if a base HTML-file is available in the PyJamas
-        output directory.
-        If the HTML-file isn't available, it will be created.
-
-        If a CSS-file with the same name is available
-        in the output directory, a reference to this CSS-file
-        is included.
-
-        If no CSS-file is found, this function will look for a special
-        CSS-file in the output directory, with the name
-        "pyjamas_default.css", and if found it will be referenced
-        in the generated HTML-file.
-
-        [thank you to stef mientki for contributing this function]
-    """
-
-    base_html = """\
-<html>
-    <!-- auto-generated html - you should consider editing and
-         adapting this to suit your requirements
-     -->
-    <head>
-      <meta name="pygwt:module" content="%(modulename)s">
-      %(css)s
-      <title>%(title)s</title>
-    </head>
-    <body bgcolor="white">
-      <script language="javascript" src="pygwt.js"></script>
-    </body>
-</html>
-"""
-
-    filename = os.path.split(source_file)[1]
-    mod_name = os.path.splitext(filename)[0]
-    file_name = os.path.join(dest_path, mod_name + '.html')
-
-    # if html file in output directory exists, leave it alone.
-    if os.path.exists(file_name):
-        return 0
-
-    if os.path.exists(os.path.join(dest_path, mod_name + '.css')):
-        css = "<link rel='stylesheet' href='" + mod_name + ".css'>"
-    elif os.path.exists(os.path.join(dest_path, 'pyjamas_default.css')):
-        css = "<link rel='stylesheet' href='pyjamas_default.css'>"
-
-    else:
-        css = ''
-
-    title = 'PyJamas Auto-Generated HTML file ' + mod_name
-
-    base_html = base_html % {'modulename': mod_name, 'title': title, 'css': css}
-
-    fh = open(file_name, 'w')
-    fh.write(base_html)
-    fh.close()
-
-    return 1
-
-
-def build(app_name, output, js_includes=(), debug=False, dynamic=0,
-          data_dir=None, cache_buster=False, optimize=False):
-
-    # make sure the output directory is always created in the current working
-    # directory or at the place given if it is an absolute path.
-    output = os.path.abspath(output)
-    msg = "Building '%(app_name)s' to output directory '%(output)s'" % locals()
-    if debug:
-        msg += " with debugging statements"
-    print(msg)
-
-    # check the output directory
-    if os.path.exists(output) and not os.path.isdir(output):
-        print("Output destination %s exists and is not a directory" % output, file=sys.stderr)
-        return
-    if not os.path.isdir(output):
-        try:
-            print("Creating output directory")
-            os.mkdir(output)
-        except OSError as e:
-            print("Exception creating output directory %s: %s" % (output, e), file=sys.stderr)
-
-    # public dir
-    for p in pyjs.path:
-        pub_dir = join(p, 'public')
-        if isdir(pub_dir):
-            print("Copying: public directory of library %r" % p)
-            copytree_exists(pub_dir, output)
-
-    # AppName.html - can be in current or public directory
-    html_input_filename = app_name + ".html"
-    html_output_filename = join(output, basename(html_input_filename))
-    if os.path.isfile(html_input_filename):
-        if not os.path.isfile(html_output_filename) or \
-               os.path.getmtime(html_input_filename) > \
-               os.path.getmtime(html_output_filename):
-            try:
-                shutil.copy(html_input_filename, html_output_filename)
-            except Exception:
-                print("Warning: Missing module HTML file %s" % html_input_filename, file=sys.stderr)
-
-            print("Copying: %(html_input_filename)s" % locals())
-
-    if check_html_file(html_input_filename, output):
-        print("Warning: Module HTML file %s has been auto-generated" % html_input_filename, file=sys.stderr)
-
-    # pygwt.js
-
-    print("Copying: pygwt.js")
-
-    pygwt_js_template = read_boilerplate(data_dir, "pygwt.js")
-    pygwt_js_output = open(join(output, "pygwt.js"), "w")
-
-    print(pygwt_js_template, file=pygwt_js_output)
-
-    pygwt_js_output.close()
-
-    # Images
-
-    print("Copying: Images and History")
-    copy_boilerplate(data_dir, "corner_dialog_topleft_black.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_topright_black.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_bottomright_black.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_bottomleft_black.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_edge_black.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_topleft.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_topright.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_bottomright.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_bottomleft.png", output)
-    copy_boilerplate(data_dir, "corner_dialog_edge.png", output)
-    copy_boilerplate(data_dir, "tree_closed.gif", output)
-    copy_boilerplate(data_dir, "tree_open.gif", output)
-    copy_boilerplate(data_dir, "tree_white.gif", output)
-    copy_boilerplate(data_dir, "history.html", output)
-
-    # all.cache.html
-    app_files = generateAppFiles(data_dir, js_includes, app_name, debug,
-                                 output, dynamic, cache_buster, optimize)
-
-    # AppName.nocache.html
-
-    print("Creating: %(app_name)s.nocache.html" % locals())
-
-    home_nocache_html_template = read_boilerplate(data_dir, "home.nocache.html")
-    home_nocache_html_output = open(join(output, app_name + ".nocache.html"),
-                                    "w")
-
-    # the selector templ is added to the selectScript function
-    select_tmpl = """O(["true","%s"],"%s");"""
-    script_selectors = cStringIO()
-
-    for platform, file_prefix in app_files:
-        print(select_tmpl % (platform, file_prefix), file=script_selectors)
-
-    print(
-        home_nocache_html_template % dict(
-            app_name=app_name,
-            script_selectors=script_selectors.getvalue(),
-        ), file=home_nocache_html_output)
-
-    home_nocache_html_output.close()
-
-    print("Done. You can run your app by opening '%(html_output_filename)s' in a browser" % locals())
-
-
-def generateAppFiles(data_dir, js_includes, app_name, debug, output, dynamic,
-                     cache_buster, optimize):
-
-    all_cache_html_template = read_boilerplate(data_dir, "all.cache.html")
-    mod_cache_html_template = read_boilerplate(data_dir, "mod.cache.html")
-
-    # clean out the old ones first
-    for name in os.listdir(output):
-        if CACHE_HTML_PAT.match(name):
-            p = join(output, name)
-            print("Deleting existing app file %s" % p)
-            os.unlink(p)
-
-    app_files = []
-    parser = pyjs.PlatformParser("platform")
-    app_headers = ''
-    scripts = ['<script type="text/javascript" src="%s"></script>' %
-               script for script in js_includes]
-    app_body = '\n'.join(scripts)
-
-    mod_code = {}
-    mod_libs = {}
-    modules = {}
-    app_libs = {}
-    early_app_libs = {}
-    app_code = {}
-    overrides = {}
-    pover = {}
-    app_modnames = {}
-    mod_levels = {}
-
-    # First, generate all the code.
-    # Second, (dynamic only), post-analyse the places where modules
-    # haven't changed
-    # Third, write everything out.
-
-    for platform in app_platforms:
-
-        mod_code[platform] = {}
-        mod_libs[platform] = {}
-        modules[platform] = []
-        pover[platform] = {}
-        app_libs[platform] = ''
-        early_app_libs[platform] = ''
-        app_code[platform] = {}
-        app_modnames[platform] = {}
-
-        # Application.Platform.cache.html
-
-        parser.setPlatform(platform)
-        app_translator = pyjs.AppTranslator(
-            parser=parser, dynamic=dynamic, optimize=optimize)
-        early_app_libs[platform], appcode = \
-            app_translator.translate(None, is_app=False,
-                                     debug=debug,
-                                     library_modules=['dynamicajax.js',
-                                                      '_pyjs.js', 'sys',
-                                                      'pyjslib'])
-        pover[platform].update(app_translator.overrides.items())
-        for mname, name in app_translator.overrides.items():
-            pd = overrides.setdefault(mname, {})
-            pd[platform] = name
-
-        print(appcode)
-        # mod_code[platform][app_name] = appcode
-
-        # platform.Module.cache.js
-
-        modules_done = ['pyjslib', 'sys', '_pyjs.js']
-        # modules_to_do = [app_name] + app_translator.library_modules
-        modules_to_do = [app_name] + app_translator.library_modules
-
-        dependencies = {}
-
-        deps = map(pyjs.strip_py, modules_to_do)
-        for d in deps:
-            sublist = add_subdeps(dependencies, d)
-            modules_to_do += sublist
-        deps = uniquify(deps)
-        # dependencies[app_name] = deps
-
-        modules[platform] = modules_done + modules_to_do
-
-        while modules_to_do:
-
-            # print "modules to do", modules_to_do
-
-            mn = modules_to_do.pop()
-            mod_name = pyjs.strip_py(mn)
-
-            if mod_name in modules_done:
-                continue
-
-            modules_done.append(mod_name)
-
-            mod_cache_name = "%s.%s.cache.js" % (platform.lower(), mod_name)
-
-            parser.setPlatform(platform)
-            mod_translator = pyjs.AppTranslator(parser=parser, optimize=optimize)
-            mod_libs[platform][mod_name], mod_code[platform][mod_name] = \
-                mod_translator.translate(mod_name,
-                                         is_app=False,
-                                         debug=debug)
-            pover[platform].update(mod_translator.overrides.items())
-            for mname, name in mod_translator.overrides.items():
-                pd = overrides.setdefault(mname, {})
-                pd[platform] = name
-
-            mods = mod_translator.library_modules
-            modules_to_do += mods
-            modules[platform] += mods
-
-            deps = map(pyjs.strip_py, mods)
-            sd = subdeps(mod_name)
-            if len(sd) > 1:
-                deps += sd[:-1]
-            while mod_name in deps:
-                deps.remove(mod_name)
-
-            # print
-            # print
-            # print "modname preadd:", mod_name, deps
-            # print
-            # print
-            for d in deps:
-                sublist = add_subdeps(dependencies, d)
-                modules_to_do += sublist
-            modules_to_do += add_subdeps(dependencies, mod_name)
-            # print "modname:", mod_name, deps
-            deps = uniquify(deps)
-            # print "modname:", mod_name, deps
-            dependencies[mod_name] = deps
-
-        # work out the dependency ordering of the modules
-
-        mod_levels[platform] = make_deps(None, dependencies, modules_done)
-
-    # now write everything out
-
-    for platform in app_platforms:
-
-        early_app_libs_ = early_app_libs[platform]
-        app_libs_ = app_libs[platform]
-        app_code_ = app_code[platform]
-        # modules_ = filter_mods(app_name, modules[platform])
-        mods = flattenlist(mod_levels[platform])
-        mods.reverse()
-        modules_ = filter_mods(None, mods)
-
-        for mod_name in modules_:
-
-            mod_code_ = mod_code[platform][mod_name]
-
-            mod_name = pyjs.strip_py(mod_name)
-
-            override_name = "%s.%s" % (platform.lower(), mod_name)
-            if override_name in pover[platform]:
-                mod_cache_name = "%s.cache.js" % (override_name)
-            else:
-                mod_cache_name = "%s.cache.js" % (mod_name)
-
-            print("Creating: " + mod_cache_name)
-
-            modlevels = make_deps(None, dependencies, dependencies[mod_name])
-
-            modnames = []
-
-            for md in modlevels:
-                mnames = map(lambda x: "'%s'" % x, md)
-                mnames = "new pyjslib.List([\n\t\t\t%s])" % ',\n\t\t\t'.join(mnames)
-                modnames.append(mnames)
-
-            modnames.reverse()
-            modnames = "new pyjslib.List([\n\t\t%s\n\t])" % ',\n\t\t'.join(modnames)
-
-            # convert the overrides
-
-            overnames = map(lambda x: "'%s': '%s'" % x, pover[platform].items())
-            overnames = "new pyjslib.Dict({\n\t\t%s\n\t})" % ',\n\t\t'.join(overnames)
-
-            if dynamic:
-                mod_cache_html_output = open(join(output, mod_cache_name), "w")
-            else:
-                mod_cache_html_output = cStringIO()
-
-            print(mod_cache_html_template % dict(
-                mod_name=mod_name,
-                app_name=app_name,
-                modnames=modnames,
-                overrides=overnames,
-                mod_libs=mod_libs[platform][mod_name],
-                dynamic=dynamic,
-                mod_code=mod_code_,
-            ), file=mod_cache_html_output)
-
-            if dynamic:
-                mod_cache_html_output.close()
-            else:
-                mod_cache_html_output.seek(0)
-                app_libs_ += mod_cache_html_output.read()
-
-        # write out the dependency ordering of the modules
-
-        app_modnames = []
-
-        for md in mod_levels[platform]:
-            mnames = map(lambda x: "'%s'" % x, md)
-            mnames = "new pyjslib.List([\n\t\t\t%s])" % ',\n\t\t\t'.join(mnames)
-            app_modnames.append(mnames)
-
-        app_modnames.reverse()
-        app_modnames = "new pyjslib.List([\n\t\t%s\n\t])" % ',\n\t\t'.join(app_modnames)
-
-        # convert the overrides
-
-        overnames = map(lambda x: "'%s': '%s'" % x, pover[platform].items())
-        overnames = "new pyjslib.Dict({\n\t\t%s\n\t})" % ',\n\t\t'.join(overnames)
-
-        # print "platform names", platform, overnames
-        # print pover
-
-        # now write app.allcache including dependency-ordered list of
-        # library modules
-
-        file_contents = all_cache_html_template % dict(
-            app_name=app_name,
-            early_app_libs=early_app_libs_,
-            app_libs=app_libs_,
-            app_code=app_code_,
-            app_body=app_body,
-            overrides=overnames,
-            platform=platform.lower(),
-            dynamic=dynamic,
-            app_modnames=app_modnames,
-            app_headers=app_headers
-        )
-        if cache_buster:
-            digest = md5.new(file_contents).hexdigest()
-            file_name = "%s.%s.%s" % (platform.lower(), app_name, digest)
-        else:
-            file_name = "%s.%s" % (platform.lower(), app_name)
-        file_name += ".cache.html"
-        out_path = join(output, file_name)
-        out_file = open(out_path, 'w')
-        out_file.write(file_contents)
-        out_file.close()
-        app_files.append((platform.lower(), file_name))
-        print("Created app file %s:%s: %s" % (
-            app_name, platform, out_path))
-
-    return app_files
-
-
-def flattenlist(ll):
-    res = []
-    for l in ll:
-        res += l
-    return res
-
-
-def subdeps(m):
-    """
-    creates sub-dependencies e.g. pyjamas.ui.Widget
-    creates pyjamas.ui.Widget, pyjamas.ui and pyjamas.
-    """
-    d = []
-    m = m.split(".")
-    for i in range(0, len(m)):
-        d.append('.'.join(m[:i+1]))
-    return d
-
-
-def add_subdeps(deps, mod_name):
-    sd = subdeps(mod_name)
-    if len(sd) == 1:
-        return []
-    # print "subdeps", mod_name, sd
-    # print "deps", deps
-    res = []
-    for i in range(0, len(sd)-1):
-        parent = sd[i]
-        child = sd[i+1]
-        k = deps.get(child, [])
-        k.append(parent)
-        deps[child] = k
-        if parent not in res:
-            res.append(parent)
-    # print deps
-    return res
-
-
-def uniquify(md):
-    """
-    makes unique and preserves list order
-    """
-    res = []
-    for m in md:
-        if m not in res:
-            res.append(m)
-    return res
-
-
-def filter_mods(app_name, md):
-    while 'sys' in md:
-        md.remove('sys')
-    while 'pyjslib' in md:
-        md.remove('pyjslib')
-    while app_name in md:
-        md.remove(app_name)
-    md = filter(lambda x: not x.endswith('.js'), md)
-    md = map(pyjs.strip_py, md)
-
-    return uniquify(md)
-
-
-def filter_deps(app_name, deps):
-
-    res = {}
-    for (k, l) in deps.items():
-        mods = filter_mods(k, l)
-        while k in mods:
-            mods.remove(k)
-        res[k] = mods
-    return res
-
-
-def has_nodeps(mod, deps):
-    if mod not in deps or not deps[mod]:
-        return True
-    return False
-
-
-def nodeps_list(mod_list, deps):
-    res = []
-    for mod in mod_list:
-        if has_nodeps(mod, deps):
-            res.append(mod)
-    return res
-
-# this function takes a dictionary of dependent modules and
-# creates a list of lists.  the first list will be modules
-# that have no dependencies; the second list will be those
-# modules that have the first list as dependencies; the
-# third will be those modules that have the first and second...
-# etc.
-
-
-def make_deps(app_name, deps, mod_list):
-    print("Calculating Dependencies ...")
-    mod_list = filter_mods(app_name, mod_list)
-    deps = filter_deps(app_name, deps)
-
-    if not mod_list:
-        return []
-
-    # print mod_list
-    # print deps
-
-    ordered_deps = []
-    last_len = -1
-    while deps:
-        l_deps = len(deps)
-        # print l_deps
-        if l_deps == last_len:
-            for m, dl in deps.items():
-                for d in dl:
-                    if m in deps.get(d, []):
-                        raise Exception('Circular Imports found: \n%s %s -> %s %s'
-                                        % (m, dl, d, deps[d]))
-            # raise Exception('Could not calculate dependencies: \n%s' % deps)
-            break
-        last_len = l_deps
-        # print "modlist", mod_list
-        nodeps = nodeps_list(mod_list, deps)
-        # print "nodeps", nodeps
-        mod_list = filter(lambda x: x not in nodeps, mod_list)
-        newdeps = {}
-        for k in deps.keys():
-            depslist = deps[k]
-            depslist = filter(lambda x: x not in nodeps, depslist)
-            if depslist:
-                newdeps[k] = depslist
-        # print "newdeps", newdeps
-        deps = newdeps
-        ordered_deps.append(nodeps)
-        # time.sleep(0)
-
-    if mod_list:
-        ordered_deps.append(mod_list)  # last dependencies - usually the app(s)
-
-    ordered_deps.reverse()
-
-    return ordered_deps
-
-
-def main():
-    global app_platforms
-
-    parser = OptionParser(usage=usage, version=version)
-    parser.add_option(
-        "-o",
-        "--output",
-        dest="output",
-        help="directory to which the webapp should be written"
-    )
-    parser.add_option(
-        "-j",
-        "--include-js",
-        dest="js_includes",
-        action="append",
-        help="javascripts to load into the same frame as the rest of the script"
-    )
-    parser.add_option(
-        "-I",
-        "--library_dir",
-        dest="library_dirs",
-        action="append",
-        help="additional paths appended to PYJSPATH"
-    )
-    parser.add_option(
-        "-D",
-        "--data_dir",
-        dest="data_dir",
-        help="path for data directory"
-    )
-    parser.add_option(
-        "-m",
-        "--dynamic-modules",
-        action="store_true",
-        dest="dynamic",
-        default=False,
-        help="Split output into separate dynamically-loaded modules (experimental)"
-    )
-    parser.add_option(
-        "-P",
-        "--platforms",
-        dest="platforms",
-        help="platforms to build for, comma-separated"
-    )
-    parser.add_option(
-        "-d",
-        "--debug",
-        action="store_true",
-        dest="debug"
-    )
-    parser.add_option(
-        "-O",
-        "--optimize",
-        action="store_true",
-        dest="optimize",
-        default=False,
-        help="Optimize generated code (removes all print statements)",
-    )
-    parser.add_option(
-        "-c",
-        "--cache_buster",
-        action="store_true",
-        dest="cache_buster",
-        help="Enable browser cache-busting (MD5 hash added to output filenames)"
-    )
-
-    parser.set_defaults(output="output", js_includes=[], library_dirs=[],
-                        platforms=(','.join(app_platforms)),
-                        data_dir=os.path.join(sys.prefix, "share/pyjamas"),
-                        dynamic=False,
-                        cache_buster=False,
-                        debug=False)
-    (options, args) = parser.parse_args()
-    if len(args) != 1:
-        parser.error("incorrect number of arguments")
-
-    data_dir = abspath(options.data_dir)
-
-    app_path = args[0]
-    if app_path.endswith('.py'):
-        app_path = abspath(app_path)
-        if not isfile(app_path):
-            parser.error("Application file not found %r" % app_path)
-        app_path, app_name = split(app_path)
-        app_name = app_name[:-3]
-        pyjs.path.append(app_path)
-    elif os.path.sep in app_path:
-        parser.error("Not a valid module declaration %r" % app_path)
-    else:
-        app_name = app_path
-
-    for d in options.library_dirs:
-        pyjs.path.append(abspath(d))
-
-    if options.platforms:
-        app_platforms = options.platforms.split(',')
-
-    # this is mostly for getting boilerplate stuff
-    data_dir = os.path.abspath(options.data_dir)
-
-    build(app_name, options.output, options.js_includes,
-          options.debug, options.dynamic and 1 or 0, data_dir,
-          options.cache_buster, options.optimize)
-
-
-if __name__ == "__main__":
-    main()
--- a/svgui/pyjs/jsonrpc/README.txt	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-These classes are intended for use server-side.
-
-e.g. in a django view.py :
-
-    from pyjs.jsonrpc.django import JSONService, jsonremote
-
-    jsonservice = JSONRPCService()
-
-    @jsonremote(jsonservice)
-    def test(request, echo_param):
-         return "echoing the param back: %s" % echo_param
-
--- a/svgui/pyjs/jsonrpc/__init__.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-# module jsonrpc
--- a/svgui/pyjs/jsonrpc/django/jsonrpc.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-# jsonrpc.py
-#   original code: http://trac.pyworks.org/pyjamas/wiki/DjangoWithPyJamas
-#   also from: http://www.pimentech.fr/technologies/outils
-
-from __future__ import absolute_import
-import datetime
-from builtins import str as text
-
-from django.core.serializers import serialize
-
-
-from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
-# JSONRPCService and jsonremote are used in combination to drastically
-# simplify the provision of JSONRPC services.  use as follows:
-#
-# jsonservice = JSONRPCService()
-#
-# @jsonremote(jsonservice)
-# def test(request, echo_param):
-#     return "echoing the param back: %s" % echo_param
-#
-# dump jsonservice into urlpatterns:
-#  (r'^service1/$', 'djangoapp.views.jsonservice'),
-
-
-class JSONRPCService(JSONRPCServiceBase):
-
-    def __call__(self, request, extra=None):
-        return self.process(request.raw_post_data)
-
-
-def jsonremote(service):
-    """Make JSONRPCService a decorator so that you can write :
-
-    from jsonrpc import JSONRPCService
-    chatservice = JSONRPCService()
-
-    @jsonremote(chatservice)
-    def login(request, user_name):
-        (...)
-    """
-    def remotify(func):
-        if isinstance(service, JSONRPCService):
-            service.add_method(func.__name__, func)
-        else:
-            emsg = 'Service "%s" not found' % str(service.__name__)
-            raise NotImplementedError(emsg)
-        return func
-    return remotify
-
-
-# FormProcessor provides a mechanism for turning Django Forms into JSONRPC
-# Services.  If you have an existing Django app which makes prevalent
-# use of Django Forms it will save you rewriting the app.
-# use as follows.  in djangoapp/views.py :
-#
-# class SimpleForm(forms.Form):
-#     testfield = forms.CharField(max_length=100)
-#
-# class SimpleForm2(forms.Form):
-#     testfield = forms.CharField(max_length=20)
-#
-# processor = FormProcessor({'processsimpleform': SimpleForm,
-#                            'processsimpleform2': SimpleForm2})
-#
-# this will result in a JSONRPC service being created with two
-# RPC functions.  dump "processor" into urlpatterns to make it
-# part of the app:
-#  (r'^formsservice/$', 'djangoapp.views.processor'),
-
-
-def builderrors(form):
-    d = {}
-    for error in form.errors.keys():
-        if error not in d:
-            d[error] = []
-        for errorval in form.errors[error]:
-            d[error].append(text(errorval))
-    return d
-
-
-# contains the list of arguments in each field
-field_names = {
-    'CharField': ['max_length', 'min_length'],
-    'IntegerField': ['max_value', 'min_value'],
-    'FloatField': ['max_value', 'min_value'],
-    'DecimalField': ['max_value', 'min_value', 'max_digits', 'decimal_places'],
-    'DateField': ['input_formats'],
-    'DateTimeField': ['input_formats'],
-    'TimeField': ['input_formats'],
-    'RegexField': ['max_length', 'min_length'],  # sadly we can't get the expr
-    'EmailField': ['max_length', 'min_length'],
-    'URLField': ['max_length', 'min_length', 'verify_exists', 'user_agent'],
-    'ChoiceField': ['choices'],
-    'FilePathField': ['path', 'match', 'recursive', 'choices'],
-    'IPAddressField': ['max_length', 'min_length'],
-}
-
-
-def describe_field_errors(field):
-    res = {}
-    field_type = field.__class__.__name__
-    msgs = {}
-    for n, m in field.error_messages.items():
-        msgs[n] = text(m)
-    res['error_messages'] = msgs
-    if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
-        res['fields'] = map(describe_field, field.fields)
-    return res
-
-
-def describe_fields_errors(fields, field_names):
-    res = {}
-    if not field_names:
-        field_names = fields.keys()
-    for name in field_names:
-        field = fields[name]
-        res[name] = describe_field_errors(field)
-    return res
-
-
-def describe_field(field):
-    res = {}
-    field_type = field.__class__.__name__
-    for fname in (field_names.get(field_type, []) +
-                  ['help_text', 'label', 'initial', 'required']):
-        res[fname] = getattr(field, fname)
-    if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
-        res['fields'] = map(describe_field, field.fields)
-    return res
-
-
-def describe_fields(fields, field_names):
-    res = {}
-    if not field_names:
-        field_names = fields.keys()
-    for name in field_names:
-        field = fields[name]
-        res[name] = describe_field(field)
-    return res
-
-
-class FormProcessor(JSONRPCService):
-    def __init__(self, forms, _formcls=None):
-
-        if _formcls is None:
-            JSONRPCService.__init__(self)
-            for k in forms.keys():
-                s = FormProcessor({}, forms[k])
-                self.add_method(k, s.__process)
-        else:
-            JSONRPCService.__init__(self, forms)
-            self.formcls = _formcls
-
-    def __process(self, request, params, command=None):
-
-        f = self.formcls(params)
-
-        if command is None:  # just validate
-            if not f.is_valid():
-                return {'success': False, 'errors': builderrors(f)}
-            return {'success': True}
-
-        elif 'describe_errors' in command:
-            field_names = command['describe_errors']
-            return describe_fields_errors(f.fields, field_names)
-
-        elif 'describe' in command:
-            field_names = command['describe']
-            return describe_fields(f.fields, field_names)
-
-        elif 'save' in command:
-            if not f.is_valid():
-                return {'success': False, 'errors': builderrors(f)}
-            instance = f.save()  # XXX: if you want more, over-ride save.
-            return {'success': True, 'instance': json_convert(instance)}
-
-        elif 'html' in command:
-            return {'success': True, 'html': f.as_table()}
-
-        return "unrecognised command"
-
-# The following is incredibly convenient for saving vast amounts of
-# coding, avoiding doing silly things like this:
-#     jsonresult = {'field1': djangoobject.field1,
-#                   'field2': djangoobject.date.strftime('%Y.%M'),
-#                    ..... }
-#
-# The date/time flatten function is there because JSONRPC doesn't
-# support date/time objects or formats, so conversion to a string
-# is the most logical choice.  pyjamas, being python, can easily
-# be used to parse the string result at the other end.
-#
-# use as follows:
-#
-# jsonservice = JSONRPCService()
-#
-# @jsonremote(jsonservice)
-# def list_some_model(request, start=0, count=10):
-#     l = SomeDjangoModelClass.objects.filter()
-#     res = json_convert(l[start:end])
-#
-# @jsonremote(jsonservice)
-# def list_another_model(request, start=0, count=10):
-#     l = AnotherDjangoModelClass.objects.filter()
-#     res = json_convert(l[start:end])
-#
-# dump jsonservice into urlpatterns to make the two RPC functions,
-# list_some_model and list_another_model part of the django app:
-#  (r'^service1/$', 'djangoapp.views.jsonservice'),
-
-
-def dict_datetimeflatten(item):
-    d = {}
-    for k, v in item.items():
-        k = str(k)
-        if isinstance(v, datetime.date):
-            d[k] = str(v)
-        elif isinstance(v, dict):
-            d[k] = dict_datetimeflatten(v)
-        else:
-            d[k] = v
-    return d
-
-
-def json_convert(l, fields=None):
-    res = []
-    for item in serialize('python', l, fields=fields):
-        res.append(dict_datetimeflatten(item))
-    return res
--- a/svgui/pyjs/jsonrpc/jsonrpc.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-from __future__ import absolute_import
-import sys
-import gluon.contrib.simplejson as simplejson
-
-
-class JSONRPCServiceBase(object):
-
-    def __init__(self):
-        self.methods = {}
-
-    def response(self, id, result):
-        return simplejson.dumps({'version': '1.1', 'id': id,
-                                 'result': result, 'error': None})
-
-    def error(self, id, code, message):
-        return simplejson.dumps({
-            'id': id,
-            'version': '1.1',
-            'error': {'name': 'JSONRPCError',
-                      'code': code,
-                      'message': message}
-        })
-
-    def add_method(self, name, method):
-        self.methods[name] = method
-
-    def process(self, data):
-        data = simplejson.loads(data)
-        id, method, params = data["id"], data["method"], data["params"]
-        if method in self.methods:
-            try:
-                result = self.methods[method](*params)
-                return self.response(id, result)
-            except Exception:
-                etype, eval, _etb = sys.exc_info()
-                return self.error(id, 100, 'Exception %s: %s' % (etype, eval))
-            except BaseException:
-                etype, eval, _etb = sys.exc_info()
-                return self.error(id, 100, '%s: %s' % (etype.__name__, eval))
-        else:
-            return self.error(id, 100, 'method "%s" does not exist' % method)
-
-    def listmethods(self):
-        return self.methods.keys()
--- a/svgui/pyjs/jsonrpc/web2py/jsonrpc.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-# pylint: disable=undefined-variable
-
-from __future__ import absolute_import
-from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
-
-
-class JSONRPCService(JSONRPCServiceBase):
-
-    def serve(self):
-        return self.process(request.body.read())
-
-    def __call__(self, func):
-        self.methods[func.__name__] = func
-        return func
--- a/svgui/pyjs/lib/_pyjs.js	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-function pyjs_extend(klass, base) {
-    function klass_object_inherit() {}
-    klass_object_inherit.prototype = base.prototype;
-    klass_object = new klass_object_inherit();
-    for (var i in base.prototype.__class__) {
-        v = base.prototype.__class__[i];
-        if (typeof v == "function" && (v.class_method || v.static_method || v.unbound_method))
-        {
-            klass_object[i] = v;
-        }
-    }
-
-    function klass_inherit() {}
-    klass_inherit.prototype = klass_object;
-    klass.prototype = new klass_inherit();
-    klass_object.constructor = klass;
-    klass.prototype.__class__ = klass_object;
-
-    for (var i in base.prototype) {
-        v = base.prototype[i];
-        if (typeof v == "function" && v.instance_method)
-        {
-            klass.prototype[i] = v;
-        }
-    }
-}
-
-/* creates a class, derived from bases, with methods and variables */
-function pyjs_type(clsname, bases, methods)
-{
-    var fn_cls = function() {};
-    fn_cls.__name__ = clsname;
-    var fn = function() {
-        var instance = new fn_cls();
-        if(instance.__init__) instance.__init__.apply(instance, arguments);
-        return instance;
-    }
-    fn_cls.__initialize__ = function() {
-        if (fn_cls.__was_initialized__) return;
-        fn_cls.__was_initialized__ = true;
-        fn_cls.__extend_baseclasses();
-        fn_cls.prototype.__class__.__new__ = fn;
-        fn_cls.prototype.__class__.__name__ = clsname;
-    }
-    fn_cls.__extend_baseclasses = function() {
-        var bi;
-        for (bi in fn_cls.__baseclasses)
-        {
-            var b = fn_cls.__baseclasses[bi];
-            if (b.__was_initialized__)
-            {
-                continue;
-            }
-            b.__initialize__();
-        }
-        for (bi in fn_cls.__baseclasses)
-        {
-            var b = fn_cls.__baseclasses[bi];
-            pyjs_extend(fn_cls, b);
-        }
-    }
-    if (!bases) {
-        bases = [pyjslib.__Object];
-    }
-    fn_cls.__baseclasses = bases;
-
-    fn_cls.__initialize__();
-
-    for (k in methods) {
-        var mth = methods[k];
-        var mtype = typeof mth;
-        if (mtype == "function" ) {
-            fn_cls.prototype[k] = mth;
-            fn_cls.prototype.__class__[k] = function () {
-                return fn_cls.prototype[k].call.apply(
-                       fn_cls.prototype[k], arguments);
-            };
-            fn_cls.prototype.__class__[k].unbound_method = true;
-            fn_cls.prototype.instance_method = true;
-            fn_cls.prototype.__class__[k].__name__ = k;
-            fn_cls.prototype[k].__name__ = k;
-        } else {
-            fn_cls.prototype.__class__[k] = mth;
-        }
-    }
-    return fn;
-}
-function pyjs_kwargs_call(obj, func, star_args, args)
-{
-    var call_args;
-
-    if (star_args)
-    {
-        if (!pyjslib.isIteratable(star_args))
-        {
-            throw (pyjslib.TypeError(func.__name__ + "() arguments after * must be a sequence" + pyjslib.repr(star_args)));
-        }
-        call_args = Array();
-        var __i = star_args.__iter__();
-        var i = 0;
-        try {
-            while (true) {
-                call_args[i]=__i.next();
-                i++;
-            }
-        } catch (e) {
-            if (e != pyjslib.StopIteration) {
-                throw e;
-            }
-        }
-
-        if (args)
-        {
-            var n = star_args.length;
-            for (var i=0; i < args.length; i++) {
-                call_args[n+i]=args[i];
-            }
-        }
-    }
-    else
-    {
-        call_args = args;
-    }
-    return func.apply(obj, call_args);
-}
-
-function pyjs_kwargs_function_call(func, star_args, args)
-{
-    return pyjs_kwargs_call(null, func, star_args, args);
-}
-
-function pyjs_kwargs_method_call(obj, method_name, star_args, args)
-{
-    var method = obj[method_name];
-    if (method.parse_kwargs)
-    {
-        args = method.parse_kwargs.apply(null, args);
-    }
-    return pyjs_kwargs_call(obj, method, star_args, args);
-}
-
-//String.prototype.__getitem__ = String.prototype.charAt;
-//String.prototype.upper = String.prototype.toUpperCase;
-//String.prototype.lower = String.prototype.toLowerCase;
-//String.prototype.find=pyjslib.String_find;
-//String.prototype.join=pyjslib.String_join;
-//String.prototype.isdigit=pyjslib.String_isdigit;
-//String.prototype.__iter__=pyjslib.String___iter__;
-//
-//String.prototype.__replace=String.prototype.replace;
-//String.prototype.replace=pyjslib.String_replace;
-//
-//String.prototype.split=pyjslib.String_split;
-//String.prototype.strip=pyjslib.String_strip;
-//String.prototype.lstrip=pyjslib.String_lstrip;
-//String.prototype.rstrip=pyjslib.String_rstrip;
-//String.prototype.startswith=pyjslib.String_startswith;
-
-var str = String;
-
--- a/svgui/pyjs/lib/json.js	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,293 +0,0 @@
-json_parse = (function () {
-
-// This is a function that can parse a JSON text, producing a JavaScript
-// data structure. It is a simple, recursive descent parser. It does not use
-// eval or regular expressions, so it can be used as a model for implementing
-// a JSON parser in other languages.
-
-// We are defining the function inside of another function to avoid creating
-// global variables.
-
-    var at,     // The index of the current character
-        ch,     // The current character
-        escapee = {
-            '"':  '"',
-            '\\': '\\',
-            '/':  '/',
-            b:    '\b',
-            f:    '\f',
-            n:    '\n',
-            r:    '\r',
-            t:    '\t'
-        },
-        text,
-
-        error = function (m) {
-
-// Call error when something is wrong.
-
-            throw {
-                name:    'SyntaxError',
-                message: m,
-                at:      at,
-                text:    text
-            };
-        },
-
-        next = function (c) {
-
-// If a c parameter is provided, verify that it matches the current character.
-
-            if (c && c !== ch) {
-                error("Expected '" + c + "' instead of '" + ch + "'");
-            }
-
-// Get the next character. When there are no more characters,
-// return the empty string.
-
-            ch = text.charAt(at);
-            at += 1;
-            return ch;
-        },
-
-        number = function () {
-
-// Parse a number value.
-
-            var number,
-                string = '';
-
-            if (ch === '-') {
-                string = '-';
-                next('-');
-            }
-            while (ch >= '0' && ch <= '9') {
-                string += ch;
-                next();
-            }
-            if (ch === '.') {
-                string += '.';
-                while (next() && ch >= '0' && ch <= '9') {
-                    string += ch;
-                }
-            }
-            if (ch === 'e' || ch === 'E') {
-                string += ch;
-                next();
-                if (ch === '-' || ch === '+') {
-                    string += ch;
-                    next();
-                }
-                while (ch >= '0' && ch <= '9') {
-                    string += ch;
-                    next();
-                }
-            }
-            number = +string;
-            if (isNaN(number)) {
-                error("Bad number");
-            } else {
-                return number;
-            }
-        },
-
-        string = function () {
-
-// Parse a string value.
-
-            var hex,
-                i,
-                string = '',
-                uffff;
-
-// When parsing for string values, we must look for " and \ characters.
-
-            if (ch === '"') {
-                while (next()) {
-                    if (ch === '"') {
-                        next();
-                        return string;
-                    } else if (ch === '\\') {
-                        next();
-                        if (ch === 'u') {
-                            uffff = 0;
-                            for (i = 0; i < 4; i += 1) {
-                                hex = parseInt(next(), 16);
-                                if (!isFinite(hex)) {
-                                    break;
-                                }
-                                uffff = uffff * 16 + hex;
-                            }
-                            string += String.fromCharCode(uffff);
-                        } else if (typeof escapee[ch] === 'string') {
-                            string += escapee[ch];
-                        } else {
-                            break;
-                        }
-                    } else {
-                        string += ch;
-                    }
-                }
-            }
-            error("Bad string");
-        },
-
-        white = function () {
-
-// Skip whitespace.
-
-            while (ch && ch <= ' ') {
-                next();
-            }
-        },
-
-        word = function () {
-
-// true, false, or null.
-
-            switch (ch) {
-            case 't':
-                next('t');
-                next('r');
-                next('u');
-                next('e');
-                return true;
-            case 'f':
-                next('f');
-                next('a');
-                next('l');
-                next('s');
-                next('e');
-                return false;
-            case 'n':
-                next('n');
-                next('u');
-                next('l');
-                next('l');
-                return null;
-            }
-            error("Unexpected '" + ch + "'");
-        },
-
-        value,  // Place holder for the value function.
-
-        array = function () {
-
-// Parse an array value.
-
-            var array = [];
-
-            if (ch === '[') {
-                next('[');
-                white();
-                if (ch === ']') {
-                    next(']');
-                    return array;   // empty array
-                }
-                while (ch) {
-                    array.push(value());
-                    white();
-                    if (ch === ']') {
-                        next(']');
-                        return array;
-                    }
-                    next(',');
-                    white();
-                }
-            }
-            error("Bad array");
-        },
-
-        object = function () {
-
-// Parse an object value.
-
-            var key,
-                object = {};
-
-            if (ch === '{') {
-                next('{');
-                white();
-                if (ch === '}') {
-                    next('}');
-                    return object;   // empty object
-                }
-                while (ch) {
-                    key = string();
-                    white();
-                    next(':');
-                    if (Object.hasOwnProperty.call(object, key)) {
-                        error('Duplicate key "' + key + '"');
-                    }
-                    object[key] = value();
-                    white();
-                    if (ch === '}') {
-                        next('}');
-                        return object;
-                    }
-                    next(',');
-                    white();
-                }
-            }
-            error("Bad object");
-        };
-
-    value = function () {
-
-// Parse a JSON value. It could be an object, an array, a string, a number,
-// or a word.
-
-        white();
-        switch (ch) {
-        case '{':
-            return object();
-        case '[':
-            return array();
-        case '"':
-            return string();
-        case '-':
-            return number();
-        default:
-            return ch >= '0' && ch <= '9' ? number() : word();
-        }
-    };
-
-// Return the json_parse function. It will have access to all of the above
-// functions and variables.
-
-    return function (source, reviver) {
-        var result;
-
-        text = source;
-        at = 0;
-        ch = ' ';
-        result = value();
-        white();
-        if (ch) {
-            error("Syntax error");
-        }
-
-// If there is a reviver function, we recursively walk the new structure,
-// passing each name/value pair to the reviver function for possible
-// transformation, starting with a temporary root object that holds the result
-// in an empty key. If there is not a reviver function, we simply return the
-// result.
-
-        return typeof reviver === 'function' ? (function walk(holder, key) {
-            var k, v, value = holder[key];
-            if (value && typeof value === 'object') {
-                for (k in value) {
-                    if (Object.hasOwnProperty.call(value, k)) {
-                        v = walk(value, k);
-                        if (v !== undefined) {
-                            value[k] = v;
-                        } else {
-                            delete value[k];
-                        }
-                    }
-                }
-            }
-            return reviver.call(holder, key, value);
-        }({'': result}, '')) : result;
-    };
-}());
--- a/svgui/pyjs/lib/pyjslib.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1418 +0,0 @@
-# Copyright 2006 James Tauber and contributors
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# pylint: disable=too-many-function-args,undefined-variable,no-absolute-import,assign-to-new-keyword,nonzero-method,next-method-called,next-method-defined
-
-# iteration from Bob Ippolito's Iteration in JavaScript
-
-from __pyjamas__ import JS
-
-# must declare import _before_ importing sys
-
-
-def import_module(path, parent_module, module_name, dynamic=1, async=False):
-
-    JS("""
-        var cache_file;
-
-        if (module_name == "sys" || module_name == 'pyjslib')
-        {
-            /*module_load_request[module_name] = 1;*/
-            return;
-        }
-
-        if (path == null)
-        {
-            path = './';
-        }
-
-        var override_name = sys.platform + "." + module_name;
-        if (((sys.overrides != null) &&
-             (sys.overrides.has_key(override_name))))
-        {
-            cache_file =  sys.overrides.__getitem__(override_name) ;
-        }
-        else
-        {
-            cache_file =  module_name ;
-        }
-
-        cache_file = (path + cache_file + '.cache.js' ) ;
-
-        //alert("cache " + cache_file + " " + module_name + " " + parent_module);
-
-        /* already loaded? */
-        if (module_load_request[module_name])
-        {
-            if (module_load_request[module_name] >= 3 && parent_module != null)
-            {
-                //onload_fn = parent_module + '.' + module_name + ' = ' + module_name + ';';
-                //pyjs_eval(onload_fn); /* set up the parent-module namespace */
-            }
-            return;
-        }
-        if (typeof (module_load_request[module_name]) == 'undefined')
-        {
-            module_load_request[module_name] = 1;
-        }
-
-        /* following a load, this first executes the script
-         * "preparation" function MODULENAME_loaded_fn()
-         * and then sets up the loaded module in the namespace
-         * of the parent.
-         */
-
-        onload_fn = ''; // module_name + "_loaded_fn();"
-
-        if (parent_module != null)
-        {
-            //onload_fn += parent_module + '.' + module_name + ' = ' + module_name + ';';
-            /*pmod = parent_module + '.' + module_name;
-            onload_fn += 'alert("' + pmod + '"+' + pmod+');';*/
-        }
-
-
-        if (dynamic)
-        {
-            /* this one tacks the script onto the end of the DOM
-             */
-
-            pyjs_load_script(cache_file, onload_fn, async);
-
-            /* this one actually RUNS the script (eval) into the page.
-               my feeling is that this would be better for non-async
-               but i can't get it to work entirely yet.
-             */
-            /*pyjs_ajax_eval(cache_file, onload_fn, async);*/
-        }
-        else
-        {
-            if (module_name != "pyjslib" &&
-                module_name != "sys")
-                pyjs_eval(onload_fn);
-        }
-
-    """)
-
-
-JS("""
-function import_wait(proceed_fn, parent_mod, dynamic) {
-
-    var data = '';
-    var element = $doc.createElement("div");
-    $doc.body.appendChild(element);
-    function write_dom(txt) {
-        element.innerHTML = txt + '<br />';
-    }
-
-    var timeoutperiod = 1;
-    if (dynamic)
-        var timeoutperiod = 1;
-
-    var wait = function() {
-
-        var status = '';
-        for (l in module_load_request)
-        {
-            var m = module_load_request[l];
-            if (l == "sys" || l == 'pyjslib')
-                continue;
-            status += l + m + " ";
-        }
-
-        //write_dom( " import wait " + wait_count + " " + status + " parent_mod " + parent_mod);
-        wait_count += 1;
-
-        if (status == '')
-        {
-            setTimeout(wait, timeoutperiod);
-            return;
-        }
-
-        for (l in module_load_request)
-        {
-            var m = module_load_request[l];
-            if (l == "sys" || l == 'pyjslib')
-            {
-                module_load_request[l] = 4;
-                continue;
-            }
-            if ((parent_mod != null) && (l == parent_mod))
-            {
-                if (m == 1)
-                {
-                    setTimeout(wait, timeoutperiod);
-                    return;
-                }
-                if (m == 2)
-                {
-                    /* cheat and move app on to next stage */
-                    module_load_request[l] = 3;
-                }
-            }
-            if (m == 1 || m == 2)
-            {
-                setTimeout(wait, timeoutperiod);
-                return;
-            }
-            if (m == 3)
-            {
-                //alert("waited for module " + l + ": loaded");
-                module_load_request[l] = 4;
-                mod_fn = modules[l];
-            }
-        }
-        //alert("module wait done");
-
-        if (proceed_fn.importDone)
-            proceed_fn.importDone(proceed_fn);
-        else
-            proceed_fn();
-    }
-
-    wait();
-}
-""")
-
-
-# pylint: disable=old-style-class
-class Object:
-    def __init__(self):
-        pass
-
-
-object = Object
-
-
-class Modload:
-
-    def __init__(self, path, app_modlist, app_imported_fn, dynamic,
-                 parent_mod):
-        self.app_modlist = app_modlist
-        self.app_imported_fn = app_imported_fn
-        self.path = path
-        self.idx = 0
-        self.dynamic = dynamic
-        self.parent_mod = parent_mod
-
-    def next(self):
-
-        for i in range(len(self.app_modlist[self.idx])):
-            app = self.app_modlist[self.idx][i]
-            import_module(self.path, self.parent_mod, app, self.dynamic, True)
-        self.idx += 1
-
-        if self.idx >= len(self.app_modlist):
-            import_wait(self.app_imported_fn, self.parent_mod, self.dynamic)
-        else:
-            import_wait(getattr(self, "next"), self.parent_mod, self.dynamic)
-
-
-def get_module(module_name):
-    _ev = "__mod = %s;" % module_name
-    JS("pyjs_eval(_ev);")
-    return __mod
-
-
-def preload_app_modules(path, app_modnames, app_imported_fn, dynamic,
-                        parent_mod=None):
-
-    loader = Modload(path, app_modnames, app_imported_fn, dynamic, parent_mod)
-    loader.next()
-
-
-# as comment on line 20 says
-# import sys should be below
-import sys  # noqa # pylint: disable=wrong-import-order,unused-import,wrong-import-position
-
-
-class BaseException:
-
-    name = "BaseException"
-
-    def __init__(self, *args):
-        self.args = args
-
-    def __str__(self):
-        if len(self.args) is 0:
-            return ''
-        elif len(self.args) is 1:
-            return repr(self.args[0])
-        return repr(self.args)
-
-    def toString(self):
-        return str(self)
-
-
-class Exception(BaseException):
-    name = "Exception"
-
-
-class TypeError(BaseException):
-    name = "TypeError"
-
-
-class StandardError(Exception):
-    name = "StandardError"
-
-
-class LookupError(StandardError):
-    name = "LookupError"
-
-    def toString(self):
-        return self.name + ": " + self.args[0]
-
-
-class KeyError(LookupError):
-    name = "KeyError"
-
-
-class AttributeError(StandardError):
-    name = "AttributeError"
-
-    def toString(self):
-        return "AttributeError: %s of %s" % (self.args[1], self.args[0])
-
-
-JS(r"""
-pyjslib.StopIteration = function () { };
-pyjslib.StopIteration.prototype = new Error();
-pyjslib.StopIteration.name = 'StopIteration';
-pyjslib.StopIteration.message = 'StopIteration';
-
-pyjslib.String_find = function(sub, start, end) {
-    var pos=this.indexOf(sub, start);
-    if (pyjslib.isUndefined(end)) return pos;
-
-    if (pos + sub.length>end) return -1;
-    return pos;
-}
-
-pyjslib.String_join = function(data) {
-    var text="";
-
-    if (pyjslib.isArray(data)) {
-        return data.join(this);
-    }
-    else if (pyjslib.isIteratable(data)) {
-        var iter=data.__iter__();
-        try {
-            text+=iter.next();
-            while (true) {
-                var item=iter.next();
-                text+=this + item;
-            }
-        }
-        catch (e) {
-            if (e != pyjslib.StopIteration) throw e;
-        }
-    }
-
-    return text;
-}
-
-pyjslib.String_isdigit = function() {
-    return (this.match(/^\d+$/g) != null);
-}
-
-pyjslib.String_replace = function(old, replace, count) {
-    var do_max=false;
-    var start=0;
-    var new_str="";
-    var pos=0;
-
-    if (!pyjslib.isString(old)) return this.__replace(old, replace);
-    if (!pyjslib.isUndefined(count)) do_max=true;
-
-    while (start<this.length) {
-        if (do_max && !count--) break;
-
-        pos=this.indexOf(old, start);
-        if (pos<0) break;
-
-        new_str+=this.substring(start, pos) + replace;
-        start=pos+old.length;
-    }
-    if (start<this.length) new_str+=this.substring(start);
-
-    return new_str;
-}
-
-pyjslib.String_split = function(sep, maxsplit) {
-    var items=new pyjslib.List();
-    var do_max=false;
-    var subject=this;
-    var start=0;
-    var pos=0;
-
-    if (pyjslib.isUndefined(sep) || pyjslib.isNull(sep)) {
-        sep=" ";
-        subject=subject.strip();
-        subject=subject.replace(/\s+/g, sep);
-    }
-    else if (!pyjslib.isUndefined(maxsplit)) do_max=true;
-
-    if (subject.length == 0) {
-        return items;
-    }
-
-    while (start<subject.length) {
-        if (do_max && !maxsplit--) break;
-
-        pos=subject.indexOf(sep, start);
-        if (pos<0) break;
-
-        items.append(subject.substring(start, pos));
-        start=pos+sep.length;
-    }
-    if (start<=subject.length) items.append(subject.substring(start));
-
-    return items;
-}
-
-pyjslib.String___iter__ = function() {
-    var i = 0;
-    var s = this;
-    return {
-        'next': function() {
-            if (i >= s.length) {
-                throw pyjslib.StopIteration;
-            }
-            return s.substring(i++, i, 1);
-        },
-        '__iter__': function() {
-            return this;
-        }
-    };
-}
-
-pyjslib.String_strip = function(chars) {
-    return this.lstrip(chars).rstrip(chars);
-}
-
-pyjslib.String_lstrip = function(chars) {
-    if (pyjslib.isUndefined(chars)) return this.replace(/^\s+/, "");
-
-    return this.replace(new RegExp("^[" + chars + "]+"), "");
-}
-
-pyjslib.String_rstrip = function(chars) {
-    if (pyjslib.isUndefined(chars)) return this.replace(/\s+$/, "");
-
-    return this.replace(new RegExp("[" + chars + "]+$"), "");
-}
-
-pyjslib.String_startswith = function(prefix, start) {
-    if (pyjslib.isUndefined(start)) start = 0;
-
-    if (this.substring(start, prefix.length) == prefix) return true;
-    return false;
-}
-
-pyjslib.abs = Math.abs;
-
-""")
-
-
-class Class:
-    def __init__(self, name):
-        self.name = name
-
-    def __str___(self):
-        return self.name
-
-
-def eq(a, b):
-    JS("""
-    if (pyjslib.hasattr(a, "__cmp__")) {
-        return a.__cmp__(b) == 0;
-    } else if (pyjslib.hasattr(b, "__cmp__")) {
-        return b.__cmp__(a) == 0;
-    }
-    return a == b;
-    """)
-
-
-def cmp(a, b):
-    if hasattr(a, "__cmp__"):
-        return a.__cmp__(b)
-    elif hasattr(b, "__cmp__"):
-        return -b.__cmp__(a)
-    if a > b:
-        return 1
-    elif b > a:
-        return -1
-    else:
-        return 0
-
-
-def bool(v):
-    # this needs to stay in native code without any dependencies here,
-    # because this is used by if and while, we need to prevent
-    # recursion
-    JS("""
-    if (!v) return false;
-    switch(typeof v){
-    case 'boolean':
-        return v;
-    case 'object':
-        if (v.__nonzero__){
-            return v.__nonzero__();
-        }else if (v.__len__){
-            return v.__len__()>0;
-        }
-        return true;
-    }
-    return Boolean(v);
-    """)
-
-
-class List:
-    def __init__(self, data=None):
-        JS("""
-        this.l = [];
-        this.extend(data);
-        """)
-
-    def append(self, item):
-        JS("""    this.l[this.l.length] = item;""")
-
-    def extend(self, data):
-        JS("""
-        if (pyjslib.isArray(data)) {
-            n = this.l.length;
-            for (var i=0; i < data.length; i++) {
-                this.l[n+i]=data[i];
-                }
-            }
-        else if (pyjslib.isIteratable(data)) {
-            var iter=data.__iter__();
-            var i=this.l.length;
-            try {
-                while (true) {
-                    var item=iter.next();
-                    this.l[i++]=item;
-                    }
-                }
-            catch (e) {
-                if (e != pyjslib.StopIteration) throw e;
-                }
-            }
-        """)
-
-    def remove(self, value):
-        JS("""
-        var index=this.index(value);
-        if (index<0) return false;
-        this.l.splice(index, 1);
-        return true;
-        """)
-
-    def index(self, value, start=0):
-        JS("""
-        var length=this.l.length;
-        for (var i=start; i<length; i++) {
-            if (this.l[i]==value) {
-                return i;
-                }
-            }
-        return -1;
-        """)
-
-    def insert(self, index, value):
-        JS("""    var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
-
-    def pop(self, index=-1):
-        JS("""
-        if (index<0) index = this.l.length + index;
-        var a = this.l[index];
-        this.l.splice(index, 1);
-        return a;
-        """)
-
-    def __cmp__(self, l):
-        if not isinstance(l, List):
-            return -1
-        ll = len(self) - len(l)
-        if ll != 0:
-            return ll
-        for x in range(len(l)):
-            ll = cmp(self.__getitem__(x), l[x])
-            if ll != 0:
-                return ll
-        return 0
-
-    def slice(self, lower, upper):
-        JS("""
-        if (upper==null) return pyjslib.List(this.l.slice(lower));
-        return pyjslib.List(this.l.slice(lower, upper));
-        """)
-
-    def __getitem__(self, index):
-        JS("""
-        if (index<0) index = this.l.length + index;
-        return this.l[index];
-        """)
-
-    def __setitem__(self, index, value):
-        JS("""    this.l[index]=value;""")
-
-    def __delitem__(self, index):
-        JS("""    this.l.splice(index, 1);""")
-
-    def __len__(self):
-        JS("""    return this.l.length;""")
-
-    def __contains__(self, value):
-        return self.index(value) >= 0
-
-    def __iter__(self):
-        JS("""
-        var i = 0;
-        var l = this.l;
-        return {
-            'next': function() {
-                if (i >= l.length) {
-                    throw pyjslib.StopIteration;
-                }
-                return l[i++];
-            },
-            '__iter__': function() {
-                return this;
-            }
-        };
-        """)
-
-    def reverse(self):
-        JS("""    this.l.reverse();""")
-
-    def sort(self, compareFunc=None, keyFunc=None, reverse=False):
-        if not compareFunc:
-            compareFunc = cmp
-        if keyFunc and reverse:
-            def thisSort1(a, b):
-                return -compareFunc(keyFunc(a), keyFunc(b))
-            self.l.sort(thisSort1)
-        elif keyFunc:
-            def thisSort2(a, b):
-                return compareFunc(keyFunc(a), keyFunc(b))
-            self.l.sort(thisSort2)
-        elif reverse:
-            def thisSort3(a, b):
-                return -compareFunc(a, b)
-            self.l.sort(thisSort3)
-        else:
-            self.l.sort(compareFunc)
-
-    def getArray(self):
-        """
-        Access the javascript Array that is used internally by this list
-        """
-        return self.l
-
-    def __str__(self):
-        return repr(self)
-
-
-list = List
-
-
-class Tuple:
-    def __init__(self, data=None):
-        JS("""
-        this.l = [];
-        this.extend(data);
-        """)
-
-    def append(self, item):
-        JS("""    this.l[this.l.length] = item;""")
-
-    def extend(self, data):
-        JS("""
-        if (pyjslib.isArray(data)) {
-            n = this.l.length;
-            for (var i=0; i < data.length; i++) {
-                this.l[n+i]=data[i];
-                }
-            }
-        else if (pyjslib.isIteratable(data)) {
-            var iter=data.__iter__();
-            var i=this.l.length;
-            try {
-                while (true) {
-                    var item=iter.next();
-                    this.l[i++]=item;
-                    }
-                }
-            catch (e) {
-                if (e != pyjslib.StopIteration) throw e;
-                }
-            }
-        """)
-
-    def remove(self, value):
-        JS("""
-        var index=this.index(value);
-        if (index<0) return false;
-        this.l.splice(index, 1);
-        return true;
-        """)
-
-    def index(self, value, start=0):
-        JS("""
-        var length=this.l.length;
-        for (var i=start; i<length; i++) {
-            if (this.l[i]==value) {
-                return i;
-                }
-            }
-        return -1;
-        """)
-
-    def insert(self, index, value):
-        JS("""    var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
-
-    def pop(self, index=-1):
-        JS("""
-        if (index<0) index = this.l.length + index;
-        var a = this.l[index];
-        this.l.splice(index, 1);
-        return a;
-        """)
-
-    def __cmp__(self, l):
-        if not isinstance(l, Tuple):
-            return -1
-        ll = len(self) - len(l)
-        if ll != 0:
-            return ll
-        for x in range(len(l)):
-            ll = cmp(self.__getitem__(x), l[x])
-            if ll != 0:
-                return ll
-        return 0
-
-    def slice(self, lower, upper):
-        JS("""
-        if (upper==null) return pyjslib.Tuple(this.l.slice(lower));
-        return pyjslib.Tuple(this.l.slice(lower, upper));
-        """)
-
-    def __getitem__(self, index):
-        JS("""
-        if (index<0) index = this.l.length + index;
-        return this.l[index];
-        """)
-
-    def __setitem__(self, index, value):
-        JS("""    this.l[index]=value;""")
-
-    def __delitem__(self, index):
-        JS("""    this.l.splice(index, 1);""")
-
-    def __len__(self):
-        JS("""    return this.l.length;""")
-
-    def __contains__(self, value):
-        return self.index(value) >= 0
-
-    def __iter__(self):
-        JS("""
-        var i = 0;
-        var l = this.l;
-        return {
-            'next': function() {
-                if (i >= l.length) {
-                    throw pyjslib.StopIteration;
-                }
-                return l[i++];
-            },
-            '__iter__': function() {
-                return this;
-            }
-        };
-        """)
-
-    def reverse(self):
-        JS("""    this.l.reverse();""")
-
-    def sort(self, compareFunc=None, keyFunc=None, reverse=False):
-        if not compareFunc:
-            compareFunc = cmp
-        if keyFunc and reverse:
-            def thisSort1(a, b):
-                return -compareFunc(keyFunc(a), keyFunc(b))
-            self.l.sort(thisSort1)
-        elif keyFunc:
-            def thisSort2(a, b):
-                return compareFunc(keyFunc(a), keyFunc(b))
-            self.l.sort(thisSort2)
-        elif reverse:
-            def thisSort3(a, b):
-                return -compareFunc(a, b)
-            self.l.sort(thisSort3)
-        else:
-            self.l.sort(compareFunc)
-
-    def getArray(self):
-        """
-        Access the javascript Array that is used internally by this list
-        """
-        return self.l
-
-    def __str__(self):
-        return repr(self)
-
-
-tuple = Tuple
-
-
-class Dict:
-    def __init__(self, data=None):
-        JS("""
-        this.d = {};
-
-        if (pyjslib.isArray(data)) {
-            for (var i in data) {
-                var item=data[i];
-                this.__setitem__(item[0], item[1]);
-                //var sKey=pyjslib.hash(item[0]);
-                //this.d[sKey]=item[1];
-                }
-            }
-        else if (pyjslib.isIteratable(data)) {
-            var iter=data.__iter__();
-            try {
-                while (true) {
-                    var item=iter.next();
-                    this.__setitem__(item.__getitem__(0), item.__getitem__(1));
-                    }
-                }
-            catch (e) {
-                if (e != pyjslib.StopIteration) throw e;
-                }
-            }
-        else if (pyjslib.isObject(data)) {
-            for (var key in data) {
-                this.__setitem__(key, data[key]);
-                }
-            }
-        """)
-
-    def __setitem__(self, key, value):
-        JS("""
-        var sKey = pyjslib.hash(key);
-        this.d[sKey]=[key, value];
-        """)
-
-    def __getitem__(self, key):
-        JS("""
-        var sKey = pyjslib.hash(key);
-        var value=this.d[sKey];
-        if (pyjslib.isUndefined(value)){
-            throw pyjslib.KeyError(key);
-        }
-        return value[1];
-        """)
-
-    def __nonzero__(self):
-        JS("""
-        for (var i in this.d){
-            return true;
-        }
-        return false;
-        """)
-
-    def __len__(self):
-        JS("""
-        var size=0;
-        for (var i in this.d) size++;
-        return size;
-        """)
-
-    def has_key(self, key):
-        return self.__contains__(key)
-
-    def __delitem__(self, key):
-        JS("""
-        var sKey = pyjslib.hash(key);
-        delete this.d[sKey];
-        """)
-
-    def __contains__(self, key):
-        JS("""
-        var sKey = pyjslib.hash(key);
-        return (pyjslib.isUndefined(this.d[sKey])) ? false : true;
-        """)
-
-    def keys(self):
-        JS("""
-        var keys=new pyjslib.List();
-        for (var key in this.d) {
-            keys.append(this.d[key][0]);
-        }
-        return keys;
-        """)
-
-    def values(self):
-        JS("""
-        var values=new pyjslib.List();
-        for (var key in this.d) values.append(this.d[key][1]);
-        return values;
-        """)
-
-    def items(self):
-        JS("""
-        var items = new pyjslib.List();
-        for (var key in this.d) {
-          var kv = this.d[key];
-          items.append(new pyjslib.List(kv))
-          }
-          return items;
-        """)
-
-    def __iter__(self):
-        return self.keys().__iter__()
-
-    def iterkeys(self):
-        return self.__iter__()
-
-    def itervalues(self):
-        return self.values().__iter__()
-
-    def iteritems(self):
-        return self.items().__iter__()
-
-    def setdefault(self, key, default_value):
-        if key not in self:
-            self[key] = default_value
-
-    def get(self, key, default_=None):
-        if key not in self:
-            return default_
-        return self[key]
-
-    def update(self, d):
-        for k, v in d.iteritems():
-            self[k] = v
-
-    def getObject(self):
-        """
-        Return the javascript Object which this class uses to store
-        dictionary keys and values
-        """
-        return self.d
-
-    def copy(self):
-        return Dict(self.items())
-
-    def __str__(self):
-        return repr(self)
-
-
-dict = Dict
-
-# taken from mochikit: range( [start,] stop[, step] )
-
-
-def range():
-    JS("""
-    var start = 0;
-    var stop = 0;
-    var step = 1;
-
-    if (arguments.length == 2) {
-        start = arguments[0];
-        stop = arguments[1];
-        }
-    else if (arguments.length == 3) {
-        start = arguments[0];
-        stop = arguments[1];
-        step = arguments[2];
-        }
-    else if (arguments.length>0) stop = arguments[0];
-
-    return {
-        'next': function() {
-            if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) throw pyjslib.StopIteration;
-            var rval = start;
-            start += step;
-            return rval;
-            },
-        '__iter__': function() {
-            return this;
-            }
-        }
-    """)
-
-
-def slice(object, lower, upper):
-    JS("""
-    if (pyjslib.isString(object)) {
-        if (lower < 0) {
-           lower = object.length + lower;
-        }
-        if (upper < 0) {
-           upper = object.length + upper;
-        }
-        if (pyjslib.isNull(upper)) upper=object.length;
-        return object.substring(lower, upper);
-    }
-    if (pyjslib.isObject(object) && object.slice)
-        return object.slice(lower, upper);
-
-    return null;
-    """)
-
-
-def str(text):
-    JS("""
-    if (pyjslib.hasattr(text,"__str__")) {
-        return text.__str__();
-    }
-    return String(text);
-    """)
-
-
-def ord(x):
-    if isString(x) and len(x) is 1:
-        JS("""
-            return x.charCodeAt(0);
-        """)
-    else:
-        JS("""
-            throw pyjslib.TypeError();
-        """)
-    return None
-
-
-def chr(x):
-    JS("""
-        return String.fromCharCode(x)
-    """)
-
-
-def is_basetype(x):
-    JS("""
-       var t = typeof(x);
-       return t == 'boolean' ||
-       t == 'function' ||
-       t == 'number' ||
-       t == 'string' ||
-       t == 'undefined'
-       ;
-    """)
-
-
-def get_pyjs_classtype(x):
-    JS("""
-       if (pyjslib.hasattr(x, "__class__"))
-           if (pyjslib.hasattr(x.__class__, "__new__"))
-               var src = x.__class__.__name__;
-               return src;
-       return null;
-    """)
-
-
-def repr(x):
-    """ Return the string representation of 'x'.
-    """
-    JS("""
-       if (x === null)
-           return "null";
-
-       if (x === undefined)
-           return "undefined";
-
-       var t = typeof(x);
-
-        //alert("repr typeof " + t + " : " + x);
-
-       if (t == "boolean")
-           return x.toString();
-
-       if (t == "function")
-           return "<function " + x.toString() + ">";
-
-       if (t == "number")
-           return x.toString();
-
-       if (t == "string") {
-           if (x.indexOf("'") == -1)
-               return "'" + x + "'";
-           if (x.indexOf('"') == -1)
-               return '"' + x + '"';
-           var s = x.replace(new RegExp('"', "g"), '\\\\"');
-           return '"' + s + '"';
-       };
-
-       if (t == "undefined")
-           return "undefined";
-
-       // If we get here, x is an object.  See if it's a Pyjamas class.
-
-       if (!pyjslib.hasattr(x, "__init__"))
-           return "<" + x.toString() + ">";
-
-       // Handle the common Pyjamas data types.
-
-       var constructor = "UNKNOWN";
-
-       constructor = pyjslib.get_pyjs_classtype(x);
-
-        //alert("repr constructor: " + constructor);
-
-       if (constructor == "Tuple") {
-           var contents = x.getArray();
-           var s = "(";
-           for (var i=0; i < contents.length; i++) {
-               s += pyjslib.repr(contents[i]);
-               if (i < contents.length - 1)
-                   s += ", ";
-           };
-           s += ")"
-           return s;
-       };
-
-       if (constructor == "List") {
-           var contents = x.getArray();
-           var s = "[";
-           for (var i=0; i < contents.length; i++) {
-               s += pyjslib.repr(contents[i]);
-               if (i < contents.length - 1)
-                   s += ", ";
-           };
-           s += "]"
-           return s;
-       };
-
-       if (constructor == "Dict") {
-           var keys = new Array();
-           for (var key in x.d)
-               keys.push(key);
-
-           var s = "{";
-           for (var i=0; i<keys.length; i++) {
-               var key = keys[i]
-               s += pyjslib.repr(key) + ": " + pyjslib.repr(x.d[key]);
-               if (i < keys.length-1)
-                   s += ", "
-           };
-           s += "}";
-           return s;
-       };
-
-       // If we get here, the class isn't one we know -> return the class name.
-       // Note that we replace underscores with dots so that the name will
-       // (hopefully!) look like the original Python name.
-
-       //var s = constructor.replace(new RegExp('_', "g"), '.');
-       return "<" + constructor + " object>";
-    """)
-
-
-def float(text):
-    JS("""
-    return parseFloat(text);
-    """)
-
-
-def int(text, radix=0):
-    JS("""
-    return parseInt(text, radix);
-    """)
-
-
-def len(object):
-    JS("""
-    if (object==null) return 0;
-    if (pyjslib.isObject(object) && object.__len__) return object.__len__();
-    return object.length;
-    """)
-
-
-def isinstance(object_, classinfo):
-    if pyjslib.isUndefined(object_):
-        return False
-    if not pyjslib.isObject(object_):
-
-        return False
-    if _isinstance(classinfo, Tuple):
-        for ci in classinfo:
-            if isinstance(object_, ci):
-                return True
-        return False
-    else:
-        return _isinstance(object_, classinfo)
-
-
-def _isinstance(object_, classinfo):
-    if not pyjslib.isObject(object_):
-        return False
-    JS("""
-    if (object_.__class__){
-        var res =  object_ instanceof classinfo.constructor;
-        return res;
-    }
-    return false;
-    """)
-
-
-def getattr(obj, name, default_=None):
-    JS("""
-    if ((!pyjslib.isObject(obj))||(pyjslib.isUndefined(obj[name]))){
-        if (pyjslib.isUndefined(default_)){
-            throw pyjslib.AttributeError(obj, name);
-        }else{
-        return default_;
-        }
-    }
-    if (!pyjslib.isFunction(obj[name])) return obj[name];
-    var fnwrap = function() {
-        var args = [];
-        for (var i = 0; i < arguments.length; i++) {
-          args.push(arguments[i]);
-        }
-        return obj[name].apply(obj,args);
-        }
-    fnwrap.__name__ = name;
-    return fnwrap;
-    """)
-
-
-def setattr(obj, name, value):
-    JS("""
-    if (!pyjslib.isObject(obj)) return null;
-
-    obj[name] = value;
-
-    """)
-
-
-def hasattr(obj, name):
-    JS("""
-    if (!pyjslib.isObject(obj)) return false;
-    if (pyjslib.isUndefined(obj[name])) return false;
-
-    return true;
-    """)
-
-
-def dir(obj):
-    JS("""
-    var properties=new pyjslib.List();
-    for (property in obj) properties.append(property);
-    return properties;
-    """)
-
-
-def filter(obj, method, sequence=None):
-    # object context is LOST when a method is passed, hence object must be passed separately
-    # to emulate python behaviour, should generate this code inline rather than as a function call
-    items = []
-    if sequence is None:
-        sequence = method
-        method = obj
-
-        for item in sequence:
-            if method(item):
-                items.append(item)
-    else:
-        for item in sequence:
-            if method.call(obj, item):
-                items.append(item)
-
-    return items
-
-
-def map(obj, method, sequence=None):
-    items = []
-
-    if sequence is None:
-        sequence = method
-        method = obj
-
-        for item in sequence:
-            items.append(method(item))
-    else:
-        for item in sequence:
-            items.append(method.call(obj, item))
-
-    return items
-
-
-def enumerate(sequence):
-    enumeration = []
-    nextIndex = 0
-    for item in sequence:
-        enumeration.append([nextIndex, item])
-        nextIndex = nextIndex + 1
-    return enumeration
-
-
-def min(*sequence):
-    minValue = None
-    for item in sequence:
-        if minValue is None:
-            minValue = item
-        elif item < minValue:
-            minValue = item
-    return minValue
-
-
-def max(*sequence):
-    maxValue = None
-    for item in sequence:
-        if maxValue is None:
-            maxValue = item
-        elif item > maxValue:
-            maxValue = item
-    return maxValue
-
-
-next_hash_id = 0
-
-
-def hash(obj):
-    JS("""
-    if (obj == null) return null;
-
-    if (obj.$H) return obj.$H;
-    if (obj.__hash__) return obj.__hash__();
-    if (obj.constructor == String || obj.constructor == Number || obj.constructor == Date) return obj;
-
-    obj.$H = ++pyjslib.next_hash_id;
-    return obj.$H;
-    """)
-
-
-# type functions from Douglas Crockford's Remedial Javascript: http://www.crockford.com/javascript/remedial.html
-def isObject(a):
-    JS("""
-    return (a != null && (typeof a == 'object')) || pyjslib.isFunction(a);
-    """)
-
-
-def isFunction(a):
-    JS("""
-    return typeof a == 'function';
-    """)
-
-
-def isString(a):
-    JS("""
-    return typeof a == 'string';
-    """)
-
-
-def isNull(a):
-    JS("""
-    return typeof a == 'object' && !a;
-    """)
-
-
-def isArray(a):
-    JS("""
-    return pyjslib.isObject(a) && a.constructor == Array;
-    """)
-
-
-def isUndefined(a):
-    JS("""
-    return typeof a == 'undefined';
-    """)
-
-
-def isIteratable(a):
-    JS("""
-    return pyjslib.isString(a) || (pyjslib.isObject(a) && a.__iter__);
-    """)
-
-
-def isNumber(a):
-    JS("""
-    return typeof a == 'number' && isFinite(a);
-    """)
-
-
-def toJSObjects(x):
-    """
-       Convert the pyjs pythonic List and Dict objects into javascript Object and Array
-       objects, recursively.
-    """
-    if isArray(x):
-        JS("""
-        var result = [];
-        for(var k=0; k < x.length; k++) {
-           var v = x[k];
-           var tv = pyjslib.toJSObjects(v);
-           result.push(tv);
-        }
-        return result;
-        """)
-    if isObject(x):
-        if isinstance(x, Dict):
-            JS("""
-            var o = x.getObject();
-            var result = {};
-            for (var i in o) {
-               result[o[i][0].toString()] = o[i][1];
-            }
-            return pyjslib.toJSObjects(result)
-            """)
-        elif isinstance(x, List):
-            return toJSObjects(x.l)
-        elif hasattr(x, '__class__'):
-            # we do not have a special implementation for custom
-            # classes, just pass it on
-            return x
-    if isObject(x):
-        JS("""
-        var result = {};
-        for(var k in x) {
-            var v = x[k];
-            var tv = pyjslib.toJSObjects(v)
-            result[k] = tv;
-            }
-            return result;
-         """)
-    return x
-
-
-def printFunc(objs):
-    JS("""
-    if ($wnd.console==undefined)  return;
-    var s = "";
-    for(var i=0; i < objs.length; i++) {
-        if(s != "") s += " ";
-        s += objs[i];
-    }
-    console.debug(s)
-    """)
-
-
-def type(clsname, bases=None, methods=None):
-    """ creates a class, derived from bases, with methods and variables
-    """
-
-    JS(" var mths = {}; ")
-    if methods:
-        for k in methods.keys():
-            _mth = methods[k]
-            JS(" mths[k] = _mth; ")
-
-    JS(" var bss = null; ")
-    if bases:
-        JS("bss = bases.l;")
-    JS(" return pyjs_type(clsname, bss, mths); ")
--- a/svgui/pyjs/lib/sys.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-# the platform name (PyV8, smjs, Mozilla, IE6, Opera, Safari etc.)
-platform = ''  # to be updated by app, on compile
-
-# a dictionary of module override names (platform-specific)
-overrides = {}  # to be updated by app, on compile
-
-# the remote path for loading modules
-loadpath = None
-
-stacktrace = None
-
-appname = None
-
-
-def setloadpath(lp):
-    global loadpath
-    loadpath = lp
-
-
-def setappname(an):
-    global appname
-    appname = an
-
-
-def getloadpath():
-    return loadpath
-
-
-def addoverride(module_name, path):
-    overrides[module_name] = path
-
-
-def addstack(linedebug):
-    JS("""
-        if (pyjslib.bool((sys.stacktrace === null))) {
-            sys.stacktrace = new pyjslib.List([]);
-        }
-        sys.stacktrace.append(linedebug);
-    """)
-
-
-def popstack():
-    JS("""
-        sys.stacktrace.pop()
-    """)
-
-
-def printstack():
-    JS("""
-        var res = '';
-
-        var __l = sys.stacktrace.__iter__();
-        try {
-            while (true) {
-                var l = __l.next();
-                res +=  ( l + '\\n' ) ;
-            }
-        } catch (e) {
-            if (e != pyjslib.StopIteration) {
-                throw e;
-            }
-        }
-
-        return res;
-    """)
--- a/svgui/pyjs/pyjs.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1780 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2006 James Tauber and contributors
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# pylint: disable=no-absolute-import,bad-python3-import
-
-from __future__ import print_function
-import sys
-import compiler
-from compiler import ast
-import os
-import copy
-from builtins import str as text
-from past.builtins import basestring
-from six.moves import cStringIO
-
-# the standard location for builtins (e.g. pyjslib) can be
-# over-ridden by changing this.  it defaults to sys.prefix
-# so that on a system-wide install of pyjamas the builtins
-# can be found in e.g. {sys.prefix}/share/pyjamas
-#
-# over-rides can be done by either explicitly modifying
-# pyjs.prefix or by setting an environment variable, PYJSPREFIX.
-
-prefix = sys.prefix
-
-if 'PYJSPREFIX' in os.environ:
-    prefix = os.environ['PYJSPREFIX']
-
-# pyjs.path is the list of paths, just like sys.path, from which
-# library modules will be searched for, for compile purposes.
-# obviously we don't want to use sys.path because that would result
-# in compiling standard python modules into javascript!
-
-path = [os.path.abspath('')]
-
-if 'PYJSPATH' in os.environ:
-    for p in os.environ['PYJSPATH'].split(os.pathsep):
-        p = os.path.abspath(p)
-        if os.path.isdir(p):
-            path.append(p)
-
-# this is the python function used to wrap native javascript
-NATIVE_JS_FUNC_NAME = "JS"
-
-UU = ""
-
-PYJSLIB_BUILTIN_FUNCTIONS = ("cmp",
-                             "map",
-                             "filter",
-                             "dir",
-                             "getattr",
-                             "setattr",
-                             "hasattr",
-                             "int",
-                             "float",
-                             "str",
-                             "repr",
-                             "range",
-                             "len",
-                             "hash",
-                             "abs",
-                             "ord",
-                             "chr",
-                             "enumerate",
-                             "min",
-                             "max",
-                             "bool",
-                             "type",
-                             "isinstance")
-
-PYJSLIB_BUILTIN_CLASSES = ("BaseException",
-                           "Exception",
-                           "StandardError",
-                           "StopIteration",
-                           "AttributeError",
-                           "TypeError",
-                           "KeyError",
-                           "LookupError",
-                           "list",
-                           "dict",
-                           "object",
-                           "tuple")
-
-
-def pyjs_builtin_remap(name):
-    # XXX HACK!
-    if name == 'list':
-        name = 'List'
-    if name == 'object':
-        name = '__Object'
-    if name == 'dict':
-        name = 'Dict'
-    if name == 'tuple':
-        name = 'Tuple'
-    return name
-
-
-# XXX: this is a hack: these should be dealt with another way
-# however, console is currently the only global name which is causing
-# problems.
-PYJS_GLOBAL_VARS = ("console")
-
-# This is taken from the django project.
-# Escape every ASCII character with a value less than 32.
-JS_ESCAPES = (
-    ('\\', r'\x5C'),
-    ('\'', r'\x27'),
-    ('"', r'\x22'),
-    ('>', r'\x3E'),
-    ('<', r'\x3C'),
-    ('&', r'\x26'),
-    (';', r'\x3B')
-    ) + tuple([('%c' % z, '\\x%02X' % z) for z in range(32)])
-
-
-def escapejs(value):
-    """Hex encodes characters for use in JavaScript strings."""
-    for bad, good in JS_ESCAPES:
-        value = value.replace(bad, good)
-    return value
-
-
-def uuprefix(name, leave_alone=0):
-    name = name.split(".")
-    name = name[:leave_alone] + map(lambda x: "__%s" % x, name[leave_alone:])
-    return '.'.join(name)
-
-
-class Klass(object):
-
-    klasses = {}
-
-    def __init__(self, name, name_):
-        self.name = name
-        self.name_ = name_
-        self.klasses[name] = self
-        self.functions = set()
-
-    def set_base(self, base_name):
-        self.base = self.klasses.get(base_name)
-
-    def add_function(self, function_name):
-        self.functions.add(function_name)
-
-
-class TranslationError(Exception):
-    def __init__(self, message, node):
-        Exception.__init__(self)
-        self.message = "line %s:\n%s\n%s" % (node.lineno, message, node)
-
-    def __str__(self):
-        return self.message
-
-
-def strip_py(name):
-    return name
-
-
-def mod_var_name_decl(raw_module_name):
-    """ function to get the last component of the module e.g.
-        pyjamas.ui.DOM into the "namespace".  i.e. doing
-        "import pyjamas.ui.DOM" actually ends up with _two_
-        variables - one pyjamas.ui.DOM, the other just "DOM".
-        but "DOM" is actually local, hence the "var" prefix.
-
-        for PyV8, this might end up causing problems - we'll have
-        to see: gen_mod_import and mod_var_name_decl might have
-        to end up in a library-specific module, somewhere.
-    """
-    name = raw_module_name.split(".")
-    if len(name) == 1:
-        return ''
-    child_name = name[-1]
-    return "var %s = %s;\n" % (child_name, raw_module_name)
-
-
-def gen_mod_import(parentName, importName, dynamic=1):
-    # pyjs_ajax_eval("%(n)s.cache.js", null, true);
-    return """
-    pyjslib.import_module(sys.loadpath, '%(p)s', '%(n)s', %(d)d, false);
-    """ % ({'p': parentName, 'd': dynamic, 'n': importName}) + \
-        mod_var_name_decl(importName)
-
-
-class Translator(object):
-
-    def __init__(self, mn, module_name, raw_module_name, src, debug, mod, output,
-                 dynamic=0, optimize=False,
-                 findFile=None):
-
-        if module_name:
-            self.module_prefix = module_name + "."
-        else:
-            self.module_prefix = ""
-        self.raw_module_name = raw_module_name
-        src = src.replace("\r\n", "\n")
-        src = src.replace("\n\r", "\n")
-        src = src.replace("\r",   "\n")
-        self.src = src.split("\n")
-        self.debug = debug
-        self.imported_modules = []
-        self.imported_modules_as = []
-        self.imported_js = set()
-        self.top_level_functions = set()
-        self.top_level_classes = set()
-        self.top_level_vars = set()
-        self.local_arg_stack = [[]]
-        self.output = output
-        self.imported_classes = {}
-        self.method_imported_globals = set()
-        self.method_self = None
-        self.nextTupleAssignID = 1
-        self.dynamic = dynamic
-        self.optimize = optimize
-        self.findFile = findFile
-
-        if module_name.find(".") >= 0:
-            vdec = ''
-        else:
-            vdec = 'var '
-        self.printo(UU+"%s%s = function (__mod_name__) {" % (vdec, module_name))
-
-        self.printo("    if("+module_name+".__was_initialized__) return;")
-        self.printo("    "+UU+module_name+".__was_initialized__ = true;")
-        self.printo(UU+"if (__mod_name__ == null) __mod_name__ = '%s';" % (mn))
-        self.printo(UU+"%s.__name__ = __mod_name__;" % (raw_module_name))
-
-        decl = mod_var_name_decl(raw_module_name)
-        if decl:
-            self.printo(decl)
-
-        if self.debug:
-            haltException = self.module_prefix + "HaltException"
-            self.printo(haltException + ' = function () {')
-            self.printo('  this.message = "Program Halted";')
-            self.printo('  this.name = "' + haltException + '";')
-            self.printo('}')
-            self.printo('')
-            self.printo(haltException + ".prototype.__str__ = function()")
-            self.printo('{')
-            self.printo('return this.message ;')
-            self.printo('}')
-
-            self.printo(haltException + ".prototype.toString = function()")
-            self.printo('{')
-            self.printo('return this.name + ": \\"" + this.message + "\\"";')
-            self.printo('}')
-
-            isHaltFunction = self.module_prefix + "IsHaltException"
-            self.printo(""")
-    %s = function (s) {
-      var suffix="HaltException";
-      if (s.length < suffix.length) {
-        //alert(s + " " + suffix);
-        return false;
-      } else {
-        var ss = s.substring(s.length, (s.length - suffix.length));
-        //alert(s + " " + suffix + " " + ss);
-        return ss == suffix;
-      }
-    }
-                """ % isHaltFunction)
-        for child in mod.node:
-            if isinstance(child, ast.Function):
-                self.top_level_functions.add(child.name)
-            elif isinstance(child, ast.Class):
-                self.top_level_classes.add(child.name)
-
-        for child in mod.node:
-            if isinstance(child, ast.Function):
-                self._function(child, False)
-            elif isinstance(child, ast.Class):
-                self._class(child)
-            elif isinstance(child, ast.Import):
-                importName = child.names[0][0]
-                if importName == '__pyjamas__':  # special module to help make pyjamas modules loadable in the python interpreter
-                    pass
-                elif importName.endswith('.js'):
-                    self.imported_js.add(importName)
-                else:
-                    self.add_imported_module(strip_py(importName))
-            elif isinstance(child, ast.From):
-                if child.modname == '__pyjamas__':  # special module to help make pyjamas modules loadable in the python interpreter
-                    pass
-                else:
-                    self.add_imported_module(child.modname)
-                    self._from(child)
-            elif isinstance(child, ast.Discard):
-                self._discard(child, None)
-            elif isinstance(child, ast.Assign):
-                self._assign(child, None, True)
-            elif isinstance(child, ast.AugAssign):
-                self._augassign(child, None)
-            elif isinstance(child, ast.If):
-                self._if(child, None)
-            elif isinstance(child, ast.For):
-                self._for(child, None)
-            elif isinstance(child, ast.While):
-                self._while(child, None)
-            elif isinstance(child, ast.Subscript):
-                self._subscript_stmt(child, None)
-            elif isinstance(child, ast.Global):
-                self._global(child, None)
-            elif isinstance(child, ast.Printnl):
-                self._print(child, None)
-            elif isinstance(child, ast.Print):
-                self._print(child, None)
-            elif isinstance(child, ast.TryExcept):
-                self._tryExcept(child, None)
-            elif isinstance(child, ast.Raise):
-                self._raise(child, None)
-            elif isinstance(child, ast.Stmt):
-                self._stmt(child, None)
-            else:
-                raise TranslationError("unsupported type (in __init__)", child)
-
-        # Initialize all classes for this module
-        # self.printo("__"+self.modpfx()+\
-        #          "classes_initialize = function() {\n")
-        # for className in self.top_level_classes:
-        #    self.printo("\t"+UU+self.modpfx()+"__"+className+"_initialize();")
-        # self.printo("};\n")
-
-        self.printo("return this;\n")
-        self.printo("}; /* end %s */ \n" % module_name)
-
-    def printo(self, *args):
-        print(*args, file=self.output)
-
-    def module_imports(self):
-        return self.imported_modules + self.imported_modules_as
-
-    def add_local_arg(self, varname):
-        local_vars = self.local_arg_stack[-1]
-        if varname not in local_vars:
-            local_vars.append(varname)
-
-    def add_imported_module(self, importName):
-
-        if importName in self.imported_modules:
-            return
-        self.imported_modules.append(importName)
-        name = importName.split(".")
-        if len(name) != 1:
-            # add the name of the module to the namespace,
-            # but don't add the short name to imported_modules
-            # because then the short name would be attempted to be
-            # added to the dependencies, and it's half way up the
-            # module import directory structure!
-            child_name = name[-1]
-            self.imported_modules_as.append(child_name)
-        self.printo(gen_mod_import(self.raw_module_name,
-                                   strip_py(importName),
-                                   self.dynamic))
-
-    def _default_args_handler(self, node, arg_names, current_klass,
-                              output=None):
-        if len(node.defaults):
-            output = output or self.output
-            default_pos = len(arg_names) - len(node.defaults)
-            if arg_names and arg_names[0] == self.method_self:
-                default_pos -= 1
-            for default_node in node.defaults:
-                if isinstance(default_node, ast.Const):
-                    default_value = self._const(default_node)
-                elif isinstance(default_node, ast.Name):
-                    default_value = self._name(default_node, current_klass)
-                elif isinstance(default_node, ast.UnarySub):
-                    default_value = self._unarysub(default_node, current_klass)
-                else:
-                    raise TranslationError("unsupported type (in _method)", default_node)
-
-                default_name = arg_names[default_pos]
-                default_pos += 1
-                self.printo("    if (typeof %s == 'undefined') %s=%s;" % (default_name, default_name, default_value))
-
-    def _varargs_handler(self, node, varargname, arg_names, current_klass):
-        self.printo("    var", varargname, '= new pyjslib.Tuple();')
-        self.printo("    for(var __va_arg="+str(len(arg_names))+"; __va_arg < arguments.length; __va_arg++) {")
-        self.printo("        var __arg = arguments[__va_arg];")
-        self.printo("        "+varargname+".append(__arg);")
-        self.printo("    }")
-
-    def _kwargs_parser(self, node, function_name, arg_names, current_klass):
-        if len(node.defaults) or node.kwargs:
-            default_pos = len(arg_names) - len(node.defaults)
-            if arg_names and arg_names[0] == self.method_self:
-                default_pos -= 1
-            self.printo(function_name+'.parse_kwargs = function (', ", ".join(["__kwargs"]+arg_names), ") {")
-            for _default_node in node.defaults:
-                # default_value = self.expr(default_node, current_klass)
-                # if isinstance(default_node, ast.Const):
-                #     default_value = self._const(default_node)
-                # elif isinstance(default_node, ast.Name):
-                #     default_value = self._name(default_node)
-                # elif isinstance(default_node, ast.UnarySub):
-                #     default_value = self._unarysub(default_node, current_klass)
-                # else:
-                #     raise TranslationError("unsupported type (in _method)", default_node)
-
-                default_name = arg_names[default_pos]
-                self.printo("    if (typeof %s == 'undefined')" % (default_name))
-                self.printo("        %s=__kwargs.%s;" % (default_name, default_name))
-                default_pos += 1
-
-            # self._default_args_handler(node, arg_names, current_klass)
-            if node.kwargs:
-                arg_names += ["pyjslib.Dict(__kwargs)"]
-            self.printo("    var __r = "+"".join(["[", ", ".join(arg_names), "]"])+";")
-            if node.varargs:
-                self._varargs_handler(node, "__args", arg_names, current_klass)
-                self.printo("    __r.push.apply(__r, __args.getArray())")
-            self.printo("    return __r;")
-            self.printo("};")
-
-    def _function(self, node, local=False):
-        if local:
-            function_name = node.name
-            self.add_local_arg(function_name)
-        else:
-            function_name = UU + self.modpfx() + node.name
-
-        arg_names = list(node.argnames)
-        normal_arg_names = list(arg_names)
-        if node.kwargs:
-            kwargname = normal_arg_names.pop()
-        if node.varargs:
-            varargname = normal_arg_names.pop()
-        declared_arg_names = list(normal_arg_names)
-        if node.kwargs:
-            declared_arg_names.append(kwargname)
-
-        function_args = "(" + ", ".join(declared_arg_names) + ")"
-        self.printo("%s = function%s {" % (function_name, function_args))
-        self._default_args_handler(node, normal_arg_names, None)
-
-        local_arg_names = normal_arg_names + declared_arg_names
-
-        if node.varargs:
-            self._varargs_handler(node, varargname, declared_arg_names, None)
-            local_arg_names.append(varargname)
-
-        # stack of local variable names for this function call
-        self.local_arg_stack.append(local_arg_names)
-
-        for child in node.code:
-            self._stmt(child, None)
-
-        # remove the top local arg names
-        self.local_arg_stack.pop()
-
-        # we need to return null always, so it is not undefined
-        lastStmt = [p for p in node.code][-1]
-        if not isinstance(lastStmt, ast.Return):
-            if not self._isNativeFunc(lastStmt):
-                self.printo("    return null;")
-
-        self.printo("};")
-        self.printo("%s.__name__ = '%s';\n" % (function_name, node.name))
-
-        self._kwargs_parser(node, function_name, normal_arg_names, None)
-
-    def _return(self, node, current_klass):
-        expr = self.expr(node.value, current_klass)
-        # in python a function call always returns None, so we do it
-        # here too
-        self.printo("    return " + expr + ";")
-
-    def _break(self, node, current_klass):
-        self.printo("    break;")
-
-    def _continue(self, node, current_klass):
-        self.printo("    continue;")
-
-    def _callfunc(self, v, current_klass):
-
-        if isinstance(v.node, ast.Name):
-            if v.node.name in self.top_level_functions:
-                call_name = self.modpfx() + v.node.name
-            elif v.node.name in self.top_level_classes:
-                call_name = self.modpfx() + v.node.name
-            elif v.node.name in self.imported_classes:
-                call_name = self.imported_classes[v.node.name] + '.' + v.node.name
-            elif v.node.name in PYJSLIB_BUILTIN_FUNCTIONS:
-                call_name = 'pyjslib.' + v.node.name
-            elif v.node.name in PYJSLIB_BUILTIN_CLASSES:
-                name = pyjs_builtin_remap(v.node.name)
-                call_name = 'pyjslib.' + name
-            elif v.node.name == "callable":
-                call_name = "pyjslib.isFunction"
-            else:
-                call_name = v.node.name
-            call_args = []
-        elif isinstance(v.node, ast.Getattr):
-            attr_name = v.node.attrname
-
-            if isinstance(v.node.expr, ast.Name):
-                call_name = self._name2(v.node.expr, current_klass, attr_name)
-                call_args = []
-            elif isinstance(v.node.expr, ast.Getattr):
-                call_name = self._getattr2(v.node.expr, current_klass, attr_name)
-                call_args = []
-            elif isinstance(v.node.expr, ast.CallFunc):
-                call_name = self._callfunc(v.node.expr, current_klass) + "." + v.node.attrname
-                call_args = []
-            elif isinstance(v.node.expr, ast.Subscript):
-                call_name = self._subscript(v.node.expr, current_klass) + "." + v.node.attrname
-                call_args = []
-            elif isinstance(v.node.expr, ast.Const):
-                call_name = self.expr(v.node.expr, current_klass) + "." + v.node.attrname
-                call_args = []
-            else:
-                raise TranslationError("unsupported type (in _callfunc)", v.node.expr)
-        else:
-            raise TranslationError("unsupported type (in _callfunc)", v.node)
-
-        call_name = strip_py(call_name)
-
-        kwargs = []
-        star_arg_name = None
-        if v.star_args:
-            star_arg_name = self.expr(v.star_args, current_klass)
-
-        for ch4 in v.args:
-            if isinstance(ch4, ast.Keyword):
-                kwarg = ch4.name + ":" + self.expr(ch4.expr, current_klass)
-                kwargs.append(kwarg)
-            else:
-                arg = self.expr(ch4, current_klass)
-                call_args.append(arg)
-
-        if kwargs:
-            fn_args = ", ".join(['{' + ', '.join(kwargs) + '}']+call_args)
-        else:
-            fn_args = ", ".join(call_args)
-
-        if kwargs or star_arg_name:
-            if not star_arg_name:
-                star_arg_name = 'null'
-            try:
-                call_this, method_name = call_name.rsplit(".", 1)
-            except ValueError:
-                # Must be a function call ...
-                return ("pyjs_kwargs_function_call("+call_name+", " +
-                        star_arg_name + ", ["+fn_args+"]" + ")")
-            else:
-                return ("pyjs_kwargs_method_call("+call_this+", '"+method_name+"', " +
-                        star_arg_name + ", ["+fn_args+"]" + ")")
-        else:
-            return call_name + "(" + ", ".join(call_args) + ")"
-
-    def _print(self, node, current_klass):
-        if self.optimize:
-            return
-        call_args = []
-        for ch4 in node.nodes:
-            arg = self.expr(ch4, current_klass)
-            call_args.append(arg)
-
-        self.printo("pyjslib.printFunc([", ', '.join(call_args), "],", int(isinstance(node, ast.Printnl)), ");")
-
-    def _tryExcept(self, node, current_klass):
-        if len(node.handlers) != 1:
-            raise TranslationError("except statements in this form are" +
-                                   " not supported", node)
-
-        expr = node.handlers[0][0]
-        as_ = node.handlers[0][1]
-        if as_:
-            errName = as_.name
-        else:
-            errName = 'err'
-
-        # XXX TODO: check that this should instead be added as a _separate_
-        # local scope, temporary to the function.  oh dearie me.
-        self.add_local_arg(errName)
-
-        self.printo("    try {")
-        for stmt in node.body.nodes:
-            self._stmt(stmt, current_klass)
-        self.printo("    } catch(%s) {" % errName)
-        if expr:
-            k = []
-            if isinstance(expr, ast.Tuple):
-                for x in expr.nodes:
-                    k.append("(%(err)s.__name__ == %(expr)s.__name__)" % dict(err=errName, expr=self.expr(x, current_klass)))
-            else:
-                k = [" (%(err)s.__name__ == %(expr)s.__name__) " % dict(err=errName, expr=self.expr(expr, current_klass))]
-            self.printo("   if(%s) {" % '||\n\t\t'.join(k))
-        for stmt in node.handlers[0][2]:
-            self._stmt(stmt, current_klass)
-        if expr:
-            # self.printo("} else { throw(%s); } " % errName)
-            self.printo("}")
-        if node.else_ is not None:
-            self.printo("    } finally {")
-            for stmt in node.else_:
-                self._stmt(stmt, current_klass)
-        self.printo("    }")
-
-    # XXX: change use_getattr to True to enable "strict" compilation
-    # but incurring a 100% performance penalty. oops.
-    def _getattr(self, v, current_klass, use_getattr=False):
-        attr_name = v.attrname
-        if isinstance(v.expr, ast.Name):
-            obj = self._name(v.expr, current_klass, return_none_for_module=True)
-            if obj is None and v.expr.name in self.module_imports():
-                # XXX TODO: distinguish between module import classes
-                # and variables.  right now, this is a hack to get
-                # the sys module working.
-                # if v.expr.name == 'sys':
-                return v.expr.name+'.'+attr_name
-                # return v.expr.name+'.__'+attr_name+'.prototype.__class__'
-            if not use_getattr or attr_name == '__class__' or \
-                    attr_name == '__name__':
-                return obj + "." + attr_name
-            return "pyjslib.getattr(%s, '%s')" % (obj, attr_name)
-        elif isinstance(v.expr, ast.Getattr):
-            return self._getattr(v.expr, current_klass) + "." + attr_name
-        elif isinstance(v.expr, ast.Subscript):
-            return self._subscript(v.expr, self.modpfx()) + "." + attr_name
-        elif isinstance(v.expr, ast.CallFunc):
-            return self._callfunc(v.expr, self.modpfx()) + "." + attr_name
-        else:
-            raise TranslationError("unsupported type (in _getattr)", v.expr)
-
-    def modpfx(self):
-        return strip_py(self.module_prefix)
-
-    def _name(self, v, current_klass, top_level=False,
-              return_none_for_module=False):
-
-        if v.name == 'ilikesillynamesfornicedebugcode':
-            print(top_level, current_klass, repr(v))
-            print(self.top_level_vars)
-            print(self.top_level_functions)
-            print(self.local_arg_stack)
-            print("error...")
-
-        local_var_names = None
-        las = len(self.local_arg_stack)
-        if las > 0:
-            local_var_names = self.local_arg_stack[-1]
-
-        if v.name == "True":
-            return "true"
-        elif v.name == "False":
-            return "false"
-        elif v.name == "None":
-            return "null"
-        elif v.name == '__name__' and current_klass is None:
-            return self.modpfx() + v.name
-        elif v.name == self.method_self:
-            return "this"
-        elif v.name in self.top_level_functions:
-            return UU+self.modpfx() + v.name
-        elif v.name in self.method_imported_globals:
-            return UU+self.modpfx() + v.name
-        elif not current_klass and las == 1 and v.name in self.top_level_vars:
-            return UU+self.modpfx() + v.name
-        elif v.name in local_var_names:
-            return v.name
-        elif v.name in self.imported_classes:
-            return UU+self.imported_classes[v.name] + '.__' + v.name + ".prototype.__class__"
-        elif v.name in self.top_level_classes:
-            return UU+self.modpfx() + "__" + v.name + ".prototype.__class__"
-        elif v.name in self.module_imports() and return_none_for_module:
-            return None
-        elif v.name in PYJSLIB_BUILTIN_CLASSES:
-            return "pyjslib." + pyjs_builtin_remap(v.name)
-        elif current_klass:
-            if v.name not in local_var_names and \
-               v.name not in self.top_level_vars and \
-               v.name not in PYJS_GLOBAL_VARS and \
-               v.name not in self.top_level_functions:
-
-                cls_name = current_klass
-                if hasattr(cls_name, "name"):
-                    cls_name_ = cls_name.name_
-                    cls_name = cls_name.name
-                else:
-                    cls_name_ = current_klass + "_"  # XXX ???
-                name = UU+cls_name_ + ".prototype.__class__." + v.name
-                if v.name == 'listener':
-                    name = 'listener+' + name
-                return name
-
-        return v.name
-
-    def _name2(self, v, current_klass, attr_name):
-        obj = v.name
-
-        if obj in self.method_imported_globals:
-            call_name = UU+self.modpfx() + obj + "." + attr_name
-        elif obj in self.imported_classes:
-            # attr_str = ""
-            # if attr_name != "__init__":
-            attr_str = ".prototype.__class__." + attr_name
-            call_name = UU+self.imported_classes[obj] + '.__' + obj + attr_str
-        elif obj in self.module_imports():
-            call_name = obj + "." + attr_name
-        elif obj[0] == obj[0].upper():  # XXX HACK ALERT
-            call_name = UU + self.modpfx() + "__" + obj + ".prototype.__class__." + attr_name
-        else:
-            call_name = UU+self._name(v, current_klass) + "." + attr_name
-
-        return call_name
-
-    def _getattr2(self, v, current_klass, attr_name):
-        if isinstance(v.expr, ast.Getattr):
-            call_name = self._getattr2(v.expr, current_klass, v.attrname + "." + attr_name)
-        elif isinstance(v.expr, ast.Name) and v.expr.name in self.module_imports():
-            call_name = UU+v.expr.name + '.__' + v.attrname+".prototype.__class__."+attr_name
-        else:
-            obj = self.expr(v.expr, current_klass)
-            call_name = obj + "." + v.attrname + "." + attr_name
-
-        return call_name
-
-    def _class(self, node):
-        """
-        Handle a class definition.
-
-        In order to translate python semantics reasonably well, the following
-        structure is used:
-
-        A special object is created for the class, which inherits attributes
-        from the superclass, or Object if there's no superclass.  This is the
-        class object; the object which you refer to when specifying the
-        class by name.  Static, class, and unbound methods are copied
-        from the superclass object.
-
-        A special constructor function is created with the same name as the
-        class, which is used to create instances of that class.
-
-        A javascript class (e.g. a function with a prototype attribute) is
-        created which is the javascript class of created instances, and
-        which inherits attributes from the class object. Bound methods are
-        copied from the superclass into this class rather than inherited,
-        because the class object contains unbound, class, and static methods
-        that we don't necessarily want to inherit.
-
-        The type of a method can now be determined by inspecting its
-        static_method, unbound_method, class_method, or instance_method
-        attribute; only one of these should be true.
-
-        Much of this work is done in pyjs_extend, is pyjslib.py
-        """
-        class_name = self.modpfx() + uuprefix(node.name, 1)
-        class_name_ = self.modpfx() + uuprefix(node.name)
-        current_klass = Klass(class_name, class_name_)
-        init_method = None
-        for child in node.code:
-            if isinstance(child, ast.Function):
-                current_klass.add_function(child.name)
-                if child.name == "__init__":
-                    init_method = child
-
-        if len(node.bases) == 0:
-            base_class = "pyjslib.__Object"
-        elif len(node.bases) == 1:
-            if isinstance(node.bases[0], ast.Name):
-                if node.bases[0].name in self.imported_classes:
-                    base_class_ = self.imported_classes[node.bases[0].name] + '.__' + node.bases[0].name
-                    base_class = self.imported_classes[node.bases[0].name] + '.' + node.bases[0].name
-                else:
-                    base_class_ = self.modpfx() + "__" + node.bases[0].name
-                    base_class = self.modpfx() + node.bases[0].name
-            elif isinstance(node.bases[0], ast.Getattr):
-                # the bases are not in scope of the class so do not
-                # pass our class to self._name
-                base_class_ = self._name(node.bases[0].expr, None) + \
-                             ".__" + node.bases[0].attrname
-                base_class = \
-                    self._name(node.bases[0].expr, None) + \
-                    "." + node.bases[0].attrname
-            else:
-                raise TranslationError("unsupported type (in _class)", node.bases[0])
-
-            current_klass.set_base(base_class)
-        else:
-            raise TranslationError("more than one base (in _class)", node)
-
-        self.printo(UU+class_name_ + " = function () {")
-        # call superconstructor
-        # if base_class:
-        #    self.printo("    __" + base_class + ".call(this);")
-        self.printo("}")
-
-        if not init_method:
-            init_method = ast.Function([], "__init__", ["self"], [], 0, None, [])
-            # self._method(init_method, current_klass, class_name)
-
-        # Generate a function which constructs the object
-        clsfunc = ast.Function(
-            [], node.name,
-            init_method.argnames[1:],
-            init_method.defaults,
-            init_method.flags,
-            None,
-            [ast.Discard(ast.CallFunc(ast.Name("JS"), [ast.Const(
-                #            I attempted lazy initialization, but then you can't access static class members
-                #            "    if(!__"+base_class+".__was_initialized__)"+
-                #            "        __" + class_name + "_initialize();\n" +
-                "    var instance = new " + UU + class_name_ + "();\n" +
-                "    if(instance.__init__) instance.__init__.apply(instance, arguments);\n" +
-                "    return instance;"
-            )]))])
-
-        self._function(clsfunc, False)
-        self.printo(UU+class_name_ + ".__initialize__ = function () {")
-        self.printo("    if("+UU+class_name_+".__was_initialized__) return;")
-        self.printo("    "+UU+class_name_+".__was_initialized__ = true;")
-        cls_obj = UU+class_name_ + '.prototype.__class__'
-
-        if class_name == "pyjslib.__Object":
-            self.printo("    "+cls_obj+" = {};")
-        else:
-            if base_class and base_class not in ("object", "pyjslib.__Object"):
-                self.printo("    if(!"+UU+base_class_+".__was_initialized__)")
-                self.printo("        "+UU+base_class_+".__initialize__();")
-                self.printo("    pyjs_extend(" + UU+class_name_ + ", "+UU+base_class_+");")
-            else:
-                self.printo("    pyjs_extend(" + UU+class_name_ + ", "+UU+"pyjslib.__Object);")
-
-        self.printo("    "+cls_obj+".__new__ = "+UU+class_name+";")
-        self.printo("    "+cls_obj+".__name__ = '"+UU+node.name+"';")
-
-        for child in node.code:
-            if isinstance(child, ast.Pass):
-                pass
-            elif isinstance(child, ast.Function):
-                self._method(child, current_klass, class_name, class_name_)
-            elif isinstance(child, ast.Assign):
-                self.classattr(child, current_klass)
-            elif isinstance(child, ast.Discard) and isinstance(child.expr, ast.Const):
-                # Probably a docstring, turf it
-                pass
-            else:
-                raise TranslationError("unsupported type (in _class)", child)
-        self.printo("}")
-
-        self.printo(class_name_+".__initialize__();")
-
-    def classattr(self, node, current_klass):
-        self._assign(node, current_klass, True)
-
-    def _raise(self, node, current_klass):
-        if node.expr2:
-            raise TranslationError("More than one expression unsupported",
-                                   node)
-        self.printo("throw (%s);" % self.expr(
-            node.expr1, current_klass))
-
-    def _method(self, node, current_klass, class_name, class_name_):
-        # reset global var scope
-        self.method_imported_globals = set()
-
-        arg_names = list(node.argnames)
-
-        classmethod = False
-        staticmethod = False
-        if node.decorators:
-            for d in node.decorators:
-                if d.name == "classmethod":
-                    classmethod = True
-                elif d.name == "staticmethod":
-                    staticmethod = True
-
-        if staticmethod:
-            staticfunc = ast.Function([], class_name_+"."+node.name, node.argnames, node.defaults, node.flags, node.doc, node.code, node.lineno)
-            self._function(staticfunc, True)
-            self.printo("    " + UU+class_name_ + ".prototype.__class__." + node.name + " = " + class_name_+"."+node.name+";")
-            self.printo("    " + UU+class_name_ + ".prototype.__class__." + node.name + ".static_method = true;")
-            return
-        else:
-            if len(arg_names) == 0:
-                raise TranslationError("methods must take an argument 'self' (in _method)", node)
-            self.method_self = arg_names[0]
-
-            # if not classmethod and arg_names[0] != "self":
-            #    raise TranslationError("first arg not 'self' (in _method)", node)
-
-        normal_arg_names = arg_names[1:]
-        if node.kwargs:
-            kwargname = normal_arg_names.pop()
-        if node.varargs:
-            varargname = normal_arg_names.pop()
-        declared_arg_names = list(normal_arg_names)
-        if node.kwargs:
-            declared_arg_names.append(kwargname)
-
-        function_args = "(" + ", ".join(declared_arg_names) + ")"
-
-        if classmethod:
-            fexpr = UU + class_name_ + ".prototype.__class__." + node.name
-        else:
-            fexpr = UU + class_name_ + ".prototype." + node.name
-        self.printo("    "+fexpr + " = function" + function_args + " {")
-
-        # default arguments
-        self._default_args_handler(node, normal_arg_names, current_klass)
-
-        local_arg_names = normal_arg_names + declared_arg_names
-
-        if node.varargs:
-            self._varargs_handler(node, varargname, declared_arg_names, current_klass)
-            local_arg_names.append(varargname)
-
-        # stack of local variable names for this function call
-        self.local_arg_stack.append(local_arg_names)
-
-        for child in node.code:
-            self._stmt(child, current_klass)
-
-        # remove the top local arg names
-        self.local_arg_stack.pop()
-
-        self.printo("    };")
-
-        self._kwargs_parser(node, fexpr, normal_arg_names, current_klass)
-
-        if classmethod:
-            # Have to create a version on the instances which automatically passes the
-            # class as "self"
-            altexpr = UU + class_name_ + ".prototype." + node.name
-            self.printo("    "+altexpr + " = function() {")
-            self.printo("        return " + fexpr + ".apply(this.__class__, arguments);")
-            self.printo("    };")
-            self.printo("    "+fexpr+".class_method = true;")
-            self.printo("    "+altexpr+".instance_method = true;")
-        else:
-            # For instance methods, we need an unbound version in the class object
-            altexpr = UU + class_name_ + ".prototype.__class__." + node.name
-            self.printo("    "+altexpr + " = function() {")
-            self.printo("        return " + fexpr + ".call.apply("+fexpr+", arguments);")
-            self.printo("    };")
-            self.printo("    "+altexpr+".unbound_method = true;")
-            self.printo("    "+fexpr+".instance_method = true;")
-            self.printo("    "+altexpr+".__name__ = '%s';" % node.name)
-
-        self.printo(UU + class_name_ + ".prototype.%s.__name__ = '%s';" %
-                    (node.name, node.name))
-
-        if node.kwargs or len(node.defaults):
-            self.printo("    "+altexpr + ".parse_kwargs = " + fexpr + ".parse_kwargs;")
-
-        self.method_self = None
-        self.method_imported_globals = set()
-
-    def _isNativeFunc(self, node):
-        if isinstance(node, ast.Discard):
-            if isinstance(node.expr, ast.CallFunc):
-                if isinstance(node.expr.node, ast.Name) and \
-                       node.expr.node.name == NATIVE_JS_FUNC_NAME:
-                    return True
-        return False
-
-    def _stmt(self, node, current_klass):
-        debugStmt = self.debug and not self._isNativeFunc(node)
-        if debugStmt:
-            self.printo('  try {')
-
-        if isinstance(node, ast.Return):
-            self._return(node, current_klass)
-        elif isinstance(node, ast.Break):
-            self._break(node, current_klass)
-        elif isinstance(node, ast.Continue):
-            self._continue(node, current_klass)
-        elif isinstance(node, ast.Assign):
-            self._assign(node, current_klass)
-        elif isinstance(node, ast.AugAssign):
-            self._augassign(node, current_klass)
-        elif isinstance(node, ast.Discard):
-            self._discard(node, current_klass)
-        elif isinstance(node, ast.If):
-            self._if(node, current_klass)
-        elif isinstance(node, ast.For):
-            self._for(node, current_klass)
-        elif isinstance(node, ast.While):
-            self._while(node, current_klass)
-        elif isinstance(node, ast.Subscript):
-            self._subscript_stmt(node, current_klass)
-        elif isinstance(node, ast.Global):
-            self._global(node, current_klass)
-        elif isinstance(node, ast.Pass):
-            pass
-        elif isinstance(node, ast.Function):
-            self._function(node, True)
-        elif isinstance(node, ast.Printnl):
-            self._print(node, current_klass)
-        elif isinstance(node, ast.Print):
-            self._print(node, current_klass)
-        elif isinstance(node, ast.TryExcept):
-            self._tryExcept(node, current_klass)
-        elif isinstance(node, ast.Raise):
-            self._raise(node, current_klass)
-        else:
-            raise TranslationError("unsupported type (in _stmt)", node)
-
-        if debugStmt:
-
-            lt = self.get_line_trace(node)
-            isHaltFunction = self.module_prefix + "IsHaltException"
-
-            out = (
-                '  } catch (__err) {',
-                '      if (' + isHaltFunction + '(__err.name)) {',
-                '          throw __err;',
-                '      } else {',
-                '          st = sys.printstack() + ' + '"%s"' % lt + "+ '\\n' ;"
-                '          alert("' + 'Error in ' + lt + '"' +
-                '+"\\n"+__err.name+": "+__err.message' +
-                '+"\\n\\nStack trace:\\n"' + '+st' + ');',
-                '          debugger;',
-                '          throw new ' + self.module_prefix + 'HaltException();',
-                '      }',
-                '  }'
-            )
-            for s in out:
-                self.printo(s)
-
-    def get_line_trace(self, node):
-        lineNum = "Unknown"
-        srcLine = ""
-        if hasattr(node, "lineno"):
-            if node.lineno is not None:
-                lineNum = node.lineno
-                srcLine = self.src[min(lineNum, len(self.src))-1]
-                srcLine = srcLine.replace('\\', '\\\\')
-                srcLine = srcLine.replace('"', '\\"')
-                srcLine = srcLine.replace("'", "\\'")
-
-        return self.raw_module_name + ".py, line " \
-            + str(lineNum) + ":"\
-            + "\\n" \
-            + "    " + srcLine
-
-    def _augassign(self, node, current_klass):
-        v = node.node
-        if isinstance(v, ast.Getattr):
-            # XXX HACK!  don't allow += on return result of getattr.
-            # TODO: create a temporary variable or something.
-            lhs = self._getattr(v, current_klass, False)
-        else:
-            lhs = self._name(node.node, current_klass)
-        op = node.op
-        rhs = self.expr(node.expr, current_klass)
-        self.printo("    " + lhs + " " + op + " " + rhs + ";")
-
-    def _assign(self, node, current_klass, top_level=False):
-        if len(node.nodes) != 1:
-            tempvar = '__temp'+str(node.lineno)
-            tnode = ast.Assign([ast.AssName(tempvar, "OP_ASSIGN", node.lineno)], node.expr, node.lineno)
-            self._assign(tnode, current_klass, top_level)
-            for v in node.nodes:
-                tnode2 = ast.Assign([v], ast.Name(tempvar, node.lineno), node.lineno)
-                self._assign(tnode2, current_klass, top_level)
-            return
-
-        local_var_names = None
-        if len(self.local_arg_stack) > 0:
-            local_var_names = self.local_arg_stack[-1]
-
-        def _lhsFromAttr(v, current_klass):
-            attr_name = v.attrname
-            if isinstance(v.expr, ast.Name):
-                lhs = self._name(v.expr, current_klass) + "." + attr_name
-            elif isinstance(v.expr, ast.Getattr):
-                lhs = self._getattr(v, current_klass)
-            elif isinstance(v.expr, ast.Subscript):
-                lhs = self._subscript(v.expr, current_klass) + "." + attr_name
-            else:
-                raise TranslationError("unsupported type (in _assign)", v.expr)
-            return lhs
-
-        def _lhsFromName(v, top_level, current_klass):
-            if top_level:
-                if current_klass:
-                    lhs = UU+current_klass.name_ + ".prototype.__class__." \
-                               + v.name
-                else:
-                    self.top_level_vars.add(v.name)
-                    vname = self.modpfx() + v.name
-                    if not self.modpfx() and v.name not in\
-                       self.method_imported_globals:
-                        lhs = "var " + vname
-                    else:
-                        lhs = UU + vname
-                    self.add_local_arg(v.name)
-            else:
-                if v.name in local_var_names:
-                    lhs = v.name
-                elif v.name in self.method_imported_globals:
-                    lhs = self.modpfx() + v.name
-                else:
-                    lhs = "var " + v.name
-                    self.add_local_arg(v.name)
-            return lhs
-
-        dbg = 0
-        v = node.nodes[0]
-        if isinstance(v, ast.AssAttr):
-            lhs = _lhsFromAttr(v, current_klass)
-            if v.flags == "OP_ASSIGN":
-                op = "="
-            else:
-                raise TranslationError("unsupported flag (in _assign)", v)
-
-        elif isinstance(v, ast.AssName):
-            lhs = _lhsFromName(v, top_level, current_klass)
-            if v.flags == "OP_ASSIGN":
-                op = "="
-            else:
-                raise TranslationError("unsupported flag (in _assign)", v)
-        elif isinstance(v, ast.Subscript):
-            if v.flags == "OP_ASSIGN":
-                obj = self.expr(v.expr, current_klass)
-                if len(v.subs) != 1:
-                    raise TranslationError("must have one sub (in _assign)", v)
-                idx = self.expr(v.subs[0], current_klass)
-                value = self.expr(node.expr, current_klass)
-                self.printo("    " + obj + ".__setitem__(" + idx + ", " + value + ");")
-                return
-            else:
-                raise TranslationError("unsupported flag (in _assign)", v)
-        elif isinstance(v, (ast.AssList, ast.AssTuple)):
-            uniqueID = self.nextTupleAssignID
-            self.nextTupleAssignID += 1
-            tempName = "__tupleassign" + str(uniqueID) + "__"
-            self.printo("    var " + tempName + " = " + self.expr(node.expr, current_klass) + ";")
-            for index, child in enumerate(v.getChildNodes()):
-                rhs = tempName + ".__getitem__(" + str(index) + ")"
-
-                if isinstance(child, ast.AssAttr):
-                    lhs = _lhsFromAttr(child, current_klass)
-                elif isinstance(child, ast.AssName):
-                    lhs = _lhsFromName(child, top_level, current_klass)
-                elif isinstance(child, ast.Subscript):
-                    if child.flags == "OP_ASSIGN":
-                        obj = self.expr(child.expr, current_klass)
-                        if len(child.subs) != 1:
-                            raise TranslationError("must have one sub " +
-                                                   "(in _assign)", child)
-                        idx = self.expr(child.subs[0], current_klass)
-                        value = self.expr(node.expr, current_klass)
-                        self.printo("    " + obj + ".__setitem__(" + idx + ", " + rhs + ");")
-                        continue
-                self.printo("    " + lhs + " = " + rhs + ";")
-            return
-        else:
-            raise TranslationError("unsupported type (in _assign)", v)
-
-        rhs = self.expr(node.expr, current_klass)
-        if dbg:
-            print("b", repr(node.expr), rhs)
-        self.printo("    " + lhs + " " + op + " " + rhs + ";")
-
-    def _discard(self, node, current_klass):
-
-        if isinstance(node.expr, ast.CallFunc):
-            debugStmt = self.debug and not self._isNativeFunc(node)
-            if debugStmt and isinstance(node.expr.node, ast.Name) and \
-               node.expr.node.name == 'import_wait':
-                debugStmt = False
-            if debugStmt:
-                st = self.get_line_trace(node)
-                self.printo("sys.addstack('%s');\n" % st)
-            if isinstance(node.expr.node, ast.Name) and node.expr.node.name == NATIVE_JS_FUNC_NAME:
-                if len(node.expr.args) != 1:
-                    raise TranslationError("native javascript function %s must have one arg" % NATIVE_JS_FUNC_NAME, node.expr)
-                if not isinstance(node.expr.args[0], ast.Const):
-                    raise TranslationError("native javascript function %s must have constant arg" % NATIVE_JS_FUNC_NAME, node.expr)
-                raw_js = node.expr.args[0].value
-                self.printo(raw_js)
-            else:
-                expr = self._callfunc(node.expr, current_klass)
-                self.printo("    " + expr + ";")
-
-            if debugStmt:
-                self.printo("sys.popstack();\n")
-
-        elif isinstance(node.expr, ast.Const):
-            if node.expr.value is not None:  # Empty statements generate ignore None
-                self.printo(self._const(node.expr))
-        else:
-            raise TranslationError("unsupported type (in _discard)", node.expr)
-
-    def _if(self, node, current_klass):
-        for i in range(len(node.tests)):
-            test, consequence = node.tests[i]
-            if i == 0:
-                keyword = "if"
-            else:
-                keyword = "else if"
-
-            self._if_test(keyword, test, consequence, current_klass)
-
-        if node.else_:
-            keyword = "else"
-            test = None
-            consequence = node.else_
-
-            self._if_test(keyword, test, consequence, current_klass)
-
-    def _if_test(self, keyword, test, consequence, current_klass):
-        if test:
-            expr = self.expr(test, current_klass)
-
-            self.printo("    " + keyword + " (pyjslib.bool(" + expr + ")) {")
-        else:
-            self.printo("    " + keyword + " {")
-
-        if isinstance(consequence, ast.Stmt):
-            for child in consequence.nodes:
-                self._stmt(child, current_klass)
-        else:
-            raise TranslationError("unsupported type (in _if_test)", consequence)
-
-        self.printo("    }")
-
-    def _from(self, node):
-        for name in node.names:
-            # look up "hack" in AppTranslator as to how findFile gets here
-            module_name = node.modname + "." + name[0]
-            try:
-                ff = self.findFile(module_name + ".py")
-            except Exception:
-                ff = None
-            if ff:
-                self.add_imported_module(module_name)
-            else:
-                self.imported_classes[name[0]] = node.modname
-
-    def _compare(self, node, current_klass):
-        lhs = self.expr(node.expr, current_klass)
-
-        if len(node.ops) != 1:
-            raise TranslationError("only one ops supported (in _compare)", node)
-
-        op = node.ops[0][0]
-        rhs_node = node.ops[0][1]
-        rhs = self.expr(rhs_node, current_klass)
-
-        if op == "==":
-            return "pyjslib.eq(%s, %s)" % (lhs, rhs)
-        if op == "in":
-            return rhs + ".__contains__(" + lhs + ")"
-        elif op == "not in":
-            return "!" + rhs + ".__contains__(" + lhs + ")"
-        elif op == "is":
-            op = "==="
-        elif op == "is not":
-            op = "!=="
-
-        return "(" + lhs + " " + op + " " + rhs + ")"
-
-    def _not(self, node, current_klass):
-        expr = self.expr(node.expr, current_klass)
-
-        return "!(" + expr + ")"
-
-    def _or(self, node, current_klass):
-        expr = "("+(") || (".join([self.expr(child, current_klass) for child in node.nodes]))+')'
-        return expr
-
-    def _and(self, node, current_klass):
-        expr = "("+(") && (".join([self.expr(child, current_klass) for child in node.nodes]))+")"
-        return expr
-
-    def _for(self, node, current_klass):
-        assign_name = ""
-        assign_tuple = ""
-
-        # based on Bob Ippolito's Iteration in Javascript code
-        if isinstance(node.assign, ast.AssName):
-            assign_name = node.assign.name
-            self.add_local_arg(assign_name)
-            if node.assign.flags == "OP_ASSIGN":
-                op = "="
-        elif isinstance(node.assign, ast.AssTuple):
-            op = "="
-            i = 0
-            for child in node.assign:
-                child_name = child.name
-                if assign_name == "":
-                    assign_name = "temp_" + child_name
-                self.add_local_arg(child_name)
-                assign_tuple += """
-                var %(child_name)s %(op)s %(assign_name)s.__getitem__(%(i)i);
-                """ % locals()
-                i += 1
-        else:
-            raise TranslationError("unsupported type (in _for)", node.assign)
-
-        if isinstance(node.list, ast.Name):
-            list_expr = self._name(node.list, current_klass)
-        elif isinstance(node.list, ast.Getattr):
-            list_expr = self._getattr(node.list, current_klass)
-        elif isinstance(node.list, ast.CallFunc):
-            list_expr = self._callfunc(node.list, current_klass)
-        else:
-            raise TranslationError("unsupported type (in _for)", node.list)
-
-        lhs = "var " + assign_name
-        iterator_name = "__" + assign_name
-
-        loc_dict = {
-            "iterator_name": iterator_name,
-            "list_expr": list_expr,
-            "lhs": lhs,
-            "op": op,
-            "assign_tuple": assign_tuple,
-        }
-
-        self.printo("""
-        var %(iterator_name)s = %(list_expr)s.__iter__();
-        try {
-            while (true) {
-                %(lhs)s %(op)s %(iterator_name)s.next();
-                %(assign_tuple)s
-        """ % loc_dict)
-        for n in node.body.nodes:
-            self._stmt(n, current_klass)
-        self.printo("""
-            }
-        } catch (e) {
-            if (e.__name__ != pyjslib.StopIteration.__name__) {
-                throw e;
-            }
-        }
-        """)
-
-    def _while(self, node, current_klass):
-        test = self.expr(node.test, current_klass)
-        self.printo("    while (pyjslib.bool(" + test + ")) {")
-        if isinstance(node.body, ast.Stmt):
-            for child in node.body.nodes:
-                self._stmt(child, current_klass)
-        else:
-            raise TranslationError("unsupported type (in _while)", node.body)
-        self.printo("    }")
-
-    def _const(self, node):
-        if isinstance(node.value, int):
-            return str(node.value)
-        elif isinstance(node.value, float):
-            return str(node.value)
-        elif isinstance(node.value, basestring):
-            v = node.value
-            if isinstance(node.value, text):
-                v = v.encode('utf-8')
-            return "String('%s')" % escapejs(v)
-        elif node.value is None:
-            return "null"
-        else:
-            raise TranslationError("unsupported type (in _const)", node)
-
-    def _unaryadd(self, node, current_klass):
-        return self.expr(node.expr, current_klass)
-
-    def _unarysub(self, node, current_klass):
-        return "-" + self.expr(node.expr, current_klass)
-
-    def _add(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " + " + self.expr(node.right, current_klass)
-
-    def _sub(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " - " + self.expr(node.right, current_klass)
-
-    def _div(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " / " + self.expr(node.right, current_klass)
-
-    def _mul(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " * " + self.expr(node.right, current_klass)
-
-    def _mod(self, node, current_klass):
-        if isinstance(node.left, ast.Const) and isinstance(node.left.value, str):
-            self.imported_js.add("sprintf.js")  # Include the sprintf functionality if it is used
-            return "sprintf("+self.expr(node.left, current_klass) + ", " + self.expr(node.right, current_klass)+")"
-        return self.expr(node.left, current_klass) + " % " + self.expr(node.right, current_klass)
-
-    def _invert(self, node, current_klass):
-        return "~" + self.expr(node.expr, current_klass)
-
-    def _bitand(self, node, current_klass):
-        return " & ".join([self.expr(child, current_klass) for child in node.nodes])
-
-    def _bitshiftleft(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " << " + self.expr(node.right, current_klass)
-
-    def _bitshiftright(self, node, current_klass):
-        return self.expr(node.left, current_klass) + " >>> " + self.expr(node.right, current_klass)
-
-    def _bitxor(self, node, current_klass):
-        return " ^ ".join([self.expr(child, current_klass) for child in node.nodes])
-
-    def _bitor(self, node, current_klass):
-        return " | ".join([self.expr(child, current_klass) for child in node.nodes])
-
-    def _subscript(self, node, current_klass):
-        if node.flags == "OP_APPLY":
-            if len(node.subs) == 1:
-                return self.expr(node.expr, current_klass) + ".__getitem__(" + self.expr(node.subs[0], current_klass) + ")"
-            else:
-                raise TranslationError("must have one sub (in _subscript)", node)
-        else:
-            raise TranslationError("unsupported flag (in _subscript)", node)
-
-    def _subscript_stmt(self, node, current_klass):
-        if node.flags == "OP_DELETE":
-            self.printo("    " + self.expr(node.expr, current_klass) + ".__delitem__(" + self.expr(node.subs[0], current_klass) + ");")
-        else:
-            raise TranslationError("unsupported flag (in _subscript)", node)
-
-    def _list(self, node, current_klass):
-        return "new pyjslib.List([" + ", ".join([self.expr(x, current_klass) for x in node.nodes]) + "])"
-
-    def _dict(self, node, current_klass):
-        items = []
-        for x in node.items:
-            key = self.expr(x[0], current_klass)
-            value = self.expr(x[1], current_klass)
-            items.append("[" + key + ", " + value + "]")
-        return "new pyjslib.Dict([" + ", ".join(items) + "])"
-
-    def _tuple(self, node, current_klass):
-        return "new pyjslib.Tuple([" + ", ".join([self.expr(x, current_klass) for x in node.nodes]) + "])"
-
-    def _lambda(self, node, current_klass):
-        if node.varargs:
-            raise TranslationError("varargs are not supported in Lambdas", node)
-        if node.kwargs:
-            raise TranslationError("kwargs are not supported in Lambdas", node)
-        res = cStringIO()
-        arg_names = list(node.argnames)
-        function_args = ", ".join(arg_names)
-        for child in node.getChildNodes():
-            expr = self.expr(child, None)
-        print("function (%s){" % function_args, file=res)
-        self._default_args_handler(node, arg_names, None,
-                                   output=res)
-        print('return %s;}' % expr, file=res)
-        return res.getvalue()
-
-    def _slice(self, node, current_klass):
-        if node.flags == "OP_APPLY":
-            lower = "null"
-            upper = "null"
-            if node.lower is not None:
-                lower = self.expr(node.lower, current_klass)
-            if node.upper is not None:
-                upper = self.expr(node.upper, current_klass)
-            return "pyjslib.slice(" + self.expr(node.expr, current_klass) + ", " + lower + ", " + upper + ")"
-        else:
-            raise TranslationError("unsupported flag (in _slice)", node)
-
-    def _global(self, node, current_klass):
-        for name in node.names:
-            self.method_imported_globals.add(name)
-
-    def expr(self, node, current_klass):
-        if isinstance(node, ast.Const):
-            return self._const(node)
-        # @@@ not sure if the parentheses should be here or in individual operator functions - JKT
-        elif isinstance(node, ast.Mul):
-            return " ( " + self._mul(node, current_klass) + " ) "
-        elif isinstance(node, ast.Add):
-            return " ( " + self._add(node, current_klass) + " ) "
-        elif isinstance(node, ast.Sub):
-            return " ( " + self._sub(node, current_klass) + " ) "
-        elif isinstance(node, ast.Div):
-            return " ( " + self._div(node, current_klass) + " ) "
-        elif isinstance(node, ast.Mod):
-            return self._mod(node, current_klass)
-        elif isinstance(node, ast.UnaryAdd):
-            return self._unaryadd(node, current_klass)
-        elif isinstance(node, ast.UnarySub):
-            return self._unarysub(node, current_klass)
-        elif isinstance(node, ast.Not):
-            return self._not(node, current_klass)
-        elif isinstance(node, ast.Or):
-            return self._or(node, current_klass)
-        elif isinstance(node, ast.And):
-            return self._and(node, current_klass)
-        elif isinstance(node, ast.Invert):
-            return self._invert(node, current_klass)
-        elif isinstance(node, ast.Bitand):
-            return "("+self._bitand(node, current_klass)+")"
-        elif isinstance(node, ast.LeftShift):
-            return self._bitshiftleft(node, current_klass)
-        elif isinstance(node, ast.RightShift):
-            return self._bitshiftright(node, current_klass)
-        elif isinstance(node, ast.Bitxor):
-            return "("+self._bitxor(node, current_klass)+")"
-        elif isinstance(node, ast.Bitor):
-            return "("+self._bitor(node, current_klass)+")"
-        elif isinstance(node, ast.Compare):
-            return self._compare(node, current_klass)
-        elif isinstance(node, ast.CallFunc):
-            return self._callfunc(node, current_klass)
-        elif isinstance(node, ast.Name):
-            return self._name(node, current_klass)
-        elif isinstance(node, ast.Subscript):
-            return self._subscript(node, current_klass)
-        elif isinstance(node, ast.Getattr):
-            return self._getattr(node, current_klass)
-        elif isinstance(node, ast.List):
-            return self._list(node, current_klass)
-        elif isinstance(node, ast.Dict):
-            return self._dict(node, current_klass)
-        elif isinstance(node, ast.Tuple):
-            return self._tuple(node, current_klass)
-        elif isinstance(node, ast.Slice):
-            return self._slice(node, current_klass)
-        elif isinstance(node, ast.Lambda):
-            return self._lambda(node, current_klass)
-        else:
-            raise TranslationError("unsupported type (in expr)", node)
-
-
-def translate(file_name, module_name, debug=False):
-    f = open(file_name, "r")
-    src = f.read()
-    f.close()
-    output = cStringIO()
-    mod = compiler.parseFile(file_name)
-    Translator(module_name, module_name, module_name, src, debug, mod, output)
-    return output.getvalue()
-
-
-class PlatformParser(object):
-    def __init__(self, platform_dir="", verbose=True):
-        self.platform_dir = platform_dir
-        self.parse_cache = {}
-        self.platform = ""
-        self.verbose = verbose
-
-    def setPlatform(self, platform):
-        self.platform = platform
-
-    def parseModule(self, module_name, file_name):
-
-        importing = False
-        if file_name not in self.parse_cache:
-            importing = True
-            mod = compiler.parseFile(file_name)
-            self.parse_cache[file_name] = mod
-        else:
-            mod = self.parse_cache[file_name]
-
-        override = False
-        platform_file_name = self.generatePlatformFilename(file_name)
-        if self.platform and os.path.isfile(platform_file_name):
-            mod = copy.deepcopy(mod)
-            mod_override = compiler.parseFile(platform_file_name)
-            self.merge(mod, mod_override)
-            override = True
-
-        if self.verbose:
-            if override:
-                print("Importing %s (Platform %s)" % (module_name, self.platform))
-            elif importing:
-                print("Importing %s" % (module_name))
-
-        return mod, override
-
-    def generatePlatformFilename(self, file_name):
-        (module_name, extension) = os.path.splitext(os.path.basename(file_name))
-        platform_file_name = module_name + self.platform + extension
-
-        return os.path.join(os.path.dirname(file_name), self.platform_dir, platform_file_name)
-
-    def merge(self, tree1, tree2):
-        for child in tree2.node:
-            if isinstance(child, ast.Function):
-                self.replaceFunction(tree1, child.name, child)
-            elif isinstance(child, ast.Class):
-                self.replaceClassMethods(tree1, child.name, child)
-
-        return tree1
-
-    def replaceFunction(self, tree, function_name, function_node):
-        # find function to replace
-        for child in tree.node:
-            if isinstance(child, ast.Function) and child.name == function_name:
-                self.copyFunction(child, function_node)
-                return
-        raise TranslationError("function not found: " + function_name, function_node)
-
-    def replaceClassMethods(self, tree, class_name, class_node):
-        # find class to replace
-        old_class_node = None
-        for child in tree.node:
-            if isinstance(child, ast.Class) and child.name == class_name:
-                old_class_node = child
-                break
-
-        if not old_class_node:
-            raise TranslationError("class not found: " + class_name, class_node)
-
-        # replace methods
-        for function_node in class_node.code:
-            if isinstance(function_node, ast.Function):
-                found = False
-                for child in old_class_node.code:
-                    if isinstance(child, ast.Function) and child.name == function_node.name:
-                        found = True
-                        self.copyFunction(child, function_node)
-                        break
-
-                if not found:
-                    raise TranslationError("class method not found: " + class_name + "." + function_node.name, function_node)
-
-    def copyFunction(self, target, source):
-        target.code = source.code
-        target.argnames = source.argnames
-        target.defaults = source.defaults
-        target.doc = source.doc  # @@@ not sure we need to do this any more
-
-
-def dotreplace(fname):
-    path, ext = os.path.splitext(fname)
-    return path.replace(".", "/") + ext
-
-
-class AppTranslator(object):
-
-    def __init__(self, library_dirs=None, parser=None, dynamic=False,
-                 optimize=False, verbose=True):
-        self.extension = ".py"
-        self.optimize = optimize
-        self.library_modules = []
-        self.overrides = {}
-        library_dirs = [] if library_dirs is None else library_dirs
-        self.library_dirs = path + library_dirs
-        self.dynamic = dynamic
-        self.verbose = verbose
-
-        if not parser:
-            self.parser = PlatformParser()
-        else:
-            self.parser = parser
-
-        self.parser.dynamic = dynamic
-
-    def findFile(self, file_name):
-        if os.path.isfile(file_name):
-            return file_name
-
-        for library_dir in self.library_dirs:
-            file_name = dotreplace(file_name)
-            full_file_name = os.path.join(
-                os.path.abspath(os.path.dirname(__file__)), library_dir, file_name)
-            if os.path.isfile(full_file_name):
-                return full_file_name
-
-            fnameinit, _ext = os.path.splitext(file_name)
-            fnameinit = fnameinit + "/__init__.py"
-
-            full_file_name = os.path.join(
-                os.path.abspath(os.path.dirname(__file__)), library_dir, fnameinit)
-            if os.path.isfile(full_file_name):
-                return full_file_name
-
-        raise Exception("file not found: " + file_name)
-
-    def _translate(self, module_name, is_app=True, debug=False,
-                   imported_js=None):
-        if module_name not in self.library_modules:
-            self.library_modules.append(module_name)
-
-        file_name = self.findFile(module_name + self.extension)
-
-        output = cStringIO()
-
-        f = open(file_name, "r")
-        src = f.read()
-        f.close()
-
-        mod, override = self.parser.parseModule(module_name, file_name)
-        if override:
-            override_name = "%s.%s" % (self.parser.platform.lower(),
-                                       module_name)
-            self.overrides[override_name] = override_name
-        if is_app:
-            mn = '__main__'
-        else:
-            mn = module_name
-        t = Translator(mn, module_name, module_name,
-                       src, debug, mod, output, self.dynamic, self.optimize,
-                       self.findFile)
-
-        module_str = output.getvalue()
-        if imported_js is None:
-            imported_js = set()
-        imported_js.update(set(t.imported_js))
-        imported_modules_str = ""
-        for module in t.imported_modules:
-            if module not in self.library_modules:
-                self.library_modules.append(module)
-                # imported_js.update(set(t.imported_js))
-                # imported_modules_str += self._translate(
-                #    module, False, debug=debug, imported_js=imported_js)
-
-        return imported_modules_str + module_str
-
-    def translate(self, module_name, is_app=True, debug=False,
-                  library_modules=None):
-        app_code = cStringIO()
-        lib_code = cStringIO()
-        imported_js = set()
-        self.library_modules = []
-        self.overrides = {}
-        if library_modules is not None:
-            for library in library_modules:
-                if library.endswith(".js"):
-                    imported_js.add(library)
-                    continue
-                self.library_modules.append(library)
-                if self.verbose:
-                    print('Including LIB', library)
-                print('\n//\n// BEGIN LIB '+library+'\n//\n', file=lib_code)
-                print(self._translate(library, False, debug=debug, imported_js=imported_js),
-                      file=lib_code)
-
-                print("/* initialize static library */", file=lib_code)
-                print("%s%s();\n" % (UU, library), file=lib_code)
-
-                print('\n//\n// END LIB '+library+'\n//\n', file=lib_code)
-        if module_name:
-            print(self._translate(module_name, is_app, debug=debug, imported_js=imported_js),
-                  file=app_code)
-        for js in imported_js:
-            path = self.findFile(js)
-            if os.path.isfile(path):
-                if self.verbose:
-                    print('Including JS', js)
-                print('\n//\n// BEGIN JS '+js+'\n//\n', file=lib_code)
-                print(open(path).read(), file=lib_code)
-                print('\n//\n// END JS '+js+'\n//\n', file=lib_code)
-            else:
-                print('Warning: Unable to find imported javascript:', js, file=sys.stderr)
-        return lib_code.getvalue(), app_code.getvalue()
-
-
-usage = """
-  usage: %s file_name [module_name]
-"""
-
-
-def main():
-    if len(sys.argv) < 2:
-        print(usage % sys.argv[0], file=sys.stderr)
-        sys.exit(1)
-    file_name = os.path.abspath(sys.argv[1])
-    if not os.path.isfile(file_name):
-        print("File not found %s" % file_name, file=sys.stderr)
-        sys.exit(1)
-    if len(sys.argv) > 2:
-        module_name = sys.argv[2]
-    else:
-        module_name = None
-    print(translate(file_name, module_name), end="")
-
-
-if __name__ == "__main__":
-    main()
--- a/svgui/svgui.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-# Copyright (C) 2017: Andrey Skvortsov
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-
-from __future__ import absolute_import
-import os
-import shutil
-
-import wx
-from svgui.pyjs import translate
-
-import util.paths as paths
-from POULibrary import POULibrary
-from docutil import open_svg
-from py_ext import PythonFileCTNMixin
-
-
-class SVGUILibrary(POULibrary):
-    def GetLibraryPath(self):
-        return paths.AbsNeighbourFile(__file__, "pous.xml")
-
-
-class SVGUI(PythonFileCTNMixin):
-
-    ConfNodeMethods = [
-        {
-            "bitmap":    "ImportSVG",
-            "name":    _("Import SVG"),
-            "tooltip": _("Import SVG"),
-            "method":   "_ImportSVG"
-        },
-        {
-            "bitmap":    "ImportSVG",  # should be something different
-            "name":    _("Inkscape"),
-            "tooltip": _("Create HMI"),
-            "method":   "_StartInkscape"
-        },
-    ]
-
-    def _getSVGpath(self, project_path=None):
-        if project_path is None:
-            project_path = self.CTNPath()
-        # define name for SVG file containing gui layout
-        return os.path.join(project_path, "gui.svg")
-
-    def _getSVGUIserverpath(self):
-        return paths.AbsNeighbourFile(__file__, "svgui_server.py")
-
-    def OnCTNSave(self, from_project_path=None):
-        if from_project_path is not None:
-            shutil.copyfile(self._getSVGpath(from_project_path),
-                            self._getSVGpath())
-        return PythonFileCTNMixin.OnCTNSave(self, from_project_path)
-
-    def CTNGenerate_C(self, buildpath, locations):
-        """
-        Return C code generated by iec2c compiler
-        when _generate_softPLC have been called
-        @param locations: ignored
-        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
-        """
-
-        current_location = self.GetCurrentLocation()
-        # define a unique name for the generated C file
-        location_str = "_".join(map(str, current_location))
-
-        res = ([], "", False)
-
-        svgfile = self._getSVGpath()
-        if os.path.exists(svgfile):
-            res += (("gui.svg", open(svgfile, "rb")),)
-
-        svguiserverfile = open(self._getSVGUIserverpath(), 'r')
-        svguiservercode = svguiserverfile.read()
-        svguiserverfile.close()
-
-        svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
-        svguilibfile = open(svguilibpath, 'w')
-        fpath = paths.AbsDir(__file__)
-        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "sys.py"), "sys"))
-        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "_pyjs.js"), 'r').read())
-        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "pyjslib.py"), "pyjslib"))
-        svguilibfile.write(translate(os.path.join(fpath, "svguilib.py"), "svguilib"))
-        svguilibfile.write("pyjslib();\nsvguilib();\n")
-        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "json.js"), 'r').read())
-        svguilibfile.write(open(os.path.join(fpath, "livesvg.js"), 'r').read())
-        svguilibfile.close()
-        jsmodules = {"LiveSVGPage": "svguilib.js"}
-        res += (("svguilib.js", open(svguilibpath, "rb")),)
-
-        runtimefile_path = os.path.join(buildpath, "runtime_%s.py" % location_str)
-        runtimefile = open(runtimefile_path, 'w')
-        runtimefile.write(svguiservercode % {"svgfile": "gui.svg"})
-        runtimefile.write("""
-def _runtime_%(location)s_start():
-    website.LoadHMI(%(svgui_class)s, %(jsmodules)s)
-
-def _runtime_%(location)s_stop():
-    website.UnLoadHMI()
-
-        """ % {"location": location_str,
-               "svgui_class": "SVGUI_HMI",
-               "jsmodules": str(jsmodules)})
-        runtimefile.close()
-
-        res += (("runtime_%s.py" % location_str, open(runtimefile_path, "rb")),)
-
-        return res
-
-    def _ImportSVG(self):
-        dialog = wx.FileDialog(self.GetCTRoot().AppFrame, _("Choose a SVG file"), os.getcwd(), "",  _("SVG files (*.svg)|*.svg|All files|*.*"), wx.OPEN)
-        if dialog.ShowModal() == wx.ID_OK:
-            svgpath = dialog.GetPath()
-            if os.path.isfile(svgpath):
-                shutil.copy(svgpath, self._getSVGpath())
-            else:
-                self.GetCTRoot().logger.write_error(_("No such SVG file: %s\n") % svgpath)
-        dialog.Destroy()
-
-    def _StartInkscape(self):
-        svgfile = self._getSVGpath()
-        open_inkscape = True
-        if not self.GetCTRoot().CheckProjectPathPerm():
-            dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
-                                      _("You don't have write permissions.\nOpen Inkscape anyway ?"),
-                                      _("Open Inkscape"),
-                                      wx.YES_NO | wx.ICON_QUESTION)
-            open_inkscape = dialog.ShowModal() == wx.ID_YES
-            dialog.Destroy()
-        if open_inkscape:
-            if not os.path.isfile(svgfile):
-                svgfile = None
-            open_svg(svgfile)
--- a/svgui/svgui_server.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-
-from __future__ import absolute_import
-import os
-from builtins import str as text
-
-from nevow import tags, loaders
-import simplejson as json  # pylint: disable=import-error
-import runtime.NevowServer as NS
-
-svgfile = '%(svgfile)s'
-
-svguiWidgets = {}
-
-currentId = 0
-
-
-def getNewId():
-    global currentId
-    currentId += 1
-    return currentId
-
-
-class SvguiWidget(object):
-
-    def __init__(self, classname, id, **kwargs):
-        self.classname = classname
-        self.id = id
-        self.attrs = kwargs.copy()
-        self.inputs = {}
-        self.outputs = {}
-        self.inhibit = False
-        self.changed = False
-
-    def setinput(self, attrname, value):
-        self.inputs[attrname] = value
-
-    def getinput(self, attrname, default=None):
-        if attrname not in self.inputs:
-            self.inputs[attrname] = default
-        return self.inputs[attrname]
-
-    def setoutput(self, attrname, value):
-        if self.outputs.get(attrname) != value:
-            self.outputs[attrname] = value
-            self.changed = True
-            self.RefreshInterface()
-
-    def updateoutputs(self, **kwargs):
-        for attrname, value in kwargs.iteritems():
-            if self.outputs.get(attrname) != value:
-                self.outputs[attrname] = value
-                self.changed = True
-        self.RefreshInterface()
-
-    def RefreshInterface(self):
-        interface = website.getHMI()
-        if isinstance(interface, SVGUI_HMI) and self.changed and not self.inhibit:
-            self.changed = False
-            d = interface.sendData(self)
-            if d is not None:
-                self.inhibit = True
-                d.addCallback(self.InterfaceRefreshed)
-
-    def InterfaceRefreshed(self, result):
-        self.inhibit = False
-        if self.changed:
-            self.RefreshInterface()
-
-
-def get_object_init_state(obj):
-    # Convert objects to a dictionary of their representation
-    attrs = obj.attrs.copy()
-    attrs.update(obj.inputs)
-    d = {
-        '__class__': obj.classname,
-        'id': obj.id,
-        'kwargs': json.dumps(attrs),
-    }
-    return d
-
-
-def get_object_current_state(obj):
-    # Convert objects to a dictionary of their representation
-    d = {
-        '__class__': obj.classname,
-        'id': obj.id,
-        'kwargs': json.dumps(obj.outputs),
-    }
-    return d
-
-
-class SVGUI_HMI(website.PLCHMI):
-    jsClass = u"LiveSVGPage.LiveSVGWidget"
-
-    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
-        tags.xml(loaders.xmlfile(os.path.join(NS.WorkingDir, svgfile))),
-    ])
-
-    def HMIinitialisation(self):
-        gadgets = []
-        for gadget in svguiWidgets.values():
-            gadgets.append(text(json.dumps(gadget, default=get_object_init_state, indent=2), 'ascii'))
-        d = self.callRemote('init', gadgets)
-        d.addCallback(self.HMIinitialised)
-
-    def sendData(self, data):
-        if self.initialised:
-            return self.callRemote('receiveData', text(json.dumps(data, default=get_object_current_state, indent=2), 'ascii'))
-        return None
-
-    def setattr(self, id, attrname, value):
-        svguiWidgets[id].setinput(attrname, value)
-
-
-def createSVGUIControl(*args, **kwargs):
-    id = getNewId()
-    gad = SvguiWidget(args[0], id, **kwargs)
-    svguiWidgets[id] = gad
-    gadget = [text(json.dumps(gad, default=get_object_init_state, indent=2), 'ascii')]
-    interface = website.getHMI()
-    if isinstance(interface, SVGUI_HMI) and interface.initialised:
-        interface.callRemote('init', gadget)
-    return id
-
-
-def setAttr(id, attrname, value):
-    gad = svguiWidgets.get(id, None)
-    if gad is not None:
-        gad.setoutput(attrname, value)
-
-
-def updateAttr(id, **kwargs):
-    gad = svguiWidgets.get(id, None)
-    if gad is not None:
-        gad.updateoutput(**kwargs)
-
-
-def getAttr(id, attrname, default=None):
-    gad = svguiWidgets.get(id, None)
-    if gad is not None:
-        return gad.getinput(attrname, default)
-    return default
--- a/svgui/svguilib.py	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-
-# pylint: disable=old-style-class,undefined-variable
-
-
-class button:
-
-    def __init__(self, parent, id, args):
-        self.parent = parent
-        self.id = id
-        self.back_elt = getSVGElementById(args.back_id)
-        self.sele_elt = getSVGElementById(args.sele_id)
-        self.toggle = args.toggle
-        self.active = args.active
-        if args.state != undefined:
-            self.state = args.state
-        else:
-            self.state = False
-        self.dragging = False
-        if self.toggle:
-            self.up = not self.state
-        else:
-            self.up = True
-
-        # Add event on each element of the button
-        if self.active:
-            self.back_elt.addEventListener("mouseup", self, False)
-            self.back_elt.addEventListener("mousedown", self, False)
-            self.back_elt.addEventListener("mouseover", self, False)
-            self.back_elt.addEventListener("mouseout", self, False)
-
-            self.sele_elt.addEventListener("mouseup", self, False)
-            self.sele_elt.addEventListener("mousedown", self, False)
-            self.sele_elt.addEventListener("mouseover", self, False)
-            self.sele_elt.addEventListener("mouseout", self, False)
-
-        blockSVGElementDrag(self.back_elt)
-        blockSVGElementDrag(self.sele_elt)
-
-        self.updateElements()
-
-    # method to display the current state of interface
-    def updateElements(self):
-        if self.up:
-            self.sele_elt.setAttribute("display", "none")
-            self.back_elt.removeAttribute("display")
-        else:
-            self.sele_elt.removeAttribute("display")
-            self.back_elt.setAttribute("display", "none")
-
-    def updateValues(self, values):
-        if values.state != self.state:
-            self.state = values.state
-            self.up = not self.state
-            if self.toggle:
-                updateAttr(self.id, 'state', self.state)
-            self.updateElements()
-
-    def handleEvent(self, evt):
-        # Quand le bouton de la souris est presse
-        if evt.type == "mousedown":
-            evt.stopPropagation()
-            setCurrentObject(self)
-
-            self.dragging = True
-
-            if self.toggle:
-                self.up = self.state
-            else:
-                self.up = False
-                self.state = True
-                updateAttr(self.id, 'state', self.state)
-            self.updateElements()
-
-        if isCurrentObject(self) and self.dragging:
-            # Quand le bouton est survole
-            if evt.type == "mouseover" and self.toggle:
-                self.up = self.state
-                self.updateElements()
-
-            # Quand le curseur quitte la zone du bouton
-            elif evt.type == "mouseout" and self.toggle:
-                self.up = not self.state
-                self.updateElements()
-
-            # Quand le bouton de la souris est relache
-            elif evt.type == "mouseup":
-                evt.stopPropagation()
-                if self.toggle and self.up == self.state:
-                    self.state = not self.state
-                    updateAttr(self.id, 'state', self.state)
-                elif not self.toggle:
-                    self.up = True
-                    self.state = False
-                    updateAttr(self.id, 'state', self.state)
-                    self.updateElements()
-                self.dragging = False
-
-
-class textControl:
-
-    def __init__(self, parent, id, args):
-        self.parent = parent
-        self.id = id
-        self.back_elt = getSVGElementById(args.back_id)
-        if args.text != undefined:
-            self.text = args.text
-        else:
-            self.text = ""
-        self.updateElements()
-
-    def updateValues(self, values):
-        if values.text != self.value:
-            self.text = values.text
-            updateAttr(self.id, 'text', self.text)
-            self.updateElements()
-
-    def updateElements(self):
-        self.back_elt.firstChild.firstChild.textContent = self.text
-
-    def handleEvent(self, evt):
-        pass
--- a/tests/first_steps/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_Python_Library="false"/>
-</BeremizRoot>
--- a/tests/first_steps/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1160 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2016-10-24T18:09:22"/>
-  <contentHeader name="First Steps" modificationDateTime="2018-09-26T12:52:51">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="AverageVal" pouType="function">
-        <interface>
-          <returnType>
-            <REAL/>
-          </returnType>
-          <inputVars>
-            <variable name="Cnt1">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt2">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt3">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt4">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt5">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="InputsNumber">
-              <type>
-                <REAL/>
-              </type>
-              <initialValue>
-                <simpleValue value="5.0"/>
-              </initialValue>
-              <documentation>
-                <xhtml:p><![CDATA[Количество входных значений]]></xhtml:p>
-              </documentation>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[AverageVal := INT_TO_REAL(Cnt1+Cnt2+Cnt3+Cnt4+Cnt5)/InputsNumber;]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-      <pou name="plc_prg" pouType="program">
-        <interface>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="Cnt1">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt2">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt3">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt4">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Cnt5">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="CounterST0">
-              <type>
-                <derived name="CounterST"/>
-              </type>
-            </variable>
-            <variable name="CounterFBD0">
-              <type>
-                <derived name="CounterFBD"/>
-              </type>
-            </variable>
-            <variable name="CounterSFC0">
-              <type>
-                <derived name="CounterSFC"/>
-              </type>
-            </variable>
-            <variable name="CounterIL0">
-              <type>
-                <derived name="CounterIL"/>
-              </type>
-            </variable>
-            <variable name="CounterLD0">
-              <type>
-                <derived name="CounterLD"/>
-              </type>
-            </variable>
-            <variable name="AVCnt">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="1" typeName="CounterST" instanceName="CounterST0" executionOrderId="0" height="60" width="125">
-              <position x="207" y="53"/>
-              <inputVariables>
-                <variable formalParameter="Reset">
-                  <connectionPointIn>
-                    <relPosition x="0" y="40"/>
-                    <connection refLocalId="2">
-                      <position x="207" y="93"/>
-                      <position x="114" y="93"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="40"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="2" executionOrderId="0" height="30" width="79" negated="false">
-              <position x="35" y="78"/>
-              <connectionPointOut>
-                <relPosition x="79" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <block localId="4" typeName="CounterFBD" instanceName="CounterFBD0" executionOrderId="0" height="54" width="121">
-              <position x="211" y="146"/>
-              <inputVariables>
-                <variable formalParameter="Reset">
-                  <connectionPointIn>
-                    <relPosition x="0" y="37"/>
-                    <connection refLocalId="13">
-                      <position x="211" y="183"/>
-                      <position x="115" y="183"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="121" y="37"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <comment localId="6" height="365" width="569">
-              <position x="620" y="130"/>
-              <content>
-                <xhtml:p><![CDATA[In this example function block with the same functionality 
-is created using all five IEC 61131-3 programing languages:
-- IL;
-- FBD;
-- LD;
-- ST;
-- SFC.
-
-
-
-
-Function block is a counter with reset control input.
-If reset is True counter value is reset to the value defined by
-global configuration constant ResetCounterValue. 
-If reset is False, counter is incremented every cycle.
-]]></xhtml:p>
-              </content>
-            </comment>
-            <block localId="7" typeName="CounterSFC" instanceName="CounterSFC0" executionOrderId="0" height="52" width="121">
-              <position x="211" y="237"/>
-              <inputVariables>
-                <variable formalParameter="Reset">
-                  <connectionPointIn>
-                    <relPosition x="0" y="36"/>
-                    <connection refLocalId="12">
-                      <position x="211" y="273"/>
-                      <position x="103" y="273"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="121" y="36"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="9" typeName="CounterIL" instanceName="CounterIL0" executionOrderId="0" height="62" width="121">
-              <position x="211" y="322"/>
-              <inputVariables>
-                <variable formalParameter="Reset">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="10">
-                      <position x="211" y="363"/>
-                      <position x="101" y="363"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="121" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="10" executionOrderId="0" height="30" width="67" negated="false">
-              <position x="34" y="348"/>
-              <connectionPointOut>
-                <relPosition x="67" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <inVariable localId="12" executionOrderId="0" height="30" width="67" negated="false">
-              <position x="36" y="258"/>
-              <connectionPointOut>
-                <relPosition x="67" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <inVariable localId="13" executionOrderId="0" height="30" width="79" negated="false">
-              <position x="36" y="168"/>
-              <connectionPointOut>
-                <relPosition x="79" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <block localId="14" typeName="CounterLD" instanceName="CounterLD0" executionOrderId="0" height="62" width="124">
-              <position x="210" y="412"/>
-              <inputVariables>
-                <variable formalParameter="Reset">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="16">
-                      <position x="210" y="453"/>
-                      <position x="100" y="453"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Out">
-                  <connectionPointOut>
-                    <relPosition x="124" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="16" executionOrderId="0" height="30" width="64" negated="false">
-              <position x="36" y="438"/>
-              <connectionPointOut>
-                <relPosition x="64" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <block localId="17" typeName="AverageVal" executionOrderId="0" height="470" width="100">
-              <position x="514" y="28"/>
-              <inputVariables>
-                <variable formalParameter="Cnt1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="3">
-                      <position x="514" y="93"/>
-                      <position x="474" y="93"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="Cnt2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="155"/>
-                    <connection refLocalId="5">
-                      <position x="514" y="183"/>
-                      <position x="473" y="183"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="Cnt3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="245"/>
-                    <connection refLocalId="8">
-                      <position x="514" y="273"/>
-                      <position x="472" y="273"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="Cnt4">
-                  <connectionPointIn>
-                    <relPosition x="0" y="335"/>
-                    <connection refLocalId="11">
-                      <position x="514" y="363"/>
-                      <position x="469" y="363"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="Cnt5">
-                  <connectionPointIn>
-                    <relPosition x="0" y="425"/>
-                    <connection refLocalId="15">
-                      <position x="514" y="453"/>
-                      <position x="469" y="453"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="100" y="65"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="18" executionOrderId="0" height="30" width="55" negated="false">
-              <position x="649" y="78"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="17" formalParameter="OUT">
-                  <position x="649" y="93"/>
-                  <position x="614" y="93"/>
-                </connection>
-              </connectionPointIn>
-              <expression>AVCnt</expression>
-            </outVariable>
-            <inOutVariable localId="3" executionOrderId="0" height="30" width="106" negatedOut="false" negatedIn="false">
-              <position x="368" y="78"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1" formalParameter="OUT">
-                  <position x="368" y="93"/>
-                  <position x="332" y="93"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt1</expression>
-            </inOutVariable>
-            <inOutVariable localId="5" executionOrderId="0" height="30" width="103" negatedOut="false" negatedIn="false">
-              <position x="370" y="168"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="4" formalParameter="OUT">
-                  <position x="370" y="183"/>
-                  <position x="332" y="183"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="103" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt2</expression>
-            </inOutVariable>
-            <inOutVariable localId="8" executionOrderId="0" height="30" width="97" negatedOut="false" negatedIn="false">
-              <position x="375" y="258"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="OUT">
-                  <position x="375" y="273"/>
-                  <position x="332" y="273"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="97" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt3</expression>
-            </inOutVariable>
-            <inOutVariable localId="11" executionOrderId="0" height="30" width="91" negatedOut="false" negatedIn="false">
-              <position x="378" y="348"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="9" formalParameter="OUT">
-                  <position x="378" y="363"/>
-                  <position x="332" y="363"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="91" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt4</expression>
-            </inOutVariable>
-            <inOutVariable localId="15" executionOrderId="0" height="30" width="88" negatedOut="false" negatedIn="false">
-              <position x="381" y="438"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="14" formalParameter="Out">
-                  <position x="381" y="453"/>
-                  <position x="334" y="453"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="88" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt5</expression>
-            </inOutVariable>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="CounterST" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="Cnt">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <externalVars constant="true">
-            <variable name="ResetCounterValue">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[IF Reset THEN
-  Cnt := ResetCounterValue;
-ELSE
-  Cnt := Cnt + 1;
-END_IF;
-
-Out := Cnt;]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-      <pou name="CounterFBD" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="Cnt">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars constant="true">
-            <variable name="ResetCounterValue">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
-              <position x="321" y="58"/>
-              <connectionPointOut>
-                <relPosition x="61" y="15"/>
-              </connectionPointOut>
-              <expression>Reset</expression>
-            </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="30" width="39" negated="false">
-              <position x="675" y="137"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="3">
-                  <position x="675" y="152"/>
-                  <position x="589" y="152"/>
-                </connection>
-              </connectionPointIn>
-              <expression>OUT</expression>
-            </outVariable>
-            <inOutVariable localId="3" executionOrderId="0" height="30" width="37" negatedOut="false" negatedIn="false">
-              <position x="557" y="137"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="OUT">
-                  <position x="557" y="152"/>
-                  <position x="527" y="152"/>
-                  <position x="527" y="130"/>
-                  <position x="517" y="130"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="37" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt</expression>
-            </inOutVariable>
-            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="69">
-              <position x="328" y="115"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="6">
-                      <position x="328" y="150"/>
-                      <position x="275" y="150"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="3">
-                      <position x="328" y="180"/>
-                      <position x="317" y="180"/>
-                      <position x="317" y="213"/>
-                      <position x="604" y="213"/>
-                      <position x="604" y="152"/>
-                      <position x="594" y="152"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="69" y="35"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="5" executionOrderId="0" height="30" width="163" negated="false">
-              <position x="222" y="256"/>
-              <connectionPointOut>
-                <relPosition x="163" y="15"/>
-              </connectionPointOut>
-              <expression>ResetCounterValue</expression>
-            </inVariable>
-            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
-              <position x="254" y="135"/>
-              <connectionPointOut>
-                <relPosition x="21" y="15"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="69">
-              <position x="448" y="100"/>
-              <inputVariables>
-                <variable formalParameter="G">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="1">
-                      <position x="448" y="130"/>
-                      <position x="415" y="130"/>
-                      <position x="415" y="73"/>
-                      <position x="382" y="73"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="4" formalParameter="OUT">
-                      <position x="448" y="150"/>
-                      <position x="397" y="150"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="5">
-                      <position x="448" y="170"/>
-                      <position x="414" y="170"/>
-                      <position x="414" y="271"/>
-                      <position x="385" y="271"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="69" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="CounterSFC" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="Cnt">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars constant="true">
-            <variable name="ResetCounterValue">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <actions/>
-        <body>
-          <SFC>
-            <step localId="1" name="Start" initialStep="true" height="34" width="90">
-              <position x="241" y="14"/>
-              <connectionPointOut formalParameter="">
-                <relPosition x="45" y="34"/>
-              </connectionPointOut>
-            </step>
-            <selectionDivergence localId="2" height="1" width="431">
-              <position x="70" y="86"/>
-              <connectionPointIn>
-                <relPosition x="216" y="0"/>
-                <connection refLocalId="1">
-                  <position x="286" y="86"/>
-                  <position x="286" y="42"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="431" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <transition localId="3" height="2" width="20">
-              <position x="491" y="132"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="2">
-                  <position x="501" y="132"/>
-                  <position x="501" y="87"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[Reset]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <transition localId="4" height="2" width="20" executionOrderId="0">
-              <position x="60" y="135"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="2">
-                  <position x="70" y="135"/>
-                  <position x="70" y="87"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[NOT Reset]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <step localId="5" name="ResetCounter" initialStep="false" height="30" width="134">
-              <position x="434" y="190"/>
-              <connectionPointIn>
-                <relPosition x="67" y="0"/>
-                <connection refLocalId="3">
-                  <position x="501" y="190"/>
-                  <position x="501" y="134"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="67" y="30"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="134" y="15"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="6" height="63" width="254">
-              <position x="641" y="190"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="5">
-                  <position x="641" y="205"/>
-                  <position x="568" y="205"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0">
-                <relPosition x="0" y="0"/>
-                <inline>
-                  <ST>
-                    <xhtml:p><![CDATA[Cnt := ResetCounterValue;]]></xhtml:p>
-                  </ST>
-                </inline>
-              </action>
-              <action localId="0">
-                <relPosition x="0" y="0"/>
-                <inline>
-                  <ST>
-                    <xhtml:p><![CDATA[OUT := Cnt;]]></xhtml:p>
-                  </ST>
-                </inline>
-              </action>
-            </actionBlock>
-            <step localId="7" name="Count" initialStep="false" height="30" width="85" executionOrderId="0">
-              <position x="28" y="191"/>
-              <connectionPointIn>
-                <relPosition x="42" y="0"/>
-                <connection refLocalId="4">
-                  <position x="70" y="191"/>
-                  <position x="70" y="137"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="42" y="30"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="85" y="15"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="8" height="52" width="164" executionOrderId="0">
-              <position x="154" y="191"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7">
-                  <position x="154" y="206"/>
-                  <position x="113" y="206"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0">
-                <relPosition x="0" y="0"/>
-                <inline>
-                  <ST>
-                    <xhtml:p><![CDATA[Cnt := Cnt + 1;]]></xhtml:p>
-                  </ST>
-                </inline>
-              </action>
-              <action localId="0">
-                <relPosition x="0" y="0"/>
-                <inline>
-                  <ST>
-                    <xhtml:p><![CDATA[OUT := Cnt;]]></xhtml:p>
-                  </ST>
-                </inline>
-              </action>
-            </actionBlock>
-            <selectionConvergence localId="10" height="1" width="431">
-              <position x="70" y="273"/>
-              <connectionPointIn>
-                <relPosition x="0" y="0"/>
-                <connection refLocalId="13">
-                  <position x="70" y="273"/>
-                  <position x="70" y="244"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointIn>
-                <relPosition x="431" y="0"/>
-                <connection refLocalId="14">
-                  <position x="501" y="273"/>
-                  <position x="501" y="250"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="216" y="1"/>
-              </connectionPointOut>
-            </selectionConvergence>
-            <jumpStep localId="12" targetName="Start" height="13" width="12">
-              <position x="280" y="317"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="10">
-                  <position x="286" y="317"/>
-                  <position x="286" y="274"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <transition localId="13" height="2" width="20" executionOrderId="0">
-              <position x="60" y="242"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="7">
-                  <position x="70" y="242"/>
-                  <position x="70" y="215"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[Reset]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <transition localId="14" height="2" width="20" executionOrderId="0">
-              <position x="491" y="248"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="5">
-                  <position x="501" y="248"/>
-                  <position x="501" y="220"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[NOT Reset]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-          </SFC>
-        </body>
-      </pou>
-      <pou name="CounterIL" pouType="functionBlock">
-        <interface>
-          <localVars>
-            <variable name="Cnt">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <externalVars constant="true">
-            <variable name="ResetCounterValue">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <IL>
-            <xhtml:p><![CDATA[LD Reset
-JMPC ResetCnt
-
-(* increment counter *)
-LD Cnt
-ADD 1
-JMP QuitFb
-
-ResetCnt:
-(* reset counter *)
-LD ResetCounterValue
-
-QuitFb:
-(* save results *)
-ST Cnt
-ST Out
-]]></xhtml:p>
-          </IL>
-        </body>
-      </pou>
-      <pou name="CounterLD" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="Reset">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="Out">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="Cnt">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars constant="true">
-            <variable name="ResetCounterValue">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <LD>
-            <outVariable localId="2" executionOrderId="0" height="30" width="34" negated="false">
-              <position x="527" y="87"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="3">
-                  <position x="527" y="102"/>
-                  <position x="443" y="102"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Out</expression>
-            </outVariable>
-            <inOutVariable localId="3" executionOrderId="0" height="30" width="34" negatedOut="false" negatedIn="false">
-              <position x="409" y="87"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="OUT">
-                  <position x="409" y="102"/>
-                  <position x="367" y="102"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="34" y="15"/>
-              </connectionPointOut>
-              <expression>Cnt</expression>
-            </inOutVariable>
-            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="67">
-              <position x="180" y="87"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="6">
-                      <position x="180" y="122"/>
-                      <position x="127" y="122"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="3">
-                      <position x="180" y="152"/>
-                      <position x="169" y="152"/>
-                      <position x="169" y="185"/>
-                      <position x="453" y="185"/>
-                      <position x="453" y="102"/>
-                      <position x="443" y="102"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="35"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="5" executionOrderId="0" height="30" width="158" negated="false">
-              <position x="74" y="228"/>
-              <connectionPointOut>
-                <relPosition x="158" y="15"/>
-              </connectionPointOut>
-              <expression>ResetCounterValue</expression>
-            </inVariable>
-            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
-              <position x="106" y="107"/>
-              <connectionPointOut>
-                <relPosition x="21" y="15"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="67">
-              <position x="300" y="72"/>
-              <inputVariables>
-                <variable formalParameter="G">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="9">
-                      <position x="300" y="102"/>
-                      <position x="266" y="102"/>
-                      <position x="266" y="62"/>
-                      <position x="134" y="62"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="4" formalParameter="OUT">
-                      <position x="300" y="122"/>
-                      <position x="247" y="122"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="5">
-                      <position x="300" y="142"/>
-                      <position x="266" y="142"/>
-                      <position x="266" y="243"/>
-                      <position x="232" y="243"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <leftPowerRail localId="8" height="40" width="3">
-              <position x="46" y="42"/>
-              <connectionPointOut formalParameter="">
-                <relPosition x="3" y="20"/>
-              </connectionPointOut>
-            </leftPowerRail>
-            <contact localId="9" height="15" width="21" negated="false">
-              <position x="113" y="54"/>
-              <connectionPointIn>
-                <relPosition x="0" y="8"/>
-                <connection refLocalId="8">
-                  <position x="113" y="62"/>
-                  <position x="49" y="62"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="21" y="8"/>
-              </connectionPointOut>
-              <variable>Reset</variable>
-            </contact>
-          </LD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="plc_task" priority="1" interval="T#100ms">
-            <pouInstance name="plc_task_instance" typeName="plc_prg"/>
-          </task>
-        </resource>
-        <globalVars constant="true">
-          <variable name="ResetCounterValue">
-            <type>
-              <INT/>
-            </type>
-            <initialValue>
-              <simpleValue value="17"/>
-            </initialValue>
-          </variable>
-        </globalVars>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/genericmake/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/genericmake/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -3,5 +3,5 @@
   <TargetType>
     <Generic Command="make -C %(buildpath)s -f ../project_files/Makefile all BEREMIZSRC=%(src)s BEREMIZCFLAGS=%(cflags)s MD5=%(md5)s USE_BEREMIZ=1 FROM_BEREMIZ=1"/>
   </TargetType>
-  <Libraries Enable_Native_Library="false" Enable_Python_Library="false" Enable_SVGUI_Library="false"/>
+  <Libraries Enable_Native_Library="false" Enable_Python_Library="false"/>
 </BeremizRoot>
--- a/tests/python/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_Python_Library="true"/>
-</BeremizRoot>
--- a/tests/python/c_code@c_ext/baseconfnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams Name="c_code" IEC_Channel="1"/>
--- a/tests/python/c_code@c_ext/cfile.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<CFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
-  <includes>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </includes>
-  <variables>
-    <variable name="TestInput" type="SINT" initial="0"/>
-    <variable name="TestOutput" type="SINT"/>
-  </variables>
-  <globals>
-    <xhtml:p><![CDATA[
-volatile long Lock=0;
-volatile char PtoC=1,CtoP=2;
-
-extern long AtomicCompareExchange(long*,long, long);
-extern char *PLC_ID;
-
-int Simple_C_Call(int val){
-  return val+1;
-}
-
-int Python_to_C_Call(char toC, char *fromC){
-  /* Code called by python should never touch to 
-     variables modified by PLC thread directly
-
-     AtomicCompareExchange comes from 
-     beremiz' runtime implementation */
-
-  int res = 0;
-  if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
-    PtoC=toC;
-    *fromC=CtoP;
-    AtomicCompareExchange((long*)&Lock, 1, 0);
-    res=1;
-  }
-  printf("C code called by Python: toC %d fromC %d\n",toC,*fromC);
-  printf("PLC_ID id %s\n",PLC_ID);
-  return res;
-}
-
-int PLC_C_Call(char fromPLC, char *toPLC){
-  /* PLC also have to be realy carefull not to 
-     conflict with asynchronous python access */
-  if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
-      CtoP = fromPLC;
-      *toPLC = PtoC;
-      AtomicCompareExchange((long*)&Lock, 1, 0);
-      return 1;
-  }
-  return 0;
-}
-]]></xhtml:p>
-  </globals>
-  <initFunction>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </initFunction>
-  <cleanUpFunction>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </cleanUpFunction>
-  <retrieveFunction>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </retrieveFunction>
-  <publishFunction>
-    <xhtml:p><![CDATA[
-if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
-    TestInput = CtoP + PtoC + TestOutput;
-    AtomicCompareExchange((long*)&Lock, 1, 0);
-}
-]]></xhtml:p>
-  </publishFunction>
-</CFile>
--- a/tests/python/c_code@c_ext/confnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<CExtension CFLAGS="" LDFLAGS=""/>
--- a/tests/python/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1644 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz:&#10;&#10;   1. How to implement python extensions.&#10;   2. How to implement basic C extension.&#10;   3. How to use C code in IEC POUs.&#10;   4. How to call C functions from python code.&#10;   5. How to avoid race conditions between IEC, C and python code.&#10;   6. How to convert betweet different IEC types.&#10;"/>
-  <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2020-10-19T23:53:08">
-    <coordinateInfo>
-      <pageSize x="1024" y="1024"/>
-      <fbd>
-        <scaling x="5" y="5"/>
-      </fbd>
-      <ld>
-        <scaling x="5" y="5"/>
-      </ld>
-      <sfc>
-        <scaling x="5" y="5"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes>
-      <dataType name="CPLX_TYPE">
-        <baseType>
-          <struct>
-            <variable name="FIRSTBYTE">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-            <variable name="SECONDBYTE">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-          </struct>
-        </baseType>
-      </dataType>
-      <dataType name="StateMachine">
-        <baseType>
-          <enum>
-            <values>
-              <value name="STANDBY"/>
-              <value name="START"/>
-              <value name="STOP"/>
-            </values>
-          </enum>
-        </baseType>
-      </dataType>
-      <dataType name="datatype0">
-        <baseType>
-          <BOOL/>
-        </baseType>
-      </dataType>
-      <dataType name="blups">
-        <baseType>
-          <array>
-            <dimension lower="0" upper="31"/>
-            <baseType>
-              <derived name="CPLX_TYPE"/>
-            </baseType>
-          </array>
-        </baseType>
-      </dataType>
-    </dataTypes>
-    <pous>
-      <pou name="main_pytest" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="mux1_sel">
-              <type>
-                <INT/>
-              </type>
-              <initialValue>
-                <simpleValue value="3"/>
-              </initialValue>
-              <documentation>
-                <xhtml:p><![CDATA[blah]]></xhtml:p>
-              </documentation>
-            </variable>
-            <variable name="mux2_sel">
-              <type>
-                <INT/>
-              </type>
-              <initialValue>
-                <simpleValue value="3"/>
-              </initialValue>
-            </variable>
-            <variable name="pytest_var1">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="fefvsd">
-              <type>
-                <derived name="datatype0"/>
-              </type>
-            </variable>
-            <variable name="pytest_var2">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="py1">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="Block1">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="Block2">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="Block3">
-              <type>
-                <derived name="python_eval"/>
-              </type>
-            </variable>
-            <variable name="pytest_var3">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="FromC">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-            <variable name="C_Pragma0">
-              <type>
-                <derived name="C_Pragma"/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="TestInput">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-            <variable name="TestOutput">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-          </externalVars>
-          <localVars>
-            <variable name="FromInput">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-            <variable name="Test_BCD">
-              <type>
-                <WORD/>
-              </type>
-              <initialValue>
-                <simpleValue value="151"/>
-              </initialValue>
-            </variable>
-            <variable name="Test_BCD_WRONG">
-              <type>
-                <WORD/>
-              </type>
-              <initialValue>
-                <simpleValue value="154"/>
-              </initialValue>
-            </variable>
-            <variable name="Test_BCD_CONVERTED">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="Test_BCD_RESULT">
-              <type>
-                <UINT/>
-              </type>
-            </variable>
-            <variable name="Test_BCD_WRONG_RESULT">
-              <type>
-                <UINT/>
-              </type>
-            </variable>
-            <variable name="Test_DT">
-              <type>
-                <DT/>
-              </type>
-              <initialValue>
-                <simpleValue value="DT#2013-02-23-22:35:46"/>
-              </initialValue>
-            </variable>
-            <variable name="Test_TOD">
-              <type>
-                <TOD/>
-              </type>
-            </variable>
-            <variable name="Test_TOD_STRING">
-              <type>
-                <string/>
-              </type>
-            </variable>
-            <variable name="Test_Date">
-              <type>
-                <DATE/>
-              </type>
-            </variable>
-            <variable name="Test_String">
-              <type>
-                <string/>
-              </type>
-              <initialValue>
-                <simpleValue value="test"/>
-              </initialValue>
-            </variable>
-            <variable name="Test_Bool">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="Global_RS">
-              <type>
-                <derived name="RS"/>
-              </type>
-            </variable>
-            <variable name="TUTU">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="TOTO">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Test_Python_Var">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Second_Python_Var">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Grumpf">
-              <type>
-                <string/>
-              </type>
-            </variable>
-          </externalVars>
-          <localVars>
-            <variable name="RTC0">
-              <type>
-                <derived name="RTC"/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="SomeVarName">
-              <type>
-                <DINT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="4" height="30" width="160" executionOrderId="0" negated="false">
-              <position x="295" y="450"/>
-              <connectionPointOut>
-                <relPosition x="160" y="15"/>
-              </connectionPointOut>
-              <expression>'666'</expression>
-            </inVariable>
-            <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0">
-              <position x="686" y="400"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="686" y="435"/>
-                      <position x="285" y="435"/>
-                      <position x="285" y="480"/>
-                      <position x="250" y="480"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="4">
-                      <position x="686" y="465"/>
-                      <position x="455" y="465"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="35"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="65"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="7" width="70" height="45" typeName="NOT" executionOrderId="0">
-              <position x="180" y="450"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="3">
-                      <position x="180" y="480"/>
-                      <position x="155" y="480"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="70" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="3" height="30" width="120" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="35" y="465"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="7" formalParameter="OUT">
-                  <position x="35" y="480"/>
-                  <position x="25" y="480"/>
-                  <position x="25" y="440"/>
-                  <position x="270" y="440"/>
-                  <position x="270" y="480"/>
-                  <position x="250" y="480"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>pytest_var2</expression>
-            </inOutVariable>
-            <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0">
-              <position x="686" y="545"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="686" y="580"/>
-                      <position x="285" y="580"/>
-                      <position x="285" y="480"/>
-                      <position x="250" y="480"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="9">
-                      <position x="686" y="610"/>
-                      <position x="665" y="610"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="35"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="65"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="9" height="30" width="370" executionOrderId="0" negated="false">
-              <position x="295" y="595"/>
-              <connectionPointOut>
-                <relPosition x="370" y="15"/>
-              </connectionPointOut>
-              <expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
-            </inVariable>
-            <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
-              <position x="295" y="735"/>
-              <connectionPointOut>
-                <relPosition x="290" y="15"/>
-              </connectionPointOut>
-              <expression>'PLCBinary.Simple_C_Call(5678)'</expression>
-            </inVariable>
-            <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0">
-              <position x="686" y="687"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="33"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="686" y="720"/>
-                      <position x="285" y="720"/>
-                      <position x="285" y="480"/>
-                      <position x="250" y="480"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="63"/>
-                    <connection refLocalId="11">
-                      <position x="686" y="750"/>
-                      <position x="585" y="750"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="33"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="63"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false">
-              <position x="290" y="885"/>
-              <connectionPointOut>
-                <relPosition x="290" y="15"/>
-              </connectionPointOut>
-              <expression>'MyPythonFunc(42)'</expression>
-            </inVariable>
-            <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0">
-              <position x="686" y="837"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="33"/>
-                    <connection refLocalId="7" formalParameter="OUT">
-                      <position x="686" y="870"/>
-                      <position x="285" y="870"/>
-                      <position x="285" y="480"/>
-                      <position x="250" y="480"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="63"/>
-                    <connection refLocalId="14">
-                      <position x="686" y="900"/>
-                      <position x="580" y="900"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="125" y="33"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="63"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <comment localId="16" height="90" width="680">
-              <position x="35" y="275"/>
-              <content>
-                <xhtml:p><![CDATA[This part of the example test that, despite of 2T period clock stimulating TRIG pin of pyth_eval blocks, blocks keep executing one after the other, in respect of execution order.]]></xhtml:p>
-              </content>
-            </comment>
-            <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0">
-              <position x="1101" y="790"/>
-              <inputVariables>
-                <variable formalParameter="K">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="18">
-                      <position x="1101" y="820"/>
-                      <position x="1076" y="820"/>
-                      <position x="1076" y="810"/>
-                      <position x="1060" y="810"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="5" formalParameter="RESULT">
-                      <position x="1101" y="840"/>
-                      <position x="941" y="840"/>
-                      <position x="941" y="465"/>
-                      <position x="811" y="465"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="8" formalParameter="RESULT">
-                      <position x="1101" y="860"/>
-                      <position x="926" y="860"/>
-                      <position x="926" y="610"/>
-                      <position x="811" y="610"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="90"/>
-                    <connection refLocalId="12" formalParameter="RESULT">
-                      <position x="1101" y="880"/>
-                      <position x="911" y="880"/>
-                      <position x="911" y="750"/>
-                      <position x="811" y="750"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="15" formalParameter="RESULT">
-                      <position x="1101" y="900"/>
-                      <position x="811" y="900"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false">
-              <position x="1271" y="805"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="17" formalParameter="OUT">
-                  <position x="1271" y="820"/>
-                  <position x="1181" y="820"/>
-                </connection>
-              </connectionPointIn>
-              <expression>pytest_var1</expression>
-            </outVariable>
-            <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0">
-              <position x="1106" y="385"/>
-              <inputVariables>
-                <variable formalParameter="K">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="22">
-                      <position x="1106" y="415"/>
-                      <position x="1076" y="415"/>
-                      <position x="1076" y="405"/>
-                      <position x="1055" y="405"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="5" formalParameter="ACK">
-                      <position x="1106" y="435"/>
-                      <position x="811" y="435"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="8" formalParameter="ACK">
-                      <position x="1106" y="455"/>
-                      <position x="841" y="455"/>
-                      <position x="841" y="580"/>
-                      <position x="811" y="580"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="90"/>
-                    <connection refLocalId="12" formalParameter="ACK">
-                      <position x="1106" y="475"/>
-                      <position x="856" y="475"/>
-                      <position x="856" y="720"/>
-                      <position x="811" y="720"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN3">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="15" formalParameter="ACK">
-                      <position x="1106" y="495"/>
-                      <position x="871" y="495"/>
-                      <position x="871" y="870"/>
-                      <position x="811" y="870"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="22" height="30" width="74" executionOrderId="0" negated="false">
-              <position x="981" y="390"/>
-              <connectionPointOut>
-                <relPosition x="74" y="15"/>
-              </connectionPointOut>
-              <expression>mux1_sel</expression>
-            </inVariable>
-            <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false">
-              <position x="1271" y="400"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="21" formalParameter="OUT">
-                  <position x="1271" y="415"/>
-                  <position x="1186" y="415"/>
-                </connection>
-              </connectionPointIn>
-              <expression>pytest_var3</expression>
-            </outVariable>
-            <outVariable localId="25" height="30" width="60" executionOrderId="0" negated="false">
-              <position x="320" y="1075"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="26" formalParameter="OUT">
-                  <position x="320" y="1090"/>
-                  <position x="265" y="1090"/>
-                </connection>
-              </connectionPointIn>
-              <expression>FromC</expression>
-            </outVariable>
-            <inVariable localId="1" height="30" width="30" executionOrderId="0" negated="false">
-              <position x="105" y="1075"/>
-              <connectionPointOut>
-                <relPosition x="30" y="15"/>
-              </connectionPointOut>
-              <expression>23</expression>
-            </inVariable>
-            <block localId="26" width="80" height="45" typeName="C_Pragma" instanceName="C_Pragma0" executionOrderId="0">
-              <position x="185" y="1060"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="1">
-                      <position x="185" y="1090"/>
-                      <position x="135" y="1090"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="27" height="30" width="90" executionOrderId="0" negated="false">
-              <position x="100" y="1190"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-              <expression>TestInput</expression>
-            </inVariable>
-            <outVariable localId="28" height="30" width="105" executionOrderId="0" negated="false">
-              <position x="195" y="1125"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="2">
-                  <position x="195" y="1140"/>
-                  <position x="140" y="1140"/>
-                </connection>
-              </connectionPointIn>
-              <expression>TestOutput</expression>
-            </outVariable>
-            <outVariable localId="29" height="30" width="85" executionOrderId="0" negated="false">
-              <position x="215" y="1190"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="27">
-                  <position x="215" y="1205"/>
-                  <position x="190" y="1205"/>
-                </connection>
-              </connectionPointIn>
-              <expression>FromInput</expression>
-            </outVariable>
-            <inVariable localId="2" height="30" width="30" executionOrderId="0" negated="false">
-              <position x="110" y="1125"/>
-              <connectionPointOut>
-                <relPosition x="30" y="15"/>
-              </connectionPointOut>
-              <expression>10</expression>
-            </inVariable>
-            <comment localId="30" height="105" width="465">
-              <position x="50" y="925"/>
-              <content>
-                <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal  to 75.
-Happy hacking! ]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="31" height="90" width="345">
-              <position x="295" y="485"/>
-              <content>
-                <xhtml:p><![CDATA[Sleep here is bad. It blocks other py_eval instances. Whith a wxGlade GUI, GUI freeze for a second.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="6" height="80" width="345">
-              <position x="295" y="630"/>
-              <content>
-                <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="10" height="85" width="345">
-              <position x="295" y="770"/>
-              <content>
-                <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="32" height="145" width="235">
-              <position x="25" y="505"/>
-              <content>
-                <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
-              </content>
-            </comment>
-            <outVariable localId="33" height="30" width="133" executionOrderId="0" negated="false">
-              <position x="580" y="1564"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="35" formalParameter="OUT">
-                  <position x="580" y="1580"/>
-                  <position x="371" y="1580"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_BCD_RESULT</expression>
-            </outVariable>
-            <inVariable localId="34" height="30" width="75" executionOrderId="0" negated="false">
-              <position x="60" y="1564"/>
-              <connectionPointOut>
-                <relPosition x="75" y="16"/>
-              </connectionPointOut>
-              <expression>Test_BCD</expression>
-            </inVariable>
-            <block localId="35" width="106" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
-              <position x="265" y="1539"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="34">
-                      <position x="265" y="1580"/>
-                      <position x="135" y="1580"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="106" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="36" height="30" width="66" executionOrderId="0" negated="false">
-              <position x="60" y="1774"/>
-              <connectionPointOut>
-                <relPosition x="66" y="16"/>
-              </connectionPointOut>
-              <expression>Test_DT</expression>
-            </inVariable>
-            <block localId="37" width="255" height="45" typeName="DATE_AND_TIME_TO_TIME_OF_DAY" executionOrderId="0">
-              <position x="265" y="1759"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="36">
-                      <position x="265" y="1790"/>
-                      <position x="125" y="1790"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="255" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="38" width="195" height="45" typeName="DATE_AND_TIME_TO_DATE" executionOrderId="0">
-              <position x="265" y="1834"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="36">
-                      <position x="265" y="1865"/>
-                      <position x="242" y="1865"/>
-                      <position x="242" y="1790"/>
-                      <position x="125" y="1790"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="195" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="40" height="30" width="82" executionOrderId="0" negated="false">
-              <position x="580" y="1849"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="38" formalParameter="OUT">
-                  <position x="580" y="1865"/>
-                  <position x="460" y="1865"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_Date</expression>
-            </outVariable>
-            <outVariable localId="42" height="30" width="98" executionOrderId="0" negated="false">
-              <position x="465" y="1944"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="46" formalParameter="OUT">
-                  <position x="465" y="1960"/>
-                  <position x="395" y="1960"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_String</expression>
-            </outVariable>
-            <outVariable localId="43" height="30" width="82" executionOrderId="0" negated="false">
-              <position x="465" y="2014"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="44" formalParameter="OUT">
-                  <position x="465" y="2030"/>
-                  <position x="400" y="2030"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_Bool</expression>
-            </outVariable>
-            <block localId="44" width="135" height="45" typeName="STRING_TO_BOOL" executionOrderId="0">
-              <position x="265" y="1999"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="45">
-                      <position x="265" y="2030"/>
-                      <position x="115" y="2030"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="135" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="45" height="30" width="58" executionOrderId="0" negated="false">
-              <position x="60" y="2014"/>
-              <connectionPointOut>
-                <relPosition x="58" y="16"/>
-              </connectionPointOut>
-              <expression>'True'</expression>
-            </inVariable>
-            <block localId="46" width="130" height="45" typeName="INT_TO_STRING" executionOrderId="0">
-              <position x="265" y="1929"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="58">
-                      <position x="265" y="1960"/>
-                      <position x="205" y="1960"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="130" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="50" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="75" y="2275"/>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>Global_RS.Q1</expression>
-            </inVariable>
-            <block localId="51" width="70" height="85" typeName="AND" executionOrderId="0">
-              <position x="240" y="2255"/>
-              <inputVariables>
-                <variable formalParameter="IN1" negated="true">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="50">
-                      <position x="240" y="2290"/>
-                      <position x="180" y="2290"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="52">
-                      <position x="240" y="2325"/>
-                      <position x="180" y="2325"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="70" y="35"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="52" height="30" width="105" executionOrderId="0" negated="false">
-              <position x="75" y="2310"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#TRUE</expression>
-            </inVariable>
-            <outVariable localId="13" height="30" width="105" executionOrderId="0" negated="false">
-              <position x="385" y="2275"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="51" formalParameter="OUT">
-                  <position x="385" y="2290"/>
-                  <position x="310" y="2290"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Global_RS.S</expression>
-            </outVariable>
-            <outVariable localId="20" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="385" y="2390"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="41" formalParameter="OUT">
-                  <position x="385" y="2405"/>
-                  <position x="310" y="2405"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Global_RS.R1</expression>
-            </outVariable>
-            <inVariable localId="24" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="75" y="2390"/>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>Global_RS.Q1</expression>
-            </inVariable>
-            <block localId="41" width="70" height="85" typeName="OR" executionOrderId="0">
-              <position x="240" y="2370"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="24">
-                      <position x="240" y="2405"/>
-                      <position x="180" y="2405"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="48">
-                      <position x="240" y="2440"/>
-                      <position x="180" y="2440"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="70" y="35"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="48" height="30" width="105" executionOrderId="0" negated="false">
-              <position x="75" y="2425"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#FALSE</expression>
-            </inVariable>
-            <outVariable localId="54" height="30" width="135" executionOrderId="0" negated="false">
-              <position x="930" y="1774"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="55" formalParameter="OUT">
-                  <position x="930" y="1790"/>
-                  <position x="855" y="1790"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_TOD_STRING</expression>
-            </outVariable>
-            <block localId="55" width="125" height="45" typeName="TOD_TO_STRING" executionOrderId="0">
-              <position x="730" y="1759"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="39">
-                      <position x="730" y="1790"/>
-                      <position x="655" y="1790"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="39" height="30" width="75" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="580" y="1774"/>
-              <connectionPointIn>
-                <relPosition x="0" y="16"/>
-                <connection refLocalId="37" formalParameter="OUT">
-                  <position x="580" y="1790"/>
-                  <position x="520" y="1790"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="75" y="16"/>
-              </connectionPointOut>
-              <expression>Test_TOD</expression>
-            </inOutVariable>
-            <inVariable localId="49" height="30" width="30" executionOrderId="0" negated="false">
-              <position x="160" y="2510"/>
-              <connectionPointOut>
-                <relPosition x="30" y="15"/>
-              </connectionPointOut>
-              <expression>42</expression>
-            </inVariable>
-            <outVariable localId="57" height="30" width="50" executionOrderId="0" negated="false">
-              <position x="240" y="2510"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="49">
-                  <position x="240" y="2525"/>
-                  <position x="190" y="2525"/>
-                </connection>
-              </connectionPointIn>
-              <expression>TOTO</expression>
-            </outVariable>
-            <outVariable localId="56" height="30" width="50" executionOrderId="0" negated="false">
-              <position x="240" y="2550"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="49">
-                  <position x="240" y="2565"/>
-                  <position x="215" y="2565"/>
-                  <position x="215" y="2525"/>
-                  <position x="190" y="2525"/>
-                </connection>
-              </connectionPointIn>
-              <expression>TUTU</expression>
-            </outVariable>
-            <inVariable localId="58" height="30" width="146" executionOrderId="0" negated="false">
-              <position x="60" y="1944"/>
-              <connectionPointOut>
-                <relPosition x="146" y="16"/>
-              </connectionPointOut>
-              <expression>Second_Python_Var</expression>
-            </inVariable>
-            <inVariable localId="59" height="30" width="30" executionOrderId="0" negated="false">
-              <position x="100" y="1385"/>
-              <connectionPointOut>
-                <relPosition x="30" y="15"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <block localId="61" typeName="function0" executionOrderId="0" height="45" width="111">
-              <position x="760" y="1170"/>
-              <inputVariables>
-                <variable formalParameter="LocalVar0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="62">
-                      <position x="760" y="1200"/>
-                      <position x="723" y="1200"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="111" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="62" executionOrderId="0" height="30" width="58" negated="false">
-              <position x="665" y="1185"/>
-              <connectionPointOut>
-                <relPosition x="58" y="15"/>
-              </connectionPointOut>
-              <expression>fefvsd</expression>
-            </inVariable>
-            <outVariable localId="63" executionOrderId="0" height="30" width="58" negated="false">
-              <position x="905" y="1185"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="61" formalParameter="OUT">
-                  <position x="905" y="1200"/>
-                  <position x="871" y="1200"/>
-                </connection>
-              </connectionPointIn>
-              <expression>fefvsd</expression>
-            </outVariable>
-            <comment localId="53" height="80" width="420">
-              <position x="75" y="2160"/>
-              <content>
-                <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p>
-              </content>
-            </comment>
-            <inVariable localId="18" height="30" width="74" executionOrderId="0" negated="false">
-              <position x="986" y="795"/>
-              <connectionPointOut>
-                <relPosition x="74" y="15"/>
-              </connectionPointOut>
-              <expression>mux2_sel</expression>
-            </inVariable>
-            <comment localId="60" height="45" width="930">
-              <position x="60" y="1480"/>
-              <content>
-                <xhtml:p><![CDATA[Here is shown how to convert values between different types (BCD, DT, TOD, STRING and others) using standard functions.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="64" height="55" width="300">
-              <position x="665" y="1095"/>
-              <content>
-                <xhtml:p><![CDATA[Example of usage of user-defined function.]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="65" height="45" width="410">
-              <position x="55" y="1315"/>
-              <content>
-                <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p>
-              </content>
-            </comment>
-            <inVariable localId="66" height="30" width="137" executionOrderId="0" negated="false">
-              <position x="60" y="1685"/>
-              <connectionPointOut>
-                <relPosition x="137" y="15"/>
-              </connectionPointOut>
-              <expression>Test_BCD_WRONG</expression>
-            </inVariable>
-            <block localId="67" width="106" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
-              <position x="265" y="1620"/>
-              <inputVariables>
-                <variable formalParameter="EN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="40"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="80"/>
-                    <connection refLocalId="66">
-                      <position x="265" y="1700"/>
-                      <position x="255" y="1700"/>
-                      <position x="255" y="1700"/>
-                      <position x="345" y="1700"/>
-                      <position x="345" y="1700"/>
-                      <position x="197" y="1700"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ENO">
-                  <connectionPointOut>
-                    <relPosition x="106" y="40"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="106" y="80"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="68" height="30" width="196" executionOrderId="0" negated="false">
-              <position x="580" y="1685"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="67" formalParameter="OUT">
-                  <position x="580" y="1700"/>
-                  <position x="371" y="1700"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_BCD_WRONG_RESULT</expression>
-            </outVariable>
-            <comment localId="69" height="165" width="375">
-              <position x="795" y="1590"/>
-              <content>
-                <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT.
-
-151 (16#97) is good BCD number , but 
-154 (16#9A) is not.  
-
-Try this out and look at value of  Test_BCD_CONVERTED variable.
-
-
-]]></xhtml:p>
-              </content>
-            </comment>
-            <outVariable localId="70" height="30" width="185" executionOrderId="0" negated="false">
-              <position x="580" y="1645"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="67" formalParameter="ENO">
-                  <position x="580" y="1660"/>
-                  <position x="370" y="1660"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_BCD_CONVERTED</expression>
-            </outVariable>
-            <comment localId="71" height="215" width="680">
-              <position x="35" y="30"/>
-              <content>
-                <xhtml:p><![CDATA[This example shows many features in Beremiz:
-
-   1. How to implement python extensions.
-   2. How to implement basic C extension.
-   3. How to use C code in IEC POUs.
-   4. How to call C functions from python code.
-   5. How to avoid race conditions between IEC, C and python code.
-   6. How to convert betweet different IEC types.
-]]></xhtml:p>
-              </content>
-            </comment>
-            <outVariable localId="72" executionOrderId="0" height="30" width="60" negated="false">
-              <position x="1065" y="1970"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="76" formalParameter="OUT">
-                  <position x="1065" y="1985"/>
-                  <position x="1025" y="1985"/>
-                  <position x="1025" y="1995"/>
-                  <position x="985" y="1995"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Grumpf</expression>
-            </outVariable>
-            <inVariable localId="73" executionOrderId="0" height="30" width="85" negated="false">
-              <position x="625" y="1940"/>
-              <connectionPointOut>
-                <relPosition x="85" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#TRUE</expression>
-            </inVariable>
-            <inVariable localId="74" executionOrderId="0" height="30" width="70" negated="false">
-              <position x="625" y="1975"/>
-              <connectionPointOut>
-                <relPosition x="70" y="15"/>
-              </connectionPointOut>
-              <expression>Test_DT</expression>
-            </inVariable>
-            <block localId="75" typeName="RTC" instanceName="RTC0" executionOrderId="0" height="90" width="65">
-              <position x="760" y="1925"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="73">
-                      <position x="760" y="1960"/>
-                      <position x="735" y="1960"/>
-                      <position x="735" y="1955"/>
-                      <position x="710" y="1955"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PDT">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="74">
-                      <position x="760" y="1995"/>
-                      <position x="727" y="1995"/>
-                      <position x="727" y="1990"/>
-                      <position x="695" y="1990"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="65" y="35"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="CDT">
-                  <connectionPointOut>
-                    <relPosition x="65" y="70"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="76" typeName="DT_TO_STRING" executionOrderId="0" height="40" width="110">
-              <position x="875" y="1965"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="75" formalParameter="CDT">
-                      <position x="875" y="1995"/>
-                      <position x="825" y="1995"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="110" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="77" typeName="ADD" executionOrderId="0" height="60" width="65">
-              <position x="170" y="1370"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="59">
-                      <position x="170" y="1400"/>
-                      <position x="130" y="1400"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="78">
-                      <position x="170" y="1420"/>
-                      <position x="160" y="1420"/>
-                      <position x="160" y="1450"/>
-                      <position x="390" y="1450"/>
-                      <position x="390" y="1400"/>
-                      <position x="380" y="1400"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="65" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="47" executionOrderId="0" height="30" width="130" negated="false">
-              <position x="625" y="1335"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="79">
-                  <position x="625" y="1350"/>
-                  <position x="590" y="1350"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Test_Python_Var</expression>
-            </outVariable>
-            <inVariable localId="79" executionOrderId="0" height="25" width="30" negated="false">
-              <position x="560" y="1340"/>
-              <connectionPointOut>
-                <relPosition x="30" y="10"/>
-              </connectionPointOut>
-              <expression>23</expression>
-            </inVariable>
-            <inOutVariable localId="78" executionOrderId="0" height="30" width="100" negatedOut="false" negatedIn="false">
-              <position x="280" y="1385"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="77" formalParameter="OUT">
-                  <position x="280" y="1400"/>
-                  <position x="235" y="1400"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="100" y="15"/>
-              </connectionPointOut>
-              <expression>SomeVarName</expression>
-            </inOutVariable>
-          </FBD>
-        </body>
-      </pou>
-      <pou name="C_Pragma" pouType="functionBlock">
-        <interface>
-          <outputVars>
-            <variable name="OUT">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-          </outputVars>
-          <inputVars>
-            <variable name="IN">
-              <type>
-                <SINT/>
-              </type>
-            </variable>
-          </inputVars>
-          <localVars>
-            <variable name="COORDS">
-              <type>
-                <array>
-                  <dimension lower="0" upper="5"/>
-                  <baseType>
-                    <SINT/>
-                  </baseType>
-                </array>
-              </type>
-              <initialValue>
-                <arrayValue>
-                  <value>
-                    <simpleValue value="54"/>
-                  </value>
-                  <value>
-                    <simpleValue value="55"/>
-                  </value>
-                  <value>
-                    <simpleValue value="56"/>
-                  </value>
-                  <value>
-                    <simpleValue value="57"/>
-                  </value>
-                  <value>
-                    <simpleValue value="58"/>
-                  </value>
-                  <value>
-                    <simpleValue value="59"/>
-                  </value>
-                </arrayValue>
-              </initialValue>
-            </variable>
-            <variable name="SMURF">
-              <type>
-                <derived name="CPLX_TYPE"/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="Global_RS">
-              <type>
-                <derived name="RS"/>
-              </type>
-            </variable>
-            <variable name="Dudiduda">
-              <type>
-                <derived name="blups"/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[(* hereafter is a C pragma accessing FB interface in a clean way *)
-{{
-  char toPLC;
-  char fromPLC = GetFbVar(IN);
-  extern int PLC_C_Call(char, char *);
-  if(PLC_C_Call(fromPLC, &toPLC)){
-    SetFbVar(OUT, toPLC);
-  }
-  if(0){
-    /* that code demonstrate C access to complex types */
-    char somebyte = GetFbVar(COORDS, .table[3]);
-    SetFbVar(SMURF, somebyte, .FIRSTBYTE);
-    SetFbVar(COORDS, somebyte, .table[4]);
-  }
-}}
-(* If you do not use GetFbVar and SetFbVar macros, expect unexpected behaviour*)
-Global_RS();
-
-(* testing access to global struct array *)
-Dudiduda[2].FIRSTBYTE := 0;
-]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-      <pou name="norm" pouType="function">
-        <interface>
-          <returnType>
-            <REAL/>
-          </returnType>
-          <inputVars>
-            <variable name="IN1">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-            <variable name="IN2">
-              <type>
-                <REAL/>
-              </type>
-            </variable>
-          </inputVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[NORM := SQRT(IN1 * IN1 + IN2 * IN2);]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-      <pou name="function0" pouType="function">
-        <interface>
-          <returnType>
-            <derived name="datatype0"/>
-          </returnType>
-          <inputVars>
-            <variable name="LocalVar0">
-              <type>
-                <derived name="datatype0"/>
-              </type>
-            </variable>
-          </inputVars>
-        </interface>
-        <body>
-          <ST>
-            <xhtml:p><![CDATA[function0 := LocalVar0;
-]]></xhtml:p>
-          </ST>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="res_pytest">
-          <task name="pytest_task" priority="0" interval="T#500ms"/>
-          <globalVars>
-            <variable name="TOTO">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </globalVars>
-          <pouInstance name="pytest_instance" typeName="main_pytest"/>
-        </resource>
-        <globalVars>
-          <variable name="Global_RS">
-            <type>
-              <derived name="RS"/>
-            </type>
-          </variable>
-          <variable name="Dudiduda">
-            <type>
-              <derived name="blups"/>
-            </type>
-          </variable>
-          <variable name="TUTU">
-            <type>
-              <INT/>
-            </type>
-          </variable>
-        </globalVars>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/python/py_ext_0@py_ext/baseconfnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="2" Name="py_ext_0"/>
--- a/tests/python/py_ext_0@py_ext/pyfile.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <variables>
-    <variable name="SomeVarName" type="DINT" onchange="MyFunc, SomeChange"/>
-    <variable name="Grumpf" type="STRING" initial="'mhoo'" onchange="MyFunc, MyOtherFunc"/>
-  </variables>
-  <globals>
-    <xhtml:p><![CDATA[
-print "All python PLC globals variables :", PLCGlobalsDesc
-print "Current extention name :", __ext_name__
-
-def MyFunc(*args):
-    print args
-
-def MyOtherFunc(*args):
-    print "other", args
-
-def SomeChange(*args):
-    print "count",OnChange.SomeVarName.count
-    print "first",OnChange.SomeVarName.first
-    print "last",OnChange.SomeVarName.last
-
-
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/tests/python/python@py_ext/baseconfnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams Name="python" IEC_Channel="0"/>
--- a/tests/python/python@py_ext/pyfile.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
-  <variables>
-    <variable name="Test_Python_Var" type="INT" initial="4"/>
-    <variable name="Second_Python_Var" type="INT" initial="5"/>
-  </variables>
-  <globals>
-    <xhtml:p><![CDATA[
-import time,sys,ctypes
-Python_to_C_Call = PLCBinary.Python_to_C_Call
-Python_to_C_Call.restype = ctypes.c_int
-Python_to_C_Call.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_int)]
-
-def MyPythonFunc(arg):
-    i = ctypes.c_int()
-    if(Python_to_C_Call(arg, i)):
-        res = i.value
-        print "toC:", arg, "from C:", res, "FBID:", FBID
-    else:
-        print "Failed Python_to_C_Call failed"
-        res = None
-    print "Python read PLC global :",PLCGlobals.Test_Python_Var
-    print "Python read PLC global Grumpf :",PLCGlobals.Grumpf
-    PLCGlobals.Second_Python_Var = 789
-    sys.stdout.flush()
-    return res
-
-async_error_test_code = """
-def badaboom():
-    tuple()[0]
-
-import wx
-def badaboomwx():
-    wx.CallAfter(badaboom)
-
-from threading import Timer
-a = Timer(3, badaboom)
-a.start()
-
-b = Timer(6, badaboomwx)
-b.start()
-"""
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[
-global x, y
-x = 2
-y = 5
-print "py_runtime init:", x, ",", y
-]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[
-print "py_runtime cleanup"
-]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[
-global x, y
-print "py_runtime start", x * x + y * y
-]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[
-print "py_runtime stop"
-]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/tests/svghmi/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="PYRO://127.0.0.1:61284">
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
   <TargetType/>
   <Libraries Enable_SVGHMI_Library="true"/>
 </BeremizRoot>
--- a/tests/svghmi/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2019-08-06T14:23:42"/>
-  <contentHeader name="Unnamed" modificationDateTime="2021-05-13T10:44:29">
+  <contentHeader name="Unnamed" modificationDateTime="2021-10-03T20:43:39">
     <coordinateInfo>
       <fbd>
         <scaling x="5" y="5"/>
--- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg	Wed Oct 20 08:57:07 2021 +0200
@@ -125,17 +125,17 @@
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
      inkscape:document-units="px"
-     inkscape:current-layer="g1499-7"
+     inkscape:current-layer="hmi0"
      showgrid="false"
      units="px"
-     inkscape:zoom="0.84355633"
-     inkscape:cx="1857.6296"
-     inkscape:cy="687.32797"
-     inkscape:window-width="1600"
-     inkscape:window-height="836"
-     inkscape:window-x="0"
+     inkscape:zoom="0.42177818"
+     inkscape:cx="543.13877"
+     inkscape:cy="-467.92793"
+     inkscape:window-width="2400"
+     inkscape:window-height="2096"
+     inkscape:window-x="3200"
      inkscape:window-y="27"
-     inkscape:window-maximized="1"
+     inkscape:window-maximized="0"
      showguides="true"
      inkscape:guide-bbox="true"
      inkscape:snap-global="true"
@@ -406,18 +406,6 @@
          y="-78.144218"
          style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px">10000</tspan></text>
     <text
-       inkscape:label="value"
-       id="text4517"
-       y="-6.1937833"
-       x="113.53007"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         id="tspan4515"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
-         y="-6.1937833"
-         x="113.53007"
-         sodipodi:role="line">000</tspan></text>
-    <text
        xml:space="preserve"
        style="font-style:normal;font-weight:normal;font-size:7.5467205px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="124.77896"
@@ -467,201 +455,6 @@
        y="336.90073"
        style="fill:#ff6600;stroke-width:0.57180536px">Pressure</tspan></text>
   <g
-     id="layer4"
-     inkscape:label="HMI:Lang:cn"
-     style="display:none"
-     inkscape:groupmode="layer">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:vertical-lr;text-anchor:middle;display:inline;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="83.669571"
-       y="136.78285"
-       id="text948-6"
-       inkscape:label="setpoint_label"><tspan
-         sodipodi:role="line"
-         id="tspan946-2"
-         x="136.78285"
-         y="83.669571"
-         style="stroke-width:1px">设定值</tspan></text>
-    <text
-       id="text952-9"
-       y="137.16286"
-       x="703.711"
-       style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;writing-mode:vertical-lr;display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"
-       inkscape:label="actual_label"><tspan
-         y="703.711"
-         x="137.16286"
-         id="tspan950-1"
-         sodipodi:role="line"
-         style="text-align:center;writing-mode:vertical-lr;text-anchor:middle;stroke-width:1px">当前值</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;writing-mode:vertical-lr;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="480.61847"
-       y="278.37503"
-       id="text956-2"
-       inkscape:label="pressure_label"><tspan
-         sodipodi:role="line"
-         id="tspan954-7"
-         x="278.37503"
-         y="480.61847"
-         style="writing-mode:vertical-lr;fill:#ff6600;stroke-width:0.99999994px">压力</tspan></text>
-    <text
-       inkscape:label="setting_jmp"
-       id="text1097"
-       y="656.98151"
-       x="1090.7626"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
-         y="656.98151"
-         x="1090.7626"
-         id="tspan1095"
-         sodipodi:role="line">设置</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="1090.7626"
-       y="1436.9814"
-       id="text1101"
-       inkscape:label="home_jmp"><tspan
-         sodipodi:role="line"
-         x="1090.7626"
-         y="1436.9814"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
-         id="tspan1107">家</tspan></text>
-  </g>
-  <g
-     id="layer2"
-     inkscape:label="HMI:Lang:fr"
-     style="display:none"
-     inkscape:groupmode="layer">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="340.9082"
-       y="77.142853"
-       id="text948"
-       inkscape:label="setpoint_label"><tspan
-         sodipodi:role="line"
-         id="tspan946"
-         x="340.9082"
-         y="77.142853">Valeur de consigne</tspan></text>
-    <text
-       id="text952"
-       y="77.142853"
-       x="960.9082"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"
-       inkscape:label="actual_label"><tspan
-         y="77.142853"
-         x="960.9082"
-         id="tspan950"
-         sodipodi:role="line"
-         style="text-align:center;text-anchor:middle">Valeur courante</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="420.37848"
-       y="399.41504"
-       id="text956"
-       inkscape:label="pressure_label"><tspan
-         sodipodi:role="line"
-         id="tspan954"
-         x="420.37848"
-         y="399.41504"
-         style="fill:#ff6600;stroke-width:0.99999994px">Pression</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="1090.7626"
-       y="656.98151"
-       id="setting_jmp-0"
-       inkscape:label="setting_jmp"><tspan
-         sodipodi:role="line"
-         id="tspan1024-9"
-         x="1090.7626"
-         y="656.98151"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">Settings</tspan></text>
-    <text
-       inkscape:label="home_jmp"
-       id="home_jmp-3"
-       y="1436.9814"
-       x="1090.7626"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
-         y="1436.9814"
-         x="1090.7626"
-         id="tspan1028-6"
-         sodipodi:role="line">Home</tspan></text>
-  </g>
-  <g
-     id="layer3"
-     inkscape:label="HMI:Lang:si"
-     style="display:inline"
-     inkscape:groupmode="layer">
-    <text
-       id="text930"
-       y="77.142853"
-       x="338.67188"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"
-       inkscape:label="setpoint_label"><tspan
-         y="77.142853"
-         x="338.67188"
-         id="tspan928"
-         sodipodi:role="line">nastavljena vrednost</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="959.38477"
-       y="77.142853"
-       id="text934"
-       inkscape:label="actual_label"><tspan
-         sodipodi:role="line"
-         id="tspan932"
-         x="959.38477"
-         y="77.142853">dejanska vrednost</tspan></text>
-    <text
-       id="text938"
-       y="399.41504"
-       x="420.37848"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"
-       inkscape:label="pressure_label"><tspan
-         style="fill:#ff6600;stroke-width:0.99999994px"
-         y="399.41504"
-         x="420.37848"
-         id="tspan936"
-         sodipodi:role="line">pritisk</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="1090.7626"
-       y="656.98151"
-       id="setting_jmp-06"
-       inkscape:label="setting_jmp"><tspan
-         sodipodi:role="line"
-         id="tspan1024-2"
-         x="1090.7626"
-         y="656.98151"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">Settings</tspan></text>
-    <text
-       inkscape:label="home_jmp"
-       id="home_jmp-6"
-       y="1436.9814"
-       x="1090.7626"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
-         y="1436.9814"
-         x="1090.7626"
-         id="tspan1028-1"
-         sodipodi:role="line">Home</tspan></text>
-  </g>
-  <g
      inkscape:label="HMI:Meter@/PUMP0/SLOTH"
      transform="matrix(7.5590552,0,0,7.5590552,-244.3956,1321.2434)"
      id="g110">
@@ -704,19 +497,6 @@
          id="tspan98"
          sodipodi:role="line">10000</tspan></text>
     <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="-20.624428"
-       y="-109.67243"
-       id="text104"
-       inkscape:label="value"
-       transform="rotate(90)"><tspan
-         sodipodi:role="line"
-         x="-20.624428"
-         y="-109.67243"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
-         id="tspan102">000</tspan></text>
-    <text
        inkscape:label="unit"
        id="text108"
        y="-9.4425077"
@@ -2841,18 +2621,6 @@
          id="tspan1326"
          sodipodi:role="line">10000</tspan></text>
     <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="113.53007"
-       y="-6.1937833"
-       id="text1332"
-       inkscape:label="value"><tspan
-         sodipodi:role="line"
-         x="113.53007"
-         y="-6.1937833"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
-         id="tspan1330">000</tspan></text>
-    <text
        inkscape:label="unit"
        id="text1336"
        y="1.1408259"
@@ -3632,13 +3400,13 @@
              height="95.723877"
              width="245.44583"
              id="rect1479-7"
-             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.28600003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal" />
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.28600003;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
         </g>
         <g
            id="g1906"
            inkscape:label="inactive">
           <rect
-             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#3d3d3d;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;font-variant-east_asian:normal"
+             style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#3d3d3d;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
              id="rect1904"
              width="245.44583"
              height="95.723877"
@@ -4326,18 +4094,6 @@
          id="tspan697"
          sodipodi:role="line">10000</tspan></text>
     <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="113.53007"
-       y="-6.1937833"
-       id="text703"
-       inkscape:label="value"><tspan
-         sodipodi:role="line"
-         x="113.53007"
-         y="-6.1937833"
-         style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.26458332px"
-         id="tspan701">000</tspan></text>
-    <text
        inkscape:label="unit"
        id="text707"
        y="1.1408259"
@@ -7473,4 +7229,313 @@
            style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">up</tspan></text>
     </g>
   </g>
+  <rect
+     inkscape:label="HMI:Page:DropDownPage"
+     y="780"
+     x="1480"
+     height="720"
+     width="1280"
+     id="rect1081"
+     style="color:#000000;fill:#4d4d4d" />
+  <g
+     style="stroke-width:0.35083869"
+     transform="matrix(0.81491208,0,0,0.81491208,1123.6641,269.69509)"
+     inkscape:label="HMI:DropDown@/SELECTION"
+     id="g1093">
+    <rect
+       inkscape:label="box"
+       ry="2.4558709"
+       rx="2.4558709"
+       y="923.98993"
+       x="864.00842"
+       height="130.9433"
+       width="391.99988"
+       id="rect1083"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#53676c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419343;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.75419331;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect1085"
+       width="391.99988"
+       height="92.71212"
+       x="864.00842"
+       y="943.10553"
+       rx="2.4558709"
+       ry="2.4558709"
+       inkscape:label="highlight" />
+    <path
+       inkscape:label="button"
+       inkscape:transform-center-y="10.92088"
+       d="m 1200.5,1018.6835 -18.9155,-32.76262 -18.9155,-32.76264 37.831,0 37.831,0 -18.9155,32.76264 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="false"
+       sodipodi:arg2="2.6179939"
+       sodipodi:arg1="1.5707963"
+       sodipodi:r2="21.841761"
+       sodipodi:r1="43.683521"
+       sodipodi:cy="975"
+       sodipodi:cx="1200.5"
+       sodipodi:sides="3"
+       id="path1091"
+       style="opacity:1;vector-effect:none;fill:#a7a5a6;fill-opacity:1;stroke:none;stroke-width:0.12376806;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       sodipodi:type="star" />
+    <use
+       transform="matrix(1.0859809,0,0,1.0859809,-531.04917,1248.2618)"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d42aff;fill-opacity:1;stroke:none;stroke-width:1.40335476px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="0"
+       y="0"
+       xlink:href="#text879-6"
+       id="use1109"
+       width="100%"
+       height="100%"
+       inkscape:label="text" />
+  </g>
+  <g
+     id="g4282-3"
+     inkscape:label="HMI:Jump:Home"
+     transform="translate(1463.5642,-564.57759)">
+    <g
+       id="g4274-6"
+       inkscape:label="button">
+      <path
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m 1217.4113,1410.4016 -22,24.5657 c -10.7925,12.0511 6.1317,35.5791 -13.5791,35.5791 h -174.2877 c -19.71078,0 -2.7866,-23.528 -13.57905,-35.5791 l -22,-24.5657 127.74845,-48.4334 z"
+         id="path4272-7"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cssssccc" />
+    </g>
+    <g
+       id="g4280-5"
+       inkscape:label="text">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="1090.7626"
+         y="1436.9814"
+         id="text4278-3"
+         inkscape:label="home_jmp"><tspan
+           sodipodi:role="line"
+           id="tspan4276-5"
+           x="1090.7626"
+           y="1436.9814"
+           style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">Home</tspan></text>
+    </g>
+  </g>
+  <g
+     transform="matrix(0.57180538,0,0,0.57180538,512.09037,-234.29183)"
+     inkscape:label="HMI:Jump:DropDownPage"
+     id="g2198-6">
+    <g
+       inkscape:label="button"
+       id="g2190-2">
+      <rect
+         inkscape:label="button"
+         ry="35.579063"
+         y="594.82263"
+         x="971.96545"
+         height="95.723877"
+         width="245.44583"
+         id="rect2188-9"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         rx="35.579063" />
+    </g>
+    <g
+       inkscape:label="text"
+       id="g2196-1">
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="1090.7626"
+         y="656.98151"
+         id="text2194-2"
+         inkscape:label="setting_jmp"><tspan
+           sodipodi:role="line"
+           id="tspan2192-7"
+           x="1090.7626"
+           y="656.98151"
+           style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px">DropDown</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g893-0"
+     inkscape:label="HMI:TextList:TestTextList"
+     transform="matrix(3.539916,0,0,3.539916,-1740.4841,1980.5529)"
+     style="stroke-width:0.28249258">
+    <text
+       inkscape:label="Trois"
+       id="text1382-7-9"
+       y="-171.54395"
+       x="1298.9102"
+       xml:space="preserve"
+       style="stroke-width:0.28249258"><tspan
+         y="-171.54395"
+         x="1298.9102"
+         id="tspan1380-5-3"
+         sodipodi:role="line"
+         style="stroke-width:0.28249258">Three</tspan></text>
+    <text
+       xml:space="preserve"
+       x="1298.9102"
+       y="-191.54395"
+       id="text875-6"
+       inkscape:label="Deux"
+       style="stroke-width:0.28249258"><tspan
+         sodipodi:role="line"
+         id="tspan873-0"
+         x="1298.9102"
+         y="-191.54395"
+         style="stroke-width:0.28249258">Two</tspan></text>
+    <text
+       inkscape:label="Un"
+       id="text879-6"
+       y="-211.54395"
+       x="1298.9102"
+       xml:space="preserve"
+       style="stroke-width:0.28249258"><tspan
+         y="-211.54395"
+         x="1298.9102"
+         id="tspan877-2"
+         sodipodi:role="line"
+         style="stroke-width:0.28249258">One</tspan></text>
+    <text
+       xml:space="preserve"
+       x="1298.9102"
+       y="-231.54395"
+       id="text883-6"
+       inkscape:label="Zero"
+       style="stroke-width:0.28249258"><tspan
+         sodipodi:role="line"
+         id="tspan881-1"
+         x="1298.9102"
+         y="-231.54395"
+         style="stroke-width:0.28249258">Zero</tspan></text>
+  </g>
+  <g
+     transform="matrix(0.28590269,0,0,0.28590269,1653.6069,1022.1289)"
+     id="g1120"
+     inkscape:label="HMI:Input@/SELECTION">
+    <text
+       inkscape:label="value"
+       id="text1110"
+       y="218.24219"
+       x="216.32812"
+       style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="text-align:end;text-anchor:end;stroke-width:1px"
+         y="218.24219"
+         x="216.32812"
+         id="tspan1108"
+         sodipodi:role="line">8</tspan></text>
+    <path
+       inkscape:label="-1"
+       inkscape:transform-center-y="7.4781812"
+       d="m 302.6459,-210.03172 -51.81035,0 25.90517,-44.86908 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="true"
+       sodipodi:arg2="1.5707963"
+       sodipodi:arg1="0.52359878"
+       sodipodi:r2="14.956361"
+       sodipodi:r1="29.912722"
+       sodipodi:cy="-224.98808"
+       sodipodi:cx="276.74072"
+       sodipodi:sides="3"
+       id="path1112"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       sodipodi:type="star"
+       transform="scale(1,-1)" />
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect1114"
+       width="407.7037"
+       height="128"
+       x="-174.94055"
+       y="95.40741"
+       onclick=""
+       inkscape:label="edit" />
+    <path
+       sodipodi:type="star"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="path1116"
+       sodipodi:sides="3"
+       sodipodi:cx="276.74072"
+       sodipodi:cy="96.444443"
+       sodipodi:r1="29.912722"
+       sodipodi:r2="14.956361"
+       sodipodi:arg1="0.52359878"
+       sodipodi:arg2="1.5707963"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 302.6459,111.4008 -51.81035,0 25.90517,-44.869079 z"
+       inkscape:transform-center-y="-7.4781804"
+       inkscape:label="+1" />
+    <path
+       inkscape:transform-center-x="1.0089177e-06"
+       sodipodi:type="star"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="path1118"
+       sodipodi:sides="4"
+       sodipodi:cx="276.74072"
+       sodipodi:cy="160.71626"
+       sodipodi:r1="41.281136"
+       sodipodi:r2="21.657967"
+       sodipodi:arg1="0.77793027"
+       sodipodi:arg2="1.5633284"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 306.14807,189.68763 -58.37872,0.43598 -0.43597,-58.37872 58.37871,-0.43597 z"
+       inkscape:transform-center-y="-10.828983"
+       inkscape:label="=0" />
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-weight:normal;font-size:80px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:1.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="1165.3422"
+     y="-584.62439"
+     id="text1129"
+     inkscape:label="HMI:Display@/PUMP0/SLOTH"
+     transform="rotate(90)"><tspan
+       sodipodi:role="line"
+       x="1165.3422"
+       y="-584.62439"
+       style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:1.99999988px"
+       id="tspan1127">000</tspan></text>
+  <text
+     inkscape:label="HMI:Display@/PUMP0/SLOTH"
+     id="text4517"
+     y="455.53851"
+     x="388.12311"
+     style="font-style:normal;font-weight:normal;font-size:22.87221527px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.57180536px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     xml:space="preserve"><tspan
+       id="tspan4515"
+       style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.57180536px"
+       y="455.53851"
+       x="388.12311"
+       sodipodi:role="line">000</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-weight:normal;font-size:22.87221527px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.57180536px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="848.12311"
+     y="415.53851"
+     id="text703"
+     inkscape:label="HMI:Display@level"><tspan
+       sodipodi:role="line"
+       x="848.12311"
+       y="415.53851"
+       style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.57180536px"
+       id="tspan701">000</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="2057.6001"
+     y="606.89435"
+     id="text1332"
+     inkscape:label="HMI:Display@/PUMP0/SLOTH"><tspan
+       sodipodi:role="line"
+       x="2057.6001"
+       y="606.89435"
+       style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.99999994px"
+       id="tspan1330">000</tspan></text>
 </svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_SVGHMI_Library="true"/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,73 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2019-08-06T14:23:42"/>
+  <contentHeader name="Unnamed" modificationDateTime="2021-09-10T14:17:04">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="5" y="5"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="MainStuff" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="var0">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+            <variable name="var1">
+              <type>
+                <derived name="HMI_INT"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="5" executionOrderId="0" height="30" width="125" negated="false">
+              <position x="445" y="65"/>
+              <connectionPointOut>
+                <relPosition x="125" y="15"/>
+              </connectionPointOut>
+              <expression>var0</expression>
+            </inVariable>
+            <outVariable localId="10" executionOrderId="0" height="25" width="85" negated="false">
+              <position x="710" y="105"/>
+              <connectionPointIn>
+                <relPosition x="0" y="10"/>
+                <connection refLocalId="5">
+                  <position x="710" y="115"/>
+                  <position x="640" y="115"/>
+                  <position x="640" y="80"/>
+                  <position x="570" y="80"/>
+                </connection>
+              </connectionPointIn>
+              <expression>var1</expression>
+            </outVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="MainStuff"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/svghmi_0@svghmi/baseconfnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="svghmi_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/svghmi_0@svghmi/confnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema" WatchdogInitial="10" WatchdogInterval="5"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/svghmi_0@svghmi/messages.pot	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,17 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2021-02-12 21:55+CET\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: SVGHMI 1.0\n"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svghmi_pathslider/svghmi_0@svghmi/svghmi.svg	Wed Oct 20 08:57:07 2021 +0200
@@ -0,0 +1,882 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   sodipodi:docname="svghmi.svg"
+   id="hmi0"
+   version="1.1"
+   viewBox="0 0 1280 720"
+   height="720"
+   width="1280">
+  <metadata
+     id="metadata4542">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs2">
+    <marker
+       inkscape:stockid="SquareL"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="SquareL"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path1054"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+         transform="scale(0.8)" />
+    </marker>
+    <linearGradient
+       id="linearGradient34303"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop34301" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient20537"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop20535" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:document-units="px"
+     inkscape:current-layer="hmi0"
+     showgrid="false"
+     units="px"
+     inkscape:zoom="1.8101934"
+     inkscape:cx="616.36085"
+     inkscape:cy="455.0488"
+     inkscape:window-width="2188"
+     inkscape:window-height="1534"
+     inkscape:window-x="3675"
+     inkscape:window-y="324"
+     inkscape:window-maximized="0"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-nodes="true" />
+  <g
+     inkscape:label="HMI:Keypad:HMI_INT:HMI_REAL"
+     id="g2432"
+     style="fill-rule:evenodd;stroke-width:0.47631353"
+     transform="matrix(3.3549332,0,0,3.14525,-181.87457,2336.0198)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:label="Background"
+       inkscape:connector-curvature="0"
+       id="path2136"
+       d="M 54.211099,1.2654702 H 435.73881 V 230.18209 H 54.211099 Z"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.16776976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <rect
+       ry="3.8152773"
+       rx="3.8152773"
+       y="15.77106"
+       x="64.024963"
+       height="30.150299"
+       width="361.89996"
+       id="rect2426"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#fffff5;fill-opacity:1;fill-rule:nonzero;stroke:#202326;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       inkscape:label="Field" />
+    <text
+       id="text2430"
+       y="37.408375"
+       x="72.50132"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:19.0763855px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.47690967px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"
+       inkscape:label="Value"><tspan
+         style="text-align:start;text-anchor:start;stroke-width:0.47690967px"
+         y="37.408375"
+         x="72.50132"
+         id="tspan2428"
+         sodipodi:role="line">number</tspan></text>
+    <g
+       style="fill-rule:evenodd;stroke-width:0.13585199"
+       inkscape:label="Enter"
+       id="g4947"
+       transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60855)">
+      <path
+         style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;stroke:none;stroke-width:0.10074362;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path193"
+         d="m 750,175 c 0,-2 -1,-3 -3,-3 h -20 c -1,0 -3,1 -3,3 v 43 c 0,1 2,2 3,2 h 20 c 2,0 3,-1 3,-2 z"
+         inkscape:connector-curvature="0" />
+      <path
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m -1244.2949,1166.5938 v 15.791 h -38.6875 v -2.9981 l -6.9199,4 6.9199,4 v -2.998 h 40.6836 v -17.7949 z"
+         transform="matrix(0.28557246,0,0,0.28557246,1098.7155,-140.51013)"
+         id="path6545-4"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       style="fill-rule:evenodd;stroke-width:0.13585199"
+       inkscape:label="Keys"
+       id="g4993"
+       transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60855)">
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="7"
+         id="g4892">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 638,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+           id="path163"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text331"
+           y="129.38269"
+           x="636.4165"
+           transform="scale(1.0007154,0.99928514)">7</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="4"
+         id="g4907">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 638,146 h 20 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+           id="path169"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text335"
+           y="154.10822"
+           x="636.4165"
+           transform="scale(1.0007154,0.99928514)">4</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="1"
+         id="g4922">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 638,172 h 20 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+           id="path175"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text339"
+           y="179.82285"
+           x="636.4165"
+           transform="scale(1.0007154,0.99928514)">1</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="8"
+         id="g4897">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 668,120 h 19 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -19 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+           id="path165"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text347"
+           y="129.38269"
+           x="667.07562"
+           transform="scale(1.0007154,0.99928514)">8</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="5"
+         id="g4912">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 668,146 h 19 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -19 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+           id="path171"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text351"
+           y="154.10822"
+           x="667.07562"
+           transform="scale(1.0007154,0.99928514)">5</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="2"
+         id="g4927">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 668,172 h 19 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -19 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+           id="path177"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text355"
+           y="179.82285"
+           x="667.07562"
+           transform="scale(1.0007154,0.99928514)">2</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="9"
+         id="g4902">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 697,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+           id="path167"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text363"
+           y="129.38269"
+           x="695.75708"
+           transform="scale(1.0007154,0.99928514)">9</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="6"
+         id="g4917">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 697,146 h 20 c 2,0 3,1 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-2 2,-3 3,-3 z"
+           id="path173"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text367"
+           y="154.10822"
+           x="695.75708"
+           transform="scale(1.0007154,0.99928514)">6</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="3"
+         id="g4932">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 697,172 h 20 c 2,0 3,1 3,3 v 17 c 0,1 -1,3 -3,3 h -20 c -1,0 -3,-2 -3,-3 v -17 c 0,-2 2,-3 3,-3 z"
+           id="path179"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text371"
+           y="179.82285"
+           x="695.75708"
+           transform="scale(1.0007154,0.99928514)">3</text>
+      </g>
+      <g
+         style="stroke-width:0.13585199"
+         inkscape:label="0"
+         id="g4937">
+        <path
+           inkscape:connector-curvature="0"
+           d="m 638,220 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 h 49 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 z"
+           id="path373"
+           style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+           id="text377"
+           y="205.53712"
+           x="636.4165"
+           transform="scale(1.0007154,0.99928514)">0</text>
+      </g>
+    </g>
+    <g
+       id="g3113"
+       inkscape:label="Esc"
+       transform="translate(-318.22576)">
+      <path
+         style="opacity:1;vector-effect:none;fill:#4f4c4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824313;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path167-3"
+         d="m 387.26079,54.792986 h 33.40019 c 3.34,0 5.01006,3.34003 5.01006,5.010045 v 30.060225 c 0,3.340029 -1.67006,5.010032 -5.01006,5.010032 h -33.40019 c -1.67006,0 -5.01007,-1.670003 -5.01007,-5.010032 V 59.803031 c 0,-1.670015 3.34001,-5.010045 5.01007,-5.010045 z"
+         inkscape:connector-curvature="0" />
+      <text
+         x="394.42801"
+         y="78.632088"
+         id="text469-4"
+         style="font-weight:normal;font-size:10.63882256px;font-family:Arial;fill:#ffffff;fill-rule:evenodd;stroke-width:0.36866826"
+         transform="scale(1.0007154,0.99928511)">Esc</text>
+    </g>
+    <g
+       id="g3109"
+       inkscape:label="BackSpace"
+       transform="translate(0,-43.420332)">
+      <path
+         style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.16824308;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path173-1"
+         d="m 387.26079,98.213318 h 33.40019 c 3.34,0 5.01006,1.670013 5.01006,5.010032 v 30.06024 c 0,3.34002 -1.67006,5.01003 -5.01006,5.01003 h -33.40019 c -1.67006,0 -5.01007,-1.67001 -5.01007,-5.01003 v -30.06024 c 0,-3.340019 3.34001,-5.010032 5.01007,-5.010032 z"
+         inkscape:connector-curvature="0" />
+      <path
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#2b2828;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         d="m -1278.9668,1041.3047 -6.9199,4 6.9199,4 v -3 h 33.416 v -1.9981 h -33.416 z"
+         transform="matrix(0.47690966,0,0,0.47690966,1008.0304,-380.26227)"
+         id="path11623-1-0-2"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g787"
+       inkscape:label="Sign"
+       style="fill-rule:evenodd;stroke-width:0.13585199"
+       transform="matrix(1.6700128,0,0,1.6700128,-678.20742,-102.18822)">
+      <path
+         style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         id="path781"
+         d="m 638,120 h 20 c 2,0 3,2 3,3 v 18 c 0,2 -1,3 -3,3 h -20 c -1,0 -3,-1 -3,-3 v -18 c 0,-1 2,-3 3,-3 z"
+         inkscape:connector-curvature="0" />
+      <text
+         x="642.1239"
+         y="135.09822"
+         id="text783"
+         style="font-weight:normal;font-size:9.28803921px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+         transform="scale(1.0007154,0.99928514)">+/-</text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.31375408px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.30784383px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="252.9579"
+       y="12.333653"
+       id="text509"
+       transform="scale(0.96824589,1.0327955)"
+       inkscape:label="Info"><tspan
+         sodipodi:role="line"
+         id="tspan507"
+         x="252.9579"
+         y="12.333653"
+         style="stroke-width:0.30784383px">information</tspan></text>
+    <g
+       transform="matrix(1.6700128,0,0,1.6700128,-826.83854,-145.60856)"
+       style="fill-rule:evenodd;stroke-width:0.13585199"
+       id="g4942"
+       inkscape:label="NumDot">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 697,197 h 20 c 2,0 3,1 3,2 v 19 c 0,1 -1,2 -3,2 h -20 c -1,0 -3,-1 -3,-2 v -19 c 0,-1 2,-2 3,-2 z"
+         id="path181"
+         style="opacity:1;vector-effect:none;fill:#d3d2d2;fill-opacity:1;stroke:none;stroke-width:0.10074359;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <text
+         style="font-weight:normal;font-size:6.96602964px;font-family:Arial;fill:#2b2828;stroke-width:0.10514989"
+         id="text771"
+         y="204.54802"
+         x="696.7464"
+         transform="scale(1.0007154,0.99928514)">.</text>
+    </g>
+  </g>
+  <rect
+     style="color:#000000;fill:#ffffff"
+     id="page0"
+     width="1280"
+     height="720"
+     x="0"
+     y="0"
+     inkscape:label="HMI:Page:Home" />
+  <g
+     id="g1913"
+     inkscape:label="HMI:Input@.max"
+     transform="translate(80,100)">
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect4827"
+       width="165.96402"
+       height="78.240181"
+       x="203.89867"
+       y="501.87585"
+       rx="7"
+       ry="7"
+       inkscape:label="edit" />
+    <text
+       id="text405"
+       y="551.66504"
+       x="275.02609"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"
+       inkscape:label="value"><tspan
+         y="551.66504"
+         x="275.02609"
+         id="tspan403"
+         sodipodi:role="line">1234</tspan></text>
+    <g
+       id="g1905"
+       inkscape:label="-1"
+       transform="translate(-314.79908,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect407"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text1558"><tspan
+           sodipodi:role="line"
+           id="tspan1556"
+           x="441.65189"
+           y="566.1087">-1</tspan></text>
+    </g>
+    <g
+       transform="translate(-434.79908,-17.189114)"
+       inkscape:label="-10"
+       id="g4394">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4388"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4392"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4390"
+           sodipodi:role="line">-10</tspan></text>
+    </g>
+    <g
+       transform="translate(11.20092,-17.189114)"
+       inkscape:label="+1"
+       id="g4402">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4396"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4400"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4398"
+           sodipodi:role="line">+1</tspan></text>
+    </g>
+    <g
+       id="g4410"
+       inkscape:label="+10"
+       transform="translate(131.20092,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect4404"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text4408"><tspan
+           sodipodi:role="line"
+           id="tspan4406"
+           x="441.65189"
+           y="566.1087">+10</tspan></text>
+    </g>
+  </g>
+  <g
+     transform="translate(80,-60)"
+     inkscape:label="HMI:Input@.min"
+     id="g4450">
+    <rect
+       inkscape:label="edit"
+       ry="7"
+       rx="7"
+       y="501.87585"
+       x="203.89867"
+       height="78.240181"
+       width="165.96402"
+       id="rect4412"
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <text
+       inkscape:label="value"
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="275.02609"
+       y="551.66504"
+       id="text4416"><tspan
+         sodipodi:role="line"
+         id="tspan4414"
+         x="275.02609"
+         y="551.66504">1234</tspan></text>
+    <g
+       transform="translate(-314.79908,-17.189114)"
+       inkscape:label="-1"
+       id="g4424">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4418"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4422"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4420"
+           sodipodi:role="line">-1</tspan></text>
+    </g>
+    <g
+       id="g4432"
+       inkscape:label="-10"
+       transform="translate(-434.79908,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect4426"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text4430"><tspan
+           sodipodi:role="line"
+           id="tspan4428"
+           x="441.65189"
+           y="566.1087">-10</tspan></text>
+    </g>
+    <g
+       id="g4440"
+       inkscape:label="+1"
+       transform="translate(11.20092,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect4434"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text4438"><tspan
+           sodipodi:role="line"
+           id="tspan4436"
+           x="441.65189"
+           y="566.1087">+1</tspan></text>
+    </g>
+    <g
+       transform="translate(131.20092,-17.189114)"
+       inkscape:label="+10"
+       id="g4448">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4442"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4446"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4444"
+           sodipodi:role="line">+10</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g4490"
+     inkscape:label="HMI:Input@.position"
+     transform="translate(80,-220)">
+    <rect
+       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       id="rect4452"
+       width="165.96402"
+       height="78.240181"
+       x="203.89867"
+       y="501.87585"
+       rx="7"
+       ry="7"
+       inkscape:label="edit" />
+    <text
+       id="text4456"
+       y="551.66504"
+       x="275.02609"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"
+       inkscape:label="value"><tspan
+         y="551.66504"
+         x="275.02609"
+         id="tspan4454"
+         sodipodi:role="line">1234</tspan></text>
+    <g
+       id="g4464"
+       inkscape:label="-1"
+       transform="translate(-314.79908,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect4458"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text4462"><tspan
+           sodipodi:role="line"
+           id="tspan4460"
+           x="441.65189"
+           y="566.1087">-1</tspan></text>
+    </g>
+    <g
+       transform="translate(-434.79908,-17.189114)"
+       inkscape:label="-10"
+       id="g4472">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4466"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4470"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4468"
+           sodipodi:role="line">-10</tspan></text>
+    </g>
+    <g
+       transform="translate(11.20092,-17.189114)"
+       inkscape:label="+1"
+       id="g4480">
+      <rect
+         ry="7"
+         rx="7"
+         y="513.73041"
+         x="392.38638"
+         height="88.909302"
+         width="99.578415"
+         id="rect4474"
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+      <text
+         id="text4478"
+         y="566.1087"
+         x="441.65189"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         xml:space="preserve"><tspan
+           y="566.1087"
+           x="441.65189"
+           id="tspan4476"
+           sodipodi:role="line">+1</tspan></text>
+    </g>
+    <g
+       id="g4488"
+       inkscape:label="+10"
+       transform="translate(131.20092,-17.189114)">
+      <rect
+         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         id="rect4482"
+         width="99.578415"
+         height="88.909302"
+         x="392.38638"
+         y="513.73041"
+         rx="7"
+         ry="7" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="441.65189"
+         y="566.1087"
+         id="text4486"><tspan
+           sodipodi:role="line"
+           id="tspan4484"
+           x="441.65189"
+           y="566.1087">+10</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g4877"
+     inkscape:label="HMI:VarInit:50@.position" />
+  <g
+     inkscape:label="HMI:VarInit:99@.max"
+     id="g4879" />
+  <g
+     id="g4881"
+     inkscape:label="HMI:VarInit:1@.min" />
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+     x="277.58728"
+     y="276.54129"
+     id="text941"><tspan
+       sodipodi:role="line"
+       id="tspan939"
+       x="277.58728"
+       y="276.54129">Position</tspan></text>
+  <text
+     id="text945"
+     y="436.54129"
+     x="277.58728"
+     style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+     xml:space="preserve"><tspan
+       y="436.54129"
+       x="277.58728"
+       sodipodi:role="line"
+       id="tspan964">Min</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+     x="277.58728"
+     y="596.54126"
+     id="text949"><tspan
+       sodipodi:role="line"
+       x="277.58728"
+       y="596.54126"
+       id="tspan968">Max</tspan></text>
+  <g
+     id="g962"
+     inkscape:label="HMI:PathSlider@.position@.min@.max">
+    <path
+       inkscape:connector-curvature="0"
+       id="path148"
+       d="m 955.14658,26.15147 211.57962,92.25534"
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       inkscape:label="path" />
+    <path
+       d="m 966.53287,44.309416 -13.21418,-7.228051 -13.44562,6.787834 2.79088,-14.801024 -10.61054,-10.689986 14.93904,-1.919484 6.88794,-13.3946089 6.44196,13.6147169 14.86752,2.411663 -10.95769,10.333842 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.5873072"
+       sodipodi:arg1="0.9589887"
+       sodipodi:r2="11.340635"
+       sodipodi:r1="22.681271"
+       sodipodi:cy="25.742275"
+       sodipodi:cx="953.50592"
+       sodipodi:sides="5"
+       id="path153"
+       style="opacity:1;vector-effect:none;fill:#ff7903;fill-opacity:0.5288889;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
+       sodipodi:type="star"
+       inkscape:label="cursor" />
+  </g>
+  <g
+     inkscape:label="HMI:PathSlider@.position@.min@.max"
+     id="g976"
+     transform="translate(0,280)">
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 955.14658,26.15147 C 851.13467,-192.73963 1041.4811,9.3909254 1166.7262,118.40681"
+       id="path972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc"
+       inkscape:label="path" />
+    <path
+       sodipodi:type="star"
+       style="opacity:1;vector-effect:none;fill:#ff7903;fill-opacity:0.5288889;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
+       id="path974"
+       sodipodi:sides="5"
+       sodipodi:cx="953.50592"
+       sodipodi:cy="25.742275"
+       sodipodi:r1="22.681271"
+       sodipodi:r2="11.340635"
+       sodipodi:arg1="0.9589887"
+       sodipodi:arg2="1.5873072"
+       inkscape:flatsided="false"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 966.53287,44.309416 -13.21418,-7.228051 -13.44562,6.787834 2.79088,-14.801024 -10.61054,-10.689986 14.93904,-1.919484 6.88794,-13.3946089 6.44196,13.6147169 14.86752,2.411663 -10.95769,10.333842 z"
+       inkscape:label="cursor" />
+  </g>
+  <g
+     transform="matrix(1.3425901,0,0,1.3433676,-917.1196,42.980158)"
+     id="g982"
+     inkscape:label="HMI:PathSlider@.position@.min@.max"
+     style="stroke-width:0.74461341">
+    <path
+       sodipodi:nodetypes="cssc"
+       inkscape:connector-curvature="0"
+       id="path978"
+       d="m 952.93687,23.941761 c 51.19833,-44.196391 62.05743,74.937687 92.34943,75.490114 21.6066,0.394035 85.7552,-75.64156 18.9371,-55.006769 -72.1854,22.292318 95.3404,97.369964 112.9989,61.828304"
+       style="fill:none;stroke:#000000;stroke-width:0.74461341px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#SquareL)"
+       inkscape:label="path" />
+    <path
+       d="m 965.58932,65.187083 -13.21418,-7.228052 -13.44561,6.787834 2.79087,-14.801023 -10.61053,-10.689986 14.93903,-1.919485 6.88795,-13.394608 6.44195,13.614717 14.86753,2.411662 -10.9577,10.333842 z"
+       inkscape:randomized="0"
+       inkscape:rounded="0"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.5873072"
+       sodipodi:arg1="0.9589887"
+       sodipodi:r2="11.340635"
+       sodipodi:r1="22.681271"
+       sodipodi:cy="46.61994"
+       sodipodi:cx="952.5624"
+       sodipodi:sides="5"
+       id="path980"
+       style="opacity:1;vector-effect:none;fill:#ff7903;fill-opacity:0.5288889;stroke:none;stroke-width:0.74461341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
+       sodipodi:type="star"
+       inkscape:label="cursor" />
+  </g>
+</svg>
--- a/tests/svghmi_scrollbar/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi_scrollbar/beremiz.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="PYRO://127.0.0.1:61284">
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
   <TargetType/>
   <Libraries Enable_SVGHMI_Library="true"/>
 </BeremizRoot>
--- a/tests/svghmi_scrollbar/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi_scrollbar/plc.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2019-08-06T14:23:42"/>
-  <contentHeader name="Unnamed" modificationDateTime="2021-02-12T19:29:13">
+  <contentHeader name="Unnamed" modificationDateTime="2021-09-10T14:17:04">
     <coordinateInfo>
       <fbd>
         <scaling x="5" y="5"/>
--- a/tests/svghmi_scrollbar/svghmi_0@svghmi/confnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi_scrollbar/svghmi_0@svghmi/confnode.xml	Wed Oct 20 08:57:07 2021 +0200
@@ -1,2 +1,2 @@
 <?xml version='1.0' encoding='utf-8'?>
-<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema" OnWatchdog="echo Watchdog for {name} !" OnStart="chromium http://127.0.0.1:{port}/{name}" OnStop="echo Closing {name}" WatchdogInitial="10" WatchdogInterval="5"/>
+<SVGHMI xmlns:xsd="http://www.w3.org/2001/XMLSchema" WatchdogInitial="10" WatchdogInterval="5"/>
--- a/tests/svghmi_scrollbar/svghmi_0@svghmi/svghmi.svg	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/svghmi_scrollbar/svghmi_0@svghmi/svghmi.svg	Wed Oct 20 08:57:07 2021 +0200
@@ -60,13 +60,13 @@
      showgrid="false"
      units="px"
      inkscape:zoom="0.64"
-     inkscape:cx="318.22524"
-     inkscape:cy="196.09799"
-     inkscape:window-width="1939"
-     inkscape:window-height="1243"
-     inkscape:window-x="3325"
-     inkscape:window-y="162"
-     inkscape:window-maximized="0"
+     inkscape:cx="-438.80601"
+     inkscape:cy="183.59799"
+     inkscape:window-width="3200"
+     inkscape:window-height="1672"
+     inkscape:window-x="0"
+     inkscape:window-y="54"
+     inkscape:window-maximized="1"
      showguides="true"
      inkscape:guide-bbox="true"
      inkscape:snap-global="true"
@@ -745,7 +745,7 @@
   </g>
   <g
      id="g4507"
-     inkscape:label="HMI:ScrollBar@.position@.range@.size"
+     inkscape:label="HMI:ScrollBar@.range@.position@.size"
      transform="translate(-202)">
     <rect
        y="84"
@@ -818,7 +818,7 @@
        x="277.58728"
        y="596.54126">Size</tspan></text>
   <g
-     inkscape:label="HMI:ScrollBar@.position@.range@.size"
+     inkscape:label="HMI:ScrollBar@.range@.position@.size"
      id="g146"
      transform="rotate(90,837.8103,-106.02497)">
     <rect
@@ -854,7 +854,7 @@
   </g>
   <g
      transform="matrix(0.35355339,0.35355339,-0.35355339,0.35355339,831.43929,-136.17916)"
-     inkscape:label="HMI:ScrollBar@.position@.range@.size"
+     inkscape:label="HMI:ScrollBar@.range@.position@.size"
      id="g156"
      style="stroke-width:2">
     <rect
--- a/tests/svgui/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
-</BeremizRoot>
--- a/tests/svgui/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,485 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="beremiz" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/>
-  <contentHeader name="Beremiz SVGUI Test" modificationDateTime="2018-09-26T13:18:53">
-    <coordinateInfo>
-      <pageSize x="1024" y="1024"/>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="5" y="5"/>
-      </ld>
-      <sfc>
-        <scaling x="5" y="5"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="main_pytest" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="counter">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="Start_Stop">
-              <type>
-                <derived name="Button"/>
-              </type>
-            </variable>
-            <variable name="Counter_TextCtrl">
-              <type>
-                <derived name="TextCtrl"/>
-              </type>
-            </variable>
-            <variable name="State_LedCtrl">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="32" width="80" height="110" typeName="ADD" executionOrderId="0">
-              <position x="649" y="285"/>
-              <inputVariables>
-                <variable formalParameter="EN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="35"/>
-                    <connection refLocalId="5">
-                      <position x="649" y="320"/>
-                      <position x="594" y="320"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="65"/>
-                    <connection refLocalId="100" formalParameter="OUT">
-                      <position x="649" y="350"/>
-                      <position x="474" y="350"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="95"/>
-                    <connection refLocalId="33">
-                      <position x="649" y="380"/>
-                      <position x="629" y="380"/>
-                      <position x="629" y="418"/>
-                      <position x="854" y="418"/>
-                      <position x="854" y="350"/>
-                      <position x="839" y="350"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ENO">
-                  <connectionPointOut>
-                    <relPosition x="80" y="35"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="65"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="33" height="35" width="85" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="754" y="333"/>
-              <connectionPointIn>
-                <relPosition x="0" y="17"/>
-                <connection refLocalId="32" formalParameter="OUT">
-                  <position x="754" y="350"/>
-                  <position x="729" y="350"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="85" y="17"/>
-              </connectionPointOut>
-              <expression>counter</expression>
-            </inOutVariable>
-            <inVariable localId="39" height="35" width="89" executionOrderId="0" negated="false">
-              <position x="55" y="333"/>
-              <connectionPointOut>
-                <relPosition x="89" y="17"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <inVariable localId="41" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="619"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'stop_back'</expression>
-            </inVariable>
-            <inVariable localId="42" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="661"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'stop_sele'</expression>
-            </inVariable>
-            <inVariable localId="46" height="30" width="122" executionOrderId="0" negated="false">
-              <position x="694" y="799"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-              <expression>'text_counter'</expression>
-            </inVariable>
-            <inVariable localId="51" height="30" width="119" executionOrderId="0" negated="false">
-              <position x="692" y="612"/>
-              <connectionPointOut>
-                <relPosition x="119" y="15"/>
-              </connectionPointOut>
-              <expression>'led_stop'</expression>
-            </inVariable>
-            <inVariable localId="52" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="691" y="648"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>'led_start'</expression>
-            </inVariable>
-            <block localId="83" width="145" height="60" typeName="INT_TO_STRING" executionOrderId="0">
-              <position x="537" y="856"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="40"/>
-                    <connection refLocalId="4">
-                      <position x="537" y="896"/>
-                      <position x="504" y="896"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="145" y="40"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="92" width="187" height="230" typeName="Button" instanceName="Start_Stop" executionOrderId="0">
-              <position x="201" y="593"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="41"/>
-                    <connection refLocalId="41">
-                      <position x="201" y="634"/>
-                      <position x="141" y="634"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="83"/>
-                    <connection refLocalId="42">
-                      <position x="201" y="676"/>
-                      <position x="141" y="676"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="toggle">
-                  <connectionPointIn>
-                    <relPosition x="0" y="125"/>
-                    <connection refLocalId="93">
-                      <position x="201" y="718"/>
-                      <position x="141" y="718"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="set_state">
-                  <connectionPointIn>
-                    <relPosition x="0" y="167"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="209"/>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="state_out">
-                  <connectionPointOut>
-                    <relPosition x="187" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="93" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="703"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <block localId="94" width="100" height="145" typeName="TextCtrl" instanceName="Counter_TextCtrl" executionOrderId="0">
-              <position x="876" y="774"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="40"/>
-                    <connection refLocalId="46">
-                      <position x="876" y="814"/>
-                      <position x="816" y="814"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="set_text">
-                  <connectionPointIn>
-                    <relPosition x="0" y="81"/>
-                    <connection refLocalId="3">
-                      <position x="876" y="855"/>
-                      <position x="815" y="855"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="text">
-                  <connectionPointIn>
-                    <relPosition x="0" y="122"/>
-                    <connection refLocalId="83" formalParameter="OUT">
-                      <position x="876" y="896"/>
-                      <position x="682" y="896"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="1" height="30" width="88" executionOrderId="0" negated="false">
-              <position x="59" y="272"/>
-              <connectionPointOut>
-                <relPosition x="88" y="15"/>
-              </connectionPointOut>
-              <expression>BOOL#1</expression>
-            </inVariable>
-            <block localId="95" width="100" height="130" typeName="Led" instanceName="State_LedCtrl" executionOrderId="0">
-              <position x="876" y="589"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="51">
-                      <position x="876" y="627"/>
-                      <position x="811" y="627"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="74"/>
-                    <connection refLocalId="52">
-                      <position x="876" y="663"/>
-                      <position x="811" y="663"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="110"/>
-                    <connection refLocalId="2">
-                      <position x="876" y="699"/>
-                      <position x="811" y="699"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <block localId="96" width="80" height="65" typeName="AND" executionOrderId="0">
-              <position x="200" y="234"/>
-              <inputVariables>
-                <variable formalParameter="IN1" negated="true">
-                  <connectionPointIn>
-                    <relPosition x="0" y="31"/>
-                    <connection refLocalId="96" formalParameter="OUT">
-                      <position x="200" y="265"/>
-                      <position x="175" y="265"/>
-                      <position x="175" y="219"/>
-                      <position x="305" y="219"/>
-                      <position x="305" y="265"/>
-                      <position x="280" y="265"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="53"/>
-                    <connection refLocalId="1">
-                      <position x="200" y="287"/>
-                      <position x="147" y="287"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="31"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <connector name="CLOCK" localId="97" height="30" width="90">
-              <position x="345" y="250"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="96" formalParameter="OUT">
-                  <position x="345" y="265"/>
-                  <position x="280" y="265"/>
-                </connection>
-              </connectionPointIn>
-            </connector>
-            <connector name="COUNT" localId="98" height="30" width="90">
-              <position x="461" y="619"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="92" formalParameter="state_out">
-                  <position x="461" y="634"/>
-                  <position x="388" y="634"/>
-                </connection>
-              </connectionPointIn>
-            </connector>
-            <continuation name="COUNT" localId="2" height="30" width="120">
-              <position x="691" y="684"/>
-              <connectionPointOut>
-                <relPosition x="120" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <inVariable localId="4" height="35" width="85" executionOrderId="0" negated="false">
-              <position x="419" y="879"/>
-              <connectionPointOut>
-                <relPosition x="85" y="17"/>
-              </connectionPointOut>
-              <expression>counter</expression>
-            </inVariable>
-            <continuation name="COUNT" localId="5" height="30" width="90">
-              <position x="504" y="305"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <block localId="99" width="80" height="110" typeName="AND" executionOrderId="0">
-              <position x="199" y="308"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="42"/>
-                    <connection refLocalId="39">
-                      <position x="199" y="350"/>
-                      <position x="144" y="350"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="87"/>
-                    <connection refLocalId="6">
-                      <position x="199" y="395"/>
-                      <position x="144" y="395"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="42"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <continuation name="CLOCK" localId="6" height="30" width="90">
-              <position x="54" y="380"/>
-              <connectionPointOut>
-                <relPosition x="90" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <block localId="100" width="125" height="45" typeName="BOOL_TO_INT" executionOrderId="0">
-              <position x="349" y="318"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="32"/>
-                    <connection refLocalId="99" formalParameter="OUT">
-                      <position x="349" y="350"/>
-                      <position x="279" y="350"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="125" y="32"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <continuation name="CLOCK" localId="3" height="30" width="122">
-              <position x="693" y="840"/>
-              <connectionPointOut>
-                <relPosition x="122" y="15"/>
-              </connectionPointOut>
-            </continuation>
-            <comment localId="101" height="197" width="1001">
-              <position x="11" y="12"/>
-              <content>
-                <xhtml:p><![CDATA[This example shows how IEC program in PLC can interact with web interface. 
-
-svgui is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!!
-
-As the program is running in PLC, web UI will be available at http://localhost:8009/.
-
-
-Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: svgui extension. 
-Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately.
-]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="102" height="126" width="641">
-              <position x="17" y="441"/>
-              <content>
-                <xhtml:p><![CDATA[In this example basic elements like 'Button', 'Led' and 'Text' are used. 
-Back_id and sele_id inputs of these blocks are IDs  of graphic primitives in SVG file. 
-This is the way how elements in SVG are bound to elements in PLC program. 
-You can find out or edit these IDs in Inkscape.]]></xhtml:p>
-              </content>
-            </comment>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="res_pytest">
-          <task name="pytest_task" interval="t#100ms" priority="0"/>
-          <pouInstance name="pytest_instance" typeName="main_pytest"/>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/svgui/svgui@svgui/baseconfnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<BaseParams Name="svgui" IEC_Channel="0"/>
--- a/tests/svgui/svgui@svgui/gui.svg	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,723 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="320"
-   height="250"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.47pre4 "
-   version="1.0"
-   sodipodi:docname="gui.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4"
-     inkscape:cx="200.66323"
-     inkscape:cy="178.08292"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1071"
-     inkscape:window-height="805"
-     inkscape:window-x="106"
-     inkscape:window-y="16"
-     inkscape:window-maximized="0" />
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3770">
-      <stop
-         style="stop-color:#008000;stop-opacity:1;"
-         offset="0"
-         id="stop3772" />
-      <stop
-         style="stop-color:#00fb00;stop-opacity:1;"
-         offset="1"
-         id="stop3774" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3708">
-      <stop
-         style="stop-color:#d40000;stop-opacity:1;"
-         offset="0"
-         id="stop3710" />
-      <stop
-         style="stop-color:#ff5c5c;stop-opacity:1;"
-         offset="1"
-         id="stop3712" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4202">
-      <stop
-         id="stop4204"
-         offset="0"
-         style="stop-color:#f6edda;stop-opacity:1;" />
-      <stop
-         id="stop4206"
-         offset="1"
-         style="stop-color:#e6e6e6;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4192">
-      <stop
-         style="stop-color:#faf4e9;stop-opacity:1;"
-         offset="0"
-         id="stop4194" />
-      <stop
-         style="stop-color:#f1f1f1;stop-opacity:1;"
-         offset="1"
-         id="stop4196" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3302">
-      <stop
-         style="stop-color:#ff0000;stop-opacity:0;"
-         offset="0"
-         id="stop3304" />
-      <stop
-         id="stop3310"
-         offset="0.43817073"
-         style="stop-color:#ff0000;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#ff0000;stop-opacity:1;"
-         offset="0.68879533"
-         id="stop3312" />
-      <stop
-         style="stop-color:#ff0000;stop-opacity:0;"
-         offset="1"
-         id="stop3306" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3687">
-      <stop
-         id="stop3689"
-         offset="0"
-         style="stop-color:#23d5ff;stop-opacity:1;" />
-      <stop
-         id="stop3691"
-         offset="1"
-         style="stop-color:#b1ffff;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3679">
-      <stop
-         id="stop3681"
-         offset="0"
-         style="stop-color:#00b5ff;stop-opacity:1;" />
-      <stop
-         id="stop3683"
-         offset="1"
-         style="stop-color:#005bff;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3659">
-      <stop
-         id="stop3661"
-         offset="0"
-         style="stop-color:#ff0030;stop-opacity:1;" />
-      <stop
-         style="stop-color:#e20000;stop-opacity:0.83211678;"
-         offset="0.60000002"
-         id="stop3669" />
-      <stop
-         id="stop3663"
-         offset="1"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3639">
-      <stop
-         id="stop3641"
-         offset="0"
-         style="stop-color:#ffff00;stop-opacity:1;" />
-      <stop
-         style="stop-color:#8fff00;stop-opacity:0.49803922;"
-         offset="0.80000001"
-         id="stop3647" />
-      <stop
-         id="stop3643"
-         offset="1"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3621">
-      <stop
-         id="stop3623"
-         offset="0"
-         style="stop-color:#ff8080;stop-opacity:1;" />
-      <stop
-         id="stop3625"
-         offset="1"
-         style="stop-color:#aa0000;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3613"
-       inkscape:collect="always">
-      <stop
-         id="stop3615"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:1;" />
-      <stop
-         id="stop3617"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3497">
-      <stop
-         id="stop3499"
-         offset="0"
-         style="stop-color:#00cd00;stop-opacity:1;" />
-      <stop
-         id="stop3501"
-         offset="1"
-         style="stop-color:#007900;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3453">
-      <stop
-         id="stop3455"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:1;" />
-      <stop
-         id="stop3457"
-         offset="1"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3173">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop3175" />
-      <stop
-         id="stop3181"
-         offset="0.5"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-      <stop
-         style="stop-color:#ff0000;stop-opacity:0;"
-         offset="1"
-         id="stop3177" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective2619" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="76.489952"
-       x2="96.68087"
-       y1="43.13879"
-       x1="96.68087"
-       id="linearGradient3503"
-       xlink:href="#linearGradient3497"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="57.028084"
-       x2="146.58875"
-       y1="57.028084"
-       x1="56.098511"
-       id="linearGradient3619"
-       xlink:href="#linearGradient3613"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientUnits="userSpaceOnUse"
-       y2="81.670944"
-       x2="102.30303"
-       y1="40.599514"
-       x1="101.45565"
-       id="linearGradient3627"
-       xlink:href="#linearGradient3621"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientTransform="translate(-18,26)"
-       y2="81.670944"
-       x2="102.30303"
-       y1="40.599514"
-       x1="101.45565"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3633"
-       xlink:href="#linearGradient3621"
-       inkscape:collect="always" />
-    <radialGradient
-       r="17.67767"
-       fy="101.69787"
-       fx="352.03818"
-       cy="101.69787"
-       cx="352.03818"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient3667"
-       xlink:href="#linearGradient3639"
-       inkscape:collect="always" />
-    <radialGradient
-       r="17.67767"
-       fy="101.69787"
-       fx="352.03818"
-       cy="101.69787"
-       cx="352.03818"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient3675"
-       xlink:href="#linearGradient3659"
-       inkscape:collect="always" />
-    <linearGradient
-       gradientTransform="translate(-1.3119965,1.110878)"
-       gradientUnits="userSpaceOnUse"
-       y2="74.0345"
-       x2="222.50246"
-       y1="102.89583"
-       x1="223.57851"
-       id="linearGradient3693"
-       xlink:href="#linearGradient3687"
-       inkscape:collect="always" />
-    <linearGradient
-       y2="116.84509"
-       x2="312.63715"
-       y1="62.306999"
-       x1="277.45764"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3702"
-       xlink:href="#linearGradient4202"
-       inkscape:collect="always" />
-    <linearGradient
-       y2="66.89164"
-       x2="223.21674"
-       y1="102.89583"
-       x1="223.57851"
-       gradientTransform="translate(-1.3119965,1.110878)"
-       gradientUnits="userSpaceOnUse"
-       id="linearGradient3704"
-       xlink:href="#linearGradient3613"
-       inkscape:collect="always" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective3767" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3302"
-       id="linearGradient3308"
-       x1="255.95412"
-       y1="328.07761"
-       x2="258.63916"
-       y2="328.07761"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-25.178571,-3.0357143)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3536"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3538"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3540"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3542"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3544"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3546"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3548"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3550"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(5.555838,16.162441)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3694"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3696"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3698"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3700"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3703"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3705"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3707"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3613"
-       id="linearGradient3709"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-381.09403,-544.64978)"
-       x1="147.86807"
-       y1="287.98224"
-       x2="147.86807"
-       y2="341.01526" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4192"
-       id="linearGradient4200"
-       x1="9.601512"
-       y1="10.789209"
-       x2="311.62698"
-       y2="232.99521"
-       gradientUnits="userSpaceOnUse" />
-    <inkscape:perspective
-       id="perspective3695"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3708"
-       id="linearGradient3714"
-       x1="87.808205"
-       y1="244.84967"
-       x2="32.786144"
-       y2="103.0031"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3708"
-       id="linearGradient3722"
-       x1="73.120178"
-       y1="183.3553"
-       x2="52.375767"
-       y2="141.61852"
-       gradientUnits="userSpaceOnUse" />
-    <inkscape:perspective
-       id="perspective3732"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective3757"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3770"
-       id="linearGradient3776"
-       x1="149.16222"
-       y1="143.01329"
-       x2="-2.1779096"
-       y2="0.84358346"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3770"
-       id="linearGradient3784"
-       x1="96.563065"
-       y1="81.798767"
-       x2="56.660259"
-       y2="47.094559"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3621"
-       id="radialGradient3792"
-       cx="352.03818"
-       cy="101.69787"
-       fx="352.03818"
-       fy="101.69787"
-       r="18.67767"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3497"
-       id="radialGradient3800"
-       cx="352.03818"
-       cy="101.69787"
-       fx="352.03818"
-       fy="101.69787"
-       r="18.67767"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     style="display:inline">
-    <rect
-       ry="23.307579"
-       y="11.523975"
-       x="10.336278"
-       height="220.73647"
-       width="300.55594"
-       id="rect3700"
-       style="fill:url(#linearGradient4200);fill-opacity:1;stroke:#000000;stroke-width:1.46953177;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-    <g
-       transform="translate(-127.27923,-40.406102)"
-       id="g3695">
-      <rect
-         style="fill:url(#linearGradient3702);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0"
-         id="rect3677"
-         width="163.64471"
-         height="53.538086"
-         x="148.49243"
-         y="62.806999"
-         ry="5.029737" />
-      <text
-         sodipodi:linespacing="125%"
-         id="text_counter"
-         y="102.99694"
-         x="154.30698"
-         style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#655fdb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
-         xml:space="preserve"><tspan
-           y="102.99694"
-           x="154.30698"
-           id="tspan3191"
-           sodipodi:role="line"
-           style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#655fdb;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">Default</tspan></text>
-    </g>
-    <g
-       id="stop_back"
-       transform="translate(-33.11078,95.2077)">
-      <path
-         sodipodi:type="star"
-         style="color:#000000;fill:url(#linearGradient3776);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3784);stroke-width:3.80890393;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path3747"
-         sodipodi:sides="3"
-         sodipodi:cx="103.21429"
-         sodipodi:cy="127.14286"
-         sodipodi:r1="91.508057"
-         sodipodi:r2="45.754028"
-         sodipodi:arg1="0"
-         sodipodi:arg2="1.0471976"
-         inkscape:flatsided="true"
-         inkscape:rounded="0"
-         inkscape:randomized="0"
-         d="m 194.72234,127.14286 -137.262082,79.2483 0,-158.496601 137.262082,79.248301 z"
-         transform="matrix(0.78762818,0,0,0.78762818,26.492161,-44.168468)" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text2393"
-         y="68.857597"
-         x="151.45537"
-         style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
-         xml:space="preserve"><tspan
-           style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
-           y="68.857597"
-           x="151.45537"
-           id="tspan2395"
-           sodipodi:role="line">Start</tspan></text>
-    </g>
-    <g
-       transform="translate(-18.07106,94.06456)"
-       id="stop_sele"
-       style="fill:#aaffaa">
-      <path
-         sodipodi:type="star"
-         style="color:#000000;fill:url(#linearGradient3714);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3722);stroke-width:3.94511151;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path3685"
-         sodipodi:sides="8"
-         sodipodi:cx="83.571426"
-         sodipodi:cy="224.28571"
-         sodipodi:r1="94.724358"
-         sodipodi:r2="87.513893"
-         sodipodi:arg1="0"
-         sodipodi:arg2="0.39269908"
-         inkscape:flatsided="true"
-         inkscape:rounded="0"
-         inkscape:randomized="0"
-         d="m 178.29578,224.28571 -27.74412,66.98023 -66.980234,27.74412 -66.980235,-27.74412 -27.744122,-66.98023 27.744122,-66.98024 66.980235,-27.74412 66.980234,27.74412 27.74412,66.98024 z"
-         transform="matrix(0.70255013,-0.29100577,0.29100577,0.70255013,-13.216048,-76.13621)" />
-      <text
-         sodipodi:linespacing="100%"
-         id="text2401"
-         y="66.643318"
-         x="147.74109"
-         style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:100%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:inherit;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
-         xml:space="preserve"><tspan
-           style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:100%;writing-mode:lr-tb;text-anchor:end;fill:#ffffff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
-           y="66.643318"
-           x="147.74109"
-           id="tspan2403"
-           sodipodi:role="line">Stop</tspan></text>
-    </g>
-    <g
-       transform="matrix(2.0899173,0,0,2.0899173,-577.84265,-204.88668)"
-       id="led_start">
-      <path
-         transform="translate(42.282829,64.376725)"
-         d="m 369.71585,101.69787 a 17.67767,17.67767 0 1 1 -35.35534,0 17.67767,17.67767 0 1 1 35.35534,0 z"
-         sodipodi:ry="17.67767"
-         sodipodi:rx="17.67767"
-         sodipodi:cy="101.69787"
-         sodipodi:cx="352.03818"
-         id="pathLed"
-         style="fill:url(#radialGradient3800);fill-opacity:1;stroke:#000000;stroke-width:0.47848782;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         sodipodi:type="arc" />
-    </g>
-    <g
-       transform="matrix(2.0899173,0,0,2.0899173,-637.08625,-59.866062)"
-       id="led_stop">
-      <path
-         sodipodi:type="arc"
-         style="fill:url(#radialGradient3792);fill-opacity:1;stroke:#000000;stroke-width:0.47848782;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         id="path_led"
-         sodipodi:cx="352.03818"
-         sodipodi:cy="101.69787"
-         sodipodi:rx="17.67767"
-         sodipodi:ry="17.67767"
-         d="m 369.71585,101.69787 a 17.67767,17.67767 0 1 1 -35.35534,0 17.67767,17.67767 0 1 1 35.35534,0 z"
-         transform="translate(70.630181,-5.0138784)" />
-    </g>
-  </g>
-</svg>
--- a/tests/svgui/svgui@svgui/pyfile.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <variables/>
-  <globals>
-    <xhtml:p><![CDATA[
-
-/*
-    Web interface is build as SVG file in Inkscape. 
-    To edit SVG file click 'Inkscape' button on the toolbar above.
-    
-    Inkscape is a free and open-source vector graphics editor. 
-    It's not part of Beremiz and needs to be installed separately.
-*/
-
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/tests/tools/test_application.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/tests/tools/test_application.py	Wed Oct 20 08:57:07 2021 +0200
@@ -172,7 +172,6 @@
     @ddt.data(
         "first_steps",
         "logging",
-        "svgui",
         "traffic_lights",
         "wxGlade",
         "python",
--- a/tests/traffic_lights/beremiz.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
-</BeremizRoot>
--- a/tests/traffic_lights/plc.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1732 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Beremiz" productName="Unnamed" productVersion="1" creationDateTime="2012-09-04T16:16:33"/>
-  <contentHeader name="traffic_lights" modificationDateTime="2018-09-26T17:49:02">
-    <coordinateInfo>
-      <fbd>
-        <scaling x="0" y="0"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="traffic_light_sequence" pouType="functionBlock">
-        <interface>
-          <inputVars>
-            <variable name="SWITCH_BUTTON">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="PEDESTRIAN_BUTTON">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </inputVars>
-          <outputVars>
-            <variable name="RED_LIGHT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="ORANGE_LIGHT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="GREEN_LIGHT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="PEDESTRIAN_RED_LIGHT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="PEDESTRIAN_GREEN_LIGHT">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </outputVars>
-          <localVars>
-            <variable name="TON1">
-              <type>
-                <derived name="TON"/>
-              </type>
-            </variable>
-            <variable name="TON2">
-              <type>
-                <derived name="TON"/>
-              </type>
-            </variable>
-            <variable name="ALLOW_CARS">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="WARN_CARS">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="STOP_CARS">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="ALLOW_PEDESTRIANS">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="STOP_PEDESTRIANS">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="TON3">
-              <type>
-                <derived name="TON"/>
-              </type>
-            </variable>
-            <variable name="R_TRIG0">
-              <type>
-                <derived name="R_TRIG"/>
-              </type>
-            </variable>
-            <variable name="R_TRIG1">
-              <type>
-                <derived name="R_TRIG"/>
-              </type>
-            </variable>
-            <variable name="SR0">
-              <type>
-                <derived name="SR"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <actions>
-          <action name="BLINK_ORANGE_LIGHT">
-            <body>
-              <LD>
-                <leftPowerRail localId="1" height="40" width="3">
-                  <position x="54" y="123"/>
-                  <connectionPointOut formalParameter="">
-                    <relPosition x="3" y="20"/>
-                  </connectionPointOut>
-                </leftPowerRail>
-                <contact localId="2" height="15" width="21" negated="true">
-                  <position x="121" y="135"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="8"/>
-                    <connection refLocalId="1">
-                      <position x="121" y="143"/>
-                      <position x="56" y="143"/>
-                    </connection>
-                  </connectionPointIn>
-                  <connectionPointOut>
-                    <relPosition x="21" y="8"/>
-                  </connectionPointOut>
-                  <variable>ORANGE_LIGHT</variable>
-                </contact>
-                <block localId="3" width="97" height="102" typeName="TON" instanceName="TON1">
-                  <position x="216" y="103"/>
-                  <inputVariables>
-                    <variable formalParameter="IN">
-                      <connectionPointIn>
-                        <relPosition x="0" y="40"/>
-                        <connection refLocalId="2">
-                          <position x="216" y="143"/>
-                          <position x="142" y="143"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                    <variable formalParameter="PT">
-                      <connectionPointIn>
-                        <relPosition x="0" y="81"/>
-                        <connection refLocalId="4">
-                          <position x="216" y="184"/>
-                          <position x="151" y="184"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                  </inputVariables>
-                  <inOutVariables/>
-                  <outputVariables>
-                    <variable formalParameter="Q">
-                      <connectionPointOut>
-                        <relPosition x="97" y="40"/>
-                      </connectionPointOut>
-                    </variable>
-                    <variable formalParameter="ET">
-                      <connectionPointOut>
-                        <relPosition x="97" y="81"/>
-                      </connectionPointOut>
-                    </variable>
-                  </outputVariables>
-                </block>
-                <inVariable localId="4" height="37" width="76" negated="false">
-                  <position x="75" y="166"/>
-                  <connectionPointOut>
-                    <relPosition x="76" y="18"/>
-                  </connectionPointOut>
-                  <expression>T#500ms</expression>
-                </inVariable>
-                <block localId="5" width="97" height="106" typeName="TON" instanceName="TON2">
-                  <position x="216" y="251"/>
-                  <inputVariables>
-                    <variable formalParameter="IN">
-                      <connectionPointIn>
-                        <relPosition x="0" y="41"/>
-                        <connection refLocalId="14">
-                          <position x="216" y="292"/>
-                          <position x="155" y="292"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                    <variable formalParameter="PT">
-                      <connectionPointIn>
-                        <relPosition x="0" y="84"/>
-                        <connection refLocalId="15">
-                          <position x="216" y="335"/>
-                          <position x="162" y="335"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                  </inputVariables>
-                  <inOutVariables/>
-                  <outputVariables>
-                    <variable formalParameter="Q">
-                      <connectionPointOut>
-                        <relPosition x="97" y="41"/>
-                      </connectionPointOut>
-                    </variable>
-                    <variable formalParameter="ET">
-                      <connectionPointOut>
-                        <relPosition x="97" y="84"/>
-                      </connectionPointOut>
-                    </variable>
-                  </outputVariables>
-                </block>
-                <coil localId="6" height="15" width="21" storage="reset">
-                  <position x="517" y="284"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="8"/>
-                    <connection refLocalId="10" formalParameter="Q">
-                      <position x="517" y="292"/>
-                      <position x="427" y="292"/>
-                    </connection>
-                  </connectionPointIn>
-                  <connectionPointOut>
-                    <relPosition x="21" y="8"/>
-                  </connectionPointOut>
-                  <variable>ORANGE_LIGHT</variable>
-                </coil>
-                <rightPowerRail localId="7" height="40" width="3">
-                  <position x="598" y="123"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="20"/>
-                    <connection refLocalId="8">
-                      <position x="598" y="143"/>
-                      <position x="530" y="143"/>
-                    </connection>
-                  </connectionPointIn>
-                </rightPowerRail>
-                <coil localId="8" height="15" width="21" storage="set">
-                  <position x="509" y="135"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="8"/>
-                    <connection refLocalId="11" formalParameter="Q">
-                      <position x="509" y="143"/>
-                      <position x="428" y="143"/>
-                    </connection>
-                  </connectionPointIn>
-                  <connectionPointOut>
-                    <relPosition x="21" y="8"/>
-                  </connectionPointOut>
-                  <variable>ORANGE_LIGHT</variable>
-                </coil>
-                <comment localId="9" height="52" width="318">
-                  <position x="51" y="11"/>
-                  <content>
-                    <xhtml:p><![CDATA[This action makes the orange light blink]]></xhtml:p>
-                  </content>
-                </comment>
-                <block localId="10" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG0">
-                  <position x="370" y="262"/>
-                  <inputVariables>
-                    <variable formalParameter="CLK">
-                      <connectionPointIn>
-                        <relPosition x="0" y="30"/>
-                        <connection refLocalId="5" formalParameter="Q">
-                          <position x="370" y="292"/>
-                          <position x="313" y="292"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                  </inputVariables>
-                  <inOutVariables/>
-                  <outputVariables>
-                    <variable formalParameter="Q">
-                      <connectionPointOut>
-                        <relPosition x="58" y="30"/>
-                      </connectionPointOut>
-                    </variable>
-                  </outputVariables>
-                </block>
-                <block localId="11" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG1">
-                  <position x="371" y="113"/>
-                  <inputVariables>
-                    <variable formalParameter="CLK">
-                      <connectionPointIn>
-                        <relPosition x="0" y="30"/>
-                        <connection refLocalId="3" formalParameter="Q">
-                          <position x="371" y="143"/>
-                          <position x="313" y="143"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                  </inputVariables>
-                  <inOutVariables/>
-                  <outputVariables>
-                    <variable formalParameter="Q">
-                      <connectionPointOut>
-                        <relPosition x="58" y="30"/>
-                      </connectionPointOut>
-                    </variable>
-                  </outputVariables>
-                </block>
-                <rightPowerRail localId="12" height="40" width="3">
-                  <position x="597" y="272"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="20"/>
-                    <connection refLocalId="6">
-                      <position x="597" y="292"/>
-                      <position x="538" y="292"/>
-                    </connection>
-                  </connectionPointIn>
-                </rightPowerRail>
-                <leftPowerRail localId="13" height="40" width="3">
-                  <position x="67" y="272"/>
-                  <connectionPointOut formalParameter="">
-                    <relPosition x="3" y="20"/>
-                  </connectionPointOut>
-                </leftPowerRail>
-                <contact localId="14" height="15" width="21">
-                  <position x="134" y="284"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="8"/>
-                    <connection refLocalId="13">
-                      <position x="134" y="292"/>
-                      <position x="69" y="292"/>
-                    </connection>
-                  </connectionPointIn>
-                  <connectionPointOut>
-                    <relPosition x="21" y="8"/>
-                  </connectionPointOut>
-                  <variable>ORANGE_LIGHT</variable>
-                </contact>
-                <inVariable localId="15" height="36" width="77" negated="false">
-                  <position x="85" y="317"/>
-                  <connectionPointOut>
-                    <relPosition x="77" y="18"/>
-                  </connectionPointOut>
-                  <expression>T#500ms</expression>
-                </inVariable>
-              </LD>
-            </body>
-          </action>
-        </actions>
-        <transitions>
-          <transition name="STOP">
-            <body>
-              <FBD>
-                <block localId="42" width="59" height="53" typeName="NOT" executionOrderId="0">
-                  <position x="237" y="31"/>
-                  <inputVariables>
-                    <variable formalParameter="IN">
-                      <connectionPointIn>
-                        <relPosition x="0" y="36"/>
-                        <connection refLocalId="43">
-                          <position x="237" y="67"/>
-                          <position x="202" y="67"/>
-                        </connection>
-                      </connectionPointIn>
-                    </variable>
-                  </inputVariables>
-                  <inOutVariables/>
-                  <outputVariables>
-                    <variable formalParameter="OUT">
-                      <connectionPointOut>
-                        <relPosition x="59" y="36"/>
-                      </connectionPointOut>
-                    </variable>
-                  </outputVariables>
-                </block>
-                <inVariable localId="43" height="39" width="164" executionOrderId="0" negated="false">
-                  <position x="38" y="48"/>
-                  <connectionPointOut>
-                    <relPosition x="164" y="19"/>
-                  </connectionPointOut>
-                  <expression>SWITCH_BUTTON</expression>
-                </inVariable>
-                <outVariable localId="44" height="40" width="46" executionOrderId="0" negated="false">
-                  <position x="351" y="47"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="20"/>
-                    <connection refLocalId="42" formalParameter="OUT">
-                      <position x="351" y="67"/>
-                      <position x="296" y="67"/>
-                    </connection>
-                  </connectionPointIn>
-                  <expression>STOP</expression>
-                </outVariable>
-              </FBD>
-            </body>
-          </transition>
-        </transitions>
-        <body>
-          <SFC>
-            <step localId="1" height="37" width="121" name="Standstill" initialStep="true">
-              <position x="509" y="31"/>
-              <connectionPointIn>
-                <relPosition x="60" y="0"/>
-                <connection refLocalId="39">
-                  <position x="569" y="31"/>
-                  <position x="569" y="11"/>
-                  <position x="963" y="11"/>
-                  <position x="963" y="1151"/>
-                  <position x="776" y="1151"/>
-                  <position x="776" y="1097"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="60" y="37"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="121" y="18"/>
-              </connectionPointOutAction>
-            </step>
-            <transition localId="2" height="2" width="20">
-              <position x="559" y="222"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="1">
-                  <position x="569" y="222"/>
-                  <position x="569" y="68"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[SWITCH_BUTTON]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <step localId="3" height="30" width="118" name="ORANGE">
-              <position x="510" y="250"/>
-              <connectionPointIn>
-                <relPosition x="59" y="0"/>
-                <connection refLocalId="2">
-                  <position x="569" y="250"/>
-                  <position x="569" y="224"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="59" y="30"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="118" y="15"/>
-              </connectionPointOutAction>
-            </step>
-            <transition localId="6" height="2" width="20">
-              <position x="559" y="376"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="15">
-                  <position x="569" y="376"/>
-                  <position x="569" y="336"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[STOP_CARS]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <actionBlock localId="8" width="231" height="162">
-              <position x="711" y="34"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="1">
-                  <position x="711" y="49"/>
-                  <position x="630" y="49"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="P">
-                <relPosition x="0" y="0"/>
-                <inline>
-                  <ST>
-                    <xhtml:p><![CDATA[ORANGE_LIGHT := 1;]]></xhtml:p>
-                  </ST>
-                </inline>
-              </action>
-              <action localId="0">
-                <relPosition x="0" y="0"/>
-                <reference name="BLINK_ORANGE_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="GREEN_LIGHT"/>
-              </action>
-            </actionBlock>
-            <actionBlock localId="9" width="232" height="125">
-              <position x="711" y="250"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="3">
-                  <position x="711" y="265"/>
-                  <position x="628" y="265"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="GREEN_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="ORANGE_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="D" duration="T#2s">
-                <relPosition x="0" y="0"/>
-                <reference name="STOP_CARS"/>
-              </action>
-            </actionBlock>
-            <step localId="10" height="34" width="92" name="RED">
-              <position x="523" y="411"/>
-              <connectionPointIn>
-                <relPosition x="46" y="0"/>
-                <connection refLocalId="6">
-                  <position x="569" y="411"/>
-                  <position x="569" y="378"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="46" y="34"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="92" y="17"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="11" width="235" height="103">
-              <position x="710" y="413"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="10">
-                  <position x="710" y="428"/>
-                  <position x="615" y="428"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="ORANGE_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="D" duration="T#2s">
-                <relPosition x="0" y="0"/>
-                <reference name="ALLOW_PEDESTRIANS"/>
-              </action>
-            </actionBlock>
-            <transition localId="12" height="2" width="20">
-              <position x="559" y="533"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="7">
-                  <position x="569" y="533"/>
-                  <position x="569" y="487"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[ALLOW_PEDESTRIANS]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <selectionDivergence localId="15" height="1" width="154">
-              <position x="415" y="335"/>
-              <connectionPointIn>
-                <relPosition x="154" y="0"/>
-                <connection refLocalId="3">
-                  <position x="569" y="335"/>
-                  <position x="569" y="280"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="154" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <transition localId="16" height="2" width="20">
-              <position x="405" y="377"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="15">
-                  <position x="415" y="377"/>
-                  <position x="415" y="336"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <reference name="STOP"/>
-              </condition>
-            </transition>
-            <jumpStep localId="17" height="13" width="12" targetName="Standstill">
-              <position x="409" y="418"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="16">
-                  <position x="415" y="418"/>
-                  <position x="415" y="379"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <transition localId="4" height="2" width="20">
-              <position x="400" y="528"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="7">
-                  <position x="410" y="528"/>
-                  <position x="410" y="487"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <reference name="STOP"/>
-              </condition>
-            </transition>
-            <jumpStep localId="5" height="13" width="12" targetName="Standstill">
-              <position x="404" y="553"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="4">
-                  <position x="410" y="553"/>
-                  <position x="410" y="530"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <selectionDivergence localId="7" height="1" width="159">
-              <position x="410" y="486"/>
-              <connectionPointIn>
-                <relPosition x="159" y="0"/>
-                <connection refLocalId="10">
-                  <position x="569" y="486"/>
-                  <position x="569" y="445"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="159" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <step localId="18" height="32" width="177" name="PEDESTRIAN_GREEN">
-              <position x="481" y="572"/>
-              <connectionPointIn>
-                <relPosition x="88" y="0"/>
-                <connection refLocalId="12">
-                  <position x="569" y="572"/>
-                  <position x="569" y="535"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="88" y="32"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="177" y="16"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="19" width="247" height="110">
-              <position x="708" y="573"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="18">
-                  <position x="708" y="588"/>
-                  <position x="658" y="588"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="D" duration="T#10s">
-                <relPosition x="0" y="0"/>
-                <reference name="STOP_PEDESTRIANS"/>
-              </action>
-            </actionBlock>
-            <transition localId="20" height="2" width="20">
-              <position x="400" y="653"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="22">
-                  <position x="410" y="653"/>
-                  <position x="410" y="626"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <jumpStep localId="21" height="13" width="12" targetName="Standstill">
-              <position x="404" y="694"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="20">
-                  <position x="410" y="694"/>
-                  <position x="410" y="655"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <selectionDivergence localId="22" height="1" width="159">
-              <position x="410" y="625"/>
-              <connectionPointIn>
-                <relPosition x="159" y="0"/>
-                <connection refLocalId="18">
-                  <position x="569" y="625"/>
-                  <position x="569" y="615"/>
-                  <position x="569" y="615"/>
-                  <position x="569" y="604"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="159" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <transition localId="23" height="2" width="20">
-              <position x="559" y="709"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="22">
-                  <position x="569" y="709"/>
-                  <position x="569" y="626"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[STOP_PEDESTRIANS]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <step localId="24" height="30" width="148" name="PEDESTRIAN_RED">
-              <position x="495" y="748"/>
-              <connectionPointIn>
-                <relPosition x="74" y="0"/>
-                <connection refLocalId="23">
-                  <position x="569" y="748"/>
-                  <position x="569" y="711"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="74" y="30"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="148" y="15"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="25" width="239" height="110">
-              <position x="708" y="748"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="24">
-                  <position x="708" y="763"/>
-                  <position x="643" y="763"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="PEDESTRIAN_GREEN_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="D" duration="T#2s">
-                <relPosition x="0" y="0"/>
-                <reference name="ALLOW_CARS"/>
-              </action>
-            </actionBlock>
-            <transition localId="26" height="2" width="20">
-              <position x="400" y="857"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="28">
-                  <position x="410" y="857"/>
-                  <position x="410" y="816"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <connectionPointIn>
-                  <connection refLocalId="48">
-                    <position x="400" y="858"/>
-                    <position x="290" y="858"/>
-                  </connection>
-                </connectionPointIn>
-              </condition>
-            </transition>
-            <jumpStep localId="27" height="13" width="12" targetName="Standstill">
-              <position x="404" y="898"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="26">
-                  <position x="410" y="898"/>
-                  <position x="410" y="859"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <selectionDivergence localId="28" height="1" width="159">
-              <position x="410" y="815"/>
-              <connectionPointIn>
-                <relPosition x="159" y="0"/>
-                <connection refLocalId="24">
-                  <position x="569" y="815"/>
-                  <position x="569" y="778"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="159" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <transition localId="29" height="2" width="20">
-              <position x="559" y="879"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="28">
-                  <position x="569" y="879"/>
-                  <position x="569" y="816"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[ALLOW_CARS]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <step localId="30" height="33" width="92" name="GREEN">
-              <position x="523" y="930"/>
-              <connectionPointIn>
-                <relPosition x="46" y="0"/>
-                <connection refLocalId="29">
-                  <position x="569" y="930"/>
-                  <position x="569" y="881"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="46" y="33"/>
-              </connectionPointOut>
-              <connectionPointOutAction formalParameter="">
-                <relPosition x="92" y="16"/>
-              </connectionPointOutAction>
-            </step>
-            <actionBlock localId="31" width="227" height="110">
-              <position x="709" y="931"/>
-              <connectionPointIn>
-                <relPosition x="0" y="15"/>
-                <connection refLocalId="30">
-                  <position x="709" y="946"/>
-                  <position x="615" y="946"/>
-                </connection>
-              </connectionPointIn>
-              <action localId="0" qualifier="S">
-                <relPosition x="0" y="0"/>
-                <reference name="GREEN_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="R">
-                <relPosition x="0" y="0"/>
-                <reference name="RED_LIGHT"/>
-              </action>
-              <action localId="0" qualifier="D" duration="T#20s">
-                <relPosition x="0" y="0"/>
-                <reference name="WARN_CARS"/>
-              </action>
-            </actionBlock>
-            <block localId="32" width="89" height="94" typeName="TON" instanceName="TON3">
-              <position x="308" y="1053"/>
-              <inputVariables>
-                <variable formalParameter="IN">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="44" formalParameter="Q1">
-                      <position x="308" y="1091"/>
-                      <position x="291" y="1091"/>
-                      <position x="291" y="1065"/>
-                      <position x="275" y="1065"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PT">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="34">
-                      <position x="308" y="1128"/>
-                      <position x="270" y="1128"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q">
-                  <connectionPointOut>
-                    <relPosition x="89" y="38"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="ET">
-                  <connectionPointOut>
-                    <relPosition x="89" y="75"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="33" height="36" width="168" negated="false">
-              <position x="15" y="1047"/>
-              <connectionPointOut>
-                <relPosition x="168" y="18"/>
-              </connectionPointOut>
-              <expression>PEDESTRIAN_BUTTON</expression>
-            </inVariable>
-            <inVariable localId="34" height="33" width="53" negated="false">
-              <position x="217" y="1112"/>
-              <connectionPointOut>
-                <relPosition x="53" y="16"/>
-              </connectionPointOut>
-              <expression>T#2s</expression>
-            </inVariable>
-            <block localId="35" width="67" height="60" typeName="OR">
-              <position x="459" y="1061"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="32" formalParameter="Q">
-                      <position x="459" y="1091"/>
-                      <position x="397" y="1091"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="36">
-                      <position x="459" y="1111"/>
-                      <position x="427" y="1111"/>
-                      <position x="427" y="1195"/>
-                      <position x="260" y="1195"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="67" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="36" height="30" width="97" negated="false">
-              <position x="163" y="1182"/>
-              <connectionPointOut>
-                <relPosition x="97" y="15"/>
-              </connectionPointOut>
-              <expression>WARN_CARS</expression>
-            </inVariable>
-            <transition localId="37" height="2" width="20">
-              <position x="559" y="1090"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="38">
-                  <position x="569" y="1090"/>
-                  <position x="569" y="1060"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <connectionPointIn>
-                  <connection refLocalId="35" formalParameter="OUT">
-                    <position x="559" y="1091"/>
-                    <position x="526" y="1091"/>
-                  </connection>
-                </connectionPointIn>
-              </condition>
-            </transition>
-            <selectionDivergence localId="38" height="1" width="207">
-              <position x="569" y="1059"/>
-              <connectionPointIn>
-                <relPosition x="0" y="0"/>
-                <connection refLocalId="30">
-                  <position x="569" y="1059"/>
-                  <position x="569" y="963"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut formalParameter="">
-                <relPosition x="0" y="1"/>
-              </connectionPointOut>
-              <connectionPointOut formalParameter="">
-                <relPosition x="207" y="1"/>
-              </connectionPointOut>
-            </selectionDivergence>
-            <transition localId="39" height="2" width="20">
-              <position x="766" y="1095"/>
-              <connectionPointIn>
-                <relPosition x="10" y="0"/>
-                <connection refLocalId="38">
-                  <position x="776" y="1095"/>
-                  <position x="776" y="1060"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="10" y="2"/>
-              </connectionPointOut>
-              <condition>
-                <inline name="">
-                  <ST>
-                    <xhtml:p><![CDATA[NOT SWITCH_BUTTON]]></xhtml:p>
-                  </ST>
-                </inline>
-              </condition>
-            </transition>
-            <jumpStep localId="41" height="13" width="12" targetName="ORANGE">
-              <position x="563" y="1137"/>
-              <connectionPointIn>
-                <relPosition x="6" y="0"/>
-                <connection refLocalId="37">
-                  <position x="569" y="1137"/>
-                  <position x="569" y="1092"/>
-                </connection>
-              </connectionPointIn>
-            </jumpStep>
-            <block localId="44" width="51" height="60" typeName="SR" instanceName="SR0">
-              <position x="224" y="1035"/>
-              <inputVariables>
-                <variable formalParameter="S1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="33">
-                      <position x="224" y="1065"/>
-                      <position x="183" y="1065"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="R">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="32" formalParameter="Q">
-                      <position x="224" y="1085"/>
-                      <position x="203" y="1085"/>
-                      <position x="203" y="1167"/>
-                      <position x="416" y="1167"/>
-                      <position x="416" y="1091"/>
-                      <position x="397" y="1091"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q1">
-                  <connectionPointOut>
-                    <relPosition x="51" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <comment localId="45" height="767" width="753">
-              <position x="973" y="21"/>
-              <content>
-                <xhtml:p><![CDATA[*** Description of SFC action qualifiers ***
-
-N : non-stored - The action code body is executed or the Boolean variable is set as
-long as the step is active.
-
-R : overriding reset &#8211; When the step has previously been executed with the S
-(including DS, DS, and SL) qualifier, the R qualifier will stop the execution of the
-code or reset the Boolean variable.
-
-S : set (stored) - The action code body is executed or the Boolean variable is set.
-This state is stored as soon as the step becomes active. It can only be reset
-explicitly by associating the same action to a different step using the qualifier 'R'.
-
-L : time limited - The action code body is executed or the Boolean variable is set as
-long as the step is active but maximal for the fixed time interval.
-
-D : time delayed - The action code body is executed or the Boolean variable is set
-after the fixed delay time has elapsed. The action remains active as long as the step
-is active. If the step is active shorter than the fixed delay time the action does not
-become active.
-
-P : pulse - As soon as the step is active the action code body is executed or the
-Boolean variable is set for one operating cycle. (Note: The code body will then
-execute for one additional operating cycle with the Step.X variable FALSE.)
-
-SD : stored and time delayed - the action code body is executed or the Boolean
-variable is stored and set when the fixed delay time has elapsed after the step
-activation, even if the step becomes inactive. The action remains active until it is
-reset. If the step is active shorter than the fixed delay time the action becomes active
-anyway.
-
-DS : delayed and stored - The action code body is executed or the Boolean variable
-is set when the fixed delay time has elapsed after the step activation. The action
-remains active until it is reset. If the step is active shorter than the fixed delay time
-the action does not become active.
-
-SL : stored and time limited - The action code body is executed or the Boolean
-variable is set and stored for a fixed time interval as soon as the step is active. If the
-step is active shorter than the time interval the action is active for the whole time
-interval anyway. If the action is reset during the time interval the action becomes
-inactive as soon as the action is reset.
-]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="46" height="224" width="375">
-              <position x="8" y="326"/>
-              <content>
-                <xhtml:p><![CDATA[Conditions can be written in any IEC 61131-3 language.
-They can be implemented in defferent ways:
-- reference to external implementation;
-- inline implementation;
-- written in FBD or LD on SFC diagram and connected to the condition.
-
-See below examples of all these types.]]></xhtml:p>
-              </content>
-            </comment>
-            <leftPowerRail localId="47" height="40" width="3">
-              <position x="189" y="838"/>
-              <connectionPointOut formalParameter="">
-                <relPosition x="3" y="20"/>
-              </connectionPointOut>
-            </leftPowerRail>
-            <contact localId="48" height="15" width="21" negated="true">
-              <position x="269" y="850"/>
-              <connectionPointIn>
-                <relPosition x="0" y="8"/>
-                <connection refLocalId="47">
-                  <position x="269" y="858"/>
-                  <position x="192" y="858"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="21" y="8"/>
-              </connectionPointOut>
-              <variable>SWITCH_BUTTON</variable>
-            </contact>
-            <comment localId="13" height="86" width="379">
-              <position x="9" y="28"/>
-              <content>
-                <xhtml:p><![CDATA[Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p>
-              </content>
-            </comment>
-          </SFC>
-        </body>
-      </pou>
-      <pou name="main_program" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="trafic_light_sequence0">
-              <type>
-                <derived name="traffic_light_sequence"/>
-              </type>
-            </variable>
-            <variable name="SwitchButton">
-              <type>
-                <derived name="Button"/>
-              </type>
-            </variable>
-            <variable name="PedestrianButton">
-              <type>
-                <derived name="Button"/>
-              </type>
-            </variable>
-            <variable name="RedLight">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-            <variable name="OrangeLight">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-            <variable name="GreenLight">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-            <variable name="PedestrianRedLight">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-            <variable name="PedestrianGreenLight">
-              <type>
-                <derived name="Led"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <block localId="1" width="350" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0">
-              <position x="494" y="462"/>
-              <inputVariables>
-                <variable formalParameter="SWITCH_BUTTON">
-                  <connectionPointIn>
-                    <relPosition x="0" y="101"/>
-                    <connection refLocalId="2" formalParameter="state_out">
-                      <position x="494" y="563"/>
-                      <position x="349" y="563"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="PEDESTRIAN_BUTTON">
-                  <connectionPointIn>
-                    <relPosition x="0" y="264"/>
-                    <connection refLocalId="3" formalParameter="state_out">
-                      <position x="494" y="726"/>
-                      <position x="402" y="726"/>
-                      <position x="402" y="777"/>
-                      <position x="351" y="777"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="RED_LIGHT">
-                  <connectionPointOut>
-                    <relPosition x="350" y="101"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="ORANGE_LIGHT">
-                  <connectionPointOut>
-                    <relPosition x="350" y="264"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="GREEN_LIGHT">
-                  <connectionPointOut>
-                    <relPosition x="350" y="427"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="PEDESTRIAN_RED_LIGHT">
-                  <connectionPointOut>
-                    <relPosition x="350" y="590"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="PEDESTRIAN_GREEN_LIGHT">
-                  <connectionPointOut>
-                    <relPosition x="350" y="753"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="2" width="159" height="183" typeName="Button" instanceName="SwitchButton" executionOrderId="0">
-              <position x="190" y="527"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="36"/>
-                    <connection refLocalId="5">
-                      <position x="190" y="563"/>
-                      <position x="137" y="563"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="68"/>
-                    <connection refLocalId="6">
-                      <position x="190" y="595"/>
-                      <position x="136" y="595"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="toggle">
-                  <connectionPointIn>
-                    <relPosition x="0" y="100"/>
-                    <connection refLocalId="4">
-                      <position x="190" y="627"/>
-                      <position x="136" y="627"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="set_state">
-                  <connectionPointIn>
-                    <relPosition x="0" y="132"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="164"/>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="state_out">
-                  <connectionPointOut>
-                    <relPosition x="159" y="36"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="3" width="159" height="198" typeName="Button" instanceName="PedestrianButton" executionOrderId="0">
-              <position x="192" y="740"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="37"/>
-                    <connection refLocalId="7">
-                      <position x="192" y="777"/>
-                      <position x="160" y="777"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="72"/>
-                    <connection refLocalId="8">
-                      <position x="192" y="812"/>
-                      <position x="159" y="812"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="toggle">
-                  <connectionPointIn>
-                    <relPosition x="0" y="107"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="set_state">
-                  <connectionPointIn>
-                    <relPosition x="0" y="142"/>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="177"/>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="state_out">
-                  <connectionPointOut>
-                    <relPosition x="159" y="37"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="4" height="30" width="18" executionOrderId="0" negated="false">
-              <position x="118" y="612"/>
-              <connectionPointOut>
-                <relPosition x="18" y="15"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <inVariable localId="5" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="31" y="548"/>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>'SWITCH_OFF'</expression>
-            </inVariable>
-            <inVariable localId="6" height="30" width="105" executionOrderId="0" negated="false">
-              <position x="31" y="580"/>
-              <connectionPointOut>
-                <relPosition x="105" y="15"/>
-              </connectionPointOut>
-              <expression>'SWITCH_ON'</expression>
-            </inVariable>
-            <inVariable localId="7" height="30" width="138" executionOrderId="0" negated="false">
-              <position x="22" y="762"/>
-              <connectionPointOut>
-                <relPosition x="138" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_OFF'</expression>
-            </inVariable>
-            <inVariable localId="8" height="30" width="137" executionOrderId="0" negated="false">
-              <position x="22" y="797"/>
-              <connectionPointOut>
-                <relPosition x="137" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_ON'</expression>
-            </inVariable>
-            <block localId="9" width="115" height="133" typeName="Led" instanceName="RedLight" executionOrderId="0">
-              <position x="1057" y="451"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="10">
-                      <position x="1057" y="489"/>
-                      <position x="1013" y="489"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="11">
-                      <position x="1057" y="526"/>
-                      <position x="1010" y="526"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="112"/>
-                    <connection refLocalId="1" formalParameter="RED_LIGHT">
-                      <position x="1057" y="563"/>
-                      <position x="844" y="563"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="10" height="30" width="82" executionOrderId="0" negated="false">
-              <position x="931" y="474"/>
-              <connectionPointOut>
-                <relPosition x="82" y="15"/>
-              </connectionPointOut>
-              <expression>'RED_OFF'</expression>
-            </inVariable>
-            <inVariable localId="11" height="30" width="79" executionOrderId="0" negated="false">
-              <position x="931" y="511"/>
-              <connectionPointOut>
-                <relPosition x="79" y="15"/>
-              </connectionPointOut>
-              <expression>'RED_ON'</expression>
-            </inVariable>
-            <block localId="12" width="115" height="133" typeName="Led" instanceName="OrangeLight" executionOrderId="0">
-              <position x="1058" y="614"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="13">
-                      <position x="1058" y="652"/>
-                      <position x="1010" y="652"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="14">
-                      <position x="1058" y="689"/>
-                      <position x="1010" y="689"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="112"/>
-                    <connection refLocalId="1" formalParameter="ORANGE_LIGHT">
-                      <position x="1058" y="726"/>
-                      <position x="844" y="726"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="13" height="30" width="111" executionOrderId="0" negated="false">
-              <position x="899" y="637"/>
-              <connectionPointOut>
-                <relPosition x="111" y="15"/>
-              </connectionPointOut>
-              <expression>'ORANGE_OFF'</expression>
-            </inVariable>
-            <inVariable localId="14" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="904" y="674"/>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>'ORANGE_ON'</expression>
-            </inVariable>
-            <block localId="15" width="115" height="133" typeName="Led" instanceName="GreenLight" executionOrderId="0">
-              <position x="1058" y="777"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="16">
-                      <position x="1058" y="815"/>
-                      <position x="1010" y="815"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="17">
-                      <position x="1058" y="852"/>
-                      <position x="1010" y="852"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="112"/>
-                    <connection refLocalId="1" formalParameter="GREEN_LIGHT">
-                      <position x="1058" y="889"/>
-                      <position x="844" y="889"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="16" height="30" width="111" executionOrderId="0" negated="false">
-              <position x="899" y="800"/>
-              <connectionPointOut>
-                <relPosition x="111" y="15"/>
-              </connectionPointOut>
-              <expression>'GREEN_OFF'</expression>
-            </inVariable>
-            <inVariable localId="17" height="30" width="106" executionOrderId="0" negated="false">
-              <position x="904" y="837"/>
-              <connectionPointOut>
-                <relPosition x="106" y="15"/>
-              </connectionPointOut>
-              <expression>'GREEN_ON'</expression>
-            </inVariable>
-            <block localId="18" width="115" height="133" typeName="Led" instanceName="PedestrianRedLight" executionOrderId="0">
-              <position x="1059" y="940"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="19">
-                      <position x="1059" y="978"/>
-                      <position x="1020" y="978"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="20">
-                      <position x="1059" y="1015"/>
-                      <position x="1020" y="1015"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="112"/>
-                    <connection refLocalId="1" formalParameter="PEDESTRIAN_RED_LIGHT">
-                      <position x="1059" y="1052"/>
-                      <position x="844" y="1052"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="19" height="30" width="171" executionOrderId="0" negated="false">
-              <position x="849" y="963"/>
-              <connectionPointOut>
-                <relPosition x="171" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_RED_OFF'</expression>
-            </inVariable>
-            <inVariable localId="20" height="30" width="166" executionOrderId="0" negated="false">
-              <position x="854" y="1000"/>
-              <connectionPointOut>
-                <relPosition x="166" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_RED_ON'</expression>
-            </inVariable>
-            <block localId="21" width="115" height="133" typeName="Led" instanceName="PedestrianGreenLight" executionOrderId="0">
-              <position x="1059" y="1103"/>
-              <inputVariables>
-                <variable formalParameter="back_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="38"/>
-                    <connection refLocalId="22">
-                      <position x="1059" y="1141"/>
-                      <position x="1035" y="1141"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="sele_id">
-                  <connectionPointIn>
-                    <relPosition x="0" y="75"/>
-                    <connection refLocalId="23">
-                      <position x="1059" y="1178"/>
-                      <position x="1035" y="1178"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="state_in">
-                  <connectionPointIn>
-                    <relPosition x="0" y="112"/>
-                    <connection refLocalId="1" formalParameter="PEDESTRIAN_GREEN_LIGHT">
-                      <position x="1059" y="1215"/>
-                      <position x="844" y="1215"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables/>
-            </block>
-            <inVariable localId="22" height="30" width="190" executionOrderId="0" negated="false">
-              <position x="845" y="1126"/>
-              <connectionPointOut>
-                <relPosition x="190" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_GREEN_OFF'</expression>
-            </inVariable>
-            <inVariable localId="23" height="30" width="185" executionOrderId="0" negated="false">
-              <position x="850" y="1163"/>
-              <connectionPointOut>
-                <relPosition x="185" y="15"/>
-              </connectionPointOut>
-              <expression>'PEDESTRIAN_GREEN_ON'</expression>
-            </inVariable>
-            <comment localId="24" height="287" width="1008">
-              <position x="22" y="13"/>
-              <content>
-                <xhtml:p><![CDATA[This example implements control of traffic lights.
-
-Basically it shows following features of Beremiz:
-- web interface (SCADA) using integrated web server in svgui extension;
-- interaction with web UI;
-- functional blocks in SFC language.
-
-
-
-
-SVGUI is extensions to build web interface to PLC. It has *integrated* web-server. So it's NOT necessary to install Apache, lighttpd or nginx for that!!!
-
-As the program is running in PLC, web UI will be available at http://localhost:8009/.
-
-Web interface is build as SVG file in Inkscape. To edit SVG file click 'Inkscape' button in 0x: svgui extension. 
-Inkscape is a free and open-source vector graphics editor. It's not part of Beremiz and needs to be installed separately.
-]]></xhtml:p>
-              </content>
-            </comment>
-            <comment localId="102" height="134" width="734">
-              <position x="21" y="303"/>
-              <content>
-                <xhtml:p><![CDATA[In this example FB like 'Button', 'Led' and 'Text' are used. 
-Back_id and sele_id inputs of these blocks are IDs  of graphic primitives in SVG file.
-This is the way how elements in SVG are bound to elements in PLC program.
-You can find out or edit these IDs in Inkscape.]]></xhtml:p>
-              </content>
-            </comment>
-          </FBD>
-        </body>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="test_task" interval="T#100ms" priority="0">
-            <pouInstance name="main_instance" typeName="main_program"/>
-          </task>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
--- a/tests/traffic_lights/svgui-0@svgui/baseconfnode.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams Name="svgui-0" IEC_Channel="0"/>
--- a/tests/traffic_lights/svgui-0@svgui/gui.svg	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1516 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="200"
-   height="300"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.2 r9819"
-   sodipodi:docname="gui.svg">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23716" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23669" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23629" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23580" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23540" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23506" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23466" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23432" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23330" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23257" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23226" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23189" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23118" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23081" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective23044" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22995" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22946" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22891" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22866" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22829" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22795" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22692" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22661" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22630" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22569" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22532" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22501" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22470" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22403" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22318" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22290" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22265" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22090" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective22002" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21911" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21856" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21831" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21776" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21745" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21654" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21626" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21580" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21549" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21518" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21418" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21338" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective21250" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19662" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19613" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19555" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19494" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19325" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19285" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19247" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19201" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19155" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19106" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective19050" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18979" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18945" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18911" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18841" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18807" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18767" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18727" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18693" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18662" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18613" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18555" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18518" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18475" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18429" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18377" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18322" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18273" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18239" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18193" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18150" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18104" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18061" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective18021" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17978" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17950" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17868" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17840" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17812" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17784" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17756" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17728" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17700" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17636" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17605" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17574" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17543" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17512" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17475" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17420" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17386" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17322" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17261" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17212" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17163" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17120" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17074" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective17046" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16994" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16951" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16896" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16856" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16822" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16794" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16766" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16738" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16689" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16640" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16594" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16548" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16493" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16438" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16401" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16370" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16321" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16242" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16187" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16156" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16101" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16061" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective16027" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15972" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15860" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15826" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15789" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15737" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15676" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15627" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15569" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15532" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15477" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15440" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15403" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15360" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15320" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15283" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15207" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15158" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15121" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15084" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective15041" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14998" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14949" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14906" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14863" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14823" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14783" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14743" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14703" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14642" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14572" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14461" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14421" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14365" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14328" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14291" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14254" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14217" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14174" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14137" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14100" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14057" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective14020" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective13983" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective13946" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective13909" />
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       id="perspective13862" />
-    <inkscape:perspective
-       id="perspective13880"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.979899"
-     inkscape:cx="-27.771849"
-     inkscape:cy="198.87744"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     units="px"
-     inkscape:window-width="1920"
-     inkscape:window-height="1056"
-     inkscape:window-x="0"
-     inkscape:window-y="24"
-     inkscape:window-maximized="1" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-752.36228)">
-    <path
-       style="color:#000000;fill:#282828;fill-opacity:1;stroke:none;stroke-width:2.04116011;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 114.28125 14.28125 L 114.28125 144.28125 L 133.21875 144.28125 L 133.21875 277.84375 L 138.9375 277.84375 L 138.9375 196.4375 L 147.84375 196.4375 L 147.84375 212.15625 L 184.28125 212.15625 L 184.28125 179.65625 L 147.84375 179.65625 L 147.84375 191.78125 L 138.9375 191.78125 L 138.9375 144.28125 L 160.71875 144.28125 L 160.71875 14.28125 L 114.28125 14.28125 z "
-       transform="translate(0,752.36228)"
-       id="rect2985" />
-    <rect
-       style="color:#000000;fill:#ffac2c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04116011;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="rect3761"
-       width="19.642857"
-       height="18.928572"
-       x="126.07143"
-       y="994.8623"
-       ry="3.5714285" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="RED_OFF"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.071429,724.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="ORANGE_OFF"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.071429,764.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="GREEN_OFF"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.071429,804.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="RED_ON"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.07143,724.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#f06414;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="ORANGE_ON"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.07143,764.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="GREEN_ON"
-       sodipodi:cx="76.071426"
-       sodipodi:cy="63.92857"
-       sodipodi:rx="13.214286"
-       sodipodi:ry="13.214286"
-       d="m 89.285712,63.92857 a 13.214286,13.214286 0 1 1 -26.428571,0 13.214286,13.214286 0 1 1 26.428571,0 z"
-       transform="translate(61.07143,804.14799)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="PEDESTRIAN_OFF"
-       sodipodi:cx="136.78572"
-       sodipodi:cy="252.5"
-       sodipodi:rx="5.3571429"
-       sodipodi:ry="5.3571429"
-       d="m 142.14286,252.5 a 5.3571429,5.3571429 0 1 1 -10.71428,0 5.3571429,5.3571429 0 1 1 10.71428,0 z"
-       transform="matrix(1.3666667,0,0,1.3666667,-51.047621,659.24323)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.04099989;marker:none;visibility:visible;overflow:visible;enable-background:accumulate"
-       id="PEDESTRIAN_ON"
-       sodipodi:cx="136.78572"
-       sodipodi:cy="252.5"
-       sodipodi:rx="5.3571429"
-       sodipodi:ry="5.3571429"
-       d="m 142.14286,252.5 a 5.3571429,5.3571429 0 1 1 -10.71428,0 5.3571429,5.3571429 0 1 1 10.71428,0 z"
-       transform="matrix(1.2333334,0,0,1.2333334,-32.809525,692.9099)" />
-    <path
-       d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
-       style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
-       id="PEDESTRIAN_RED_OFF"
-       inkscape:connector-curvature="0" />
-    <path
-       d="m 157.9184,937.65033 c 0.98406,-0.0329 1.66207,0.64458 1.66207,1.76564 0,1.1159 -0.57443,1.01655 -0.57443,1.38898 0,0.40492 0.23543,1.04997 1.08294,1.45489 0.9511,0.47555 1.49256,0.71568 1.72797,2.10466 0.20247,1.25196 0.33901,4.06805 0.33901,4.06805 0.0329,0.37197 -0.13654,1.32259 0,1.55848 0.27309,0.50851 -0.0329,1.18652 -0.37196,0.98405 -0.37197,-0.20246 -0.78159,-0.678 -0.67801,-1.04997 0.0989,-0.4101 0,-0.84751 -0.0329,-1.08764 -0.0707,-0.23541 -0.0707,-2.91449 -0.57914,-3.08399 -0.26837,-0.0659 -0.1695,2.26944 0.033,3.45596 0.10358,0.5457 0.10358,3.3566 0.10358,4.27474 0,0.88095 -0.20246,3.31942 -0.0659,3.72953 0.16951,0.37196 1.38898,0.97935 1.38898,1.42193 0,0.44259 -0.57443,0.339 -1.01702,0.27262 -0.40963,-0.0372 -1.89748,-0.64458 -2.00106,-1.76565 -0.10359,-1.11542 -0.13654,-5.08459 -0.57443,-7.2175 l -0.1695,2.26945 c 0,0 -0.0377,3.5925 -0.13654,4.27004 -0.10359,0.71097 -0.40493,1.83204 -0.78159,2.13808 -0.16951,0.13655 -1.69503,0.67801 -1.89749,0.50851 -0.40492,-0.339 -0.40492,-0.6121 0.0707,-0.98406 0.47083,-0.40539 0.71096,-0.61209 0.74392,-1.52552 0.0659,-0.88047 0,-2.60892 -0.0329,-3.28646 -0.0707,-0.71567 -0.13654,-3.69608 -0.10358,-4.10571 0.44259,-2.81091 -0.0989,-3.55955 -0.0989,-3.55955 l -0.40963,2.54254 c -0.033,1.08763 -0.0989,1.42664 -0.13655,2.00059 -0.0659,0.78206 -0.43788,1.18652 -0.71096,0.81455 -0.23543,-0.40444 -0.43788,-1.83109 -0.33901,-2.09994 0.10358,-0.30557 -0.0989,-0.95063 0.0707,-1.69455 0.13183,-0.71568 0.26838,-2.91921 0.30134,-3.18759 0.0706,-0.24013 0.10358,-0.88093 0.88046,-1.2901 0.7816,-0.37196 1.25714,-1.01748 1.35602,-1.55847 0.13655,-0.54147 -0.54147,-1.08341 -0.50851,-1.86453 0.0707,-0.9511 0.24014,-1.6291 1.4596,-1.66206"
-       style="fill:#e20f10;fill-opacity:1;fill-rule:nonzero;stroke:none"
-       id="PEDESTRIAN_RED_ON"
-       inkscape:connector-curvature="0" />
-    <path
-       d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
-       style="fill:#505050;fill-opacity:1;fill-rule:nonzero;stroke:none"
-       id="PEDESTRIAN_GREEN_OFF"
-       inkscape:connector-curvature="0" />
-    <path
-       d="m 171.65012,940.43176 c -0.3444,-0.68878 -0.41136,-2.7886 1.13839,-2.7886 1.10014,0 1.44453,1.82718 1.51628,2.06634 0.067,0.27743 -0.41614,1.23885 0.067,1.68847 0.44962,0.44482 2.03285,1.75542 2.7886,2.78859 0.72226,0.89399 0.89446,4.68227 0.89446,5.0654 0,0.75575 -0.65052,0.82223 -0.86097,-0.0383 -0.33962,-1.37757 -1.06666,-3.20044 -1.58324,-3.61611 0.34439,1.06667 -0.27264,2.54897 -0.13873,3.4439 0.21047,1.31059 0.13873,2.85988 0.86577,3.82176 0.684,0.93273 2.33898,3.37694 2.71685,3.65437 0.41613,0.23868 0.79402,0.61656 0.48311,0.89446 -0.3444,0.23915 -1.65499,1.54975 -1.92763,1.47799 -0.27743,-0.067 -0.0718,-0.58401 0.13871,-0.96141 0,-0.31092 0.067,-0.58355 -0.99969,-1.68847 -1.06665,-1.10012 -2.44421,-3.44389 -2.72163,-4.02744 -0.27743,-0.55533 -0.72227,-0.62182 -1.1384,-0.31138 -0.37787,0.31138 -1.65019,3.16694 -1.8224,3.61656 -0.20568,0.44436 -0.75573,1.96063 -0.75573,2.47721 0,0.51707 0.13392,0.65579 -0.31092,0.89493 -0.4831,0.27743 -1.65497,0.72706 -2.34375,0.21047 -0.1722,-0.27742 0.27742,-0.44961 0.55007,-0.58833 0.2774,-0.13871 0.72225,-1.10013 0.86095,-2.20027 0.13872,-1.1054 0.44963,-2.86082 0.93273,-4.41057 0.44484,-1.54929 1.51627,-1.9989 1.58324,-2.482 0.067,-0.44484 0.6553,-2.06682 0.20567,-3.02776 -0.20567,-0.20567 -0.067,0.2052 -0.72226,0.86098 -0.41135,0.37786 -1.48278,1.41103 -2.23852,1.82238 -0.79402,0.41615 -0.89446,-0.3396 -0.96621,-0.47831 -0.20567,-0.3109 1.65498,-1.54977 1.9324,-1.9324 0.27265,-0.41137 1.06665,-2.13331 1.13362,-2.78909 0.067,-0.65482 1.17187,-2.47721 0.72226,-3.44342"
-       style="fill:#50a00e;fill-opacity:1;fill-rule:nonzero;stroke:none"
-       id="PEDESTRIAN_GREEN_ON"
-       inkscape:connector-curvature="0" />
-    <g
-       id="SWITCH_OFF"
-       transform="matrix(0,-1,1,0,-772.76319,846.96137)">
-      <path
-         transform="translate(0,752.36228)"
-         d="m 53.928572,57.5 c 0,9.270494 -7.515221,16.785715 -16.785715,16.785715 -9.270495,0 -16.785716,-7.515221 -16.785716,-16.785715 0,-9.270494 7.515221,-16.785715 16.785716,-16.785715 9.270494,0 16.785715,7.515221 16.785715,16.785715 z"
-         sodipodi:ry="16.785715"
-         sodipodi:rx="16.785715"
-         sodipodi:cy="57.5"
-         sodipodi:cx="37.142857"
-         id="path4546"
-         style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)"
-         d="m 55.178574,57.857143 c 0,2.071068 -7.59517,3.75 -16.964287,3.75 -9.369117,0 -16.964287,-1.678932 -16.964287,-3.75 0,-2.071067 7.59517,-3.75 16.964287,-3.75 9.369117,0 16.964287,1.678933 16.964287,3.75 z"
-         sodipodi:ry="3.75"
-         sodipodi:rx="16.964287"
-         sodipodi:cy="57.857143"
-         sodipodi:cx="38.214287"
-         id="path4548"
-         style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <path
-         inkscape:transform-center-y="-0.16341378"
-         inkscape:transform-center-x="-0.012953186"
-         transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
-         d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.0446877"
-         sodipodi:arg1="-0.0025098425"
-         sodipodi:r2="1.4117311"
-         sodipodi:r1="2.7027807"
-         sodipodi:cy="89.285713"
-         sodipodi:cx="52.142857"
-         sodipodi:sides="3"
-         id="path4552"
-         style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="star" />
-    </g>
-    <g
-       id="SWITCH_ON">
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path4576"
-         sodipodi:cx="37.142857"
-         sodipodi:cy="57.5"
-         sodipodi:rx="16.785715"
-         sodipodi:ry="16.785715"
-         d="m 53.928572,57.5 c 0,9.270494 -7.515221,16.785715 -16.785715,16.785715 -9.270495,0 -16.785716,-7.515221 -16.785716,-16.785715 0,-9.270494 7.515221,-16.785715 16.785716,-16.785715 9.270494,0 16.785715,7.515221 16.785715,16.785715 z"
-         transform="translate(0,752.36228)" />
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path4578"
-         sodipodi:cx="38.214287"
-         sodipodi:cy="57.857143"
-         sodipodi:rx="16.964287"
-         sodipodi:ry="3.75"
-         d="m 55.178574,57.857143 c 0,2.071068 -7.59517,3.75 -16.964287,3.75 -9.369117,0 -16.964287,-1.678932 -16.964287,-3.75 0,-2.071067 7.59517,-3.75 16.964287,-3.75 9.369117,0 16.964287,1.678933 16.964287,3.75 z"
-         transform="matrix(0.98958091,0,0,1,-0.76159828,752.36228)" />
-      <path
-         sodipodi:type="star"
-         style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path4580"
-         sodipodi:sides="3"
-         sodipodi:cx="52.142857"
-         sodipodi:cy="89.285713"
-         sodipodi:r1="2.7027807"
-         sodipodi:r2="1.4117311"
-         sodipodi:arg1="-0.0025098425"
-         sodipodi:arg2="1.0446877"
-         inkscape:flatsided="false"
-         inkscape:rounded="0"
-         inkscape:randomized="0"
-         d="m 54.845629,89.27893 -1.993841,1.227603 -2.054443,1.123241 -0.06621,-2.340518 0.05447,-2.34082 2.060055,1.112914 z"
-         transform="matrix(0.65194108,0,0,0.65194108,15.383639,752.1041)"
-         inkscape:transform-center-x="-0.012953186"
-         inkscape:transform-center-y="-0.16341378" />
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 37.67857,786.29085 0,3.75"
-       id="path4582"
-       inkscape:connector-curvature="0" />
-    <g
-       style="font-size:6.32609415px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-       id="text4584">
-      <path
-         d="m 33.828224,780.67935 c -0.362435,10e-6 -0.643526,0.13386 -0.843274,0.40156 -0.199751,0.26771 -0.299626,0.64456 -0.299624,1.13055 -2e-6,0.48393 0.09987,0.85974 0.299624,1.12745 0.199748,0.26771 0.480839,0.40156 0.843274,0.40156 0.364488,0 0.646609,-0.13385 0.846362,-0.40156 0.199746,-0.26771 0.299621,-0.64352 0.299624,-1.12745 -3e-6,-0.48599 -0.09988,-0.86284 -0.299624,-1.13055 -0.199753,-0.2677 -0.481874,-0.40155 -0.846362,-0.40156 m 0,-0.8618 c 0.741335,0 1.32205,0.21211 1.742147,0.63631 0.420087,0.42422 0.630133,1.01008 0.630138,1.7576 -5e-6,0.74545 -0.210051,1.33029 -0.630138,1.7545 -0.420097,0.42421 -1.000812,0.63631 -1.742147,0.63631 -0.739282,0 -1.319997,-0.2121 -1.742147,-0.63631 -0.420093,-0.42421 -0.630139,-1.00905 -0.630139,-1.7545 0,-0.74752 0.210046,-1.33338 0.630139,-1.7576 0.42215,-0.4242 1.002865,-0.63631 1.742147,-0.63631"
-         style=""
-         id="path4589" />
-      <path
-         d="m 37.096294,779.90095 3.209381,0 0,0.89887 -2.020149,0 0,0.85872 1.899681,0 0,0.89887 -1.899681,0 0,1.95529 -1.189232,0 0,-4.61175"
-         style=""
-         id="path4591" />
-      <path
-         d="m 41.420773,779.90095 3.209381,0 0,0.89887 -2.020149,0 0,0.85872 1.899681,0 0,0.89887 -1.899681,0 0,1.95529 -1.189232,0 0,-4.61175"
-         style=""
-         id="path4593" />
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 60.982143,810.04086 -3.75,0"
-       id="path4582-4"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-size:6.17188454px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-       x="62.818459"
-       y="812.17749"
-       id="text4613"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan4615"
-         x="62.818459"
-         y="812.17749">ON</tspan></text>
-  </g>
-</svg>
--- a/tests/traffic_lights/svgui-0@svgui/pyfile.xml	Tue Oct 19 15:15:03 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <variables/>
-  <globals>
-    <xhtml:p><![CDATA[
-/*
-    Web interface is build as SVG file in Inkscape. 
-    To edit SVG file click 'Inkscape' button on the toolbar above.
-    
-    Inkscape is a free and open-source vector graphics editor. 
-    It's not part of Beremiz and needs to be installed separately.
-*/
-
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/util/BitmapLibrary.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/util/BitmapLibrary.py	Wed Oct 20 08:57:07 2021 +0200
@@ -71,7 +71,7 @@
             height = max(bmp1.GetHeight(), bmp2.GetHeight())
 
             # Create bitmap with both icons
-            bmp = wx.EmptyBitmap(width, height)
+            bmp = wx.Bitmap(width, height)
             dc = wx.MemoryDC()
             dc.SelectObject(bmp)
             dc.Clear()
--- a/util/ExceptionHandler.py	Tue Oct 19 15:15:03 2021 +0200
+++ b/util/ExceptionHandler.py	Wed Oct 20 08:57:07 2021 +0200
@@ -49,7 +49,7 @@
         trcbck_lst.append(trcbck)
 
     # Allow clicking....
-    cap = wx.Window_GetCapture()
+    cap = wx.Window.GetCapture()
     if cap:
         cap.ReleaseMouse()