diff --git a/doc/examples/example_simple.tum b/doc/examples/example_simple.tum
index 7db71e1..ff61638 100644
--- a/doc/examples/example_simple.tum
+++ b/doc/examples/example_simple.tum
@@ -5,13 +5,21 @@ main:
steps:
- py_func:
- name: function test item
- doc: The purpose of this step is to demonstrate func test item
+ name: python function call
+ doc: The purpose of this step is to demonstrate the py_func test item
file: utils.py
func_name: funcToBeExecuted
param:
- 123
+ - lua_func:
+ name: lua function call
+ doc: The purpose of this step is to demonstrate the lua_func test item
+ file: lua_func.lua
+ func_name: func_to_be_executed
+ param:
+ - 123
+
- sleep:
name: sleep item
dialog: True
diff --git a/doc/examples/lua_func.lua b/doc/examples/lua_func.lua
new file mode 100644
index 0000000..c12958e
--- /dev/null
+++ b/doc/examples/lua_func.lua
@@ -0,0 +1,6 @@
+tm = require("tm")
+
+function func_to_executed(param)
+ -- return tm.gd(param)
+ return param
+end
\ No newline at end of file
diff --git a/src/testium/interpreter/terminal.py b/src/testium/interpreter/terminal.py
index bb50c64..dbe8af0 100644
--- a/src/testium/interpreter/terminal.py
+++ b/src/testium/interpreter/terminal.py
@@ -42,7 +42,8 @@ class Terminal(Cmd):
SUPPORTED_TESTS = [
cst.TYPE_SLEEP,
cst.TYPE_LET,
- cst.TYPE_FUNCTION,
+ cst.TYPE_PY_FUNCTION,
+ cst.TYPE_LUA_FUNCTION,
cst.TYPE_CONSOLE,
cst.TYPE_IMAGE_DLG,
cst.TYPE_MESSAGE_DLG,
diff --git a/src/testium/interpreter/test_items/test_item_lua_func.py b/src/testium/interpreter/test_items/test_item_lua_func.py
index 912d965..75daa83 100644
--- a/src/testium/interpreter/test_items/test_item_lua_func.py
+++ b/src/testium/interpreter/test_items/test_item_lua_func.py
@@ -18,9 +18,9 @@ class TestItemLuaFunc(TestItem):
"""
def __init__(self, dict_item, parent=None, status_queue=None, filename=""):
- self._name = cst.TYPE_FUNCTION.item_name
+ self._name = cst.TYPE_LUA_FUNCTION.item_name
super().__init__(dict_item, parent, status_queue, filename=filename)
- self._type = cst.TYPE_FUNCTION
+ self._type = cst.TYPE_LUA_FUNCTION
self.is_container = False
try:
self.file_name = self._prms.getParam("file", required=True)
@@ -45,7 +45,7 @@ class TestItemLuaFunc(TestItem):
if tm.debug_enabled():
tm.print_debug("Parameters list:")
tm.print_debug(textwrap.indent(pprint.pformat(pl), " |"))
- success, ret = func_exec(self.file_name, self.func_name, pl)
+ success, ret = lua_func_exec(self.file_name, self.func_name, pl)
if success == TestValue.SUCCESS:
self.result.set(TestValue.SUCCESS)
diff --git a/src/testium/interpreter/test_items/test_item_py_func.py b/src/testium/interpreter/test_items/test_item_py_func.py
index 167c8fb..12a9101 100644
--- a/src/testium/interpreter/test_items/test_item_py_func.py
+++ b/src/testium/interpreter/test_items/test_item_py_func.py
@@ -18,9 +18,9 @@ class TestItemPyFunc(TestItem):
"""
def __init__(self, dict_item, parent=None, status_queue=None, filename=""):
- self._name = cst.TYPE_FUNCTION.item_name
+ self._name = cst.TYPE_PY_FUNCTION.item_name
super().__init__(dict_item, parent, status_queue, filename=filename)
- self._type = cst.TYPE_FUNCTION
+ self._type = cst.TYPE_PY_FUNCTION
self.is_container = False
try:
self.file_name = self._prms.getParam("file", required=True)
diff --git a/src/testium/interpreter/utils/api_srv.py b/src/testium/interpreter/utils/api_srv.py
index 198ce71..0912001 100644
--- a/src/testium/interpreter/utils/api_srv.py
+++ b/src/testium/interpreter/utils/api_srv.py
@@ -17,7 +17,10 @@ def api_request(method, params):
except Exception as e:
return {"error": str(e)}
elif method == "print":
- print(*params, end="")
+ if isinstance(params, str):
+ print(params, end="")
+ elif isinstance(params, list):
+ print(*params, end="")
return {"result": 0}
else:
return {"error": "unsupported function"}
diff --git a/src/testium/interpreter/utils/constants.py b/src/testium/interpreter/utils/constants.py
index 4faecbc..234545e 100644
--- a/src/testium/interpreter/utils/constants.py
+++ b/src/testium/interpreter/utils/constants.py
@@ -13,7 +13,8 @@ class TestItemType(Enum):
TYPE_CONSOLE = TestItemEnum("console", "Console")
TYPE_CONSOLE_ACTION = TestItemEnum("console_action", "Console action")
TYPE_CYCLE = TestItemEnum("loop", "Cycle")
- TYPE_FUNCTION = TestItemEnum("py_func", "python Function")
+ TYPE_PY_FUNCTION = TestItemEnum("py_func", "python Function")
+ TYPE_LUA_FUNCTION = TestItemEnum("lua_func", "lua Function")
TYPE_REPORT = TestItemEnum("report", "Report")
TYPE_GIT = TestItemEnum("git", "git repository")
TYPE_GRAPH = TestItemEnum("plot", "Runtime plot")
diff --git a/src/testium/interpreter/utils/test_init.py b/src/testium/interpreter/utils/test_init.py
index 05317b5..b7cead1 100644
--- a/src/testium/interpreter/utils/test_init.py
+++ b/src/testium/interpreter/utils/test_init.py
@@ -33,6 +33,7 @@ from interpreter.test_items.test_item_runtime_plot import TestItemPlot
from interpreter.test_items.test_item_group import TestItemGroup
from interpreter.test_items.test_item_git import TestItemGit
from interpreter.test_items.test_item_py_func import TestItemPyFunc
+from interpreter.test_items.test_item_lua_func import TestItemLuaFunc
from interpreter.test_items.test_item_let import TestItemLet
from interpreter.test_items.test_item_check import TestItemCheckValue
from interpreter.test_items.test_item_json_rpc import TestItemJSON_RPC
@@ -51,7 +52,8 @@ from interpreter.test_items.test_item_report import TestItemReport
def _constants_init():
cst.TYPE_CONSOLE.item_class = TestItemConsole
cst.TYPE_CYCLE.item_class = TestItemCycle
- cst.TYPE_FUNCTION.item_class = TestItemPyFunc
+ cst.TYPE_PY_FUNCTION.item_class = TestItemPyFunc
+ cst.TYPE_LUA_FUNCTION.item_class = TestItemLuaFunc
cst.TYPE_GIT.item_class = TestItemGit
cst.TYPE_GRAPH.item_class = TestItemPlot
cst.TYPE_GROUP.item_class = TestItemGroup
diff --git a/src/testium/lua_func/json-rpc.lua b/src/testium/lua_func/json-rpc.lua
index b0e0f53..33377a2 100644
--- a/src/testium/lua_func/json-rpc.lua
+++ b/src/testium/lua_func/json-rpc.lua
@@ -1,4 +1,5 @@
local json = require("cjson")
+local utils = require("utils")
local JSONRPC = {}
JSONRPC.__index = JSONRPC
@@ -19,6 +20,7 @@ end
--- Handle incoming raw data from the transport layer
function JSONRPC:handle_message(raw_data)
+ utils.log("received: '%s'", raw_data)
local ok, msg = pcall(json.decode, raw_data)
if not ok then return self:_send_error(nil, -32700, "Parse error") end
@@ -63,7 +65,7 @@ function JSONRPC:_handle_response(res)
end
--- Call a method on the client
-function JSONRPC:call(method, params, callback)
+function JSONRPC:_call(method, params, callback)
local id = self.next_id
self.next_id = self.next_id + 1
@@ -83,7 +85,7 @@ function JSONRPC:call_sync(method, params)
local callco = coroutine.create(function(m, p)
local co = coroutine.running()
-- Call the async version, but use the callback to resume this coroutine
- self:call(m, p, function(err, res)
+ self:_call(m, p, function(err, res)
coroutine.resume(co, err, res)
end)
@@ -94,7 +96,9 @@ function JSONRPC:call_sync(method, params)
end
function JSONRPC:_send(data)
- self.send_raw(json.encode(data))
+ local j = json.encode(data)
+ utils.log("sending: '%s'", j)
+ self.send_raw(j)
end
function JSONRPC:_send_error(id, code, message)
diff --git a/src/testium/lua_func/main.lua b/src/testium/lua_func/main.lua
index 5738ba0..d60426e 100644
--- a/src/testium/lua_func/main.lua
+++ b/src/testium/lua_func/main.lua
@@ -58,6 +58,7 @@ end
local socket = require("socket")
local JSONRPC = require("json-rpc") -- The module from the previous response
local utils = require("utils")
+local tm = require("tm")
utils.verbose = config.verbose
@@ -76,30 +77,26 @@ end
client_sock:settimeout(10) -- Prevents hanging on dead connections
-utils.log("Client connected!")
+utils.log("Client connected")
-- Initialize the RPC instance for this specific connection
local rpc = JSONRPC.new(function(data)
client_sock:send(data .. "\n") -- Standard JSON-RPC uses newline delimiters over TCP
end)
+tm._init_api(rpc)
utils.setup_remote_print(rpc)
--- Define Server Methods
-rpc:register("echo", function(params)
- return params
-end)
-
-- Example: Send a request TO the client immediately upon connection
-rpc:call("greet", { msg = "Welcome to the server" }, function(err, res)
- if not err then print("Client replied to greeting:", res) end
-end)
+print("Welcome to the lua server")
+
+local tdir = tm.gd("test_directory")
-- Communication Loop for this client
while true do
local line, err = client_sock:receive() -- Read until newline
if err == "closed" then
- utils.log("Connection closed:", err)
+ utils.log("Connection ended: %s", err)
break
elseif err then
socket.sleep(0.01)
@@ -109,3 +106,4 @@ while true do
end
client_sock:close()
+utils.log("Server stopped")
diff --git a/src/testium/lua_func/utils.lua b/src/testium/lua_func/utils.lua
index d8d96c4..1bb6a8f 100644
--- a/src/testium/lua_func/utils.lua
+++ b/src/testium/lua_func/utils.lua
@@ -47,15 +47,19 @@ function utils.setup_remote_print(rpc)
-- Define the new local print
_G.print = function (...)
- local args = table.pack(...)
+
+ local args = {...}
local output = {}
- for i = 1, args.n do
- table.insert(output, tostring(args[i]))
+ for i, v in ipairs(args) do
+ table.insert(output, tostring(v))
end
local message = table.concat(output, "\t")
-
+ utils.log("Printed value: '%s'", message)
+ if string.sub(message, -1) ~= "\n" then
+ message = message .. "\n"
+ end
pcall(function()
rpc:call_sync("print", message )
end)
diff --git a/src/testium/main_win/resources/about_win_rc.py b/src/testium/main_win/resources/about_win_rc.py
index 03af375..50f1bc4 100644
--- a/src/testium/main_win/resources/about_win_rc.py
+++ b/src/testium/main_win/resources/about_win_rc.py
@@ -1826,7 +1826,7 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x9bK\x0b\xd0\x9d\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
"
def qInitResources():
diff --git a/src/testium/main_win/resources/black/text-x-lua.png b/src/testium/main_win/resources/black/text-x-lua.png
new file mode 100644
index 0000000..39ba577
Binary files /dev/null and b/src/testium/main_win/resources/black/text-x-lua.png differ
diff --git a/src/testium/main_win/resources/color/text-x-lua.png b/src/testium/main_win/resources/color/text-x-lua.png
new file mode 100644
index 0000000..39ba577
Binary files /dev/null and b/src/testium/main_win/resources/color/text-x-lua.png differ
diff --git a/src/testium/main_win/resources/f1_win_rc.py b/src/testium/main_win/resources/f1_win_rc.py
index 4a9b441..4b0bf99 100644
--- a/src/testium/main_win/resources/f1_win_rc.py
+++ b/src/testium/main_win/resources/f1_win_rc.py
@@ -1832,7 +1832,7 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x9bK\x0b\xd0\x9d\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
"
def qInitResources():
diff --git a/src/testium/main_win/resources/testium_core_win.qrc b/src/testium/main_win/resources/testium_core_win.qrc
index 27f0424..9cb6b08 100644
--- a/src/testium/main_win/resources/testium_core_win.qrc
+++ b/src/testium/main_win/resources/testium_core_win.qrc
@@ -46,6 +46,7 @@
black/system-log-out.png
black/terminal.png
black/text-x-python.png
+ black/text-x-lua.png
black/verif.png
black/view-refresh.png
@@ -96,6 +97,7 @@
color/system-log-out.png
color/terminal.png
color/text-x-python.png
+ black/text-x-lua.png
color/verif.png
color/view-refresh.png
diff --git a/src/testium/main_win/resources/testium_core_win_rc.py b/src/testium/main_win/resources/testium_core_win_rc.py
index 4481717..673a26b 100644
--- a/src/testium/main_win/resources/testium_core_win_rc.py
+++ b/src/testium/main_win/resources/testium_core_win_rc.py
@@ -2267,6 +2267,82 @@ y\x06\xd2\x00\xd9\x02\xe0|A\x85\xfd\x90\xdb~\x91\x9d\
\xff_\x22\xf8\x03\xb2\xc5\xfb$^\xff\x16\xaf\xd0a\x5c\
>\x9f\xff\x1b\x19\xef\x5c\xc7\xa6\xcdG\xd2\x00\x00\x00\x00\
IEND\xaeB`\x82\
+\x00\x00\x04\x91\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
+\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x00\
+\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\
+ cHRM\x00\x00z&\x00\x00\x80\x84\x00\x00\xfa\
+\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\x00\x00:\
+\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06bKG\
+D\x00\xc9\x00\xc9\x00\xc9a\x80\xe6\x0e\x00\x00\x00\x09p\
+HYs\x00\x00.#\x00\x00.#\x01x\xa5?v\
+\x00\x00\x00\x07tIME\x07\xe9\x0c\x1e\x0d\x12\x1br\
+\xe0\x07+\x00\x00\x03\xd5IDATx\xda\xed\xdb_\
+HSQ\x1c\x07\xf0\xef\xddv\xc9\xfe-\x15\xd4 ,\
+\x02\x0d\x9doQ=\x14\xb5\xa9\x11\xd2\xcaz\xe9\xad\xc8\
+0\xccH\x9b\x7f2\xa2\xa7^+\x1dn3XQ\xf9\
+\xef=B0\x88\x9cn+{0(\x82\x9c\xc9\xb4?\
+.Ag\x7f\xb4\xc4\xa2\xcd{z\xb0FS\xeb\xba\xdd\
+?\xbbg\xdc\xf3\xb4\xdd\x9d{\xb6\xf3\xd9\xef\x9c\xf3;\
+\x87\x8d\x01O1\x18\xae\xac\xe5R\xd6\xd8\x18\x82c`\
+\x18=d*\x07\x8aro\xd9\x1a\x8f\x9e\x91\xfa}4\
+|\x15\xc8\xaa\xd5V\x06L\xb9\x9c\x9d\x07\x00\xbd>\xa5\
+\xc2r\xe1\xfe\xcd\xc4\x030\x9acHP\x91\x03\x81\x17\
+\x80\x01\xd2\x90\xc0\xa2\xd7\xa7TT\xd5\xdfkM\x18\x80\
+\x12J\xda\x865eR!P\x01 %\x025\x00R\
+!P\x05 \x05\x02u\x00b#P\x09\xf0\x07\xe1\x5c\
+\xadp\x04j\x01\x00 =M8\x02\xd5\x00b P\
+\x0f \x14!)\x00\x84 $\x0d@\xbc\x08\x8a\x05\xf8\
+\x19\x9a\x97\x05A\xb1\x00\xef\xde\x7f\x91%\x12\x14\x0b\xf0\
+\xca7\x01\xff\xe8G\xc9#\x81\xe1\xab\x90\xbf\xfd:Q\
+\x02H8\xf4\x0d\xe1\xd0\xd7\x98\xef{\xfb\xba\x99I\x8a\
+IP\xc7\xae\x87\x8e\x8d\xf5P\x8a\x90\xa4Z\x05\xe2C\
+H\xb2ePl\x04*\xf3\x001\x11\xa8M\x84\xc4B\
+\xa0:\x13\x14\x03\x81\xfaTX(\x82N\xa9\x1dcY\
+-\xce\x9f\xdd\x83Rs\x01\x08!\xe8\xea\xf6\xc1\xe1\xec\
+Gh\x99\xc4H\xc7\xae\xff\x9d+|M\x1e\x80\xea\xca\
+=(?\xb9+\xf2\xfct\xd9\xc2c\xab\xc3\xfb\xcfH\
+\x88\x07A\xb1C\xe0\xc8\xa1\x82%\xd7\x8e\x1e.\x10}\
+8(\x16\x80,\x93\xc4\xcd\xcf\x13\xd1\xe7\x04\x9d\x5c\xe3\
+y\x7fa.\x8a\x8c90\xe4gbc\xe6B\xb8N\
+\x04\xbf\xc17\x14\x84\xcb\xed\x87\xcb=\x125\xbe\xbb\xba\
+}\x91\xb0\x8f\x5c{0\xb8\xe2\x89qa8\xcc$\x1e\
+\xe0@\xf16\xd4[\x8c\xc8\xde\xb4a\xc9k[\xb7\xa4\
+c\xeb\x96t\x98K\xf2\x10\xf80\x8dF\x9b\x07\x8fz\
+\xfd\x00\x00\x87\xb3\x1f\x00Pj6D@Z\x9cOc\
+Z\x1d\x00\x0e\x09\xdb\x0dj5\x0c\xea,F\x9c:\xbe\
+#\xa6\xfbZ;\x9f\xa1\xc9\xee\x05\xc7\x11Q\x06\xd2\xd0\
+\xf3\x8b\x9a\x84\xcc\x01\xf1t\x1e\x00N\x9d\xd8\x89\xda\xaa\
+\xbd\xb2\xcd5\x1a\xa9\xc2\x9e\xaf\xf3\xa1\xd0<\x9a\xec^\
+\x98J\x9c0\x958aux#s@\xf9\xc9](\
+6\xe5\xd0\x09\xc0\xb2Z\xd4[\x8c\xbc\xf5\x1c\xce~\xdc\
+i\x1f@pj\x16\xc1\xa9Y\xdcn\x1b\x88\x8c{\x00\
+h\xa81\x81e\xb5\xf4\x01\xec/\xcc]v\xc2[\x5c\
+\xba\xba}\xff\xbd\xb69;\x15E\xc6\x1c\xfa\x00\x84\x84\
+.\xc3\x88\xd7V\xc2\x00\x0cyY+\xaa\xf7gy\x8b\
+\xbav0:\xd3+0dI\x0e z\x1e\x90\x91\xb1\
+v\xc5\xb9\xfe\xdfa_j6\xa0\xaarwT\x9d\xcc\
+\x8cu\xf4\x010\xfc\xa9Ed\xb2\xac\xab\xde\x87\xba\xea\
+}\x02\x8e4\x158\x04\x82S\xb3\x8alK6\x80\xc1\
+\xa1I\xf1\xda\xf2M\xd0\x07\xe0r\xfb\xc5k\xcb3B\
+\x1f@O\x9f\x1fc\x81i\xc1\xed\x04\xc6g\xd0\xe7\x19\
+\xa5\x0f \x1c\xe6\xd0d\xf7\x08n\xe7\xaa\xb5o\xd9\xe3\
+/*\xf6\x02\x8fz\xfdh\xed|\x16\xf7\xfd\xb7\xdb\x06\
+\xd0\xeb\x96>\xfc%\xdd\x0d6\xd9\xbd\xb8\xdb\x11;\xc2\
+\x9d\xf6\x014\xdfx,\xdbnP\xb2\x03\x11\x8e#h\
+\xb4y\xf0\xe2\xe58\x1ajL\xd8\x9c\x9d\xfa\xdf\xfac\
+\x81i\x5ckv\xcb\xf6\xcd\xcbv\x22\xe4r\x8f\xc0\xf3\
+\xe4\x0d\x8aM\xb9(6\xe5\xc0\x90\x9f\xb5\xe8Hl\x12\
+=n?z\xdd#\x08\x879\xc8]d9\x13\x0c\x87\
+9<\xec\x19\xc6\xc3\x9ea(\xad$\xd5\x8f\xa4T\x00\
+\x15@\x05P\x01T\x00\x15@\x05P\x01T\x00Q\xff\
+:K\xc8gj{G\xf0I\x8c\x08\xe8\xa0\x16\x80\xe1\
+\xff\xec\xbc\x00?\xbe\xcc]\x02H\x0b\x08f(\xfa\xe6\
+g\x08!\xf6\xef\x9f\xe7.\xf3\xd5\xfd\x05\xf6eXB\
+ZO2\x9f\x00\x00\x00\x00IEND\xaeB`\x82\
+\
\x00\x00\x06-\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -13193,6 +13269,82 @@ lC_\x94\x1c~\xcf\x1d0|\x04\xcc\xff\xfe\x8e0\
\x22\xb0\xa8dG&\x01$\x80\x04\x90\x92\x92\x92\xda\xcd\
\xfa\x05$\xe3\xfd\xacQFD\xb5\x00\x00\x00\x00IE\
ND\xaeB`\x82\
+\x00\x00\x04\x91\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
+\x00\x00\x00\x01sRGB\x01\xd9\xc9,\x7f\x00\x00\x00\
+\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\
+ cHRM\x00\x00z&\x00\x00\x80\x84\x00\x00\xfa\
+\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\x00\x00:\
+\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06bKG\
+D\x00\xc9\x00\xc9\x00\xc9a\x80\xe6\x0e\x00\x00\x00\x09p\
+HYs\x00\x00.#\x00\x00.#\x01x\xa5?v\
+\x00\x00\x00\x07tIME\x07\xe9\x0c\x1e\x0d\x12\x1br\
+\xe0\x07+\x00\x00\x03\xd5IDATx\xda\xed\xdb_\
+HSQ\x1c\x07\xf0\xef\xddv\xc9\xfe-\x15\xd4 ,\
+\x02\x0d\x9doQ=\x14\xb5\xa9\x11\xd2\xcaz\xe9\xad\xc8\
+0\xccH\x9b\x7f2\xa2\xa7^+\x1dn3XQ\xf9\
+\xef=B0\x88\x9cn+{0(\x82\x9c\xc9\xb4?\
+.Ag\x7f\xb4\xc4\xa2\xcd{z\xb0FS\xeb\xba\xdd\
+?\xbbg\xdc\xf3\xb4\xdd\x9d{\xb6\xf3\xd9\xef\x9c\xf3;\
+\x87\x8d\x01O1\x18\xae\xac\xe5R\xd6\xd8\x18\x82c`\
+\x18=d*\x07\x8aro\xd9\x1a\x8f\x9e\x91\xfa}4\
+|\x15\xc8\xaa\xd5V\x06L\xb9\x9c\x9d\x07\x00\xbd>\xa5\
+\xc2r\xe1\xfe\xcd\xc4\x030\x9acHP\x91\x03\x81\x17\
+\x80\x01\xd2\x90\xc0\xa2\xd7\xa7TT\xd5\xdfkM\x18\x80\
+\x12J\xda\x865eR!P\x01 %\x025\x00R\
+!P\x05 \x05\x02u\x00b#P\x09\xf0\x07\xe1\x5c\
+\xadp\x04j\x01\x00 =M8\x02\xd5\x00b P\
+\x0f \x14!)\x00\x84 $\x0d@\xbc\x08\x8a\x05\xf8\
+\x19\x9a\x97\x05A\xb1\x00\xef\xde\x7f\x91%\x12\x14\x0b\xf0\
+\xca7\x01\xff\xe8G\xc9#\x81\xe1\xab\x90\xbf\xfd:Q\
+\x02H8\xf4\x0d\xe1\xd0\xd7\x98\xef{\xfb\xba\x99I\x8a\
+IP\xc7\xae\x87\x8e\x8d\xf5P\x8a\x90\xa4Z\x05\xe2C\
+H\xb2ePl\x04*\xf3\x001\x11\xa8M\x84\xc4B\
+\xa0:\x13\x14\x03\x81\xfaTX(\x82N\xa9\x1dcY\
+-\xce\x9f\xdd\x83Rs\x01\x08!\xe8\xea\xf6\xc1\xe1\xec\
+Gh\x99\xc4H\xc7\xae\xff\x9d+|M\x1e\x80\xea\xca\
+=(?\xb9+\xf2\xfct\xd9\xc2c\xab\xc3\xfb\xcfH\
+\x88\x07A\xb1C\xe0\xc8\xa1\x82%\xd7\x8e\x1e.\x10}\
+8(\x16\x80,\x93\xc4\xcd\xcf\x13\xd1\xe7\x04\x9d\x5c\xe3\
+y\x7fa.\x8a\x8c90\xe4gbc\xe6B\xb8N\
+\x04\xbf\xc17\x14\x84\xcb\xed\x87\xcb=\x125\xbe\xbb\xba\
+}\x91\xb0\x8f\x5c{0\xb8\xe2\x89qa8\xcc$\x1e\
+\xe0@\xf16\xd4[\x8c\xc8\xde\xb4a\xc9k[\xb7\xa4\
+c\xeb\x96t\x98K\xf2\x10\xf80\x8dF\x9b\x07\x8fz\
+\xfd\x00\x00\x87\xb3\x1f\x00Pj6D@Z\x9cOc\
+Z\x1d\x00\x0e\x09\xdb\x0dj5\x0c\xea,F\x9c:\xbe\
+#\xa6\xfbZ;\x9f\xa1\xc9\xee\x05\xc7\x11Q\x06\xd2\xd0\
+\xf3\x8b\x9a\x84\xcc\x01\xf1t\x1e\x00N\x9d\xd8\x89\xda\xaa\
+\xbd\xb2\xcd5\x1a\xa9\xc2\x9e\xaf\xf3\xa1\xd0<\x9a\xec^\
+\x98J\x9c0\x958aux#s@\xf9\xc9](\
+6\xe5\xd0\x09\xc0\xb2Z\xd4[\x8c\xbc\xf5\x1c\xce~\xdc\
+i\x1f@pj\x16\xc1\xa9Y\xdcn\x1b\x88\x8c{\x00\
+h\xa81\x81e\xb5\xf4\x01\xec/\xcc]v\xc2[\x5c\
+\xba\xba}\xff\xbd\xb69;\x15E\xc6\x1c\xfa\x00\x84\x84\
+.\xc3\x88\xd7V\xc2\x00\x0cyY+\xaa\xf7gy\x8b\
+\xbav0:\xd3+0dI\x0e z\x1e\x90\x91\xb1\
+v\xc5\xb9\xfe\xdfa_j6\xa0\xaarwT\x9d\xcc\
+\x8cu\xf4\x010\xfc\xa9Ed\xb2\xac\xab\xde\x87\xba\xea\
+}\x02\x8e4\x158\x04\x82S\xb3\x8alK6\x80\xc1\
+\xa1I\xf1\xda\xf2M\xd0\x07\xe0r\xfb\xc5k\xcb3B\
+\x1f@O\x9f\x1fc\x81i\xc1\xed\x04\xc6g\xd0\xe7\x19\
+\xa5\x0f \x1c\xe6\xd0d\xf7\x08n\xe7\xaa\xb5o\xd9\xe3\
+/*\xf6\x02\x8fz\xfdh\xed|\x16\xf7\xfd\xb7\xdb\x06\
+\xd0\xeb\x96>\xfc%\xdd\x0d6\xd9\xbd\xb8\xdb\x11;\xc2\
+\x9d\xf6\x014\xdfx,\xdbnP\xb2\x03\x11\x8e#h\
+\xb4y\xf0\xe2\xe58\x1ajL\xd8\x9c\x9d\xfa\xdf\xfac\
+\x81i\x5ckv\xcb\xf6\xcd\xcbv\x22\xe4r\x8f\xc0\xf3\
+\xe4\x0d\x8aM\xb9(6\xe5\xc0\x90\x9f\xb5\xe8Hl\x12\
+=n?z\xdd#\x08\x879\xc8]d9\x13\x0c\x87\
+9<\xec\x19\xc6\xc3\x9ea(\xad$\xd5\x8f\xa4T\x00\
+\x15@\x05P\x01T\x00\x15@\x05P\x01T\x00Q\xff\
+:K\xc8gj{G\xf0I\x8c\x08\xe8\xa0\x16\x80\xe1\
+\xff\xec\xbc\x00?\xbe\xcc]\x02H\x0b\x08f(\xfa\xe6\
+g\x08!\xf6\xef\x9f\xe7.\xf3\xd5\xfd\x05\xf6eXB\
+ZO2\x9f\x00\x00\x00\x00IEND\xaeB`\x82\
+\
\x00\x00\x078\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -20332,6 +20484,10 @@ qt_resource_name = b"\
\x00g\
\x00n\x00o\x00m\x00e\x00-\x00s\x00e\x00t\x00t\x00i\x00n\x00g\x00s\x00.\x00p\x00n\
\x00g\
+\x00\x0e\
+\x0a^\xdeg\
+\x00t\
+\x00e\x00x\x00t\x00-\x00x\x00-\x00l\x00u\x00a\x00.\x00p\x00n\x00g\
\x00\x08\
\x0c3Z\x87\
\x00h\
@@ -20485,202 +20641,206 @@ qt_resource_name = b"\
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x10\x00\x02\x00\x00\x000\x00\x00\x003\
+\x00\x00\x00\x10\x00\x02\x00\x00\x001\x00\x00\x004\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x000\x00\x00\x00\x03\
+\x00\x00\x00\x00\x00\x02\x00\x00\x001\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x05&\x00\x00\x00\x00\x00\x01\x00\x04\xcb\xeb\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x03\xd5'\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x02\x80z\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x04\x84\x89\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x05\x02\x00\x00\x00\x00\x00\x01\x00\x04\xc7\xbf\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x02\xa0\x5c\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x006\x00\x00\x00\x00\x00\x01\x00\x02z\xfd\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x02\xaa\x97\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x04R\x00\x00\x00\x00\x00\x01\x00\x04\x9e\xee\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x036\xc0\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x04\xa4\xc2\
-\x00\x00\x01\x9bJ\xd7\x8b\xdf\
-\x00\x00\x03&\x00\x00\x00\x00\x00\x01\x00\x03\xddc\
-\x00\x00\x01\x9bK\x0b\xd0\x9d\
-\x00\x00\x04r\x00\x00\x00\x00\x00\x01\x00\x04\xa1`\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02\xd2\x00\x00\x00\x00\x00\x01\x00\x03\xd1\xed\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03L\x00\x00\x00\x00\x00\x01\x00\x04N.\
-\x00\x00\x01\x8d\xd0\x9c,\xa1\
-\x00\x00\x01N\x00\x00\x00\x00\x00\x01\x00\x03*\xb9\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x03#{\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03\x10\x00\x00\x00\x00\x00\x01\x00\x03\xd8\xa4\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x04\xdd\x83\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x03\x1c\xc6\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x05h\x00\x00\x00\x00\x00\x01\x00\x04\xd9N\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02\xaa\x00\x00\x00\x00\x00\x01\x00\x03\xcb3\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x01\xea\x00\x00\x00\x00\x00\x01\x00\x03H\xc4\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x01\xac\x00\x00\x00\x00\x00\x01\x00\x03=\x82\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x02s\xd7\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x05P\x00\x00\x00\x00\x00\x01\x00\x04\xd4\x92\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x02\x98\xb6\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x02\x1c\x00\x00\x00\x00\x00\x01\x00\x03\x95q\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x024\x00\x00\x00\x00\x00\x01\x00\x03\x9b;\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02L\x00\x00\x00\x00\x00\x01\x00\x03\x9f\xc6\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x04\x0c\x00\x00\x00\x00\x00\x01\x00\x04\x96\xa1\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03p\x00\x00\x00\x00\x00\x01\x00\x04}\x16\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03\xf4\x00\x00\x00\x00\x00\x01\x00\x04\x8e\x14\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x02\xf8\xbb\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03\x8a\x00\x00\x00\x00\x00\x01\x00\x04\x7f\x8c\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x02\xc06\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x02\xf0\xef\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x04\xba\x18\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x01x\x00\x00\x00\x00\x00\x01\x00\x03/\x84\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02\x00\x00\x00\x00\x00\x00\x01\x00\x03oC\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x03FQ\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x04\xc1\x9f\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03\xbc\x00\x00\x00\x00\x00\x01\x00\x04\x87\x8b\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x1d\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x02\x80\x00\x00\x00\x00\x00\x01\x00\x03\xa2!\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x04\xe0\xd9\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x04\x8a\x8d\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x04*\x00\x00\x00\x00\x00\x01\x00\x04\x9a%\
-\x00\x00\x01\x91\xc2j\xf36\
-\x00\x00\x05&\x00\x00\x00\x00\x00\x01\x00\x02U\xea\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x016\xce\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x05H\x00\x00\x00\x00\x00\x01\x00\x04\xd5\x15\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x03\xdeQ\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x02\x85\x0f\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03\xca\x00\x00\x00\x00\x00\x01\x00\x04\x8d\xb3\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x05$\x00\x00\x00\x00\x00\x01\x00\x04\xd0\xe9\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x02\xa4\xf1\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x006\x00\x00\x00\x00\x00\x01\x00\x02\x7f\x92\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x02\xaf,\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04t\x00\x00\x00\x00\x00\x01\x00\x04\xa8\x18\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x03?\xea\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04\xb8\x00\x00\x00\x00\x00\x01\x00\x04\xad\xec\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
+\x00\x00\x03H\x00\x00\x00\x00\x00\x01\x00\x03\xe6\x8d\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
+\x00\x00\x04\x94\x00\x00\x00\x00\x00\x01\x00\x04\xaa\x8a\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x03\xdb\x17\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x03n\x00\x00\x00\x00\x00\x01\x00\x04WX\
+\x00\x00\x01\x9bi\x96\x0e\x10\
+\x00\x00\x01N\x00\x00\x00\x00\x00\x01\x00\x03/N\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x03(\x10\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x032\x00\x00\x00\x00\x00\x01\x00\x03\xe1\xce\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x04\xe6\xad\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x03![\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x04\xe2x\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02\xcc\x00\x00\x00\x00\x00\x01\x00\x03\xd4]\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x03Q\xee\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x03F\xac\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x02xl\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x05r\x00\x00\x00\x00\x00\x01\x00\x04\xdd\xbc\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x02\x9dK\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x02>\x00\x00\x00\x00\x00\x01\x00\x03\x9e\x9b\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02V\x00\x00\x00\x00\x00\x01\x00\x03\xa4e\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02n\x00\x00\x00\x00\x00\x01\x00\x03\xa8\xf0\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04.\x00\x00\x00\x00\x00\x01\x00\x04\x9f\xcb\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x04\x86@\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04\x16\x00\x00\x00\x00\x00\x01\x00\x04\x97>\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x01x\x00\x00\x00\x00\x00\x01\x00\x034\x19\
+\x00\x00\x01\x9boh\xf3A\
+\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x02\xfdP\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x04\x88\xb6\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x02\xc4\xcb\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x02\xf5\x84\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x04\xc3B\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x038\xae\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x03xm\
+\x00\x00\x01\x9bi\x96\x0e\x14\
+\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x03O{\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04\xf6\x00\x00\x00\x00\x00\x01\x00\x04\xca\xc9\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x04\x90\xb5\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x03\x00\xb2\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x02\xa2\x00\x00\x00\x00\x00\x01\x00\x03\xabK\
+\x00\x00\x01\x9bi\x96\x0e\x14\
+\x00\x00\x05\xba\x00\x00\x00\x00\x00\x01\x00\x04\xea\x03\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x00\x04\x93\xb7\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x04L\x00\x00\x00\x00\x00\x01\x00\x04\xa3O\
+\x00\x00\x01\x9bi\x96\x0e\x12\
+\x00\x00\x05H\x00\x00\x00\x00\x00\x01\x00\x02Z\x7f\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03\x0a\x00\x00\x00\x00\x00\x01\x00\x01;c\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x00\x0c&\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x01\xee\xae\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x05\x02\x00\x00\x00\x00\x00\x01\x00\x02P\xa0\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x10\
+\x00\x00\x03\xca\x00\x00\x00\x00\x00\x01\x00\x01\xf3C\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x05$\x00\x00\x00\x00\x00\x01\x00\x02U5\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00-\xf8\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x006\x00\x00\x00\x00\x00\x01\x00\x00\x07&\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x005\x07\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x04R\x00\x00\x00\x00\x00\x01\x00\x02$0\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x91\xac\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x02. \
-\x00\x00\x01\x9bJ\xd7\x8b\xdf\
-\x00\x00\x03&\x00\x00\x00\x00\x00\x01\x00\x01A\x97\
-\x00\x00\x01\x9bK\x0b\xd0\x9d\
-\x00\x00\x04r\x00\x00\x00\x00\x00\x01\x00\x02)y\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02\xd2\x00\x00\x00\x00\x00\x01\x00\x01/\xf5\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03L\x00\x00\x00\x00\x00\x01\x00\x01\xb2b\
-\x00\x00\x01\x8d\xd0\x9c,\xa1\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04t\x00\x00\x00\x00\x00\x01\x00\x02(\xc5\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x96A\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04\xb8\x00\x00\x00\x00\x00\x01\x00\x022\xb5\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
+\x00\x00\x03H\x00\x00\x00\x00\x00\x01\x00\x01F,\
+\x00\x00\x01\x9bi\x96\x0e\x1c\
+\x00\x00\x04\x94\x00\x00\x00\x00\x00\x01\x00\x02.\x0e\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02\xf4\x00\x00\x00\x00\x00\x01\x00\x014\x8a\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03n\x00\x00\x00\x00\x00\x01\x00\x01\xb6\xf7\
+\x00\x00\x01\x9bi\x96\x0e\x10\
\x00\x00\x01N\x00\x00\x00\x00\x00\x01\x00\x00\x83\x8e\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x00\x7f;\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\x10\x00\x00\x00\x00\x00\x01\x00\x01<\x82\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x05\x80\x00\x00\x00\x00\x00\x01\x00\x02h\xd4\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x032\x00\x00\x00\x00\x00\x01\x00\x01A\x17\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x02mi\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x01\x14\x00\x00\x00\x00\x00\x01\x00\x00zn\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x05h\x00\x00\x00\x00\x00\x01\x00\x02d\x13\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02\xaa\x00\x00\x00\x00\x00\x01\x00\x01)\xdf\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x01\xea\x00\x00\x00\x00\x00\x01\x00\x00\xa4\x84\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x01\xac\x00\x00\x00\x00\x00\x01\x00\x00\x97Q\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x02h\xa8\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02\xcc\x00\x00\x00\x00\x00\x01\x00\x01.t\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xa9\x19\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x01\xce\x00\x00\x00\x00\x00\x01\x00\x00\x9b\xe6\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x05P\x00\x00\x00\x00\x00\x01\x00\x02\x5cb\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x05r\x00\x00\x00\x00\x00\x01\x00\x02`\xf7\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x00&R\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x02\x1c\x00\x00\x00\x00\x00\x01\x00\x00\xf11\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x024\x00\x00\x00\x00\x00\x01\x00\x00\xf5\xec\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02L\x00\x00\x00\x00\x00\x01\x00\x00\xfa.\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x04\x0c\x00\x00\x00\x00\x00\x01\x00\x02\x03h\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03p\x00\x00\x00\x00\x00\x01\x00\x01\xe1J\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\xf4\x00\x00\x00\x00\x00\x01\x00\x01\xfcC\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00qw\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\x8a\x00\x00\x00\x00\x00\x01\x00\x01\xe9\xb2\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x008\xf2\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00i\xab\
-\x00\x00\x01\x8d\xd0\x9c,\xa5\
-\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x02Cv\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x02>\x00\x00\x00\x00\x00\x01\x00\x00\xf5\xc6\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02V\x00\x00\x00\x00\x00\x01\x00\x00\xfa\x81\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02n\x00\x00\x00\x00\x00\x01\x00\x00\xfe\xc3\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04.\x00\x00\x00\x00\x00\x01\x00\x02\x07\xfd\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x01\xe5\xdf\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04\x16\x00\x00\x00\x00\x00\x01\x00\x02\x00\xd8\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x01x\x00\x00\x00\x00\x00\x01\x00\x00\x8b{\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\xcb\x03\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x9d\xe7\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x02K\xf4\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\xbc\x00\x00\x00\x00\x00\x01\x00\x01\xf2\xee\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9boh\xf3A\
+\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00qw\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x01\xeeG\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x008\xf2\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00i\xab\
+\x00\x00\x01\x9bi\x96\x0e\x13\
+\x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x02H\x0b\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x90\x10\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x00\xcf\x98\
+\x00\x00\x01\x9bi\x96\x0e\x14\
+\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x01\x00\x00\xa2|\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04\xf6\x00\x00\x00\x00\x00\x01\x00\x02P\x89\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x01\xf7\x83\
+\x00\x00\x01\x9bi\x96\x0e\x11\
\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00u\x07\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x02\x80\x00\x00\x00\x00\x00\x01\x00\x01\x00\xcd\
-\x00\x00\x01\x8d\xd0\x9c,\xaf\
-\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x02l\xbc\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x01\xf7q\
-\x00\x00\x01\x91\xc2j\xf33\
-\x00\x00\x04*\x00\x00\x00\x00\x00\x01\x00\x02\x07\x7f\
-\x00\x00\x01\x91\xc2j\xf33\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x02\xa2\x00\x00\x00\x00\x00\x01\x00\x01\x05b\
+\x00\x00\x01\x9bi\x96\x0e\x14\
+\x00\x00\x05\xba\x00\x00\x00\x00\x00\x01\x00\x02qQ\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01\x00\x01\xfc\x06\
+\x00\x00\x01\x9bi\x96\x0e\x11\
+\x00\x00\x04L\x00\x00\x00\x00\x00\x01\x00\x02\x0c\x14\
+\x00\x00\x01\x9bi\x96\x0e\x11\
"
def qInitResources():
diff --git a/src/testium/main_win/test_tree.py b/src/testium/main_win/test_tree.py
index 4a9aa18..07e10b2 100644
--- a/src/testium/main_win/test_tree.py
+++ b/src/testium/main_win/test_tree.py
@@ -21,7 +21,8 @@ from main_win.test_tree_items.test_tree_sleep import QTestTreeItemSleep
from main_win.test_tree_items.test_tree_cycle import QTestTreeItemCycle
from main_win.test_tree_items.test_tree_group import QTestTreeItemGroup
from main_win.test_tree_items.test_tree_git import QTestTreeItemGit
-from main_win.test_tree_items.test_tree_func import QTestTreeItemFunc
+from main_win.test_tree_items.test_tree_py_func import QTestTreeItemPyFunc
+from main_win.test_tree_items.test_tree_lua_func import QTestTreeItemLuaFunc
from main_win.test_tree_items.test_tree_jsonrpc import QTestTreeItemJSONRPC, QTestTreeItemJSONRPCAction
from main_win.test_tree_items.test_tree_run import QTestTreeItemRun
from main_win.test_tree_items.test_tree_runtime_plot import QTestTreePlot, QTestTreePlotAction
@@ -58,7 +59,8 @@ class QTestTree(QTreeWidget):
cst.TYPE_GRAPH_ACTION.item_name : QTestTreePlotAction,
cst.TYPE_GROUP.item_name : QTestTreeItemGroup,
cst.TYPE_GIT.item_name : QTestTreeItemGit,
- cst.TYPE_FUNCTION.item_name : QTestTreeItemFunc,
+ cst.TYPE_PY_FUNCTION.item_name : QTestTreeItemPyFunc,
+ cst.TYPE_LUA_FUNCTION.item_name : QTestTreeItemLuaFunc,
cst.TYPE_LET.item_name : QTestTreeItemLet,
cst.TYPE_CHECK.item_name : QTestTreeItemCheckValue,
cst.TYPE_JSON_RPC.item_name : QTestTreeItemJSONRPC,
diff --git a/src/testium/main_win/test_tree_items/test_tree_lua_func.py b/src/testium/main_win/test_tree_items/test_tree_lua_func.py
new file mode 100644
index 0000000..0b53f0f
--- /dev/null
+++ b/src/testium/main_win/test_tree_items/test_tree_lua_func.py
@@ -0,0 +1,9 @@
+
+from .test_tree_item import QTestTreeItem
+from interpreter.utils.icons import icon_prefix
+
+class QTestTreeItemLuaFunc(QTestTreeItem):
+ def __init__(self, parent, test_set_item, cols):
+ super().__init__(parent, test_set_item, cols)
+ self.setRowIcon(icon_prefix() + "/text-x-lua.png")
+
diff --git a/src/testium/main_win/test_tree_items/test_tree_func.py b/src/testium/main_win/test_tree_items/test_tree_py_func.py
similarity index 83%
rename from src/testium/main_win/test_tree_items/test_tree_func.py
rename to src/testium/main_win/test_tree_items/test_tree_py_func.py
index f2594f1..6f386a0 100644
--- a/src/testium/main_win/test_tree_items/test_tree_func.py
+++ b/src/testium/main_win/test_tree_items/test_tree_py_func.py
@@ -2,7 +2,7 @@
from .test_tree_item import QTestTreeItem
from interpreter.utils.icons import icon_prefix
-class QTestTreeItemFunc(QTestTreeItem):
+class QTestTreeItemPyFunc(QTestTreeItem):
def __init__(self, parent, test_set_item, cols):
super().__init__(parent, test_set_item, cols)
self.setRowIcon(icon_prefix() + "/text-x-python.png")
diff --git a/src/testium/py_func/__init__.py b/src/testium/py_func/__init__.py
index f5010c7..62a26aa 100755
--- a/src/testium/py_func/__init__.py
+++ b/src/testium/py_func/__init__.py
@@ -30,7 +30,7 @@ def main():
outstream = TcpStdOut()
stdio_redir.redirect(outstream)
# debug the server
- thrd_api.dbg_out = stdio_redir.ini_stdout
+ # thrd_api.dbg_out = stdio_redir.ini_stdout
try:
while thrd_api.is_alive():
thrd_api.join(1)