From f8971907d7ee78dec9e7325e6c68485c49c0387b Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 10:18:50 +0100 Subject: [PATCH 1/6] update deps --- .gitmodules | 2 +- deps/ledger-zxlib | 2 +- deps/nanos-secure-sdk | 2 +- deps/nanosplus-secure-sdk | 2 +- deps/nanox-secure-sdk | 2 +- tests_zemu/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitmodules b/.gitmodules index 5024ec55..f944d5e0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "deps/nanos-secure-sdk"] path = deps/nanos-secure-sdk - url = https://github.com/LedgerHQ/nanos-secure-sdk.git + url = https://github.com/LedgerHQ/ledger-secure-sdk.git [submodule "deps/nanox-secure-sdk"] path = deps/nanox-secure-sdk url = https://github.com/LedgerHQ/ledger-secure-sdk.git diff --git a/deps/ledger-zxlib b/deps/ledger-zxlib index 9e9cb2b2..a669ab07 160000 --- a/deps/ledger-zxlib +++ b/deps/ledger-zxlib @@ -1 +1 @@ -Subproject commit 9e9cb2b21fdf94a6b1f7d71ee6f89ca8101712ce +Subproject commit a669ab077a3acbf80dd27d9563c2b5d35620d67a diff --git a/deps/nanos-secure-sdk b/deps/nanos-secure-sdk index 74ca336c..e0d514f4 160000 --- a/deps/nanos-secure-sdk +++ b/deps/nanos-secure-sdk @@ -1 +1 @@ -Subproject commit 74ca336caa23db2c64cc42424ac9e32f6988df09 +Subproject commit e0d514f4e4b063226b09cdb239d8daa67601fc70 diff --git a/deps/nanosplus-secure-sdk b/deps/nanosplus-secure-sdk index c69c3018..e0d514f4 160000 --- a/deps/nanosplus-secure-sdk +++ b/deps/nanosplus-secure-sdk @@ -1 +1 @@ -Subproject commit c69c301833ee3c7b1966b9efe96e706ce0c78d74 +Subproject commit e0d514f4e4b063226b09cdb239d8daa67601fc70 diff --git a/deps/nanox-secure-sdk b/deps/nanox-secure-sdk index c69c3018..e0d514f4 160000 --- a/deps/nanox-secure-sdk +++ b/deps/nanox-secure-sdk @@ -1 +1 @@ -Subproject commit c69c301833ee3c7b1966b9efe96e706ce0c78d74 +Subproject commit e0d514f4e4b063226b09cdb239d8daa67601fc70 diff --git a/tests_zemu/package.json b/tests_zemu/package.json index 08cdfc99..9d37bcb5 100644 --- a/tests_zemu/package.json +++ b/tests_zemu/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@zondax/ledger-cosmos-js": "^3.0.3", - "@zondax/zemu": "^0.48.0" + "@zondax/zemu": "^0.49.0" }, "devDependencies": { "@types/jest": "^29.5.12", From 787dd56911c9aee24a43f07a0bb1c4ae2c321d71 Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 10:52:58 +0100 Subject: [PATCH 2/6] define MIN_STACK_SIZE --- app/Makefile | 6 +++++- app/src/common/tx.c | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Makefile b/app/Makefile index 53b11936..f73c5aae 100755 --- a/app/Makefile +++ b/app/Makefile @@ -68,7 +68,11 @@ ifneq ($(TARGET_NAME),TARGET_NANOS) DEFINES += COMPILE_TEXTUAL endif -APP_STACK_MIN_SIZE := 1600 +ifeq ($(TARGET_NAME),TARGET_NANOS) + APP_STACK_MIN_SIZE := 1600 +else ifeq ($(TARGET_NAME),TARGET_NANOX) + APP_STACK_MIN_SIZE := 3800 +endif include $(CURDIR)/../deps/ledger-zxlib/makefiles/Makefile.platform CFLAGS += -I$(MY_DIR)/../deps/tinycbor/src diff --git a/app/src/common/tx.c b/app/src/common/tx.c index 60e1d7ab..06af1e1a 100644 --- a/app/src/common/tx.c +++ b/app/src/common/tx.c @@ -21,9 +21,12 @@ #include #include "zxmacros.h" -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) +#if defined(TARGET_NANOS2) || defined(TARGET_STAX) #define RAM_BUFFER_SIZE 8192 #define FLASH_BUFFER_SIZE 16384 +#elif defined(TARGET_NANOX) +#define RAM_BUFFER_SIZE 8158 +#define FLASH_BUFFER_SIZE 16384 #elif defined(TARGET_NANOS) #define RAM_BUFFER_SIZE 0 #define FLASH_BUFFER_SIZE 8192 From 811295d073bbcc7f26b4efded80c1c1b2a596dcc Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 10:53:17 +0100 Subject: [PATCH 3/6] update snapshots --- app/Makefile.version | 2 +- tests_zemu/snapshots/s-mainmenu/00004.png | Bin 465 -> 465 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 465 -> 465 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 396 -> 395 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 396 -> 395 bytes tests_zemu/snapshots/st-mainmenu/00001.png | Bin 13589 -> 13485 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 396 -> 395 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 396 -> 395 bytes 8 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Makefile.version b/app/Makefile.version index f3f985a2..782e3ff0 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=2 # This is the `spec_version` field of `Runtime` APPVERSION_N=35 # This is the patch version of this release -APPVERSION_P=20 +APPVERSION_P=21 diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index 777fac66949cd373a7fb1dbdde205f9211ee125a..d8e6401169b230a05ce14b8a83212a1401b1163c 100644 GIT binary patch delta 430 zcmV;f0a5LngO=_u{>sJp9bT4d=F@FPO&%N;p$32Cq3hOw{ zA{Ughkl9(^44zpycDl*{T^(`Jr18|@t)AkA57-g5p}$Xmrpcw0HHXKDuseIfS& zECa;ul1JPk_yZh@&;ZSJYHHj-OOi`+yQYFbB@3yyj;=4v-s_W z-Mz`W{{fA2T|{|@qq(*i7nju<*~+Evf1l+~qb}$}QzsG*E%@a!5^Kdz0{{R3005PE Y0j=uc<5c_qAMCA(*;(HV=A1Zoy2}7n9dS{l@zmk1p5hZ9uq|v&z08A=w~CW+Svl^fYXt~>A@>C= z1H{`UkGMtf2TaU>?GI%Dk;n){2E=_I>%c?k`5Ml>8lbiXHXuJ81s+vT6-+Y&h_=`U zP(Mr2Q|%MUD1Ruz>%003YD YoLngO=_u{>sJp9bT4d=F@FPO&%N;p$32Cq3hOw{ zA{Ughkl9(^44zpycDl*{T^(`Jr18|@t)AkA57-g5p}$Xmrpcw0HHXKDuseIfS& zECa;ul1JPk_yZh@&;ZSJYHHj-OOi`+yQYFbB@3yyj;=4v-s_W z-Mz`W{{fA2T|{|@qq(*i7nju<*~+Evf1l+~qb}$}QzsG*E%@a!5^Kdz0{{R3005PE Y0j=uc<5c_qAMCA(*;(HV=A1Zoy2}7n9dS{l@zmk1p5hZ9uq|v&z08A=w~CW+Svl^fYXt~>A@>C= z1H{`UkGMtf2TaU>?GI%Dk;n){2E=_I>%c?k`5Ml>8lbiXHXuJ81s+vT6-+Y&h_=`U zP(Mr2Q|%MUD1Ruz>%003YD Yo_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWKpV< delta 369 zcmeBX?qQywQXlN;;uumf=k3kFyu%7S4T)xN)$aWF*mqhkU}F2hkj(bEul~aRN4NbaK-GX>@OngJZ3TMofe(qy5!oebKjd6ItFIG;Qb*5Piy`^^Q&w9!E%S_NmZd%5B1Vk`dwfD_Qerf z8+p&|3pR0|ov`YIMclMJ?kc+}tN$LKS8|M}zFbPUpw7(J>TsitPxZ^yt2^556W01x zy#FCrYkgWl_;0e>LbYG*6PrEWI8ChJbKmsvFW1cD)7Cz*n4S}RLSFsh>&&=wvM|d9L{Gc8h4SZ(+Ba>dk#t&$~S>$MJksc&~Bg zT9Z0%tySA>YW7yuK6!Fc-&4pSb-yfM{Elt$^2@_>H!&gwjr%WF6J5ra7jI4W1&MmP L`njxgN@xNA`?slI diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 71c7d7128a1ecd75b87ab08b63affa0e7dd50b25..d32e423268167a2c3af977464a6a7d3735cc8452 100644 GIT binary patch delta 368 zcmeBS?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWKpV< delta 369 zcmeBX?qQywQXlN;;uumf=k3kFyu%7S4T)xN)$aWF*mqhkU}F2hkj(bEul~aRN4NbaK-GX>@OngJZ3TMofe(qy5!oebKjd6ItFIG;Qb*5Piy`^^Q&w9!E%S_NmZd%5B1Vk`dwfD_Qerf z8+p&|3pR0|ov`YIMclMJ?kc+}tN$LKS8|M}zFbPUpw7(J>TsitPxZ^yt2^556W01x zy#FCrYkgWl_;0e>LbYG*6PrEWI8ChJbKmsvFW1cD)7Cz*n4S}RLSFsh>&&=wvM|d9L{Gc8h4SZ(+Ba>dk#t&$~S>$MJksc&~Bg zT9Z0%tySA>YW7yuK6!Fc-&4pSb-yfM{Elt$^2@_>H!&gwjr%WF6J5ra7jI4W1&MmP L`njxgN@xNA`?slI diff --git a/tests_zemu/snapshots/st-mainmenu/00001.png b/tests_zemu/snapshots/st-mainmenu/00001.png index 397e01862091bef73ba6127e0ad64ce9e3066b1a..b5a83442715abff715888c672853cdb046212eff 100644 GIT binary patch delta 10749 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 F{|CQmoo)aC delta 10851 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 Ux_YpxQ2+z1ZS)ZPz&7gt0P=+Uh5!Hn diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 71c7d7128a1ecd75b87ab08b63affa0e7dd50b25..d32e423268167a2c3af977464a6a7d3735cc8452 100644 GIT binary patch delta 368 zcmeBS?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWKpV< delta 369 zcmeBX?qQywQXlN;;uumf=k3kFyu%7S4T)xN)$aWF*mqhkU}F2hkj(bEul~aRN4NbaK-GX>@OngJZ3TMofe(qy5!oebKjd6ItFIG;Qb*5Piy`^^Q&w9!E%S_NmZd%5B1Vk`dwfD_Qerf z8+p&|3pR0|ov`YIMclMJ?kc+}tN$LKS8|M}zFbPUpw7(J>TsitPxZ^yt2^556W01x zy#FCrYkgWl_;0e>LbYG*6PrEWI8ChJbKmsvFW1cD)7Cz*n4S}RLSFsh>&&=wvM|d9L{Gc8h4SZ(+Ba>dk#t&$~S>$MJksc&~Bg zT9Z0%tySA>YW7yuK6!Fc-&4pSb-yfM{Elt$^2@_>H!&gwjr%WF6J5ra7jI4W1&MmP L`njxgN@xNA`?slI diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 71c7d7128a1ecd75b87ab08b63affa0e7dd50b25..d32e423268167a2c3af977464a6a7d3735cc8452 100644 GIT binary patch delta 368 zcmeBS?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWKpV< delta 369 zcmeBX?qQywQXlN;;uumf=k3kFyu%7S4T)xN)$aWF*mqhkU}F2hkj(bEul~aRN4NbaK-GX>@OngJZ3TMofe(qy5!oebKjd6ItFIG;Qb*5Piy`^^Q&w9!E%S_NmZd%5B1Vk`dwfD_Qerf z8+p&|3pR0|ov`YIMclMJ?kc+}tN$LKS8|M}zFbPUpw7(J>TsitPxZ^yt2^556W01x zy#FCrYkgWl_;0e>LbYG*6PrEWI8ChJbKmsvFW1cD)7Cz*n4S}RLSFsh>&&=wvM|d9L{Gc8h4SZ(+Ba>dk#t&$~S>$MJksc&~Bg zT9Z0%tySA>YW7yuK6!Fc-&4pSb-yfM{Elt$^2@_>H!&gwjr%WF6J5ra7jI4W1&MmP L`njxgN@xNA`?slI From 3741997f13b7fe65cdea5fbe5067c6e95c72c360 Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 13:57:19 +0100 Subject: [PATCH 4/6] remove conan --- CMakeLists.txt | 32 +- cmake/Hunter/config.cmake | 1 + cmake/HunterGate.cmake | 543 ++++++++++++++++++++++++++++ cmake/conan/CMakeLists.txt | 15 - cmake/gtest/CMakeLists.txt | 31 -- cmake/gtest/CMakeLists.txt.gtest.in | 16 - conanfile.txt | 6 - 7 files changed, 565 insertions(+), 79 deletions(-) create mode 100644 cmake/Hunter/config.cmake create mode 100644 cmake/HunterGate.cmake delete mode 100644 cmake/conan/CMakeLists.txt delete mode 100644 cmake/gtest/CMakeLists.txt delete mode 100644 cmake/gtest/CMakeLists.txt.gtest.in delete mode 100644 conanfile.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index bd698708..fbcb8699 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,12 +14,22 @@ #* limitations under the License. #******************************************************************************** cmake_minimum_required(VERSION 3.0) +include("cmake/HunterGate.cmake") +HunterGate( + URL "https://github.com/cpp-pm/hunter/archive/v0.25.5.tar.gz" + SHA1 "a20151e4c0740ee7d0f9994476856d813cdead29" + LOCAL +) + project(ledger-cosmos VERSION 0.0.0) enable_testing() cmake_policy(SET CMP0025 NEW) set(CMAKE_CXX_STANDARD 11) +set(HUNTER_STATUS_DEBUG ON) +set(HUNTER_TLS_VERIFY OFF) + option(ENABLE_FUZZING "Build with fuzzing instrumentation and build fuzz targets" OFF) option(ENABLE_COVERAGE "Build with source code coverage instrumentation" OFF) option(ENABLE_SANITIZERS "Build with ASAN and UBSAN" OFF) @@ -30,6 +40,13 @@ string(APPEND CMAKE_LINKER_FLAGS " -fno-omit-frame-pointer -g") add_definitions(-DAPP_STANDARD) +hunter_add_package(fmt) +find_package(fmt CONFIG REQUIRED) +hunter_add_package(jsoncpp) +find_package(jsoncpp CONFIG REQUIRED) +hunter_add_package(GTest) +find_package(GTest CONFIG REQUIRED) + if(ENABLE_FUZZING) add_definitions(-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1) SET(ENABLE_SANITIZERS ON CACHE BOOL "Sanitizer automatically enabled" FORCE) @@ -71,9 +88,6 @@ if(ENABLE_SANITIZERS) string(APPEND CMAKE_LINKER_FLAGS " -fsanitize=address,undefined -fsanitize-recover=address,undefined") endif() -include(cmake/conan/CMakeLists.txt) -add_subdirectory(cmake/gtest) - string(APPEND CMAKE_CXX_FLAGS " -fsanitize=address -fno-omit-frame-pointer") string(APPEND CMAKE_LINKER_FLAGS " -fsanitize=address -fno-omit-frame-pointer") @@ -135,24 +149,20 @@ file(GLOB_RECURSE TESTS_SRC add_executable(unittests ${TESTS_SRC}) target_include_directories(unittests PRIVATE - ${gtest_SOURCE_DIR}/include - ${gmock_SOURCE_DIR}/include - ${CONAN_INCLUDE_DIRS_FMT} - ${CONAN_INCLUDE_DIRS_JSONCPP} ${CMAKE_CURRENT_SOURCE_DIR}/deps/jsmn/src ${CMAKE_CURRENT_SOURCE_DIR}/deps/tinycbor/src ) target_link_libraries(unittests PRIVATE - gtest_main + GTest::gtest_main app_lib - CONAN_PKG::fmt - CONAN_PKG::jsoncpp) + fmt::fmt + JsonCpp::JsonCpp) add_compile_definitions(TESTVECTORS_DIR="${CMAKE_CURRENT_SOURCE_DIR}/tests/") add_compile_definitions(APP_TESTING=1) add_compile_definitions(COMPILE_TEXTUAL=1) -add_test(unittests ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittests) +add_test(NAME unittests COMMAND unittests) set_tests_properties(unittests PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests) ############################################################## diff --git a/cmake/Hunter/config.cmake b/cmake/Hunter/config.cmake new file mode 100644 index 00000000..0703ceb0 --- /dev/null +++ b/cmake/Hunter/config.cmake @@ -0,0 +1 @@ +hunter_config(GTest VERSION 1.14.0) diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake new file mode 100644 index 00000000..17c6d380 --- /dev/null +++ b/cmake/HunterGate.cmake @@ -0,0 +1,543 @@ +# Copyright (c) 2013-2019, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.5) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/cpp-pm/gate/ +# * https://github.com/cpp-pm/hunter + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) + +if(HUNTER_ENABLED) + if(CMAKE_VERSION VERSION_LESS "3.5") + message( + FATAL_ERROR + "At least CMake version 3.5 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) + endif() +endif() + +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) +set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.") + +set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors") + +function(hunter_gate_status_print) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + message(STATUS "[hunter] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_status_debug) + if(HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("${hunter_ERROR_PAGE}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + if(HUNTER_ROOT) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + if(DEFINED ENV{HUNTER_ROOT}) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + if(DEFINED ENV{HOME}) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + if(DEFINED ENV{SYSTEMDRIVE}) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + if(DEFINED ENV{USERPROFILE}) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + ERROR_PAGE "error.detect.hunter.root" + ) +endfunction() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + ERROR_PAGE "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.5)\n" + "if(POLICY CMP0114)\n" + " cmake_policy(SET CMP0114 NEW)\n" + "endif()\n" + "if(POLICY CMP0135)\n" + " cmake_policy(SET CMP0135 NEW)\n" + "endif()\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " TLS_VERIFY\n" + " ${HUNTER_TLS_VERIFY}\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) + if(no_make) + set(make_arg "") + else() + # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM + set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + + execute_process( + COMMAND + "${CMAKE_COMMAND}" + "-H${dir}" + "-B${build_dir}" + "-G${CMAKE_GENERATOR}" + "${toolchain_arg}" + ${make_arg} + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error( + "Configure project failed." + "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" + "In directory ${dir}" + ) + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + + set( + _hunter_gate_disabled_mode_dir + "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" + ) + if(EXISTS "${_hunter_gate_disabled_mode_dir}") + hunter_gate_status_debug( + "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" + ) + list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") + endif() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + ERROR_PAGE "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + ERROR_PAGE "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(TOLOWER "${_sha1_value}" _sha1_value_lower) + string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower) + string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/cmake/conan/CMakeLists.txt b/cmake/conan/CMakeLists.txt deleted file mode 100644 index e8924378..00000000 --- a/cmake/conan/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Download automatically, you can also just copy the conan.cmake file - -if (NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") - message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") - file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.16.1/conan.cmake" - "${CMAKE_BINARY_DIR}/conan.cmake") -endif () -include(${CMAKE_BINARY_DIR}/conan.cmake) - -conan_check(REQUIRED) - -conan_cmake_run(CONANFILE conanfile.txt - BASIC_SETUP - CMAKE_TARGETS - BUILD missing) diff --git a/cmake/gtest/CMakeLists.txt b/cmake/gtest/CMakeLists.txt deleted file mode 100644 index eea7d079..00000000 --- a/cmake/gtest/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -############################## -# Google Test -# Based on instructions in https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project -# Download and unpack googletest at configure time -configure_file(CMakeLists.txt.gtest.in ${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt) - -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download) -if (result) - message(FATAL_ERROR "CMake step for googletest failed: ${result}") -endif () - -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download) -if (result) - message(FATAL_ERROR "Build step for googletest failed: ${result}") -endif () - -# Prevent overriding the parent project's compiler/linker settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -add_subdirectory( - ${CMAKE_BINARY_DIR}/googletest-src - ${CMAKE_BINARY_DIR}/googletest-build -) - -if (CMAKE_VERSION VERSION_LESS 2.8.11) - include_directories("${gtest_SOURCE_DIR}/include") -endif () diff --git a/cmake/gtest/CMakeLists.txt.gtest.in b/cmake/gtest/CMakeLists.txt.gtest.in deleted file mode 100644 index b4566319..00000000 --- a/cmake/gtest/CMakeLists.txt.gtest.in +++ /dev/null @@ -1,16 +0,0 @@ -# Based on https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project -cmake_minimum_required(VERSION 3.0.0) - -project(googletest-download NONE) - -include(ExternalProject) -ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG release-1.11.0 - SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" - ) diff --git a/conanfile.txt b/conanfile.txt deleted file mode 100644 index 9639b968..00000000 --- a/conanfile.txt +++ /dev/null @@ -1,6 +0,0 @@ -[requires] -jsoncpp/1.9.5 -fmt/8.1.1 - -[generators] -cmake From 0c63112ca7a40842180d8296d3ea15260d593b38 Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 17:23:03 +0100 Subject: [PATCH 5/6] setting APP_MIN_STACK_SIZE for all devices --- app/Makefile | 2 +- app/Makefile.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Makefile b/app/Makefile index f73c5aae..aba35df4 100755 --- a/app/Makefile +++ b/app/Makefile @@ -70,7 +70,7 @@ endif ifeq ($(TARGET_NAME),TARGET_NANOS) APP_STACK_MIN_SIZE := 1600 -else ifeq ($(TARGET_NAME),TARGET_NANOX) +else APP_STACK_MIN_SIZE := 3800 endif diff --git a/app/Makefile.version b/app/Makefile.version index 782e3ff0..cbfcb90d 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=2 # This is the `spec_version` field of `Runtime` APPVERSION_N=35 # This is the patch version of this release -APPVERSION_P=21 +APPVERSION_P=22 From 1f07be703de138a78748070d57e30c5df3970365 Mon Sep 17 00:00:00 2001 From: Carlos Medeiros Date: Thu, 16 May 2024 17:23:13 +0100 Subject: [PATCH 6/6] update snapshots --- tests_zemu/snapshots/s-mainmenu/00004.png | Bin 465 -> 469 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 465 -> 469 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 395 -> 397 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 395 -> 397 bytes tests_zemu/snapshots/st-mainmenu/00001.png | Bin 13485 -> 13429 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 395 -> 397 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 395 -> 397 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index d8e6401169b230a05ce14b8a83212a1401b1163c..44954afe8f727ec12b167d398431a5a6e4ebb461 100644 GIT binary patch delta 443 zcmV;s0Yv`M1JwhNB!8SqL_t(|ob8#*a>FnPMRBM3{}1-UU8vO%UKMg;;r5=DM=v`U zBmp4;0002q$g$J08_y?~`V)Mv{(vOgWAzujn572bzTA{OcG@1_?fpRvAZCU>fVc38 z=B!G5EPHbog=<7)oG^Wiw}P0}Y;Y4U*#XTZxmN~qlX6wle}DDFK=;D-7&Acj-W&hH z@kn8+!a7c~=m<(#$Q-O2gEb4sPFESAt0NwoG@d%V*HgUk1v|nvG|Idfd9Sz$Z!5?3 zOzi-nFXTRfWq|m&GJ6AQBmY$bh)-V;^`3J)gt5X9M)Uzy{=}qrju< zse)-{0MQrQ0DtOdX?m)2A{hn6IqF0d6im^DAg?iAt#)jdjDqy7duA(m#hgYy*8LyQc&#IwtJU5s*B0aAvRWg1yfof4)DFgrj008h0`2vzc>D@U?z%Bp)002ovPDHLkV1k^Z(?9?K delta 439 zcmV;o0Z9JU1JMJJB!8GmL_t(|ob8$2a)clZg=44t{txWM?gcHA&0h(+5#d#wI~lUZs2zLuM^&z-i%&;5QOIuJ8M@4)Zy zf##@6d@Xx(7lms?WO$g~$9sYp)ogGRF4+NXN%B=0$W3agnt$t84-9lKY>zPmWY4|v z3CBH!sS4{j%_0|+vXI$X-wd8vICi?q09_q%(WLRz;jNzHg%8*fwxM3;!N^<1NqAd1 zu4ifo2z?><0W1T=?vh8`BKQL)X2AA~GJr^A1R?|CYajc-L+JS)&b=F;w*@vJKOF@g zT~8HEGXsdW*nb94KTFe7`H5r{6z8ZDQBW{M7lOQ-+3&1GG78eC?vbtF6>}Ob1v6XC z>?|k^6((5=@=o1&lBTJ=6nC1SU{{!_JV4Cq&q?xCneql+8a!TFINi)=liUGu6?2Zj zB)nYF!?XD9h26c$y8i)FnPMRBM3{}1-UU8vO%UKMg;;r5=DM=v`U zBmp4;0002q$g$J08_y?~`V)Mv{(vOgWAzujn572bzTA{OcG@1_?fpRvAZCU>fVc38 z=B!G5EPHbog=<7)oG^Wiw}P0}Y;Y4U*#XTZxmN~qlX6wle}DDFK=;D-7&Acj-W&hH z@kn8+!a7c~=m<(#$Q-O2gEb4sPFESAt0NwoG@d%V*HgUk1v|nvG|Idfd9Sz$Z!5?3 zOzi-nFXTRfWq|m&GJ6AQBmY$bh)-V;^`3J)gt5X9M)Uzy{=}qrju< zse)-{0MQrQ0DtOdX?m)2A{hn6IqF0d6im^DAg?iAt#)jdjDqy7duA(m#hgYy*8LyQc&#IwtJU5s*B0aAvRWg1yfof4)DFgrj008h0`2vzc>D@U?z%Bp)002ovPDHLkV1k^Z(?9?K delta 439 zcmV;o0Z9JU1JMJJB!8GmL_t(|ob8$2a)clZg=44t{txWM?gcHA&0h(+5#d#wI~lUZs2zLuM^&z-i%&;5QOIuJ8M@4)Zy zf##@6d@Xx(7lms?WO$g~$9sYp)ogGRF4+NXN%B=0$W3agnt$t84-9lKY>zPmWY4|v z3CBH!sS4{j%_0|+vXI$X-wd8vICi?q09_q%(WLRz;jNzHg%8*fwxM3;!N^<1NqAd1 zu4ifo2z?><0W1T=?vh8`BKQL)X2AA~GJr^A1R?|CYajc-L+JS)&b=F;w*@vJKOF@g zT~8HEGXsdW*nb94KTFe7`H5r{6z8ZDQBW{M7lOQ-+3&1GG78eC?vbtF6>}Ob1v6XC z>?|k^6((5=@=o1&lBTJ=6nC1SU{{!_JV4Cq&q?xCneql+8a!TFINi)=liUGu6?2Zj zB)nYF!?XD9h26c$y8i)53(1wJ=vi>w?KSzDF65MZ(kg- zt+Ac7Y{4e3-l$a{EaIl=vCidxs`LNGB2 zs|s%w%Ej8&iiei(e!X*6<$Lpw=Nlw{zYVB;7*$tWvTl_zB4`*MeE!2^bB2RWjq5)< ONZ8ZW&t;ucLK6UTxvp&h delta 368 zcmeBW?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWx=YH diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index d32e423268167a2c3af977464a6a7d3735cc8452..2ff8585b5d94e21c7054712e892f2d80165f6b94 100644 GIT binary patch delta 370 zcmeBX?q!~!QXk^!;uumf=k3kFz7_?ZhQzYX<`4h5zl#0VsFN72d8{yF?w|XU0~0(B zzPb{`fB*;7g#-mR9@ppls$hRnc!%#=(<-iTmDq+t{p}~ZJl1ZV`<{K3qvW)O<`U<7 zWcjP#ewY1vxKD11q1)5{t4#Ku&0)E^dhNmLwA%W>53(1wJ=vi>w?KSzDF65MZ(kg- zt+Ac7Y{4e3-l$a{EaIl=vCidxs`LNGB2 zs|s%w%Ej8&iiei(e!X*6<$Lpw=Nlw{zYVB;7*$tWvTl_zB4`*MeE!2^bB2RWjq5)< ONZ8ZW&t;ucLK6UTxvp&h delta 368 zcmeBW?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWx=YH diff --git a/tests_zemu/snapshots/st-mainmenu/00001.png b/tests_zemu/snapshots/st-mainmenu/00001.png index b5a83442715abff715888c672853cdb046212eff..db957736590993d6a694065f8a5c493bd186f34f 100644 GIT binary patch delta 11651 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�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 delta 11769 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 diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index d32e423268167a2c3af977464a6a7d3735cc8452..2ff8585b5d94e21c7054712e892f2d80165f6b94 100644 GIT binary patch delta 370 zcmeBX?q!~!QXk^!;uumf=k3kFz7_?ZhQzYX<`4h5zl#0VsFN72d8{yF?w|XU0~0(B zzPb{`fB*;7g#-mR9@ppls$hRnc!%#=(<-iTmDq+t{p}~ZJl1ZV`<{K3qvW)O<`U<7 zWcjP#ewY1vxKD11q1)5{t4#Ku&0)E^dhNmLwA%W>53(1wJ=vi>w?KSzDF65MZ(kg- zt+Ac7Y{4e3-l$a{EaIl=vCidxs`LNGB2 zs|s%w%Ej8&iiei(e!X*6<$Lpw=Nlw{zYVB;7*$tWvTl_zB4`*MeE!2^bB2RWjq5)< ONZ8ZW&t;ucLK6UTxvp&h delta 368 zcmeBW?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWx=YH diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index d32e423268167a2c3af977464a6a7d3735cc8452..2ff8585b5d94e21c7054712e892f2d80165f6b94 100644 GIT binary patch delta 370 zcmeBX?q!~!QXk^!;uumf=k3kFz7_?ZhQzYX<`4h5zl#0VsFN72d8{yF?w|XU0~0(B zzPb{`fB*;7g#-mR9@ppls$hRnc!%#=(<-iTmDq+t{p}~ZJl1ZV`<{K3qvW)O<`U<7 zWcjP#ewY1vxKD11q1)5{t4#Ku&0)E^dhNmLwA%W>53(1wJ=vi>w?KSzDF65MZ(kg- zt+Ac7Y{4e3-l$a{EaIl=vCidxs`LNGB2 zs|s%w%Ej8&iiei(e!X*6<$Lpw=Nlw{zYVB;7*$tWvTl_zB4`*MeE!2^bB2RWjq5)< ONZ8ZW&t;ucLK6UTxvp&h delta 368 zcmeBW?q;5#QXk~$;uumf=k3jCp+gEh4uK_iIDf|neS5^N+|1%6@3rFI=c}2FGe4}# z_bLaCHbrrb_fte? zZ+*7A`tJrs_N6_674lP6roY@8aMdgM!`wLeCwuCdE=|!%Un=-+!LqF4f3LdS?%X|| zd{I}U$0?Y1YPAf1bRPFDxl{N4EzXz9-L>EPDzm|Ub4#nMt$R$er}|e5mfI(6b*xzb zL$22Hu7dF2OsR!xza|^9&AZWRQ^;3+>EYg;Uy?o2i+bFx^i#HPe(?I`t{%}$b=^0I zUh9XBA^?DkqrKje6-q3Z=xkr~fdGFaHalB{OJU=<<^Ur)o+xe#o z>c8e}3Jl=0b!G!@q;Vj!RhCe)cb44ifcr L^>bP0l+XkKWx=YH