blob: 73d8f0a6dbeda06c4e03d19b176af920a99ec9d1 [file] [log] [blame]
Anton Komlevaee4b612023-05-14 17:38:36 +01001#-------------------------------------------------------------------------------
Raef Coles09dcd162024-12-09 15:40:53 +00002# SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
Anton Komlevaee4b612023-05-14 17:38:36 +01003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
David Hu1249f0d2023-12-04 22:57:56 +08007cmake_minimum_required(VERSION 3.21)
Anton Komlevaee4b612023-05-14 17:38:36 +01008
9# This CMake script is prepard by TF-M for building the non-secure side
10# application and not used in secure build a tree being for export only.
11# This file is renamed to spe/CMakeList.txt during installation phase
12
13include(spe_config)
14include(spe_export)
15
Antonio de Angelis8bb98512024-01-16 14:13:36 +000016set_target_properties(tfm_config psa_interface psa_crypto_config PROPERTIES IMPORTED_GLOBAL True)
Anton Komlevaee4b612023-05-14 17:38:36 +010017target_link_libraries(tfm_config INTERFACE psa_interface)
18
David Hub27a6632023-10-23 22:38:39 +080019# In actual NS integration, NS side build should include the source files
20# exported by TF-M build.
21set(INTERFACE_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}/interface/src)
22set(INTERFACE_INC_DIR ${CMAKE_CURRENT_LIST_DIR}/interface/include)
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010023set(PLATFORM_DIR ${CMAKE_CURRENT_LIST_DIR}/platform)
Gergely Kovacs4d50f252024-10-07 10:23:36 +000024if (DEFINED NS_TARGET_NAME)
25 message(STATUS "Using NS_TARGET_NAME: ${NS_TARGET_NAME}")
26else()
27 set(NS_TARGET_NAME "tfm_ns")
28endif()
Anton Komlevaee4b612023-05-14 17:38:36 +010029
David Hub27a6632023-10-23 22:38:39 +080030add_library(tfm_api_ns STATIC)
Anton Komlevaee4b612023-05-14 17:38:36 +010031
32target_sources(tfm_api_ns
David Hu0a07b632023-10-16 15:25:20 +080033 PUBLIC
David Hub27a6632023-10-23 22:38:39 +080034 $<$<BOOL:${TFM_PARTITION_PLATFORM}>:${INTERFACE_SRC_DIR}/tfm_platform_api.c>
35 $<$<BOOL:${TFM_PARTITION_PROTECTED_STORAGE}>:${INTERFACE_SRC_DIR}/tfm_ps_api.c>
36 $<$<BOOL:${TFM_PARTITION_INTERNAL_TRUSTED_STORAGE}>:${INTERFACE_SRC_DIR}/tfm_its_api.c>
37 $<$<BOOL:${TFM_PARTITION_CRYPTO}>:${INTERFACE_SRC_DIR}/tfm_crypto_api.c>
38 $<$<BOOL:${TFM_PARTITION_INITIAL_ATTESTATION}>:${INTERFACE_SRC_DIR}/tfm_attest_api.c>
39 $<$<BOOL:${TFM_PARTITION_FIRMWARE_UPDATE}>:${INTERFACE_SRC_DIR}/tfm_fwu_api.c>
Anton Komlevaee4b612023-05-14 17:38:36 +010040)
41
David Hub27a6632023-10-23 22:38:39 +080042# Include interface headers exported by TF-M
Anton Komlevaee4b612023-05-14 17:38:36 +010043target_include_directories(tfm_api_ns
44 PUBLIC
David Hub27a6632023-10-23 22:38:39 +080045 ${INTERFACE_INC_DIR}
46 ${INTERFACE_INC_DIR}/crypto_keys
Anton Komlevaee4b612023-05-14 17:38:36 +010047)
48
Jamie Foxc0489cc2023-11-28 17:55:36 +000049if (CONFIG_TFM_USE_TRUSTZONE)
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010050 add_library(tfm_api_ns_tz STATIC)
Jamie Foxc0489cc2023-11-28 17:55:36 +000051
52 target_sources(tfm_api_ns_tz
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010053 PUBLIC
Jamie Foxc0489cc2023-11-28 17:55:36 +000054 ${INTERFACE_SRC_DIR}/tfm_tz_psa_ns_api.c
55 )
56
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010057 target_include_directories(tfm_api_ns_tz
58 PUBLIC
59 ${INTERFACE_INC_DIR}
60 )
61
Jamie Foxc0489cc2023-11-28 17:55:36 +000062 target_link_libraries(tfm_api_ns_tz
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010063 PRIVATE
Jamie Foxc0489cc2023-11-28 17:55:36 +000064 ${CMAKE_CURRENT_SOURCE_DIR}/interface/lib/s_veneers.o
65 )
66endif()
67
Nicola Mazzucato6414e292025-05-09 22:05:05 +010068if (TFM_HYBRID_PLATFORM_API_BROKER)
69 add_library(tfm_api_broker STATIC)
70 target_sources(tfm_api_broker
71 PUBLIC
72 ${INTERFACE_SRC_DIR}/hybrid_platform/api_broker.c
73 )
74
75 target_compile_definitions(tfm_api_broker
76 PUBLIC
77 TFM_HYBRID_PLATFORM_API_BROKER
78 )
79
80 target_include_directories(tfm_api_broker
81 PUBLIC
82 ${INTERFACE_INC_DIR}
83 )
84
85 target_link_libraries(tfm_api_ns_tz PUBLIC tfm_api_broker)
86
87endif()
88
Jamie Foxc0489cc2023-11-28 17:55:36 +000089if (TFM_PARTITION_NS_AGENT_MAILBOX)
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010090 add_library(tfm_api_ns_mailbox STATIC)
Jamie Foxc0489cc2023-11-28 17:55:36 +000091
92 target_sources(tfm_api_ns_mailbox
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +010093 PUBLIC
Jamie Foxc0489cc2023-11-28 17:55:36 +000094 ${INTERFACE_SRC_DIR}/multi_core/tfm_multi_core_ns_api.c
95 ${INTERFACE_SRC_DIR}/multi_core/tfm_multi_core_psa_ns_api.c
Nicola Mazzucato6414e292025-05-09 22:05:05 +010096 ${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox.c
97 ${INTERFACE_SRC_DIR}/multi_core/platform_ns_mailbox.c
Jamie Foxc0489cc2023-11-28 17:55:36 +000098 )
99
100 target_include_directories(tfm_api_ns_mailbox
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +0100101 PUBLIC
102 ${INTERFACE_INC_DIR}
Jamie Foxc0489cc2023-11-28 17:55:36 +0000103 ${INTERFACE_INC_DIR}/multi_core
Nicola Mazzucato1d39bd02025-06-06 20:41:10 +0100104 ${PLATFORM_DIR}/ext/cmsis/Include
Jamie Foxc0489cc2023-11-28 17:55:36 +0000105 )
Nicola Mazzucato6414e292025-05-09 22:05:05 +0100106
107 target_compile_definitions(tfm_api_ns_mailbox
108 PUBLIC
109 $<$<BOOL:${TFM_HYBRID_PLATFORM_API_BROKER}>:TFM_HYBRID_PLATFORM_API_BROKER>
110 )
Jamie Foxc0489cc2023-11-28 17:55:36 +0000111endif()
112
Antonio de Angelis8bb98512024-01-16 14:13:36 +0000113if (TFM_PARTITION_CRYPTO)
114 target_link_libraries(tfm_api_ns
115 PUBLIC
116 psa_crypto_config
117 )
118endif()
119
David Hu35aa1a52023-10-24 23:04:04 +0800120add_library(platform_region_defs INTERFACE)
121
122target_compile_definitions(platform_region_defs
123 INTERFACE
124 $<$<BOOL:${BL1}>:BL1>
125 $<$<BOOL:${BL2}>:BL2>
126 BL2_HEADER_SIZE=${BL2_HEADER_SIZE}
127 BL2_TRAILER_SIZE=${BL2_TRAILER_SIZE}
David Hu35aa1a52023-10-24 23:04:04 +0800128 $<$<BOOL:${MCUBOOT_IMAGE_NUMBER}>:MCUBOOT_IMAGE_NUMBER=${MCUBOOT_IMAGE_NUMBER}>
Dávid Házi78157732024-07-11 22:18:42 +0200129 $<$<STREQUAL:${MCUBOOT_EXECUTION_SLOT},2>:LINK_TO_SECONDARY_PARTITION>
David Hu35aa1a52023-10-24 23:04:04 +0800130 $<$<BOOL:${TEST_PSA_API}>:PSA_API_TEST_${TEST_PSA_API}>
131 $<$<OR:$<CONFIG:Debug>,$<CONFIG:relwithdebinfo>>:ENABLE_HEAP>
132)
133
134target_link_libraries(platform_region_defs
135 INTERFACE
136 tfm_config
137)
138
Anton Komlevaee4b612023-05-14 17:38:36 +0100139add_subdirectory(platform)
140
David Hub27a6632023-10-23 22:38:39 +0800141target_sources(platform_ns
142 PRIVATE
143 $<$<BOOL:${PLATFORM_DEFAULT_UART_STDOUT}>:${CMAKE_CURRENT_SOURCE_DIR}/platform/ext/common/uart_stdout.c>
144)
145
Gergely Kovacs5206a412024-10-14 09:49:57 +0000146add_library(platform_ns_definitions INTERFACE)
147
148# these compile definitions must match on the secure and nonsecure side for security
149target_compile_definitions(platform_ns_definitions
150 INTERFACE
Kevin Peng7dc0ebf2023-11-14 14:31:31 +0800151 DOMAIN_NS=1
Anton Komlev8dc9eb22023-09-15 15:53:03 +0100152 $<$<BOOL:${PLATFORM_DEFAULT_CRYPTO_KEYS}>:PLATFORM_DEFAULT_CRYPTO_KEYS>
153 $<$<STREQUAL:${CONFIG_TFM_FLOAT_ABI},hard>:CONFIG_TFM_FLOAT_ABI=2>
154 $<$<STREQUAL:${CONFIG_TFM_FLOAT_ABI},soft>:CONFIG_TFM_FLOAT_ABI=0>
Roman Mazurak0a79e672024-08-14 16:48:13 +0300155 $<$<BOOL:${CONFIG_TFM_DISABLE_CP10CP11}>:CONFIG_TFM_DISABLE_CP10CP11>
Anton Komlev8dc9eb22023-09-15 15:53:03 +0100156 $<$<BOOL:${CONFIG_TFM_ENABLE_CP10CP11}>:CONFIG_TFM_ENABLE_CP10CP11>
157)
158
Gergely Kovacs5206a412024-10-14 09:49:57 +0000159target_link_libraries(platform_ns
160 PUBLIC
161 platform_ns_definitions
162)
163
164if (DEFINED PLATFORM_CUSTOM_NS_FILES)
165 message(STATUS "Using PLATFORM_CUSTOM_NS_FILES: ${PLATFORM_CUSTOM_NS_FILES}")
166else()
167 set(PLATFORM_CUSTOM_NS_FILES FALSE)
168endif()
169
Anton Komlevaee4b612023-05-14 17:38:36 +0100170target_link_libraries(tfm_api_ns
171 PUBLIC
David Hu35aa1a52023-10-24 23:04:04 +0800172 platform_region_defs
Gergely Kovacs5206a412024-10-14 09:49:57 +0000173 platform_ns_definitions
174 $<$<NOT:$<BOOL:${PLATFORM_CUSTOM_NS_FILES}>>:platform_ns>
Anton Komlevaee4b612023-05-14 17:38:36 +0100175)
176
Dávid Házi34cf9b92023-10-11 11:10:41 +0200177if(BL2 AND PLATFORM_DEFAULT_IMAGE_SIGNING)
Anton Komlevaee4b612023-05-14 17:38:36 +0100178
David Hua5fefdc2023-11-03 13:24:41 +0800179 find_package(Python3)
180
David Hua01be0a2023-10-25 23:08:10 +0800181 add_custom_target(tfm_s_ns_signed_bin
182 ALL
Dávid Házi1a72fd42024-03-06 18:33:45 +0100183 SOURCES ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
David Hua01be0a2023-10-25 23:08:10 +0800184 )
185
Gergely Kovacsaae6d782024-10-11 07:21:30 +0000186 if (DEFINED S_NS_SIGNED_TARGET_NAME)
187 message(STATUS "Using S_NS_SIGNED_TARGET_NAME: ${S_NS_SIGNED_TARGET_NAME}")
188 else()
189 set(S_NS_SIGNED_TARGET_NAME tfm_s_ns_signed)
190 endif()
191
192 add_custom_command(
193 TARGET tfm_s_ns_signed_bin
194 POST_BUILD
195 COMMAND ${CMAKE_COMMAND} -E copy
196 ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
Gergely Kovacs4d50f252024-10-07 10:23:36 +0000197 $<TARGET_FILE_DIR:${NS_TARGET_NAME}>/${S_NS_SIGNED_TARGET_NAME}.bin
Gergely Kovacsaae6d782024-10-11 07:21:30 +0000198 )
199
Dávid Házi34cf9b92023-10-11 11:10:41 +0200200 if (MCUBOOT_IMAGE_NUMBER GREATER 1)
Anton Komlevaee4b612023-05-14 17:38:36 +0100201
Maulik Pateld1afad02025-04-14 13:04:35 +0100202 set(wrapper_args
203 --version ${MCUBOOT_IMAGE_VERSION_NS}
204 --layout ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_ns.o
205 --key ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/keys/image_ns_signing_private_key.pem
206 --public-key-format $<IF:$<BOOL:${MCUBOOT_HW_KEY}>,full,hash>
207 --align ${MCUBOOT_ALIGN_VAL}
208 --pad
209 --pad-header
210 -H ${BL2_HEADER_SIZE}
211 -s ${MCUBOOT_SECURITY_COUNTER_NS}
212 -L ${MCUBOOT_ENC_KEY_LEN}
213 -d \"\(0, ${MCUBOOT_S_IMAGE_MIN_VER}\)\"
214 $<$<STREQUAL:${MCUBOOT_UPGRADE_STRATEGY},OVERWRITE_ONLY>:--overwrite-only>
215 $<$<BOOL:${MCUBOOT_CONFIRM_IMAGE}>:--confirm>
216 $<$<BOOL:${MCUBOOT_ENC_IMAGES}>:-E${CMAKE_CURRENT_SOURCE_DIR}/image_signing/keys/image_enc_key.pem>
217 $<$<BOOL:${MCUBOOT_MEASURED_BOOT}>:--measured-boot-record>
218 $<TARGET_FILE_DIR:${NS_TARGET_NAME}>/${NS_TARGET_NAME}.bin
219 ${CMAKE_BINARY_DIR}/bin/${NS_TARGET_NAME}_signed.bin
220 )
221
222 if(MCUBOOT_BUILTIN_KEY)
Maulik Pateld1afad02025-04-14 13:04:35 +0100223 set(wrapper_args ${wrapper_args} --psa-key-ids ${TFM_NS_KEY_ID})
224 endif()
225
Gergely Kovacs4d50f252024-10-07 10:23:36 +0000226 add_custom_target(${NS_TARGET_NAME}_signed_bin
227 SOURCES ${CMAKE_BINARY_DIR}/bin/${NS_TARGET_NAME}_signed.bin
David Hua01be0a2023-10-25 23:08:10 +0800228 )
Gergely Kovacs4d50f252024-10-07 10:23:36 +0000229 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/${NS_TARGET_NAME}_signed.bin
Anton Komlevc88e2ac2024-09-12 16:46:39 +0100230 DEPENDS ${NS_TARGET_NAME}_bin
David Hua01be0a2023-10-25 23:08:10 +0800231 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_ns.o
David Hub5f10a52023-10-26 22:24:10 +0800232 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts
Anton Komlevaee4b612023-05-14 17:38:36 +0100233
Dávid Házi34cf9b92023-10-11 11:10:41 +0200234 #Sign non-secure binary image with provided secret key
Maulik Pateld1afad02025-04-14 13:04:35 +0100235 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts/wrapper/wrapper.py ${wrapper_args}
David Hua01be0a2023-10-25 23:08:10 +0800236 )
Anton Komlevaee4b612023-05-14 17:38:36 +0100237
David Hua01be0a2023-10-25 23:08:10 +0800238 # Create concatenated binary image from the two independently signed
239 # binary file. This only uses the local assemble.py script (not from
240 # upstream mcuboot) because that script is geared towards zephyr
241 # support
Dávid Házi1a72fd42024-03-06 18:33:45 +0100242 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
David Hua01be0a2023-10-25 23:08:10 +0800243 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/tfm_s_signed.bin
Anton Komlevc88e2ac2024-09-12 16:46:39 +0100244 DEPENDS ${CMAKE_BINARY_DIR}/bin/${NS_TARGET_NAME}_signed.bin
David Hua01be0a2023-10-25 23:08:10 +0800245 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s.o
David Hub5f10a52023-10-26 22:24:10 +0800246 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts
David Hua01be0a2023-10-25 23:08:10 +0800247
Dávid Házi34cf9b92023-10-11 11:10:41 +0200248 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts/assemble.py
249 --layout ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s.o
250 --secure ${CMAKE_CURRENT_SOURCE_DIR}/bin/tfm_s_signed.bin
Gergely Kovacs4d50f252024-10-07 10:23:36 +0000251 --non_secure ${CMAKE_BINARY_DIR}/bin/${NS_TARGET_NAME}_signed.bin
Dávid Házi1a72fd42024-03-06 18:33:45 +0100252 --output ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
Dávid Házi34cf9b92023-10-11 11:10:41 +0200253 )
254 else()
David Hua01be0a2023-10-25 23:08:10 +0800255 add_custom_target(tfm_s_ns_bin
Dávid Házi1a72fd42024-03-06 18:33:45 +0100256 SOURCES ${CMAKE_BINARY_DIR}/bin/tfm_s_ns.bin
David Hua01be0a2023-10-25 23:08:10 +0800257 )
Dávid Házi1a72fd42024-03-06 18:33:45 +0100258 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/tfm_s_ns.bin
David Hua01be0a2023-10-25 23:08:10 +0800259 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/tfm_s.bin
Anton Komlev8ab4f042025-06-03 21:13:07 +0100260 DEPENDS ${NS_TARGET_NAME}_bin
David Hub5f10a52023-10-26 22:24:10 +0800261 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s_ns.o
262 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts
Anton Komlevaee4b612023-05-14 17:38:36 +0100263
Dávid Házi34cf9b92023-10-11 11:10:41 +0200264 # concatenate S + NS binaries into tfm_s_ns.bin
265 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts/assemble.py
David Hub5f10a52023-10-26 22:24:10 +0800266 --layout ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s_ns.o
Dávid Házi34cf9b92023-10-11 11:10:41 +0200267 --secure ${CMAKE_CURRENT_SOURCE_DIR}/bin/tfm_s.bin
Gergely Kovacs4d50f252024-10-07 10:23:36 +0000268 --non_secure $<TARGET_FILE_DIR:${NS_TARGET_NAME}>/${NS_TARGET_NAME}.bin
Dávid Házi1a72fd42024-03-06 18:33:45 +0100269 --output ${CMAKE_BINARY_DIR}/bin/tfm_s_ns.bin
David Hua01be0a2023-10-25 23:08:10 +0800270 )
271
Maulik Patel439be352025-04-15 14:34:28 +0100272 set(wrapper_args
273 --version ${MCUBOOT_IMAGE_VERSION_S}
274 --layout ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s_ns.o
275 --key ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/keys/image_s_signing_private_key.pem
276 --public-key-format $<IF:$<BOOL:${MCUBOOT_HW_KEY}>,full,hash>
277 --align ${MCUBOOT_ALIGN_VAL}
278 --pad
279 --pad-header
280 -H ${BL2_HEADER_SIZE}
281 -s ${MCUBOOT_SECURITY_COUNTER_S}
282 -L ${MCUBOOT_ENC_KEY_LEN}
283 $<$<STREQUAL:${MCUBOOT_UPGRADE_STRATEGY},OVERWRITE_ONLY>:--overwrite-only>
284 $<$<BOOL:${MCUBOOT_CONFIRM_IMAGE}>:--confirm>
285 $<$<BOOL:${MCUBOOT_ENC_IMAGES}>:-E${CMAKE_CURRENT_SOURCE_DIR}/image_signing/keys/image_enc_key.pem>
286 $<$<BOOL:${MCUBOOT_MEASURED_BOOT}>:--measured-boot-record>
287 ${CMAKE_BINARY_DIR}/bin/tfm_s_ns.bin
288 ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
289 )
290
291 if(MCUBOOT_BUILTIN_KEY)
292 set(wrapper_args ${wrapper_args} --psa-key-ids ${TFM_S_KEY_ID})
293 endif()
294
Dávid Házi1a72fd42024-03-06 18:33:45 +0100295 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/tfm_s_ns_signed.bin
296 DEPENDS tfm_s_ns_bin ${CMAKE_BINARY_DIR}/bin/tfm_s_ns.bin
David Hub5f10a52023-10-26 22:24:10 +0800297 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/layout_files/signing_layout_s_ns.o
David Hub5f10a52023-10-26 22:24:10 +0800298 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts
Anton Komlevaee4b612023-05-14 17:38:36 +0100299
Dávid Házi34cf9b92023-10-11 11:10:41 +0200300 # sign the combined tfm_s_ns.bin file
301 COMMAND ${Python3_EXECUTABLE}
302 ${CMAKE_CURRENT_SOURCE_DIR}/image_signing/scripts/wrapper/wrapper.py
Maulik Patel439be352025-04-15 14:34:28 +0100303 ${wrapper_args}
Dávid Házi34cf9b92023-10-11 11:10:41 +0200304 )
305 endif()
Anton Komlevaee4b612023-05-14 17:38:36 +0100306endif()