From fb041f6570eafee83d022b9bc3f3bed51b2ba415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 30 Dec 2025 14:24:24 +0100 Subject: [PATCH] added lua function test item --- doc/examples/example_simple.tum | 12 +- doc/examples/lua_func.lua | 6 + src/testium/interpreter/terminal.py | 3 +- .../test_items/test_item_lua_func.py | 6 +- .../test_items/test_item_py_func.py | 4 +- src/testium/interpreter/utils/api_srv.py | 5 +- src/testium/interpreter/utils/constants.py | 3 +- src/testium/interpreter/utils/test_init.py | 4 +- src/testium/lua_func/json-rpc.lua | 10 +- src/testium/lua_func/main.lua | 18 +- src/testium/lua_func/utils.lua | 12 +- .../main_win/resources/about_win_rc.py | 2 +- .../main_win/resources/black/text-x-lua.png | Bin 0 -> 1169 bytes .../main_win/resources/color/text-x-lua.png | Bin 0 -> 1169 bytes src/testium/main_win/resources/f1_win_rc.py | 2 +- .../main_win/resources/testium_core_win.qrc | 2 + .../main_win/resources/testium_core_win_rc.py | 526 ++++++++++++------ src/testium/main_win/test_tree.py | 6 +- .../test_tree_items/test_tree_lua_func.py | 9 + ...test_tree_func.py => test_tree_py_func.py} | 2 +- src/testium/py_func/__init__.py | 2 +- 21 files changed, 417 insertions(+), 217 deletions(-) create mode 100644 doc/examples/lua_func.lua create mode 100644 src/testium/main_win/resources/black/text-x-lua.png create mode 100644 src/testium/main_win/resources/color/text-x-lua.png create mode 100644 src/testium/main_win/test_tree_items/test_tree_lua_func.py rename src/testium/main_win/test_tree_items/{test_tree_func.py => test_tree_py_func.py} (83%) 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 0000000000000000000000000000000000000000..39ba577e5fdff0d0ba357c7a752973dc80f28f95 GIT binary patch literal 1169 zcmV;C1aA9@P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;%SE$pFb=faVSW000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2k8tR4H6r2;0G%J00Y%YL_t(|+U?t4NK;W92k`IRcFF!N71SUs0u7ySQ9Ts3 zsS(o3dg-mmFw97se=?${UMn4LGgwji?>#~=h@5UKdoU=1oXNC5EfxtyH`0KGn?!gAsM&BOyRnqx>%kpqDjfC18wz@pcuR8-a9YfTt{5=z>J zHDyvEPyrw%0yO|qAy5S%1p;*dVk1xq@CV^st#AZt0RSL9O*jJ80Ae6e4`L9qbu-hYuL5)=#Y$~OW3=ts#Tf#Iu=zx_H<0!TRY4dKw&nD2Z0 zx|vCeNl?eGhmMW)P>PVGS_R@mNU~*6Yy>Lv05K7$O@zckpgI#21A+QfSSW%{sU2fk zEzY0agHm$=2qEa|_QB!oM`)SENXM@Kohy7z9)Rk~Jt#l9EAsqw*}`M1!~4%jhzCKj zL*U4vf+g3E9xf1lI4Bl?ER)2|&lAz-1f5*td4FLpii|lh5l{jH_cq4N_`N>@ zz_MD@Ta3K*9L|2+X&*pvY8Jt%S=??Lh>UvxXs9uPWwrDH>@Un+cEVd+y1IS;y|y_! z6-CAz`T&H4F2jh|R>A-bd08u}_h)&Fx^^%+(BHlV6< zcT}CsjCJ$@F#M@SWU{QQ-iNyCeFBa&6*vTfQ?rU}OE!SPp-J)D@=eeO;Bx!LYs)i2 zA3#r^A7g=O!R-XbXVB*vr4Jw+=FnvK2yW-9wQt$uFDmu|k9z%R?R*yZ{kPi&(Cd~y z{3YEDHrc(n+Yvj$o%R7V-*_zBZcwrV5so8hw0ZF2A`rrCvfoWW8cFXq7 z%XT8uG{=tyi5J#IgG-6IHxImlgPITH+rIXvtc#>1XrD6J&b zkEB!p6+i`00aO4LKm||%Q~*)`I!nlBYI{fUNsI{Spca7P|LnW~KfcUe0!Rx8W+?jR jX9ywo@1N%`^VR(Y_GMT?T2C^c00000NkvXXu0mjfBIW%) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..39ba577e5fdff0d0ba357c7a752973dc80f28f95 GIT binary patch literal 1169 zcmV;C1aA9@P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;%SE$pFb=faVSW000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2k8tR4H6r2;0G%J00Y%YL_t(|+U?t4NK;W92k`IRcFF!N71SUs0u7ySQ9Ts3 zsS(o3dg-mmFw97se=?${UMn4LGgwji?>#~=h@5UKdoU=1oXNC5EfxtyH`0KGn?!gAsM&BOyRnqx>%kpqDjfC18wz@pcuR8-a9YfTt{5=z>J zHDyvEPyrw%0yO|qAy5S%1p;*dVk1xq@CV^st#AZt0RSL9O*jJ80Ae6e4`L9qbu-hYuL5)=#Y$~OW3=ts#Tf#Iu=zx_H<0!TRY4dKw&nD2Z0 zx|vCeNl?eGhmMW)P>PVGS_R@mNU~*6Yy>Lv05K7$O@zckpgI#21A+QfSSW%{sU2fk zEzY0agHm$=2qEa|_QB!oM`)SENXM@Kohy7z9)Rk~Jt#l9EAsqw*}`M1!~4%jhzCKj zL*U4vf+g3E9xf1lI4Bl?ER)2|&lAz-1f5*td4FLpii|lh5l{jH_cq4N_`N>@ zz_MD@Ta3K*9L|2+X&*pvY8Jt%S=??Lh>UvxXs9uPWwrDH>@Un+cEVd+y1IS;y|y_! z6-CAz`T&H4F2jh|R>A-bd08u}_h)&Fx^^%+(BHlV6< zcT}CsjCJ$@F#M@SWU{QQ-iNyCeFBa&6*vTfQ?rU}OE!SPp-J)D@=eeO;Bx!LYs)i2 zA3#r^A7g=O!R-XbXVB*vr4Jw+=FnvK2yW-9wQt$uFDmu|k9z%R?R*yZ{kPi&(Cd~y z{3YEDHrc(n+Yvj$o%R7V-*_zBZcwrV5so8hw0ZF2A`rrCvfoWW8cFXq7 z%XT8uG{=tyi5J#IgG-6IHxImlgPITH+rIXvtc#>1XrD6J&b zkEB!p6+i`00aO4LKm||%Q~*)`I!nlBYI{fUNsI{Spca7P|LnW~KfcUe0!Rx8W+?jR jX9ywo@1N%`^VR(Y_GMT?T2C^c00000NkvXXu0mjfBIW%) literal 0 HcmV?d00001 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)