From 36c4abe1f95d7d4e5f7ac0a49c95868515d359d2 Mon Sep 17 00:00:00 2001 From: sun_shine Date: Tue, 15 Jan 2019 13:39:25 +0800 Subject: [PATCH] [bsp][stm32] add bsp stm32l432-st-nucleo --- bsp/stm32/stm32l432-st-nucleo/.config | 350 ++ bsp/stm32/stm32l432-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l432-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l432-st-nucleo/README.md | 116 + bsp/stm32/stm32l432-st-nucleo/SConscript | 14 + bsp/stm32/stm32l432-st-nucleo/SConstruct | 58 + .../applications/SConscript | 9 + .../stm32l432-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 13 + .../board/CubeMX_Config/CubeMX_Config.ioc | 169 + .../board/CubeMX_Config/Inc/main.h | 88 + .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 435 +++ .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 66 + .../board/CubeMX_Config/Src/main.c | 292 ++ .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 153 + .../board/CubeMX_Config/Src/stm32l4xx_it.c | 197 ++ .../CubeMX_Config/Src/system_stm32l4xx.c | 353 ++ bsp/stm32/stm32l432-st-nucleo/board/Kconfig | 45 + .../stm32l432-st-nucleo/board/SConscript | 39 + bsp/stm32/stm32l432-st-nucleo/board/board.c | 87 + bsp/stm32/stm32l432-st-nucleo/board/board.h | 40 + .../board/linker_scripts/link.icf | 33 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../stm32l432-st-nucleo/figures/board.jpg | Bin 0 -> 118884 bytes bsp/stm32/stm32l432-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32l432-st-nucleo/project.ewp | 2275 +++++++++++++ bsp/stm32/stm32l432-st-nucleo/project.eww | 10 + bsp/stm32/stm32l432-st-nucleo/project.uvoptx | 1002 ++++++ bsp/stm32/stm32l432-st-nucleo/project.uvprojx | 738 +++++ bsp/stm32/stm32l432-st-nucleo/rtconfig.h | 179 ++ bsp/stm32/stm32l432-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32l432-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l432-st-nucleo/template.eww | 10 + bsp/stm32/stm32l432-st-nucleo/template.uvoptx | 186 ++ .../stm32l432-st-nucleo/template.uvprojx | 386 +++ 36 files changed, 12597 insertions(+) create mode 100644 bsp/stm32/stm32l432-st-nucleo/.config create mode 100644 bsp/stm32/stm32l432-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l432-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l432-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l432-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l432-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l432-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l432-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l432-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32l432-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l432-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l432-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l432-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l432-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l432-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l432-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l432-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l432-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l432-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l432-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32l432-st-nucleo/.config b/bsp/stm32/stm32l432-st-nucleo/.config new file mode 100644 index 0000000000..8af7c5464c --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/.config @@ -0,0 +1,350 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40000 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_MPU6XXX is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set + +# +# sample package +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# example package: hello +# +# CONFIG_PKG_USING_HELLO is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L432KC=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_STLINK_TO_USART=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l432-st-nucleo/.gitignore b/bsp/stm32/stm32l432-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32l432-st-nucleo/Kconfig b/bsp/stm32/stm32l432-st-nucleo/Kconfig new file mode 100644 index 0000000000..d174bcc585 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config $BSP_DIR + string + option env="BSP_ROOT" + default "." + +config $RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config $PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32l432-st-nucleo/README.md b/bsp/stm32/stm32l432-st-nucleo/README.md new file mode 100644 index 0000000000..dc1755da3b --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/README.md @@ -0,0 +1,116 @@ +# NUCLEO32-L432 开发板的 BSP 说明 + +## 简介 + +本文档为ST官方 NUCLEO32-L432 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +对于 NUCLEO32-L432,内核是 Cortex-M4,绿色的 Nucleo 标志显示了这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,迷你尺寸,mirco USB 接口,可数的外设,Arduino™ nano 兼容的接口。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L432KC,主频 80MHz,256KB FLASH ,64KB RAM。 +- 常用外设 + - LED:3个,USB communication(LD1 双色),power LED(LD2 红色),user LED(LD3 黄色) + - 按键:1个,复位按键(B1)。 +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口。 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +开发板更多详细信息请参考【STMicroelectronics】 [NUCLEO-L432KC](https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-l432kc.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | UART2 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | UART2 | +| SPI | 暂不支持 | SPI1 即将支持 | +| I2C | 暂不支持 | 软件 I2C 即将支持 | +| RTC | 暂不支持 | 即将支持 | +| PWM | 暂不支持 | 即将支持 | +| USB Device | 暂不支持 | 即将支持 | +| IWG | 暂不支持 | 即将支持 | +| **扩展模块** | **支持情况** | **备注** | + + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 microUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD1 和 LD2 常亮、黄色色 LD3 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.0 build Jan 9 2019 + 2006 - 2018 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口2 的功能,如果需使用更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 开机时如果不能打印 RT-Thread 版本信息,请将BSP中串口 GPIO 速率调低 +- 开机时如果不能打印 RT-Thread 版本信息,请重新选择 PC 端串口调试软件的串口号 + +## 联系人信息 + +维护人: + +- [sun_shine](https://github.com/sunshine0824), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32l432-st-nucleo/SConscript b/bsp/stm32/stm32l432-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32l432-st-nucleo/SConstruct b/bsp/stm32/stm32l432-st-nucleo/SConstruct new file mode 100644 index 0000000000..f28e552248 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map rt-thread.map']) + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32L4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32l432-st-nucleo/applications/SConscript b/bsp/stm32/stm32l432-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..4939638d41 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/applications/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [str(Dir('#')), cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l432-st-nucleo/applications/main.c b/bsp/stm32/stm32l432-st-nucleo/applications/main.c new file mode 100644 index 0000000000..50f76b2e87 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-01-11 sun_shine first edition + */ + +#include +#include +#include +#include "drv_gpio.h" +/* defined the LED0 pin: PB3 */ +#define LED0_PIN GET_PIN(B, 3) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..8f1d011016 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,13 @@ +[PreviousGenFiles] +HeaderPath=D:/rtt/rt-thread/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=D:/rtt/rt-thread/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l432xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..2d6b3677c5 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,169 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=true +Mcu.Family=STM32L4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32L432K(B-C)Ux +Mcu.Package=UFQFPN32 +Mcu.Pin0=PC14-OSC32_IN (PC14) +Mcu.Pin1=PC15-OSC32_OUT (PC15) +Mcu.Pin2=PA0 +Mcu.Pin3=PA2 +Mcu.Pin4=PA13 (JTMS-SWDIO) +Mcu.Pin5=PA14 (JTCK-SWCLK) +Mcu.Pin6=PA15 (JTDI) +Mcu.Pin7=PB3 (JTDO-TRACESWO) +Mcu.Pin8=VP_SYS_VS_Systick +Mcu.PinsNb=9 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L432KCUx +MxCube.Version=4.27.0 +MxDb.Version=DB.4.0.270 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false +PA0.GPIOParameters=GPIO_Label +PA0.GPIO_Label=MCO [High speed clock in] +PA0.Locked=true +PA0.Mode=HSE-External-Clock-Source-for-LittleOrca +PA0.Signal=RCC_CK_IN +PA13\ (JTMS-SWDIO).GPIOParameters=GPIO_Label +PA13\ (JTMS-SWDIO).GPIO_Label=SWDIO +PA13\ (JTMS-SWDIO).Locked=true +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK-SWCLK).GPIOParameters=GPIO_Label +PA14\ (JTCK-SWCLK).GPIO_Label=SWCLK +PA14\ (JTCK-SWCLK).Locked=true +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +PA15\ (JTDI).GPIOParameters=GPIO_Speed,GPIO_Label +PA15\ (JTDI).GPIO_Label=VCP_RX +PA15\ (JTDI).GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PA15\ (JTDI).Locked=true +PA15\ (JTDI).Mode=Asynchronous +PA15\ (JTDI).Signal=USART2_RX +PA2.GPIOParameters=GPIO_Speed,GPIO_Label +PA2.GPIO_Label=VCP_TX +PA2.GPIO_Speed=GPIO_SPEED_FREQ_MEDIUM +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label +PB3\ (JTDO-TRACESWO).GPIO_Label=LD3 [Green] +PB3\ (JTDO-TRACESWO).Locked=true +PB3\ (JTDO-TRACESWO).Signal=GPIO_Output +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PCC.Checker=true +PCC.Line=STM32L4x2 +PCC.MCU=STM32L432K(B-C)Ux +PCC.PartNumber=STM32L432KCUx +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=null +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L432KCUx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.13.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.48CLKFreq_Value=24000000 +RCC.AHBFreq_Value=32000000 +RCC.APB1Freq_Value=32000000 +RCC.APB1TimFreq_Value=32000000 +RCC.APB2Freq_Value=32000000 +RCC.APB2TimFreq_Value=32000000 +RCC.CortexFreq_Value=32000000 +RCC.FCLKCortexFreq_Value=32000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=32000000 +RCC.HSE_VALUE=8000000 +RCC.HSI16_VALUE=16000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=32000000 +RCC.I2C2Freq_Value=16000000 +RCC.I2C3Freq_Value=32000000 +RCC.IPParameters=48CLKFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI16_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LCDFreq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIMFreq_Value,LPUART1Freq_Value,LPUARTFreq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MCOPinFreq_Value,MSI_VALUE,PLLCLKFreq_Value,PLLMUL,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PWRFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SAI1Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TIMFreq_Value,TimerFreq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,WatchDogFreq_Value +RCC.LCDFreq_Value=37000 +RCC.LPTIM1Freq_Value=32000000 +RCC.LPTIM2Freq_Value=32000000 +RCC.LPTIMFreq_Value=32000000 +RCC.LPUART1Freq_Value=32000000 +RCC.LPUARTFreq_Value=32000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=32000000 +RCC.MCOPinFreq_Value=32000000 +RCC.MSI_VALUE=4000000 +RCC.PLLCLKFreq_Value=32000000 +RCC.PLLMUL=RCC_PLLMUL_4 +RCC.PLLN=16 +RCC.PLLPoutputFreq_Value=9142857.142857144 +RCC.PLLQoutputFreq_Value=32000000 +RCC.PLLRCLKFreq_Value=32000000 +RCC.PLLSAI1PoutputFreq_Value=4571428.571428572 +RCC.PLLSAI1QoutputFreq_Value=16000000 +RCC.PLLSAI1RoutputFreq_Value=16000000 +RCC.PWRFreq_Value=32000000 +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SAI1Freq_Value=4571428.571428572 +RCC.SWPMI1Freq_Value=32000000 +RCC.SYSCLKFreq_VALUE=32000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TIMFreq_Value=32000000 +RCC.TimerFreq_Value=32000000 +RCC.USART1Freq_Value=32000000 +RCC.USART2Freq_Value=32000000 +RCC.USART3Freq_Value=16000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=64000000 +RCC.VCOSAI1OutputFreq_Value=32000000 +RCC.WatchDogFreq_Value=32000 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-L432KC +boardIOC=true diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..85abbc2bea --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,88 @@ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +/* Includes ------------------------------------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private define ------------------------------------------------------------*/ + +#define MCO_Pin GPIO_PIN_0 +#define MCO_GPIO_Port GPIOA +#define VCP_TX_Pin GPIO_PIN_2 +#define VCP_TX_GPIO_Port GPIOA +#define SWDIO_Pin GPIO_PIN_13 +#define SWDIO_GPIO_Port GPIOA +#define SWCLK_Pin GPIO_PIN_14 +#define SWCLK_GPIO_Port GPIOA +#define VCP_RX_Pin GPIO_PIN_15 +#define VCP_RX_GPIO_Port GPIOA +#define LD3_Pin GPIO_PIN_3 +#define LD3_GPIO_Port GPIOB + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus + extern "C" { +#endif +void _Error_Handler(char *, int); + +#define Error_Handler() _Error_Handler(__FILE__, __LINE__) +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 0000000000..ca4919858d --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,435 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_HAL_CONF_H +#define __STM32L4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "main.h" +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DMA2D_MODULE_ENABLED */ +/*#define HAL_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)48000U) /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l4xx_hal_rcc.h" + #include "stm32l4xx_hal_rcc_ex.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" + #include "stm32l4xx_hal_dma_ex.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h new file mode 100644 index 0000000000..d5ad144aff --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" +#include "main.h" +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..f96948047a --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,292 @@ + +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_hal.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * + * @retval None + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration----------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + + } + /* USER CODE END 3 */ + +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 16; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /**Enable MSI Auto calibration + */ + HAL_RCCEx_EnableMSIPLLMode(); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +/* USART2 init function */ +static void MX_USART2_UART_Init(void) +{ + + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + +} + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +static void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : LD3_Pin */ + GPIO_InitStruct.Pin = LD3_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @param file: The file name as string. + * @param line: The line in file as a number. + * @retval None + */ +void _Error_Handler(char *file, int line) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c new file mode 100644 index 0000000000..154dd3ca55 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,153 @@ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" +extern void _Error_Handler(char *, int); +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* System interrupt init*/ + /* MemoryManagement_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0); + /* BusFault_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0); + /* UsageFault_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0); + /* SVCall_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0); + /* DebugMonitor_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); + /* PendSV_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0); + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA15 (JTDI) ------> USART2_RX + */ + GPIO_InitStruct.Pin = VCP_TX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(VCP_TX_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = VCP_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; + GPIO_InitStruct.Alternate = GPIO_AF3_USART2; + HAL_GPIO_Init(VCP_RX_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA15 (JTDI) ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, VCP_TX_Pin|VCP_RX_Pin); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c new file mode 100644 index 0000000000..b938e6265a --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -0,0 +1,197 @@ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" +#include "stm32l4xx.h" +#include "stm32l4xx_it.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ + +/** +* @brief This function handles Non maskable interrupt. +*/ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** +* @brief This function handles Hard fault interrupt. +*/ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } + /* USER CODE BEGIN HardFault_IRQn 1 */ + + /* USER CODE END HardFault_IRQn 1 */ +} + +/** +* @brief This function handles Memory management fault. +*/ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } + /* USER CODE BEGIN MemoryManagement_IRQn 1 */ + + /* USER CODE END MemoryManagement_IRQn 1 */ +} + +/** +* @brief This function handles Prefetch fault, memory access fault. +*/ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } + /* USER CODE BEGIN BusFault_IRQn 1 */ + + /* USER CODE END BusFault_IRQn 1 */ +} + +/** +* @brief This function handles Undefined instruction or illegal state. +*/ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } + /* USER CODE BEGIN UsageFault_IRQn 1 */ + + /* USER CODE END UsageFault_IRQn 1 */ +} + +/** +* @brief This function handles System service call via SWI instruction. +*/ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** +* @brief This function handles Debug monitor. +*/ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** +* @brief This function handles Pendable request for system service. +*/ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** +* @brief This function handles System tick timer. +*/ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + HAL_SYSTICK_IRQHandler(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32l4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c new file mode 100644 index 0000000000..c76fe45ee1 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c @@ -0,0 +1,353 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l432-st-nucleo/board/Kconfig b/bsp/stm32/stm32l432-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..d5aca8b2de --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/Kconfig @@ -0,0 +1,45 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L432KC + bool + select SOC_SERIES_STM32L4 + default y + +menu "Onboard Peripheral Drivers" + config BSP_USING_STLINK_TO_USART + bool "Enable STLINK TO USART (uart2)" + select BSP_USING_UART + select BSP_USING_UART2 + default y +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l432-st-nucleo/board/SConscript b/bsp/stm32/stm32l432-st-nucleo/board/SConscript new file mode 100644 index 0000000000..95e0d8ecc4 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/SConscript @@ -0,0 +1,39 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l432xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/arm/startup_stm32l432xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/iar/startup_stm32l432xx.s'] + +# STM32L412xx || STM32L422xx || STM32L431xx +# STM32L432xx || STM32L433xx || STM32L442xx +# STM32L443xx || STM32L451xx || STM32L452xx +# STM32L462xx || STM32L471xx || STM32L475xx +# STM32L476xx || STM32L485xx || STM32L486xx +# STM32L496xx || STM32L4A6xx || STM32L4R5xx +# STM32L4R7xx || STM32L4R9xx || STM32L4S5xx +# STM32L4S7xx || STM32L4S9xx +# You can select chips from the list above +CPPDEFINES = ['STM32L432xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32l432-st-nucleo/board/board.c b/bsp/stm32/stm32l432-st-nucleo/board/board.c new file mode 100644 index 0000000000..924350eaa0 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/board.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 16; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /**Enable MSI Auto calibration + */ + HAL_RCCEx_EnableMSIPLLMode(); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} diff --git a/bsp/stm32/stm32l432-st-nucleo/board/board.h b/bsp/stm32/stm32l432-st-nucleo/board/board.h new file mode 100644 index 0000000000..e2f50c33d8 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/board.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift change to new framework + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (256 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM1_SIZE (48) +#define STM32_SRAM1_START (0x20000000) +#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024) + +#define HEAP_BEGIN STM32_SRAM1_START +#define HEAP_END STM32_SRAM1_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..384efc347d --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,33 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x2000BFFF; +define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000; +define symbol __ICFEDIT_region_RAM2_end__ = 0x10003FFF; + +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +define region RAM2_region = mem:[from __ICFEDIT_region_RAM2_start__ to __ICFEDIT_region_RAM2_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM1_region { section .sram }; +place in RAM2_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..82a4371c68 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 256k /* 256KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 48k /* 48K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 16k /* 16K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM2 + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM2 + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM2 + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..ed86f920e0 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00040000 { ; load region size_region + ER_IROM1 0x08000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM2 0x10000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l432-st-nucleo/figures/board.jpg b/bsp/stm32/stm32l432-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae66ff86c32022ab3d98c21d5cd98cb501850ecd GIT binary patch literal 118884 zcmeFZcUV(f(>NMHiqcdR6p&t&9!h9Jq=Se^?;wQGLm&l^s&W*SrYIl+f+8T&gir(o zRHR9h-i!3!YanoUu$}Y1=l9+3x%at$U00sH_NKv|>;M93 zX$gR+Kp+qe2t+~#A_1UvAS3w!djl{j0Fwdu=fFYn15XOTCx5`iI;VfYL_TH`@U&2niYK5mItW3Mz6k8VP`Sg6s(ANieyRo-G5H=PhxH zQ;%NcDRc9j*8gZHA&I)(szS*dWw88h1%{Sle3>82r~25?UhPu~2Ex>4GzwqE{Z-YD z9a~f9fAZ>1LGduJ`V+XIhF=<6LU6Y&A8YYh3A+hPjwcS%&Cx8(Gv^{dD z6D0+?)S(KT;FCuH4LrFR$i;6xIz`mrqkikM1drV})a@u0gVQjytm^%ZtHPw?^5gB=S+$N zzI0^n>(0Z|MJ?Cz;t4wO@$LtpDFvj#uG53^YX%#lSxoVKv>dPYJN_aR-x+lJMy?6lX&lFVrk|%yH;3m6qx(WI76mPQG#iC^M1CU1lqA!{6 zzx*aJ|?7W;B216?0V2;L!;weBia9tL|_)3ZhG-fQN{ z4ugI|9)OM>fS9vQcd5^e8OC+E_KrwZZ7HNIK(m6ThLa@+d6glZVN@WyJlQo9hyh)-|#@nqNZ zX756_xm>!#qs8+`KT1n^F5@K*-h#kJSg$fuZYDh9a4~G+eb!vro-N`oo%zIUoxq&s z!?5?Z>48rGI?ciI{L40X3B0saqj&L4kW3fh^qHo6508u@HSr;tyO{xX=Vb1dxeROZ zJPCagrNxte@O49ax|W@*#v|(6;X(_ z>+axyy&KFA-;A2g5dkL?Dr$u|=2;A&Aya}PSEG$#bi%&jZ?%ruw(TDE-CoC5B4_)yVXN$cCGb!h9 zJh9DnIR_wg-hT7oyXe-v!N^_F-UE=wS-D+@~N!Mz>sfZXxMQSU4$ljc5S}m#q8W~9S5N5puaW+ z&*;>imFelaW);=_ju(Z*a+R4{n{b_Mn)GThEW0KYd$h(@ihCrSt1q zAFoP&g&0=(a2UMUO^6^STsw=>#ZdoKyPP zLQ}f6P~|vHU|ua3Zp7h5X8`?<+VsXiJA@*#JDnQ8WVGN&ir(7MOzkJUlh}x@d~GKl zTCS739_O8c#041Vq`zsoT${^(EWyPyj;0EC85s_ct`iiO)jm5b0^{-fJa)zu& z_s+;Jxems`v4OD!rdOq5{s{xp>j@Tp^NpDTp(yX;gWp2XiF*sW`wsm=t~Msyf{c)J zI$j1&b@i3>+~PR38?H$Xmag+BcHhS43gvcIu@8)Fq+L{(d0iWHCFtYO6`UeYzq|eM z&6Vf}^=AvEUYT~4A=4jzSnfu^ilqrm<%re*S;>4no6wsNthL3rkA1AmJeiwq%1tE| z%h-c@S_h(y=&@$mSv&x>X$R!Kg0{LoV<-RgR`v7jLS>ggi>T0DGnokn{gKyu@0Gzj z&?RUD#6wvK*h*d`tI54VubQ4LStZg*};vgf#1AwSEB7%kmSTlNAxC_AVU0Y`x^w?K{-c#($14<>B023+8^5 zTOFD4hw?|btsv!=HfirQZNW@f7+qY4NOcokLuNWSxD_4R&j@U)1^G3_Ywd2>@dLW%qz7F58p<4`Ym9x=BAchg@{Y}YlS+WyCnfGFR zvvX$q@ldVxz{l#dK$gU;&-)C;)CryD3voT)5rFEA2v=#UTqB6?AFezuK{-0*`SZv z^ce(K_BmQJre}lqqm@XOvI-+S?>@pqq~~|6pA-7$)7NcM2+ZFq3M;~vvbr!~E;?1L z0l_qelWoIA3j2jSjFRB>%8gJPs{#p!1JJhQj6F}B>XLOFojC74J9Cd+dkBX#OG%9- z>9v)SO`r$q8-j8}DPIMe^YhF~HZQsN$Xjp9e(O9JISjKYY+Uc%jTWA;NWb3Rz6@S= z-bXSQb@YHVo%+jMgKn7V)%Eh1Npf+YIFU@UroH96xrnz;+4A?6Go&o+j~Diqzr{gV zuu#xWqX@VjAnH1JRekR+#nmxk^bkc?&jARrK;Tceiox47bv>^L54CT{UtSWfbJfbr zMP}#}+O?g-^SQ%@gJzh-Z(K}6zhM=B*sW8!?hsNe$eowAq&ZEH&K!{t70;hfY=##} zRi{p*I|YP0_s`14dspspg@oeFW4J^0FUR*Ump*RMTJb*F_G)-(DF#FS~r?Z<~19D;UJ4qv*19F~u><=f+uFfZ>R{3Gk z=FS7#uB;0~EkW&jE$hyoSxSsIv7JtG*D9)XwUugL^|!lzs?E=R%gh-qmUt)IkD#mb zaH$nPtTMQ?k6d?|JU&Ys$fBJYbah?h9YdKLy;9%ZlHr%@<@4?>Q_zu4+l`45dky^)&k-K$eJR&F95 zaFumTXX&utyP_8SsK@E_j-BYTxqpuxT?0vJ2b=(C$@15>PeD>P`xIp^=QG)2^t4q3vMBOW-X6OS;_yhcoG7{CL-MUl ze zpuC~#wo2kc<<;%6=uB9$s=CnGQERYB`)Foii@*Zeg{tjScV3McYdYDJnTcig@I~s? zSDuU2yH!;4wWW1Y)H@|Rx_oGKj$CA&XrVH6Hmh$Gl&dHV(ZqNSE$LH>6EMHIZUUN<+6$HTtYNfbHRxlWL@+xyn>bjrx4ch0pXx8bQmO(g~& zHkh9aw`m40O5)9iO#}kYF}yH9>lo)3QyQ-ne!xe1b%UD*2Q7s@E9ktkH=A=Se3@ux z>9)bz&A1!%$rpP7y0f0S-g>{yO5leodS#3OBn;EKR z1LB`;*<0hEO&M$^Hs>sv$3O}EuL{AXSkoP!D{qS7*9~ijBV(3@6btX{un@c$-CT>s zONV9;Kp*p?ZD@N<7iPTZQp~C|4nPj2nSE=BBALaUk7(AdGR}3pmqH{qjIe9;Ja6OX z2 zztqjdw4|{GJ^*>H1!Zkj&QW&Lg!xB8hF`aCn?QuGwymqkIXE~}L*@YdY2IZ!d=ZYNUn^^gtwtHPb^;jq1U@A9I+ z;I5)b7(~=uZ*XpSb-KmSbqj;vYtz@_i874Rz7HLv=WKcKmf3uahN9|S#86lF`je;2 zExgOr*&DV^jdoR4i`pTf6K$KTe)h4)p*4(pV!w0ATZ~;~7E82Ay1-w?a5^5FuHiX(-_3wU z6rpMs)mL6v*hTUhZ2`Ygk)mxn$2=cmuy6osy{z1rJj&8R*ClUD3Ua2z1c;^-uU}5m z|NODxgS(&wVgs&q{YAKYbVO(LFB59=ms@NG@1To&Xu^aQ^biqcBSZVI8{K zJA+Sakk;ROp6J3@e-SHlHU6tudwg;ZCbD8fxm`M%KDWYTU z3J-JI&s648^XOj#*1&DU_hrfBCI+ZkcNH<5xPU7dHP4%EOHWsUb5$v)x6WN2ep;?} zL-+FMOunpJND>@=dB z9N-CgZ8q?ly%@tTdxcu`7IlJoztwI(Yq{19YaKtUo4XljdW&QNUfwNk|Elo(&SEWa zBe`jV*KPHKKHDf4Z5K7XwiazVhX-bRJUd;5(168$?tUbJmnZ6S{L2H-LFa}>0K>B2 zBdks_AKvCJRQp=W0-6qOeRdu%Z?WjLw5^NVPsBFk`A3YY2Lx*smus05ai$Xa0U67T zftmJBjG=hm2w>C(W@oBh&zjP8mT3_Ly?ld41{bq+%K5&mp@iX!r^k_^$?`MClQAa7 z-LYc-v*A^DNkq<5E{K}k0To#k|`KZDCql zhp(f9DYnHsUn-@ija#-;OWL1;g=;>X86iXj>$RLbV%RN#Hs1vPKb8uCD`JxkVAbGx zh2Do1*}xesSB$X67T4XFPWEqEPkwdTQ0PQ%noR?@eH7;X;EJaKwJhi!R_a&XJ55Q$ z@(i!f;MEY^gkclHY(JNI`~W>vyJ3SqYe(j(#%nt`{)tHhA-cZ2f;!pDMny;FQ$?lk-Ea>e#CWfPEKxq;eL0}9pE`k9$F63gfDCF zjhvA_xi)J*8I0#s2tz!NQQM$akgnw1#48RjTZadIV|pDFx|kFw+W93PC(XK;HWvS6 zD$W!8;$`*#f?yRL7`ey%fK=}`JUOi)EE6q0WTNIDpdlPCIdsJp<~_IBD_i0N~7ib zHS}E19Dtnrx{J|%zPDloEz>kVT)Av1U1c+}_;vg4*>RaL+ZyiL>f#xy<-KMRs8UI< zkqJDyG`)ve2fn%~)!F%YdNH$q#GbuJpX@)=@s$V8iQD;|qI?P=3l zUT6CpihjUKs(z6pen%O&Ry2AKEU&H&WgaD?1CZmlM+IF}TvR-XRDJ5{TP6+lT%s?- zv4M$>8Z(7r-8x)%<-EnCX8Y`whWad<4nTco2cR{Hm;2p>ECq)FE&;}O1}O^klZqjw zxh^~PJmI}%73CcQcZ@Le1bL*!OmTrU*Q1B6AKsUKRb<0usS=Xz9)Y}V;xgC#>b3u7 z=LS!?C3hfOQfatoI@2gYXy{g``lY&0{3rT+3)^XOJ`AVKc6H4U3=ikpwUZtZjgHbB zr2ly0TZ!@3>{{R(E&n%B)JbomYy@6K{g0=E-h%}```<50B}BwPGRj&yM~Lr0K_E(2 z;5{z!Rqi2<_Yik{dc|^0^y8TqFZ~>|tL-~W4{36Tv?U-v4jja{mmmzuQHgD1uZN$bR?z zw$4bx}yO)6OmKJ1LOX)J3x2sP`?WLj%b}<1r?OL%I|_Z=6B(Wog4ZW<*Fmb z>sLVy;imel09f?5Xl0nI;}4U3w--oXLsr=yV-O68(tsnhB?Gv^KrYR|BL;Y7aWE`qEu}$w!|JB zDtXQE8v5t_Ai_ju;7n8-bOrA4UCe(pYY4pV|F>ohU~b>>*HExaW<&{x={O99^e}OP z1A`09RcCj{pXQ?@67&I`l#v(=65)n)cl=R><|l=y!r$<;Kk@p`j!u6kQ2!(Vy8YrO zt{Sq1?>hW=(@*;Ie7K_c4rz2h8U;?!n?Kee?IDi1LfH;E&;GMawsu%PdYA(l$>A*J zC(cb^rvF$jz=S>2VB-+02@-X104Q!iPV`_PR{D;45%=sDM*I+O4&*<1qz*B}ng0WG zD03SqgMc*#I{4Q_Hcce|E9v0>4eihtMA5`8>#%o6h+EfB-M+6?u|o_Q;EM3QOw^rd z6(T3`AUl*oMMVBw&7_wA5^(&mJ{u7_^bz?kftgq&vjDR1HXs&3B;LTW4gd_mF5?E+ z!Up6HKrjG?1N)IMNCG4d^W+#CBkJ$}U{^K$Na~hy!HM+F~(C4Y)fT zWs8B^0|=1e4UeCHCC9!q6EQ@J7Q&GOIQ@U!e=;n}?H_+ghsOUWMhETq&p#~+TQ`iM zt>Ztq=wNU+H$%7&MhmTJsB`7#W=QoD{SW4&PDqrmlAE*RPfO8%@4V(uG|+QOd$@xw z_Hc7P>IFw({)OH6C;Ff4)OL<4NH-+vZ^k|GUB0r$F9J{nbQS4NwDnO8(gXOrN5lWV z`yF!ww#om((%2nttN(?k28P(_KiLo0^QprUaYBDz z$wYn->kS|yE|p~9@BzRP5a=5KvRZ-80Pa(N+^hb$SN(CX`r}^p$Gz&0d(|KJsz2^k zf84A7xL5sgulnO&^~b&Hk9*Z0_o_ecRe#*8{W_QXANQ(1?p1%> ztNyrG{c*4Q<6iZ@aj*LRj*=62*$4tz0SEA&5^!z;DFKd1NRS=i48Q@p266&m3~-foP91sJ6LDEFQ-&?u_fFO`RaQwF$0I})Ax6(*E7Y+aTC=Q@R1JVc7hXIP)0zM3mhn@`_fHL3p z`0fiq38Dfz48$%t_(nVCgu!^oiHf?TMQn-TIYeMcgs6|LhbUM?OcZnx>f>PxbA@9# z?BKwAe+90kvPv!vXL|)M6Db`r9S;?_le4BT3U1(g)ez?E3X`?xf+})c^pW#Hcp%^y zTMi$Dn>$+0M}g~5xEufz(V|=&hb$OZ1+K%8862iM*Em#=C^(0d2t*hLmXP6)mK6a@ z$;yaJ3K4^ZKt#o4MZuE7Vqju;5HT>vkHiJEhO&2%(^pmh(H2lr;QG-iZ*OlAZwV13 z%25<7D=RB1CN3&2E(~x8qi?ulY<+~?(cC{JsKU`Ol=Goa7za@z;O~URC~yIqe(wUp zLr3SA;D5Ci0zvH8AvYSM5C5&kzjC9AukS_m;byi|PXqJM%4%M4 zcg(Nqfa(9|%0Jt&hyCL70Nf-F&14S~g}cEKfIKuX1HivJ_EW~c)rEi|5)froB?%d6HJ~m;Mj8TU;6K}S z2HGXg12H=YSXf$C%2pUIEh#B%2eFqDmbDcZx0jR^lav&PAJ&&sLBVYS*Ed7J?d|6* z{q2#dVgUIaw&rjAaKKXzuE0f%VrzIRJb2Wju@aN}QD zi6L+P!3r!Fd%*kd|CZSvCg*@eA#8z}1 zDu4^6gR>hzATEaQW2Xv7IeWqF)lo45RJMZuLEfhqnkGvz;n9Q{-e=49*c z2nV)OQ7&RnMTwiv_pXV4AA;Y#KBWC^gZjx1?0Q7-*LJJ;b6fm#{$qhZ7WiX|{mflCW-;C2j%OUU;lF5xBO?IIcI^bs#49B6CRryV0RsGek5~Aa#00n-280p65BQlVsVI&f zAwNb&N<y2Yl*D$$%)A6elT9Fq}HhA;xu@ zQCx!R(lu@#Nhu~yWyqQ9yefQPRW)g#Z6LfM*%1n|qm(DeDagqInB*imh=EJ|)Cpy7 z3Qm1H37*qnl*(~2rQ1<24PcTSdim(bPZ+P+dfxgJjB8gl#PAk&LcAz1J!-R;y8a@i zsvvqfuk|mr)iLZHX~5&2>^sbk9`2`PBI)h4g{AGSJp>KoFeBC;{@B? zj>=czk-W65r04nQ<)^l5wzu*=wvHOW(5k1UUaSUJVZJ?1;ib6lfonIk|7&GzP3;aN zgaHWL2t;NiKaA{1v=(4UPOy^R@nu_24zXL0UR=5c2>G^h-Q#-%Loy(6BjBw~GCV?L z{?|m7As93XEnb@ApE@&9>6Z{VffM)_#thk&8sqact8&`wwRCElBhO04MFWMr-v>bl z9`ZpO^>!a=x!4!Yx@FiDV&3m}a@4!%qRg-Vryz3X`ms@12?I~s9k*PqD>wYn1e|F1 z9MdEjewO{6!>0UM-pns`qwT3XH~f17!UC-MouB-tj8nUO7njy*t(JyW97Dpni&Ciq z@OQUvJXiFoya2I`DTzFq)Y@>~*gtC6W=0TILbplHFjj4qp}pxB$lGv=-7^yQ*H-&= zLbF%iX56KJ2q#x8KD%QDTdT4g^{bBJVKaL2*1Ji0 zt3fuwn}^E07MF|T+e{bT5<1FBJ7vd)!Z&?zr?+txTw5xtF1rQ;EaUz;w=!bnYgVF8 z7xk2Sp1=KuL;dA_sdMEwYmwhP+n(}9lnE_duU@uKN*~#Ct~K2v8Pi3}$p-pt!OgaX zy4j}Sz`z<_rPc1vt@rP~pD|)a*Xq_s*>}!RKlizl&pB-qJE+;Z?X~RyLD|HZw*gm) z57_2;*g}rgGUbQ>ku88HD5FLM|KD-9o({fr~UNCu=z0`Q|)t#iR>>1V^lT1rn zS1Gxg)%^^rm7H)peEP+@{Oh5f`>ih7&&H81ru{}1+K<}gShsj*y-f_t??m5yyIUC0 zKE)P0bRjU)|5@@9VdxTRmZwWZ;lB7pQVWMDdq?>(oAO3msYGV*n#skoAkB5UD#f74 zuz<##q4yP96Mnk8==`PtI^qX1B+A8-uC&V44!*?-3l4Vc!yPhv4aK)7x`gBYlAJJ~ z8sxTEMzefs$=+L;1$WeQTD_J*^3ASxjz&@#I3NaM$EoY_SJKxbzf>lOuTY*^I%m`s zX~rRh!rtb;ekQ;D^^Fqu%K{%Rt2sXqH{NyI?%5xXsGg@eNv3iwsAW;OU1d(oJL5)s zs_A%UW3=MVY;=N!bXxPR>n-jUeVaQh&l(0#q8}}gp`I;P1(wdTX3d%PAwB?VACoEz z&aK2?i}oBDin)V)qC*tEE-zBU&=cxVmSL?{l-0I@+vWXJ4vhR^P+@zw|1 zrq&HLgSvI=6DnTrZCtJ6_wqhRpj?zamFD9RN|wD8u@g8PxVJEnd%3qR^E69v+h*Km zt_Aa#?X~DeD+=ow0(k(SFz6U}VMMe+x{!(QsHe^WDCtXdgAQzFFSMvNs+XS(uUuFu zSYVhv`|COz>8j#RckNec)juCDyo?hI;&CYAP@|5Mx)5TlVJPk@r5KIg1`XaPz@nrum@4$BW zv9BB(c`Mz51C+ywRe3#nOYzeLA&10WeB?`7cmMkhsi6ZC4S3R7qSB|>G$>et`D<2G z!_PC#sn(uET;H$sWgqrOTpB2;KmhNs|2gISrepsq}~$omMH=*P3J z`P)VQ@|+Wdu8(Scmrf%i4YBDf8bTlvpNiCJGykDsv&`)1o>v=9tL%cM>`KEE@(Hyq zg62>Ll+9Fff6#E^bK43Xz^1eYbtB!I5dpCSF6ETjmNl38RNoBxDOm1tXRj=AZjA*? z&>rn`4mct?-V)*>mOkhkcP5m+&@{|fgD&1hfqE)lC9@^--evWVu~)H(5^wJptW~*< zruM#NI!sE}V(J4Oif0}>o{s#h=%&EZ+1GO#qeG@3()!IZhnB#m*_W9sa(CRuHUbg} zah=tCJI!~L6%D4YBhr_KS|x@iF9BbLJxQ{jiz(_{C~FfnJTj>=Hn7Egn=NE8(05ganmbUiqDru*!EyMBV5gj!J!;%2)qI~!Z=vwqo4&Q@6)+c8S)QOAt; z@zcj%Vwf(A}F z@-b!&Yih?hn9dw~IebLeg8kjv;BK|~O|q1Ts??+@UCPms6|wcWMUfn6@%yKr*&^ql z^N-Ncj}}k`{Zj(`Q&yZqJU8S^QWUYrkKFMd81P=FEWHU##fc<7%{Dsy@!^c_Bn>2F z`PKwhve+zPex<}Ge?4BNoXYe?{+Wd^ZwmjHwIqMFXG0)%EHrPHcJ^DJzFCdz-Bhd& zZ(Aw$s}$^!gxBQMDc`tpvlOm}dLGX=7wcWq1ERI}M}PVD97}maF=<+_Nl|cZ=e9xV z74=i^rk}q!(NK5OXTdcxWgJ94h7WyVJ)D|50$A>b+SX$Ec71^b!fwrUPI4)B-ORj+ zKDBgys(X2Pd)${U{=vd1uB~r;Vs6^dcS7^sFg5Er`jj3?3*Mb>c>Olz=WlNp#YKmP z+%}q2>}%h+l-DX0Ukku!n3Y`v9Z}J`+r?k)|GY1N5)pSbx|4Aa{Xus@P+Fs^yC-blRK^nkyEpuytE+_ddu=EHl*x5B>BhZSU%w&3c)sbiB-Q9H~0|MRHgJcyU%=_%c znIZE|%NTUmzD);&97-}3!FD;`x8>Qlje4kTzQZsggiu})fC zqWQbfn;?*)dS#%+)T#c-Qqi%E0{VBp!$F+S-mN~U@OFxtF2GD^V;@LleEhKYtb}Z} zbn)YU!AvYuxz!~=HPYLcT~P1+#+y~aPP{Z@n)#;TUbN1ZeWbAmOpqy*Un&{8Os zXX5f4g-WAxCF4mxQl96Sa_$KhoG#qmu8N%B`p~pnG_C9BgflASl|B0UvW+IrVkNK; zlD7tEMq;#GsD8^oyXjR~R*i~8@u#oeIJU9bSD0W#)U;h8{`C@5@C?iNPJ8+XKpT)g z?VzubZemelNZhqj-gX7PruSzkXr69{#WV;npPJ-$JzBf7(%EuKP0PF@x8Y4X^PC^z zz2UOec_+JL?MCa~Z~CQRLzuIY#VaXM&1Q3f*CqL2ntl}1?*3!g6O36)`$+$x64Hx`D@dAU+|&hHK0Bq~C3c|vlh1Zwb*Rn!MxK0TD~tsNc$ zbq&7QXfAF|7mW>(rerU1DfIZTvOmIHF~a=0NUJc#t7zR1dTckPT&{n5_4%EM zc=t~`kFthP{w!?SS*NwtGKe2w|4uLE<<|Mqua_zmN9u?%<}_@yUAl_Nv(OUOjffcT zM^a+vYE-0C)-NnX#T`RgXTm3KH@Gd6a;#TTI$!MX_WFP3zma%PVTPK*m%*w~yE`Ia zwt~5#@wa>cI#p_5@{+Lk1hTv=JzB=+(-!I+nJJMFxBZGWmJg;O+>#+|H4=1&u>Nev zF8o~l(L$CCAKC?Pzs|+c1q(qZtFXL)qS{HcRO&=!cY=Nv2g`{LF42_JkSGB6%jiLQ4XY_Q*zlyAS=d4OyW6VA>%&g=p@`U`_S|z7a zzw1W-lPmAH3Y=AHYKk)kDZcg045eWm75~{Gy@2`CjCATF7y)ZX%e?A>Ojhn2InE5) zj)ruHUCR@A!OZB4gXF);&agw<`Ku)Y5voVoy(0#0WPXW@oWgF{_KjqirBJ$W_8))}@3de*Zpy|(00gCqn@8s}UarCjs3Xh^)SmPof%#`RlXBUd^qr`b zKL8C6t4FoUI6_KWtmI;;7ptzH$_%S5PHD$NpYbnhue(8)G^l1TDyn8%OIBT*#YSX0 zCi*f-Y|zs?<8K1ukLk6_#3aji*H&$B5N@#7F0JpAZ4(F=x6Vihu=_tEa1wPmX2zXi z$}y4UsQzN2vw>a7BCgSGxz(#CO^b!M>f_^geIFl9)t+meN7*Q4jj%skPLykrz*wuD z8z0Avq62+{o)ql?PfAj@~Z%rdoE1x{cpKB4SEfI-K9gb z$mUk0u5Bz%CiZ1ml~|>wZm`YSATyh?vlJUv*ZqVo)6sPpI#4Y2^crbemZXTQY7c9*~~rJ$GSoc zCvYYnj&()g&-pTvRz}4^j&noh(%i2Ww66a{v*JbSO}-bqm30>AZ%}K)%x=D!BJOvx z9#i1QUV(9)0#wzm4dXy3~5WA1`;!fA^k8`{niv0}lOS;_lUN}Fb3&}!N z(54_*-BXcF6sxZo{#lB8NbyqPspmLU$(B6Niq z%y$lw8szE7@H}Tb|NhX^_ubxu(j3hPF<)h|{ zQpN1?8aiXUdOa7P&`8_9!v7wnFEEWaD@#02BEHok(Lz{!;-%94N$$WC`X<&5)E%z) zuEj1YWr#}L?rve6X<(Ot{`uNWIunT@w%`Ww%fqT`l^GIL-SdoHb4u%Zr|pQ!{5FaO zv-I^RoCsOtCt0%B)4a|5dl_H-#o+M5z7N&uKJz8ph(FWFwUYPuY(8I-+vCiV)OKFV zAjzgk!uw78p}o9kXhv6r`g?7&ng z^%}}~Mf<$ZHS{|Z zh9E(VL-(6tX|svLQ2{~F0It1o0xz-NF&l7t)ym_7t-EPz?h_SI+dV(ylg5yoYAr24 z=8~ivSuaLTV83Ww7LbSg5%lU8{v@}bBUWa*LWg7oW_?C2S-FJdu0Y)vYUxrD%B z)!t=YL*x5CxyBXf-&5D{h83%XfvZ5FG5YCF(lGN#wyr}X?S|I8nw7q+( zS;m4boiy7eyUo0GcM?~mlJ7yVLhldvj zK!lJ6T3Ih7-?7z;D$PBcSG7mZ5?>CfdEzW#80=O6)vV+W(z*oHBTc>Pw3hEPIc`LK zn&oYH+?Pzq>!AJ@Ei50Z3i$)wv}F`(wtV^Nhp1uZr7L2)DZV=!t=dUVzDq~DH6#~{ zZo9t#!mJu=aDI9&7Uby;M=Uucx!%i(F>Oh-{rMT-?uJHh&H=pqZ(Il65IHl zNKOLVLH+J-{mxy@&nUZbAF%jEodI9VmB)O3{Rf~)#cuj38|cxkzRqSYei@%ZXyge8 zdTdb9UWvobFud4k=uXRTVSk54&q=TwuOvv^{5$gh2$KQNwuw$|B;=$ApkT&wGI3i2 zGE2uNg*5QTbqW{kwcr^zdpiai)C5<>nnB+n&lK|dQ$&B*y9^4Hi3Tl8w7^yAyNIk% zoJ@Jn7Pzc5U0TF&T1Xz5)|^xghEenQfu9VLMXb6Frt==Frk!KkEuUtAo6x)WhRf}` zeAdaT@aYX^wGg3^o%YeZ1%B7xTPUcEG-H!%HVChQ-5%X8Vz1dk;`xT##uPYDWm#(9 zHsX1-SXt&-n87DdZI&WC^!WG`1S)=-DNJY3NoC7|`B%`$rPB+vcgv8y-H6oc+|k?K>XPhO(4D)<>S8D#d=cv|(Z2&O&& zw;0rMkDE3e$?xI3&9VZ=S)v#xm#8l!qu+0Fl&r~TFyEC%1xV5@Ysl;6D>qPX9+hI1 znP-R=Q7T@2JZrrg)={%jsuU0B=igDy?8-N*O8#7- z^xlWZ-5_%EVefH-G>x{;dRbJ}wiz3oA?#(4;`8V8HKU>m;>Yc3X)RL2am?!EM+O$v zT+JXkiWd#SA*VYeuDm#Z8OQXHKS;K;u}SZH zzWk>Pi3pRJ`9U(>FeFWrTK&@%*w=KJ*`51Z5ms)p&zMez*k8^chn)Cof6a_nyixU0 z6!o(xI;q}qXw<#;7o5VXk`34&LgUyyQq7&xS#H*g^rxp?yr$Fws_{IFPES4-c)YWP zpZx>aP5K0GEpu>BL4vnbUN}Ix@r#OG_S?C+-uG(L{@&=c(>Joyg3s>VXYn0*%s}sO zt3~;0!VR*EW1EZajE>VPLt93>UKI+jA08dp)5Nlu<(+piH=V(~UDElOoHRrwd7*sd zUil;sCwiOF8X`6zeZiGKV&#Zl*vBE&+s8m5M{YHp;<+aM(LT+lmcyI+%!!1hi_Z7l zsvu9E;G?mfFh6tEa-0`WLyg^tgkx&DNhyzI4CC%mW)p7A(F{J)+D?euxXPj?efX8J z9!rNo;rWEvW%;q`#EQ>U??a_K!Y1^b6YS_o`>8*v`PrUuaOc#26ps)M|105x)~6Bn zX4IbRg?^nrd0v(CIH!fAI6I2-Ye`X%WKY?wh-_T`*6XJ1kg%-BT-==UtoS}XmYgj_^Q}LdDW52&H0lsL@*-cbx71bnlaiJ@3Ok3S?$Acr(3`ogPAeC??>U=7kwScV!4Lfb`*6ZMsA0fBE~=2^{CEE&YVqYzfm){ z@cHu-OWC$EjqpZ^2VbsyTF6T;iPy1Ls{g#0^(5JcP5y3A#pHa8WyY}w9$ukUBWSKm5XF1BeLsZ^=$@uK$>rOl!tayC9;& z6-fUVTqZ33_=gF<@OPAz(UTr4I?Aexfy0&WIKIWxHFD0>#2M&qx7kGmk+Qy`(f^Bs zCa&Yr1_?(peFu8K(6l_Hy^>_~~0T!iUc%djP=K9@xcDSyb zMefiqX(zF<=A3T^>x;4!o231sd&~60&w_DTgWy0R{q10XCRW3+*VUn5mS=1W^$HN5 zy{ET;fU}J;;4o1sUkhGuh=Pbi32vo?N`C?xqG$&0y-@aGmlH>N-Wx`D^HkHGZCg>L z0~Z1s3u*#JBG)1>)IojftYwrKxsu&Uvqkn`J24h)RIiTW?YwD6-iiB=m9{)#0eP0* z-FMuY`Fj2D$Sp5w6f?K*<^hi^&XkiUjg~N=zow3@ikLSJGr`bxkdHRHqV7pSyHJEhYWPgPT#FCr`v#md0)z z+oeT>v^9h4K|*C`Ebn9!B*b;>$mkk)V3si6Tb$~jzTKF8=A6dd=sAGypa^bUF|Ave zdrUjOh2je3U|r*&lV*x1<7O!-6ZjVD{g(e@1K0gNDx<;j|BJ7`42!Gx!bf4+0>$0k z-Q8tycN?s@3{u>o#ogTpr!cr{ad#LTin}|sJTJfhd9U;7obxGHc5>|`D=T}i+$$@0 zeq8hD2xk`_trwegn`lYH8pxhgTUX8doSdlp%J1=8jq#*Xf70m9sBIGE^`d3HDjWl> zI~^aP+`*S2qF7g!Q4R2JNS!(-rd(RgUZwJ&wAOU~Z}mB4tIw&;pOCcWrHXVaHk%`& zxqb7b2>8Byu|@GTq#K|~A`R*M=#FSc=-AfCSk3enZbBmR%NCg`dsZGVWrx8}&O9sE1AFz`Q(pk_i?E7?@O$|>%j_D4Thzt$zS=7FF6s8Fje=bOM z;$uRlH_*Z&G>iItcim#oF6th9xU-V|fyO;f!^BCuw^*=HNI7v2RHJd3(#4+Ki=OIwZyY?iJ4-X>=m-cgDXiBuA{y=YCvX%S!@`yv~c zu%Y~@iN{Mfx~jfjnKHDfdMcS8>9AN%6uUtK8Lk&mqlDJ{I0&<(=&EH463g`?5QyiJJA5I`-0CxD9OPT??oeNjFBm~H zXLGN!iV?S;6g`=0<5}REHq;yAXH%~jI|z@Q6v8OByfr6jta)k)$A0zp`;AyRP5$XY z$^n+LC;U>{&_LB7dyOxM9et6{u^4OIk@oN`yMxpN)&#df?`P5?ued|1g%KO>JYo0{ z*WAV@`Fi3ICPGc@dA*Em#ia7rr8E%j7H-fxpPiNYb$pTs_k(1LyEl|RRME#DmxNP(%^72*-p{C z0I_#s6G#unN`Je-d?)jgv4Uo1H420F*lH&DFxz^(|gii)|nxZm^ zKRY8Exe?Qc0a;1}5##Z0pczfv8lz5{oFAlt(qu{}K%z~QU}Xt|KhcX}%$m(?r`_Kh zQsSiAg@waVDa;P50A5v8PhwVxS(a@J+j1+xdHlaOx;UK;8$NKA1`*Wnn1t4>7sdC? zVPRC~NinO{fZY^p1B_&0N6@dgfQUDLcFfOhCL%`uNx10o`CsA~@!LN|{>xEg+L2qa z;~8lQjwB3^OI)0(icW^cMBHrmpx97_mjn3tg&vLIK~; z^Kq6NjQZ)s*~bp?5nJ12b+;sWkrRK9%L}71!d{vvOG{S};!``;=Z1c5V73IO*^rpo znmaL+?iGYW)16JKP2$+sbdEvhLoA04Xs3! z)>A(*lKC3Z!;`W688~4A=OQTEmfBsw)ivM`9@sJ(&(U<1QI3mm$`{&_|{;ivr+k=KPS(8G-WK#TB(@xmvbg5t@D%WVGm zaIHNIhroSRbK>mIh5Xx`JvnKD&yA`eZcW6DApXk}^%K`hBr|Wjz+0kGB^PCg8Iono zcs_~(UBhu}PLB@0Iq@Wwu@#{-a1muxQ+jQDKAvAg6_3T@$%Vz~n{{5iQ*|;e*E(9x zW*XU-8(|1*l$dgxMiGw`9EaOq)(4q1;DyA+`J)nC-EK;vwF+Ol;af7R*RkPH{bQ`- z2(I~VKkpxaxqu*p-RB0$`pTB@9zpJ9^f-B*-_Q3&&YuYB$tlu|<#mpeS^ZF>`Z($F zt-20(91QwMv>mEEB2i9W$e`_4C=+bR8|{1>0AX}Ynp@4dp*#@7c>j2VCv{KK^@v5^ zTUwE?h$B|`Ym@Zb(fH`*2i*&%mZ+1lsJ{urRi!*MvUf2>spOwL=dk!G6GDt^o0&#T z*Ss9j>B-b+DNF*M!43_Joq6JAP?!ojVN2owK53MsEYTnjjwC8Bi_x3%nvl4+YpvtA zm3UV6bm9e7vlo*s33}qe_k-v^6(ipx%cC9ZHGIONPQG;`p02-3e)+@LfWxiA-G|E8 zoIGz}vVn7xhq)&QBf`X*96jm`duHwkwPMb(SU55zov=yeaR~KvjN2D> zW3eA5$y{-+6nq>{2^+Jn-{o`0&Y1E7jx}gKF(Ed2ip7@G+v{>^SHj9~!vJQMK{J2ZlgQa--mUN?->>e?4)m*A8w%5>y&6lD%qktJo5QaBm9a0 zNz?ye0C5gh`tR8>c2yizoK?;m#m-w@xaZS3DDR@kA7(I`TzA$U+QCg*iGQ-eSYabU zWkB~RDxH{^HIrGgjvu|>t*P^$i{!fKM0SoD*5KdVvF3p^C7B$*F&{o5LcRw$nH=oN;ZI}sQ5@5)SyJau<~%0){S|b)UOC{E|{Nn z5B`K#PF+MBr%NOkX;xHxi!hmo+38He zIcI5!M}O)?-+l*n%$E%$zh5V^R>-1*s&uKm02jhNU0R*VNT>PE6I>h$cJC((&{V(j zy@1Vcz@vCSEr~$*FnUN#{FUZnoLZ!Gv>y7(GK#plc45)db_i~Wv6?s$MBhfGQz-;; zM@W*4X3fn?$tT|nUsv^t_dlp{azw?MQ!KgRC_G(#2KTk<-P(Ve2Qcn9{Wi~M`yi_f zhe9v*e6o_={MZw4&^9hMcRfAnxSUxsEbKTK5vt66RIm0a9r+OK-rQQ-;UwFeR;L=3 zz1Ffg3aV}lfHI#T6QAxr=V9J)(oGs&iB32vSCn+7@qBuUX_Emef1jwMMtD{7faS!d zUgnG;*x{RS=EspTvq_@Oz{6H0|L1K*5UHuVAtGQDO>XNVY%cKle&987jlz$ZK5;=# zE{>VATQ_C#K`a>48?@8hu)XYTbhtW|T`xW&jQtMk#_xXmVk7<@)yv;~$8dxLiCEdb zgM1*6;@A&?%)4c>u#qfLyHqX>l;ak&=4jgf!rY;_WF(!MH_pg}43w8$d!ObST#^p( z{wfv^k>eW~x@7t^7Vnldqmsu@h(Xnr+iq6HB)Wij!Zg@oVL$r`304N^$AV7zX}gen;-U)PfOKoC&Z!Jptg0SQ3{M{#TCtLT z&Az-pmz7EVl(mQI2*02*wD;n4GATQKNEKK+gg?&2|CPWfdf%X7lc6W?zHIm?S&)QV z<4zDe$FxQBg$8OyLF^eh<;oc{PG?2-83*zH4TP2@ov(+VoFMQ_s7(@O3rDNq)Oj>! z>Dnl_w{Fq+RnbzAW+O!+{w&!rEXSH4w(Ns>V}XRQddGzCe^bBkIZ@4m8Ur8=yZTi* zHYFbXiBEDHWO+}bTpdS9Oik+hKQW$HSKv{y`@j(Tgfi%KV|YKEH2f9Jy0-XEk<^-r zhlIzQG|F{Xmz9dNJxWUzDa(aJuNS+Ucx6Zv7X>5^4R#2%ipa)N8LCI=U(X4qGFdkZ zFGm~hDQwX0H`C>ulP9BR-EiX^Eu*CP>-fPOh6+iA#oxb`=f7#+V8^oRZd}DR77X9s zUuci^lznQk@}Kb#xVVp+Ytt4xp9cGd#U#Y2A-?wF`2Ff%^Q8WzoT(y0r-uZB?0*(^ zw-juus~NRHC#Fw2+=(LDK|-hw=fQuX_C*fO(tTB9ba38ZHbNP-p{&Fx2y!X-?r#Ef z1911hfvyb^W-k%Tb^3zn3@kyF4U}oS&okDKn)E~mc8U&TH|Oy8y8I~ev6e7BhWaLA zzjrc1zY!7}kR((8$V}0$Od2^@*!jn`6Fqdz{(rh=w^7O5cZ2fhT%HB!`aJnAoRg4n z_~nv}6{T8@&yRepd%dMO(pn?)SYcyy#X6GmcKc&~nMgE=C0wQmyt~~4#iPfgI5Ss< zOH0A<9&I-psst$1O4|4p&8+D%#C8|c5z3OvqdenOYzc-a?q3x!bV;*)&!hK4YU3ls#m(}hB=~g^9VLbDg~=)+%P#!#Qvvfi>k=!(;>W{IO9`Rv0;?k@ZZyfVWqz; z`CYe2eO48upg;X74lK zomfh$#?)c3PdTd~Yaj~=*YNvn)o}gi;;oeaOldx)guE0>S8s1e>1}5N63105i-X;d z1!HFTLWF+j)`dqpQ(bgP%2)Z<>N)WfR@H~4?FiUWSRtg8c!VO3$BFn~?rA*AgPKP}HYz{sF5 z5w%4Fb6cu1M`tn%1)*zp3hN(Y2JFXgp*5|DQt9H#{lBCMBvFjJPM1Lc6pSa#C?w1J zE`KFnYCfX!iSgfqV+3gv1Hw%x5Ld4LDD(CH|v&vAJ9F#XozQxLo z?v`3%2{I~|;mNOl<%gh)N9<+APM96$fRNiQMlay66e1d)d9O*RFMC1FeFD1>lTAJ3 zi+ifXEfko&@=pu8>wVSL3+DV1FBiQl|CWDdJ>v6retT48ZRPld8P_o~=r?QJEF3RV z(oA4$pR&FoX2otOFqAtOOXtd&em)@{(6->TDnb3Dux+5=HsSwxXg>d69-2@eu@}-3 zR#bRW)}NI(zP`P58S>A<_}6sVQp{DnxO#SJ8t7Q9p|tSGPXWCuR>x&xT#%wRor@ZX z(-tnswyX!)Qw)(Y;K!?ERdnEG?^sV9ivQ8O>$}Q#Q)jsOU(j1&9*BilumO{fa@T5X zKC93RyC?}@vzE(#LWb?tex?ZGUUix94(W=qI1;~W1C;}3I}HIiVbHLp3l*N$3};#z zyH6Mh{|IJKzFkE#4HM;~o{8e(mcmNQqssP<0g$8yH<4BBWek?es$ZFwm-a{#2S+sg zf~QcE4zN;;%B2jM z$w)`kMQ4T5Pq)sg+NdQS0eGQ3NYrrpW|Wt?6(zN06xtZ!KTL%zW>h#vZ=E1$%c|i9 zDB6@>4Z=9(DRMpGvbLd=_)=3kwN<~z8cM#X3f(ZD_x)Yy&U#^x&k1s#_OuSgLKb+J z9$W}yI0I<-K-@QH0Yp4Wvki#Akt7~pQiraF5nFezGzffi<)vCuC@ZeFwVpD2YJz_3 zG8F(G!Q~(u=PUGj+25)*`8R{DM<>Pk0t45Rj6rE}JsvRKuw#FZ6#~jz)0$vmvLacSc@RIH^NaEL{dNQfU@87RNYHh}i&SnwQFRdY0djvph$AB!=KB zMH-tgOtWg6(5WE`GZ21mSN8;0Amf*N4PT1Ny01BIg;G~$qEu=NHnGlYDWN)(p(w2k z7{k^e!7LN;;l)iDRa$EKJN^{`hA1b~SL4`U`h}+0X|3e9l*Mi~=$2j1?ADb*94Q48 zwe5Nam7F+jc-TBY(K&K??0{Q^B0mQUUH*4Cc0=G|IM@szX74E`##57LCvnAM6US%; zLB9J{ASooMJeM)cfyK@f+B8@QXK@AdAO~Z)Fm3Vclg)Ujt?KR^Lqalkj%58Tw?}A) zrM3n>5R|tM0=%_P76@d=V;vC*Tp$ct#vDlQfhk@+c5Eu4tSE6pKlh0SEk?tb{rRo#1g~`x7}d6_E;<{yKo$l; z$Gio~xMdNts*E*6$D{wzbTX^0f0?J0$BQJY^-DB)7 zSrq{2j5b*sR_PP1zXOP7@@O3;?b#2GU!515FZtW4@r{Rt2J~PB-C9 zaK?#4yn6GN@r$#2l-MAkdNMEFZZF^qpNDN#M~8QFVhqQ)uH0BmFKxi2D}XaI^Re3` zHkAlV5h%S{C~{(4f+AsY>oX%YIND|DI>_Iig1ON5*l$HAO)DHeg`O&J}_r`0;bdK4qCZl%wJ(fqcq74S1aD{q$)^tQN3mLo*SQ=&6P{IeTmhf zckZtm8nU41IN_p|{idL)6(U(y=ENtAz8+_4L>?MPlEX2@b;{%GoKziP33dQ8%Z6zI zF?vwWOu|Hd2Popkxkee$A1e1m*Hr*sfE7<2Az$Lt?IW|!vM3lv(wD2{ikA~zNu*hd zXm)3bY3!E#AP8|3sgS3aDza~RTug-0PuvA7Z!1jCDxNk<3#cJT5v85{A4GBK7sHNa z$o;LqBW5396UOw*^NlAB*@5qp&d-zEcMQEp>_OAUOI)F;&1}Q0%#6X|02Gs!j8YFA z4My*SI9*D2mXnaBatk#;Q86N&MwSiXY`5=RwWoUI+qyAQKjzl>>S5ngAq^%eQ&_1& z^{omTl$$9tiied+#oG0lV|wM#SG|k_x|Y_5S&{LI3iIZs zC|{CgMO^g#t8*zr$HUT^j4>_h0jiKD4>`27=F%BYQUUhRrJW=*59o)80_ z@D3t^H|aoyIIKc&J-bd?QxaU(K_xuV2h;|VT?9~0qUCE`U-QlNW~mLU2tf0c&jnF( zKSt-%o$W*%Et2M^bf2uRiv5wCHoKN0_eZd=`6i$~1xP4jylmIad`)fkmEWh>+h@;b zmU(Q+j!=}ydnVB!B7AT@ZXa%0o920Q(WnnYy*zN#CmFsD1nvFlwb*Gmwy9MGm^%Vo zfzi6c?FIKy)B;_3vHr+*M2_*P4F5Lxq?Cm47#hm@xj1E4WtVbv?nZW~x;oF9 z+`oHUm!0txro}q?341HKYl=xiP>L1xTbXN!8D}AtNRYU4sL#v!s}k^`)8ou@Vs<1y z0zdgdwAQpBInKW1EBM6Arw=%B#Qui|w^@&@>!eCp*O(UBH!2#@_m$mT0sAMo$U%iz1M; zbt?qBW;Efvd7vx>D+1egT4kO{&%P&gu7GaY*x&%##8%UfuV>~yhir$#7Vp;MQOCsF zQ!Bnv@a%X42Ab#CE!(M7HX9wPJC=o5Lc`jADiP>(27w=~gJCkWOzd}hU)P56o4^D~k4 zrAqLNNvPy?aM#h(ukQrIOX-&T7u z)e5$La_>+IQsjm&#^hL|lg0YBxJsS{1WEY5xDHLt>XfI3XV9z22{w#V7jt%Jkf;gN zx4Zhm&*1d2ap}UQYHdcZIluP*JdXd#K-Xo+F2x`UGLDc_wh=DHhx(>9H8&c860EX) zQiINMeUtDD0cdw=RuK3R0l=my<0qn)C^yD-l$^Qazz5gFV1TJAe@yJ!a^m%7bLw(T zIgkbEVP&b1D(qC24CYh*sd_}77_AwI*fO9G0HQ}7;m=*!m|M;=FLqn>J zB*Gqgi;^H(v20+tQ37HtjZDBN_!pp}xFw2`kcbmOTk3On)g{2fBM@uyJ6)k&e{ zpj4)aRghF;=mA{&=SCxlHdeMLE`TLD>-e62{mCwHukOm1G}{zHnbA!&Rkc)C#v{)? zW|WOFQzo)70EXvkt^@%XE$-4KuF$2{Y9I&{C8!dCoHT-q-Mf3_wbc<%+Sdz-whs;& zkLP}m?H{zF^#!wn&i^uK{&kZ6s}K4bGhoPod+DV=PQ6Tb!?L9jz&iziIii*sw{s5x zF1RM?vdb_j9Q4{1wR59$xv~gBZ!%`bm%%Xd?)$>Y4Sw_#Jm9CfIS7Jpgq=g!o&|Yr zWoE6qV+I$d`o46zn7dar5^jWSLYCP)^&eS(^^F9syM>T0b&hHg4&-MMZPPLHk8jfQ z0`S2;uxle7a@5>)fH~$JbF0448_Y;@ln{Sx(0C4US_h(gxQ~q4Z^vc_xC@W^z%we? z3=fN&DgrfDN=tcKiS4JlCYnByOc?^Bz zqam3nynQwt29DStb9XHaU1`G2*gDAUx@d6=UgNGDdt;T4ZPs)A1MT zTpeh$p6X*y+Ud#GvaI-+cfx|EJ*e^|dwDu>c>zAGSvNfkK1EI(ik0d!2^cX=hz;zi z#z(~7GZY+HJR0|2n`jLms25sM6r0dFFzmb-%k`M9yRV4 zH94z~pj>RGs_LOs38&^l*4p}2`U_Q8o%vbBglP7sL5;7V2q?kf`+2g`sG_jhU5!y-< z?T){Jp-b?+a4V3v!g|w|_AeQen5kuMCFLmD?ItpCPM)gUTom_A|05Do#?T55l@g;t%Ju5c!7i10gu_;-u{oR5EOE3D-%Vsw07Eqka@ zarS7?N5(*Biv8vntVnLWvRZQSBs`XD`tg!$zI zx@Ra&juLC#M)lhFng8zsToD(CXNW%nNC!ihrI|Heo{*k}_;;KisN@*H9-n?;NY2aH zoTS_Rl|Z?KB~ZlD5$!Wx!>ZLU_CNN@!*<)lRp>{I^2<*^BM;swW4C3KQp$>8M7DOt zvgT$54`-cipKL$FW_Px5fg6l=JARFiI{8%{&C8U?Wf8$i_R=Py1-&)RweMR02R8Zg z|A$R(YD9AbAB>kF^Qa{(+22aA5=5yo)}7|b;zt@=uP2+gk=!hq%7Jz^hteoq!c z1$AsRRzZ5`9YJ@@(_t@!7W+3P>_G9}F%!jRR$Bo3QK=9oGv#~fzQDp5<-X9vl}dWN zs#Ic^aM1w=tU3f#E~mfe0yqmk3;TYvEn;owroEV&<^B;rtw|SEqSB}$l#%@g_cs)> z>3;eE-m1qPPp{FQJzgqmo4@S-e3u#_ccgQnB8PQ~Zw0oE^|5ug3a?v{L=N~7g;N-u zB(>u2Wg^;Cq_LGtzpCHgY_%+ss)>XW{imZhTq8C@M!w7RTdYR{B_hE7n~91X`Xcco zzJClfzMn>ymPeCR5^L1TlG2j0EOEvHc=kW@swT}nxsm+T#H9wrg)b-IDyZnaXd9&) z4TLKDvX)ifE-Hkx+MavKeC{8kg(5=N_mcjMj@{ZV`yoQKS-W=Q7hY(h%kr-SoK^3VqS%^hO>uijm51OChpYA-XQtOJQ+EiTl$`gv# zKj!mPJVvumVeZh!0N6AD86XgeR=Dc&R(BkNl}filK+-;~^FQl(xy+9C|0u|)6v=Fz zXKm!43kkBY=?fVx;JjUlTpMLV@p+h-p;_h7$rJ{cLlfBP`U32bO`Auu(^aEo8c&0) zT(*2>Mj)oJP$(QHmja_*fc@3}ZbW*MZH+PD_*Bo`)?j})8BYhxaMBo=x7AW;^^1*c zUeqW)!&4P?nK@9@*<^qf4<`-shQ+l)Zj8~#P*w|eT7?DA&ZYu4`^hCHA^t}d-?!Mh zQBTcD!)=Q?M#5seJMIkUi%jo*KiTRtdWy5s#~S^R}s{ZJbis2XKZk8=Yj5 z7-FN*o%|8r9Bq+nV>w`y0S;7)8JKaWPL@ldV8#^b2UF7Ql1Y3~v~)}G?HUa(l-QKo zI1_p>b}v1vV)a0_WCI+_hJTE^Qx|suL7n}&QVr`#1HRUZyQM5_R@`|5M`@t`ik1DVMK_Tay1A;ll%AvXpNQav+X^61E6{3JV1qptF6PJdB;)-AUk&exz33X6^L5jZxr z$?v*P5L&wa4wloOF-o91sREh8db-pY8{>Mam&os^J8PP|+SV0wVIw4d;&o@2DiW*A zKfQn;%hA`nSZh+p`4p(~=goId>$7t`6!7sPQ>j4x2t*I<_Ts$Su!Ul;FI0=7gHk(d zAVE}DN0(GJ9ncOOsDke~JK)$)=dGh+kZiJ<=x!>WttU$rA`hC`&a_Crt~wCea~7%a z=$wxBIEtH%Z!vfZ_miU&0d?KfJniV;dS^pB7{e+uEVrban`{k@4xR+S$Q^UFTU7;yD05(K~em)OwQWVEIV zNW@@n(y0W%ym`tgU)rz8(3LR&$p{9zh{4wRzJRH!7Dz_`E zT(_+-^OX=GB&b>L#q0g|Daf8;WSA4-=yU7p5$Jd|Q|^cXVOlLNC;@Qxi#WHl7{C^X z@VukUKpv{+TQ2RR*L8A zz_!C2)=~$RnM>K6i*J|3w^vw!63axbnu%VXX(T2$-Tf&1@of01R|%jK*V_Q6IyP4E9AD0hUhBfuW z%S6hR8QpYjRpv(@p)PKe`PyM&+zLB2A9u6Kq#Iya^T|xPU)&dp$Gx2yOMM{b+1-e4 z6^U;dZ_rRzUClWmv3R#le!3GMP@~Q`1lL_l!3W`Qfu+)^&sp)cr96YLiAH=riSieU zq#+M4|D;Bj2HTD*+0weO6xrHxA{y0j{!7E{8L#Ey)Hw6AQ~7#PF5#-yf}d&s_Ua~> zJDd3#+L~5#rRdlh!qZs4sg6<&^zg~y(?=)>J%6djAW&c%GgvArF_xMMm>K|H_VXCe ztINL%&aAL03RgY1$t^z(V<><+8Ro1pZbyd9&G+M6B`XEWm8nEq68S->wpNR*I0FB{ zJO;VB+-=m-t^uHAJtZZh?o&_BH`giWBpTts(OaT+8g5L1o57Bsu?D$G6^s-#S~5)v zh%#h;)Ui}fvs;uh92l2Q2)d@X7)yUcd4niXO-H5l{vR^ZRyVh`&t1GVdoM!e9Z(*( z{QGy6JS%iPv}s%$1K-}$H|n^vUwbbsABQ{dibGU*A+DU0xkTT2U>($|+`?oG!XQ|a zTn1unetv7jeLE{cslg(KrhrQTkBMN~C!X@w$uW%nK;D?F1@P*~Ku|b`hkqj$8NvNm zg-9e$H@IS)5Pws}l!+3;Av5wIvXPm>+GrK+4X;uK?mK_O^_ek~(A@YkvKclh;J+!W z;(4btv2qAmeyheQK2TJg)9bzT3@0*!#BV8!G8x|!FH~qAuj3Sh>yv=FZPm+KOLN_b zmS#)?3}Sq&^Z$BKH*@pEdp7XWv(@(>Ou&?LkjX&MDEG`3VfVj;kie&$z}K0n8}DP| zO*y(g(Njk`6ydGZ8N+$@>I1fF;nC9Y+vSCtbh0KY7E9FQ5DyM;H?f`vNqQ2*(GYmB zo1FreOOe@NmY3|YBj>j$a9k86`Sp4A>3k{1k}upl{rlKggV8^1Y;@lXl@4fQ-G|xq zca#smB2v;VPFmHo$j?cnjmHw4cm_I0|N3Z8Qz++=*L0&d_+H@eA+V(xQael;uSi{r zN%gP>WICIZ;E8j7FNt|!>oEHj5QhvG%CJrRF~l6JWj|u85r+wMjMh*FU#o~n(^7>6 z%2XKEJWUE7QlV61vhaW@e>|QZv#2Du+I#$)ZZwZcs z@VY>iRynKtq~lV4PJz?2?7uSc$bj?7}4F!8gmoL zzOo2|jnqVi3Xyik9DCK-8UMbZP}`nkW9Re9)*K`k@Jd_L zvB4igVynL#QDtmfu3*_NUT3r2sAay9YuCoFn#hMX8R2ioy2VD@r~4O6lPA?}-W9Ho zw*KRQRLMa_r)%}!ZTvsRTgL9aab-=9cxvw|q&^IS&dR@|;uD^Zat6GkY!i!3J0BDMOERAsD&Q)mXH`d~!r97gjESboxR zq*(4>#Y*Rh^AG7cSgOm){pcs;5AW#IIgw?9;Mn6^>LD@cDyLJiiSc^)&He{N&WJ3n z?W@F9ro7(}YAd(Gy>4>7Mex{BaHF%HV5!NM-*N^c%tqQRFl5&+W)(NJYsMJ zd$)Gi;~$Tpn#jGXG>l6UZ6nn~t%>j1s*K0^eDfnI9gXE&I}BD8oyR`EChIDj!uuXd(p}%_N0cOmH8}`VUzX2~{4Oe)$NF=+a+yC0Y1G?GIABa#BDR1jB z!8y(_T-LJ+jBBG~F;U$-FoFzx7(bXxMn{qhq$Z%9d z8L^bCl}GgvW)(;Ssp@^GNFVTmNxJP^FnMfU+w*!jm9)XQ*i)IT>~Qv781)A?{frYw zO9C>8&E^wT)0h~#7_OAKPWQl*(#AgD4o<`RiKP4Iv{^3^QmOLdUi(PD#8T!rn3Htq znp4!uWJVToszo!eS|Llfq>qhyc2S%Eqr{Z$^3`}t(PCtt7rTajeIxR4-{`2R(2BIF z5-@q~^eB|!C8_d@(+kDbL@l*2dF?ZB=jhhJl!+&&8u^8%;SNw`y4(C)*u<0HjVzGT zMMMRwMYDOgp{Mv@hH;g~ZHB&J;<0rHSB5i{Y8N%Nt?N!xlnH>s$wVXWx&&+Z1ZnDD`;k#g>R`sP(ASHTSfg*L8)fyo zd-#ru(a{fXNk^`Lwcr0(FXeMnmYq++MYX(Msks8xb5o`6?*;pCXtukm$&dTB5RZ^} zLZIqLMHF)Kf#e9*p%SmiBw)s7mNKmAjtshrNFOC-dkRbt&rKab4w_=g(hC2)N{cM7 zP~>5Q?yL7D+A~sc3q$slj*EnNCzTZw7fz9izFtnZY-96L2P?Ti|9dimHL`3yKa3(p z>A{-L1Vem_Bhq3qUxeB;cIcaN4@IN=Ulyb48U#gSK^bsrFj-^(M{5}(yWl!fLJ7}U zeEOVGV)a_495N-xKL-tK%K7L--@ZJb_3f=PA~Re2YJ=b8jD4KDeV`8_)txRmrY z_)34fM%$lc5yr-<7CW@?=a~C7RgEoHpxRS}hz$O=CyA8Mk9%u!K6* z1FO3BOhvF-kYU3Kng}mKB^sa2X_1u!G{w?K%(Q$E)go=B5teJ~)@)q-Hkw zLY!@xSvlYO2625&ar(yGBcWwP; zwG`obKLsdpZ=#w9$*rj*cksKn^{EOcw<1$VR*Er+0XsUl$8T$Wj8oWE*`eB|9BJS- zu-#a|!^N$ZXKM+;D_xhjK=y1A6g}4#8!y?r6^z9&!VwoTs2s698Mc-tkHMp| z-Ck>Za3zcWkjA!Rpoh$RyJcgc%)3A1-cDQ8@$9OtP)oC#Z>3tMNQ2 zRwbv`+}>zdAAEN&?VATQA#5S)qz1{xnHOa>Bm$YP8}$#yz(BF-*yARB8h0qNvNE#7 zKaBgvbmIZhls;0)*Of(DG=~RiQ5(huQ~db@*dPYz*Xlqu1e&h3avd=z9d1y5q}_SB z0B?(HqrLTY$Uc}xCCPDRFG7)*t7tw(LE=%P9eISCal)n1gHqcT-b!a)|GqR&NhxNoq=KSERpr!_*oL4JwmO4ILvh4TK&d4w1ye#vg4BRN;pw#gPgl<`L{^p`7`B zV|Y0#d3+)ALv*v%y$T_zSR%K)*rMiP9)msgJ#@CEM8mEwHu|+qywM;3grD8u7k{Tt zzaej$f#sAraMz{7O24OaipwE>gzsG`qw*t$0uS#Fc8cNygW^+{W430bX(la0-j3(S zY+&i$2EA;gOkRZp@g*;^;2h>2oR+|cyOx3>(RJJJVdFdyUeYb z?*WAo|G}&TG2>7JD9tcMVy16pH?VE|cUzfz6D&u~yVA$bD?l4Jn(x*`P3#y-PFjF*s6bIq-{1{{qPPuG z46GyW6B)fcE8g#`y>J1xtm51MU&FNaq;YO{hw|!TO}6 zLY>?`1{+s5a;xW6=adzArsqCed%f@x2vm%@h#>TVHhP*i}Dq?HPbc+?`@Z;aAsv0maB`ExdJB0 zehydrFpa8J85+xGr89mNAOv|~;=-o(bZr3J(Cm8CVz&;p+QF=97L*5^;Jjd_8T z_dmx%jld6A3=wQ`*Fla{jCiNvD1nx-{QYxl6NjYLJ!bzO$+x9^vw7=(Gw|D4n0wz` zTmc~nQ^2vD5Cv2QcH?T8XDLU zo`#EreELI64>9S`{kkYp(PlwMK25g&C~~!aB0Gt1^6#;&fDOCmTb&|gf5ImAk1A6I zkgBKlI}bAaB(63O)m9k|>(M#eLF1$%kX}G6PNm8PNx>NzoSQ{R3rMr6RZ}tWB)s~W z$j66-S6m?;xD~+<{IcG_q*#NsT%0y_9RIiAGgKH=yoUZpxc3sCtdroRfk#kBqo}9EL-$LD z3qPk6cj^Y1k}hvew=rMr-v9(YgB*hfFC|>P}Nd#Y_($H|C5# zXRY3Wi~dx|g5*Z1?LmRPPj%5(fcAGUKS=VB3^zb)%o_N#;??Q0?r1?jeG0#RzqI`r zL@kvNQ|DE&k}VNP_YMS&J671eyM1q9?9F(b*X^>y&r1!rw4Za&MC{g^z0Fq)tCNfaTB2J14peS9c66rgTYfD+z z%{GYw!VoINm>Ey536^g+XtC$5mjMu;=)ktCDcN*s{5B91DL9bm26*T;maYO{5B-!F zIjA(9mGB2ZsRnT7>v($v1#R!h5*NP==8?R=^X5+owJSlgJy*2-DV~~XGvQ&|`xJ6V zh@YCW*f(RvHcS-@^zcy%)hJC=%wp#L*D5;oDJ5SD+8}-Jp_}gF$m?HGd)FH9zXP$_ zZG)$XK3IK3s7VsC+6BK6ll}*XC59{fUI-|ztN#aggk>L4Oee6~))SH{9}B9mUE5-4 ziGms9o}ZGW+%+B$ri}PQevQys2mj1Svu43j)1LSI@RH%08a5T;o1-a)GndZ}$its& zMmSJTf{dg&wyPLoYej-EZ@(uvqhFTzsLK4c@K>8S`|Nkvw*A-hu5_wp07)EmD#Lxl zJaY0Xq%gbb`XjsJ8Ghy2>LnW=U&U7w0VYFDo!<$Tgak74x)$5u@hrOH2pL;kLBugRvkk;jT3(r4)qPC9 z!nrMR)_TRVaO$}Y+yJcYc>sFID)RrtfZS46ww{tnI;(^u0og|SWT}4JIeAAYolz3Z z<&-r&wSZA`FnyAHQ#jEsoFbY6?7=Gl`}qfJm1w!g=CQcOGuI;JLXUMim&FcAl;vmK zPXZp)An%)CY0q!GEb{{ch<&F70*q%;T3|q(UkP-JjNrgG;cx6MHK4y`5Z0KdSmtkY zQ4bL6OxNGiILnw|#=18}tC+^TO|i54I7TQhT2sb36e-nVwY*TW?8kJ_klag z2j=dMhK^>VqY!k=qsj~Pjh(2UdH8%!xK<7YAGEhR!t8q{5i`|fD~@T6@yG8PDprj@ zV5CFYX$4PLqK$o4#_t28lM|Grow#@8Mzc}xwSq~_u2qEx(05mIr_hjCNxY5G3^i16 zaJ-Eo%)!CK@9B>)KnGvOH>H*$Uh@yz^uX4;7SRpBLL7Y+AvweOpLaXO`zN$?hELjY zUT^&;6l99cSVz^;%i*>oASA+MhEu&o5^W#x&jeC{%{h!e&%VPz)VI(^`Y>C;R2r3M z&Y^7}>A>k3Ae>IEHl|L*fOw91S!A=}Advf))m*-@D2XwtgHTpbCpfQQ#S7h( zks85P5rw+3jO!U)hNz=COwLZBXA)ipTmkx$CH5a&m`t^Qlj?KPi|GoswRi@3Wn<$x}QW8PccK4Z9wL07z>eN#1YA4CGK z9@h{biU0JD2cZ&UYDe(sxzpga^#77g|Brg9Zhz$ooH7J_&i-LhhgixwK%WJ(YV1f> ztXBnkHrNN%=*um19QG|wQ}y0DN-&tV-;3DM)uX_>W!LZ?g?6LR6ghxXwXqiRK0>K^ zK-zTT;Aj4h{fd5!o^GZH4j}0Wen z;EQfKs2gKeJFJiEBZCCBA?o+q2sf9&G8t+laA+)yYCDt_$t1Dd_;1?EdlgVDO6M3X zf)O}H8xp)$jAC1l>teB8NC<9%tjd1b{tE@e#%|B^M*vtDL-Aw3`&FP!cc2-~kXz9* z4C!9glt6{0qku~^dAc8;p+D;RRGA;caKj@IU6v6o%MpF;r0O&*r}myD#Y>^Xf=lEjsm|yUq)bIJ>HJA5^rL}wi zLKKAK_CRTMkDLTeovUm)t}+xbx7tA^;rW{D02ZEL&AzGe_n>6ScIXAaG%=+c%LO`G z)b)y`fWeWL)%9Se;`ywpufWdzW769*Y+6J8cQ?%DCWAekvK{P>zga2#dKoC6PxM(v zCB^D(j4OHie@)ZCyI%YoNBA9NJ%wefy;43`{vI7Bc^{psY9x|9`x8PUgYVFN|M}_F zu{gDpm-3HsIEYHWiBBMr`zjuS%7dZ*Ms9Ik%!0Qq=Thh&s@yl=B~o3yS|rO(jU6L6 z1NjQvH&ZE#j3X5$|Fv*+K%Ts`3Uaj=4BETZng6MaNYkkxVOEbVdr@A!vZb5Rg{Owm za7uThf>32F1@~&5$3B`6glMb>tjtiXJIB< zFIru-T3qQz7WK3fdg7G&qI{w4L}b1VqH^U5DP*yE-*`FfVHqhQYXem<~ zHd^}KLws;_uPypOVb(O^*4rV9aVMd|`N5oER?IrNruE4wBpEFD0D6c!L%R<%HwrDm z?zHDZRWolr7=Vo#zXwp!D7Pvw5dRxBZ7Is<=)o!0uE#ioYFvhOdMMX+K3|Ajo_WSL zy}yT2V8d)wjpbtI>p+8hC|cEnwA5-43$%9+hbf`WQ9QkAu~H zULjXdJYVsK+wY2<#Fq#fIWF|Zrlx)LV$Ng`_bjT1*t_kWGZpNR@-6cg>oyxhbIr+37x6f zk^BGD;5m+$@E-D%MQyXRzI`qHT48V&sd3-`zVE*G=m%_(Na4E58HJmSM++$#7Yo@i z?W0s~M;o=ENXp!@C(j^1t|N&h9s*QHBTb6^$)*1hD#WO$zvB*QQelF0Q481pF01jR zDxg0W$5YFFUd#g*)r&HZ+>4hA8rJxg$#orZP#{E`)$7y-uXThLi=VIZ?Oq=M3Kp?^ zFE?k>NixlSvlS)m#X7v9D&P8d^n=Z@97&5;BSxPiRV#qt0CDi=5bJ=0Khh5L?ATCb5^Pkxn(yGBOQZhCrdhdAvhBzUPkx3(GON(mpmUs2ahmMHNzz_eQ(E z=N4B-q$IFBbcx$boS!$QkZtb{&9>HxHqei;{XUP-TX{sn^X%TO!~_}!y3?f4L)Sdi zY~SaB;m##`wGEGN_)--3+5#3%4oAIoewYCIK76|TB)NF&XkQH#vkeFMBUjM9Ub=-8 zA}wQf&_U`)#$+d4UB@j_URrQ?w&4rB$d(TAd*mGphvXsM+`{jU3V+DD$+U&pQkN-D zhq4Qme$(uu(=O*?KiE6DaR*Gqfzjjbif~PL1$dFrQ0L zE`9oT@(9R4_^b7TlWaGZGctobiOOZOegy!&V40x7%?{Cs(CDvkZaI-vEUQ95RQNVh z+wWl)YW^nZTLDwxwXteZ2xwtrWg8Jt!41L&pld%*FM`pF<+jO!{&ftWkmOQfj3+;Z zn@(Pe^fBWmLwEtOO4IF4akofoQFq(NM;d!e^%I<7JhGU+TXD;EUgKprNM@} zvEZTLY-p#olRQ)Z0b!5NK$+oJ?-L0)qr025UV5` zUbU;2I%W+l&Mr!(`X{M}s7MO&cf}Oh3+7Hp|myL|VgEVCPSO0?xHgHnnPX!Wi7+MO& zUqlT`Y-Xk$es!cNmQY6OdlDn2Mu*Q}1{%YQLNgi)tqIK*G7jY^Aa%tVGLy^ql;9}; zJ(E3nBj7zeGrD?aF20X_e$6osbTf7)b~w*YU}bm%yGfiCIk?`%XhnS(&DyGVVd6iy z%TRg0pRPlDnUW`?-FY+c{>j#u^b@;N`Qb+P}w(9I9PdovtF&9v3lu?4zqi=g4+6rPf`5Sz;@RF;D;QbKGV)AS@HPPc!b$ zbJoI74^I`NPhJZ_cp1`+^s0yI0+PG5MgsA6N+`Y*EaBu1%RX`Tv_heV1#-!e;+oIbVu=dT(Z~(yq~GevFup3Cj!9=dk_1KmIsUA1Y(mI%&_d zZtUZyzd5z}P8&xjB>*59C}QAC-frw!^(mco+yS6#B0*9+15RlC$T`&#O|B_=23Em0z=O+Vq;yk7UOL zk(oK%MSo1&M;<%~xN9!qP%B%eHLV1D9VE5h`)sN0?M38Cwiq?~cehP?-vv>!LlmGK zc040pHzP~|8%E1wCb~p=-Z7k(A&K4xrsi5vJQ3;yitSFM#?w zgu`IY#@PKLuo|bH1r6X7Dat?}=>C349SzjC zi8!HU2{sjiwK|c_rlfjd2W0uYlt(pReFC>Us8b&gx(_=av|a@HPQ9^1q7tq(sUBW> z;X5`v2?9Ecga_u)w}^I8Oz_gXl2yJ1U8Ay3;;gK5(`h?|-v$||lcoBRTRQ&mIBud8 zaJ1yD31qO0#1YVL2(!@?Q+BjdoWk-WT32RSZNQ-N&dk52#jE9)En<5&4=Z35l6&)9kV z53ZWqR|{%jcWmA2KBD*B`FTD>N#bW|k!&F&Pa}(cO*ZTD*S6&`AlukzhdqYAk($Po zHA-v$&!p6Jr9REObBr-~ZF%$Q-~qk0jTU=+&LFd;!tQS*Ya7-&=emIXc}F@k(+!?* zMi5>3zxu+p2f>T?Umo}cbuIIIwKzY`UwNi^T%^+Q-*w~3sfOLKVuIs%7rm_S4ah~b)Ta^0jSFqsR5x5%shqL$#x5>YO<5m-BCNF$s5gE?% z8i?Hs4F*@?a2l2Y+nDJ}_I>BxYsS`++ghR`j87o?{2Km!B4bc$E1A7{;o)mDi4@S) z03Aa;kIZJC%4~4F@>jJ1&cv4YYY$?Q^KMv`?NK@RP%wJ5ZrH5$Q{fr>{~dK{WJVc7 zn!v)>jm4=_*FdfN)PxNLB0toPVAz)=Nhi4yf{z|q#zJm(-U}c1Y%i5mc9E(>jMzXl1k^bO!sH_P>l%0)XO!fw>Q%xMe@hAi*QosPN@ybxCnXQ z*OBnCXOm!8*e&%wX>fyxV$(dsv%I^%BW#_p8&mI(!VWLZz%^HAwd^GCb@clBeeis( zNyY4}U&Y$Nio4%tWVtI6R{910pyiqOJ<)ZDD|Ey$=Kapf)6w%^{x2I3gYSA?a%x;8 zOKWTFH*fd#`|hRETYd|sd4qm6Ex5AtPNj4!1=@ zNa0K$axORI7|E1+j=~JH$LT}6@++XcaDU#@ol%MV2dsPqiCm6!Q|u|>8ePQ9)FjG9 zXKVGbTPaJVKnd1*;X^88o z0#PHA>Zb31D_rK}{0|OAb4jB84Euj)id8a)CN-Yav-BOpfus(J^STYB(XnGym3awcrsexE&(Lo?$QvI1rCeGmlqcYZ zj3$E*m5oDP1-qfuR3nzFemjKf$>*V4jZ5dzS}c*86Tc(1=g-&*4c+DDA5wABmFmPv^^B*kKsj=A^}WA?}Bv^>Fa@m zzq@gPbUyA+ZK~6=9(*lPrWzEhs&75I}CvgajHpv@m9<%uH zh;Y^NPr=Xd$vi4phf>N6fErOcY)?lswjRY(^Vo()J4Ea5{wK%LjVVy#{+txBV_U#H zymQKIaI~5-6IRxl0&w<6C&{p1;}qUlud^j)B#O^bVz*U<#{8Z~$u(ugdn2392h0AE z*Mjn`(yf|rql^nJLS#n9IfR6^B%>$T<{vGcEx?*WhF`aITZAt=)4AMlOKoTt5;G`@ zWxaH1qg7?d6|N1vM9F1OklywFrX*-O$f8mAzd2?=(c_5=s>0=pR5+OB>d(EaYizxq*(qA-yGady{l%F5+0FxH@?QLQV}bLdAXCXV*ti;&q9nk|&0? zK<#q>#5de_zOnvqg2dhZk6%&UW(1R~>?_&~;xE%ri1($TzvFWNsCk0d97C3|K0!kz z#?|x5Y|Q)@9_^;r=t0&gnkVt0b50m}6HB=U;>yY&Rx}oQmi%v3$epNuY>k-UxsUBr zd@q!$hGU9D)Gzs6WK>a*_R%#gHTkkWX!Ark)w}ieEUlA9r(8d~OTnH>kk94?Y=`vX zC+t!0v^|`?shfr|wvaKV%^Km&g2wk@xE%Tt$2l-Nmu3@*;?snQOB^Z8s41|W#nt;E z9$1HkZ71=)c;FlDg~t{q&r|Ca9DJ0z6B`yKI5cQaYNahw7!5iF z+;w!+c^0!-#wHv(Tt3`0?of7ogyqnfjQ6(Nw~5P~Ia`7GP1wJ$+DJjf@lvx3P{=;S z#C#!OXA+(29bKK)!_;?>qjZxAOPr_=RjuU>+zy?sy-E{>WUa1Jl{_2l>VNMgaLfUmb2ro8Kz80V{Dd~f5+JIy`axOe_STn)* zgi^eOa2f5!WG595j?>qQPyZT<{SIu4Q^IdWt9X&{xY{VYeY5+QLt=B9!5@v9xNVv= z3zjyXo}xno)IlI{L{z-lu{*lQ*vaM$vFyP%KZF1ey_(QNZB!;zCrKwi16+ZIL@(q! zuJVO`FIG(p(^NjFV~VbFy{30#WA;Ur1|?B^ms+1;nPedhAI?`~_M(9^FAP(aYpG@J z0q;dRtkfK>RNieyxkI}tR`m~d#9+d-2v8awfFijrDJX9xkCy7l>KTYXFdCv3=r0{9n%0}SqmcBq&753%$gW3X75W?riwzs~+*$lQb0#Z6U^3Dz#nbmX3D+k$ zsZLtuY9akd2%+(O{^;H{a35wSciAEZ%D>LaI&R_;CZT`DH9#RZn$-SLK3FfsDhG|q zA^CZ+5Q}Y!DwHfLjP=+SDa_gMr!kuB!I-BjPIz6%@`z)P!_qdnq$4B)aXiosF5G&@ zSSn~)_v_Cy@~{@~?(&^xJHj`N_m@O!nmbdCrrXLORK06rxsSvE%@7ZzcDQ&-IdYas z$r2Y?6kLfmEKy~M{zggXE!CbSL>2U2^YF}>TB1$af4F=KCG=rZH$b8#!#1uyOn~5< zN&OP>yRoLCLJyjoDc+?nwgx0KO_LyceW1Uk`+z*fjQU<3tckC z`lKJic>I+eJemAxi8Kb|JN}&}OhNGCs4lD4WjO$fDgIKC3LsHYVM~Yj@R0OJWe3<$ zpm=!*kkL4TkcpeDKT?wj0q@enxH;0KNIIThO{EvxfbM)L`aif7NtR+{klb*dZens? zpv;l@>AqZz^{1dYX4y0zLuU?-Jrgtrl&)WuncYg2=R@ZlvXb^@Te|-JRgn)~eqvZa zej-k==|FnEjn>!ii={@EKbz1d$n3?fguJt_DT{VZdG{m-3R1q<5Rrb<^Kbp)Vf~k| zc34bv{FlV{7WFd}1>P@Yhm$D_^K9%j8vJz;l17>p(>McY93KxPYNl!)`HqHieO;Jr zDprfwW^XoHh*sTfo^=Tq6JsGlBrK%)7%K%OlD~#Fhju(ZJT)E_#`?>%gd7$)*&qeo z?vQkLPdgs_*o3QpGsWD0!2HwK4Fpczy=E!#fu;IdQ~rEk!;V~x!$T+;I@4J&_&qCX z{MhMNGCE9^^`l6@KEi)TN&oz^LEG42!dCbbjTF59MZ%x=H79vx!zlwpUQR8!3pAbq$DAprgXFc3giOrTHJ^lc6tYea{BqiA4UIzJ98BoHrf?`H8Bg0dr2&Co;DXP zCAR$JH8eX5@S{w|d9OZeZ9XMa8?fzTF~ol!2TB@{V{I0i`Ft5K6-=ldQ#9Nw$_V~9 zr52CXPJ>sqj_=+OrQ&D0=xivHbRL2UER*Sxvv(ip+TX6dn59dNg;rn_keIZ!$}CEK ze_?~Sc;l{yQeRXQ&qV6KT%vJ&;N{%k;*Iimi0jNkFa1Dzk z{T_J&qr9l(#3@h919)kUVhbj#(@C*?<-W#j(J_2NSFgSMwuO_$auULHAKRdGb>!m8 zN$fV|i~qU~q&s~LXY|HPnj|ow%UR;EnLvg{5yGH|i4pZ_&ZY+}= zAL&2i>MWCC<}dzX6D43AKp}{eL1U(TXMBto%mG}9nyPjrT?Ket2I`$(Af-WGBh_esim(8 zKdq$pKRA0asXjh7`0x%1P;Pt^m}$*LcscMtxbh<5PlE9#< z)nP{vr?H1wo~K5_jmw|}z0*PMchY7rBhjOQk?x}_tbfDirx>dK87};Te1(YFA7`EC zyr4Iu;H@Yk)b%qsBjXZPuChiRSW5tWW4BQoWfrxCVQVZ{1X=NOZ*%&2s4nU{)3w>aG%sr zJ6`&Ms(%P4N`2buoFk#iUU}PaLfNbVl-*S?URNEgJ}&|U!F^>&T~Y#m z^S%`oNJZUIJo4OPTC(ttft?QVKGfv)*$q(`n(tj&LiHL-Pf^g@z`-Z$$9%iif1o#h zZ*8ex65a4k_NWJq^TrY3r|4|herWonEUnGUUpljx`WIi4SCR7}j$8DLstaJf3&~5U z{r!_wyn>I7W=Hs|Umem1f}}!~y#{&x)^N!f(u%ff6-}WzQ8X+98gj&g$^)cF+Q`)t z;xC1x1vHw-dK%o~O0H|b?BnSaGFl~bp2jM6pjXkL4{R(PEFCRWHTA!zn3`^%kI~-pVd;It5nCC!+OXAFUUvZ<^nhd2T`HlXTr+3S4?~@J z5;J%N0I&DkQ^=WIf=C95Hq6?JV^jDZ&RI>a5u#3l>!;c;7Pe?v$#5L5h>vmyr{y{UH}2t)^Vm8cZ_By0>VBrFF$ zak+FR78v?eL>y|+_X<-Y12ie|g@AJ4rbQxz>vzZOqCK4mCPC0eiydTTWrsmyMf2Qo z6QTCU@J9tEUgdobuL*#t+{CyE`xjTQW?P53V6YC@4@2L-bl!fP_r;pFVsGj%U!!7- z>Ogx?^0j+*!{eyfrl9_n&@f{!4pkI2YAC$mP~h)FmE- zpMwBBcMfO`PJ_isi{;+P#gb;#cq`&Qtd`0Z(yv6h#XQ@j=|odb zAId1=Fbd-JfwoEj#rJD^QF^3oCuCB^Ceeu|Eb?AIbLM`#T4`2R>i8e@kTfE+HXo0Y zI2i&Gvm3!teh0r5mh)o{UY|dm%y~9a7hQl_kWK?@6VidX*Y;COhNSTlq>vyMA9h4l z<|d*-Tg&&76VUaDSi9Xaaj{a+r_`1H@9R;av8j|`EpAa?=0ryPFCX>fLTVvDYPU*z zZDcHuoec&lE{ZR%85f2pp9>vHvev%QGw1d71TX33k>Z6AzM;>xZ9#UFVI99NROq%K2i>3+F6~jmhK33Ttnu9B`SimlBhA{t#?y zNT)j}P4C9i=ffH*)RBk-r{=u~n*X$6t}?jxH>ilgi$Jw4uLjU%$v3)saoZ zN?A!~UH`@XEVBuv-WX6I?rBW2JM8!Z7z_{vTP~h-pRz}GnS2@`e zUTnYj&06izhEF+5Y3s;MF@V+X_aJFT{7~(E-Gx&`uqS5x855V*(jg_XnQq8UjHozm zkpaA8f#YR6o^=iWb2_%_om}S_}sL72gNNKJ5 z)d5IK@(FGU*F?kZ38sSUwN_D{ML0M9{b_B1@fPj*Ozp<&7&B(fWlDo=TaC^clP7D| zy?blz%sMZY;DVY|(?sp8EnQT4Cw%)qI1WL>l2FS#|RQ=zILp6dM7WLLN zxKI8V6I~6+=-MaMBh~4|U-;?NQQL{Y?mYa(N;xjxw3C2DnKrq$#1lYnq7J5cqBp_S zmZ82rBWL`+z0k3^fnXjfl8Q>F9fN?QLnN{%ucIjxWjfP&0O?;X&y=bXMbk&zYNPfQ zCv(n%Qb)js>%qpYq-Guh6C)lq1(Q@tKf;6NmlJR8eiyZDr=v7)B3mJ{&p80g)DMAt z;jYO;lfzgPZPmvEGDG@oJ0liSkMSWV?jJg)S;wbA;@^k_X;ElFgRz&kHkzYO#ssG! zQRh~dqn;kXmu@9Xlz>P4Sb9e3(D{wi5B=-&enJS4&=RLE<$4Su{5?V&$0ogw8NN)n z#-=Z&@$xK3-A*HNrAi+@TYK&hy>o!dKgIxIPket3cM9XQP2=reT!XV~Xn%f=`Lp8s zN^&)sLm^B&h3(VHOd>V%^;_>2Pwaq)jl za_m=X)xe%e(IlJH_2*IcroN}O*W*UKBddndeq+kMp8oVUEhCZC%tSx+$<*MsVnagO z7R%G{H@iBAOHF&|L}cV(6$7H_-*^01`VTJw>D{K?vd}=FH8oA@uWVS+;vb1)Q;L-? zU$T>L`@~dh92AtV&N9?GyfDwG;++BZ)YL;8kYU>T^{PEut--f6Zmi48P%vktt>+JG zSX6fUk4Jnm?wV}xYgHy1Hm?Rgj{c$$`81-So~U>Bco6O1p`Te-dm=?&NE}^#5Jg|n zs(@n*t)Ik&1H>^jC3)EJGFJlI!=IICzz|F2^4knADXx3yni|_qE75gAvkUb1BJFQ{ zJ2^?(toNp9umLm3I*WS5)kNyDUkUsa8W9w6NAjmi1+y*c1(zE?>QEKRolhZTl6APy z;{VGcJnj-(z{iLGs*S0Vgf4BLZpQRXgh;iLh8uMH@qxc7-%+p3&5xAfZChVKvOuxp z!z*KCh|G)g%)yA+F61jsb$i~eusWGjVXUNyLzOYL6mvC1GN$ai zhcY2-b!^@Qfj6p`3T* zpZ2!jf?aTDVK$V#Y@f9w*c8KVlQbvnm@GY{OwVJ ziuTu-S|Xu)xZ<%2anCE{S)?#fd?cF94;~7NrWM=Yp1#sNS&if)!38UV;sW=T@CE#X z?w7tx(Tk21c``-S0%%HVYvE3Wjn()?PdSLJ^>bGWC|B=Oju;N3PUFK;u<&ACyIW&z z&au64$f9Sm-sr9HQl?F0`dMM=4ROmVyU+1&Ab@`uOv3psrv=La^pnm^RM+=@P#ap^ z^xc14Xw~z1xzyExsTl7>m-|h>ddVhWpeo%Nb{Y{;HY*vb&wZW0@n&tmlU>{Vbta#Q zco_dgt51pCL&e%8PT&3H8?+wBXT64xDO9NFaK>wFLez{`*uEMU5$r!5Q%F;l^;H|~=^*XU#UUg9tHfq6p2<{~ zhj>vOv?9)g(&p%?U9yI!b!PD@k7JeEnz2KKPj(U?9Tl&B+tYKUk+Rd!M_SD;U^NRke*?EZot&Oj@tAu{CZ=Fp zyyUl!!P6^Wv1mRYkbP-FyR6T#X&y?_9}!s!;>d75|e+`U~Y+wkBH zUU7g;H6W8=E|ZY^sWulm&zyggn#KYzmYTXQO)+JZsCB50CbhDLOU))`@)yYYoPdxcwg;B>)w%b7)Lu>CH1Tors?+lbiEcvR&DlxX zfZVIGvmwtwwFJ66Bulk)fE!gF$#wKq4Ewpzr*Y|k|KI|j?_@+Rn{H&UiJ+u)lGMO) zv24gmaT*WKH8)#Ez3$g`X@vvlqvKI6rr;q+JU6yv?@G+}D9%cJRx}xU;a7o95BY=H z)!?Xo;tg(92#r71U2&Jtc@r^zeurm_8OgoR1e`ra{U0BKj|i$Uwt_M5&1ExTVHVrkVN8YWnzY-?=ZeN0=xoXZWNp(Z9d|_ zhGKf*Y}w8ZVa>(oAoRUj6ZQe5#xmTHUq+U@3pxxY9l1uc^Xl^+>$?!S8lJ2Z;jr)z4o47y zMDB8CW!UmJNh_J%Utb{Riz{w*)46|(LUEi@-g`Yg%prmsSas+&aBMHQ5a;X|<>CSE zVUqhu?DJQG@7V|&Ycn|LUNrJZc*6t3L{>oE1LDCzZPs~~4}-xR z?5=SokE@X~oC4Bd4P^#CxG#T(2h_vwZ(|;&hs=arG%FLCK8DI=;ZnJ60H)f|qWF_^ zS}0&=*8G7GU?e@7IO4j_o&L_|CN~)?+HbYd-n}HQHAYAFohI#%!VR}y26nYh(Gg0y z?LKEKUMmPPoFo9_e-%%z!Z(o+ZJ7>z@mfaw1WNl6#6PWYNCX9QFH+rQk2-br z^F4==uskJ-KaMhGQ)dv&Pd>$#dR^F@yH^Bae^HO7go53Tr4^t{L)}Lu>_mfPLUrvS zA1~vZ5d75`^4=P(GVj?wrAz$=A`W^xIO`o`$n$5GMky0q7^aSAyn=I0_Vo+b>~u7<{7>^@#FP_O&$|(gE!d zatI-yQ7|DYUq-TF0x33ybu?2(#;S}#!lb_tEATqE3o5%1SA6iUQc7VjUQH5U)b;d` zF{7v9>j8|YGKLKLyUI9$Cm| zKErT20B)hLY|PN1-zLE&YTJ_neYTOC6k}ux+cq|(#Qe1V7orSOj=P&?*Rcu*8hJ!U z_;dq$dHQd{)wUat%URKp`_x-+s;NsW_#^?Lh1WZHS#>I872Xg$uQXztTCOXPs0p?jybF#iKQP) z7iKQcM9H6+XRXR$yhjiqe;4$lGJ@kRg41po(IRnvetL;}3X%=l-}2z|4{SIA?e3Sh zPF~An(G2N|RNK1O@oS2^xzCAbQXNy%Y=Vf*@;*LMO9edG9u7L~)WUCP-E)jfOFz2H zeCH9X%+NQ5RK+T5y9>u%!5GKUu2Ao5ZI zuRK2ae{hcT7~1gXbD=HgPmvJ{;)j*028rM>V;T|BkHi+I2)(*L{m0Ex><%4IjsZe6 zYOy^gR6QeO(E^#Pk%}yBl%FCdKfsa2mMKF|3WXw6TA!naqrH)aRjs_m7(^4M-oB6C zlkkLbqpsD*lE>`nP0lp&amil%AoL@Qnqu7o7iC352Si|V>>w70@RI&+%kbe(ocFEs zhYyDzbw4}lt;NOGI=R-61Ochn>LE->Wn|m7ASW)hfmmczE5RhEzQw7hj6pLTSF!);Uz$)UbOuWL_bHJ(p+^>Frxo@r;Nx7MEo@V$o z2IiwD{_tX!k8hGWY_m+SiG8!8+0T>pP3TQG=5|>OdR1t$BhCcD(P`r*xMlyb|DmSi z<}@~7xQcl%)Wq@@_7K1Hfx(Gdl3sE~f5+-XFi42mWM_%sHhOc+XBZHn(R{F@{~sJJ z#>&P*T&)8rG6Mr>vcwKQTmz*>y-Xn>w-ZdQ9V3kgE@ao3e=5q(tn;RXZ<-Es^XZ?E za)oSeq7O|U#t%lZ=j^?wmbGujHoCF+W7EXGBKMJ+u;!6y`or;9l`uJHf(YEcx6cV|v%EtfmtKJ3GNgD*mf_=q#C} zJ9TLL&6`9%f=DkThcHQ^^`2yM+720NOf*@+uMAw0kN0Qhm1lP~2{b>!py6v;J>4fK z2NoOQG+EwZD|gg`XZb%*uWRPcwA8UOj?Af<%A-_$^co)YwQ^yUC2*)c6hsftEwD5q z8?l)VIQb|_jNmr>pK%ZQ#=WPm2_L^P3h4tJOGMo{TOOQGHebO;`}6MO>`>9it1kq| z4X^O_gwl>r2c`H1nd17&R56gLRfN3!$IsG^7aTKX>N%2|Ron&n#DCcRlp=b?s%5*( z)Y?I#jQ-yffwNz6r3xE_^b>@nouI(!Ve@@c&D3a2;VUWLrUk41eF_vt!H2&(q=}AAxFn$3Bh~E!5Ospaz$5tRKGibSW<58^L5jIf8pfHVkmdn;xLK6D@?o7 zPGK34y$$veyBnL}*V55=8~+rW8+M&KbHj_LFc_@OCT}=QDiuF>fNO~>uKo8$YA`NS zazsBe#zn0E(wvcJBVeFB-bamC+K}2u7^`*D<82~uC%2Ba2G=G;0WG&ld^~a5gI-;U zCw(az>LWT;r$_3m*~vy96C%}+av3pFW-PY#YlkTwXhziDTOiY4pMwCi63?Isc;Kl1 zB{GU8Mz$I)=#!~bb@fB|%-`(=!SfUEWzW~}0lf}TTK7**pPyyuYA~PRhnp&wKl+r9 z0abV)&anIBlF_Pzvm<>g0l~+(#EWTj(#NmKIPoWF80f^$`F>^M>QZU+YYkOxCSmpe z!3l zdQ>?sepG+rV1Z2d}(IS7_XmdBX%c%!y+8IGnv5ilml(f^pTq8`Khe zdp!<$4%X7#c4JFgB3pYfA^ERar6H@lcj@Bk&oLERd zPi7ZSf~2ly_}Tw__H=0hZ^d53wtw^1J-Bt<&p4*RJa!m;_uNNaSqW=FSTygbTd#LJ zXA`nDthp(uh9JZHMUC{N(ot1(x0rQ$9$Tj7HiYa`-Tnt>G$*AB7fV*kCeuxFxql#N zNXoANi2fLCBj1-tBrS}OT4QMRm$)UOC=srXPaz&5$A2E_mWX2Oh5U2o@?-rlRiMkF z<_f0B_Lye{XouL@faG~O8uI(Sr$bND!AEfBzL|USbob)H%|c-HL5nGT_`sv0h}1{6A!BX6&v?7EUT&*zJbf2?QA_t=uk620N@=X!s~&(y_S=Tqv!`U=`+Ebzn{E*YfAI5(<}ia7(cMrn7G8v9hs#SA;PJ zEQ=Uf0wnb^LNTS6g@?nhCu3yfqF}ti<{^=pmWV{Myy!sg0OC3sKiu~2f1 z$S3x~1|*UnVYbh$sd+M!hjtDRn=w>=Nb(B!dCGJ!R?i;C+iBTjIMt}KKE#<;GAvEg zv#A5**zan%_sR0ym|Z49RH)d&j!zj-!DgM|Pz8+U=Fm)TL&~$^<)z1pcx9AHQi&7f zf?K?vFA~pwC8@NJyb!;O0j#d^u)(TYP*P^0$zqx`>yTh}^DW$KjV?hVccyzYwf-8L?QzNKtrll3P!Y z?Wn_ERKw(-)>C>UTJVU9v2f3+lXahOFT7p-M~(qN1SA#!Jfb2N+xwij)0rz&ntyn5 z%)c`4-NMMb_HbdYMQQp6hSN{`-S=o(q82HFCbj`wBqhp1Uvef51S~krDKh&$g*1Z1 ztN6Whwxwh;O#97QbNTrMApTX!eU+FA=OB#A|gGtt$0L4bhN=e z$XLaamdbLyAFkq33lsTn&pzq8URLc)56S5x&?=PD6!QtI#>ptj7Vqb|C$Cl{k0|BrIFK|dn zarG8^t99iWb7(Gxa^Y=)TfRcp`;e0x>^S+g=boPxE^QuB*b@?=B}XE|vKzL2c^LDn(!Z07Wzet4Dlkw4RbXY_e zLy7CUGI;|1QysR?mV>&0$B_I8$}hGA@^v28rDD5wAWZm&W7oqKuMn^#nt3-ptwU6G z$eTuC{IeY~k~cm;iecWA`)}4vvbdResS*?vXmP_o~Vx42AKH{jDb6sLzG6OaE0f* z;92Zz%tZ=gA%o%uHZ%nJgeS#o@+HTT!?+iD^nu;c*R65ZwvpA1G9ubLz|7C}{92-B zKjzUXCS1lv$p}nTiBFBP2PB>2^yu|RK#2)5!*d1w8UXaTlP;>5QE})AD!EN~hfy+li+{<(yKi$d^T`@G)Hr2&>1050=dGx38}dNJ#Qf=>O=#71#N{{T1?x$c#> z?Fj0oRU;!Ss%6APMcy*|n|R!VmY=6!ta?9^a?a1i*3Ls9%A&tY6JiiwTv7pl?lBOn zPSC8ObH9j3jPJ}3zF_0g#1+TMH_8s4>x8_>a#OPJsjP>Zn!hlkH<9x+h9e~LhF(`} zHCP)ll9n9f$=T}-n$85el&JZflyuf?QMgqp;bzQ`=hP>sA=;#}Jd{_YH9VA~TR;r| z021CUO_@xzXdP(UaZWwl!C~)soPN%xVrwWuBxK>?{LF^rTB(Zw;0ygt9Vt-@3ffhd z+C}PcYiNBWo*V8vTffKv8tgs0U-l$cj_N(I`%QK>qZnPn_Oppf?i-9hMjFLHRMCt~ z!{Ih^LMBQcmNaurkXPv5AH&je^KuJrbHwHh1miBROjr?Y5 z4o$vqsigk(M7t~N2?gMKc@1W)BQDm-gAz7nQSJ@z^_D5$XWhG4tTkz~*e&w}*u#&F z4lh}e{hCZO4kMMm=I2sp1UDZ=IW+=LHJ(2S3-tF%7E8vnp z!7s^4Y=7 zqw}6XsRjfI114;NxKbjd*sNSjxZcNy4&IpBQpy_%ln+!$?z8uEbL}6e;GtH(mn8oH zfW*8Ntm~8eTGz|P$Dqf{=@S70(OkvH zG8>=3Z3k|CgS&2#N>HjPL3U6^;vqt8{^LhV$;8pd>txLm$zpSO_-OH*85m)~J_fS6 zDlI7)Qrb&gQgdR8$ALXI_m9(fxbV zQZG$-wcA?u{`ED6Oef*vO3aaECrxHQB;KG}doVG%Q#Je~z`vW5R3qEC#BZ#AB@tQ0 zX0iTWMSC6Q8NM|~m|?@`{I}|DFd(^8V{uk13t*dX8SI(xczUOm3m+Zjkbc~T)J3ht zqa7p;cT9h;vu{X@JgHbNpNspsFsW@N2agEr-IB5X>^OB5*+`qpi6Dk-MJ^`zDcAxSas-E`iqc?zagqvIk4&XBjQywK| zMTn8db(0gl87AOm{9)|r8Kz^#P^xY`;y>nQr9v30wp^Jw>nu0&>|5$_Yt2&Y=2k&D zGRLOI(*qKDG)5W{?VPJw)j;`>Bv#$N=CFQW&(**lamT9=uaqmp>n&V>v8r8>5C$W~ zZoI!29UngqO5scS(`&=?H>+;hYByesH!k;MuPtMO7HT$N=FMJbCMCl)3KkN9Mt8xy zIDOda4l1zop`Le`$~$ty#InW@`8EFlu!HRVUHZu4o{aMICzy)3dBL}`K0J;%HX#^% z3eEQww<`TEK0b@>fSi6dEoLYhHmIY+Ny!cXHd*=lrYciLVr61-4XKZ3|}!>{Xq2iVXJE~P8QtWF>j$vtGT z7A8En(B%>qcgZ-?WcUk^2n)3*Ar;wUkGMGa*$A_sPaTMV44B#MI9c%s{Vu2-zef*f zhzQ;5*czKMlP`~pks}q4h595#;cJih_i55FnHOV?$ZS{a*|ya*EHH3#a&qg;9&(hv z5U64xn@7a-c+(Gy^v7@BOUzis_Lz_Q%?lo3AM&st@Sm0IecIPiGYgy5szW1#M`LfN z>Q!)+-9vBV;nZj;l35M-gD&xpv_o^47T6}=Q&(74)9E`3-^$fwQZuU>pG=LT*#28? z%|`QISK3dN)AXG`FO2lvySe(WS5%Q$&ZK(%4<$Ei`CYp-b&nm-pmWtKYi;`Wf&JQ2 zl9*I$rdW?EYKs9eya7ab#i8TwDY=q>J zPo{$*Bt!WO(+#mPZjn+FrDhNf!{Odev&Rk&T_I7^5|Gxi9xDf@v_2cA0N~s8wFT?1 zY&f{daa%^pQ_Q5kTHSPYE0G-6YX;OwL9P^>o3be)9yUx1BXs`&#B%ErV<8I_d4@(_ zbzdPUSw`CF{2}{IgE9PlUKL_U^BByNiINnkdvFbRM%pet!(Oe#boD!B69KXT3onOf zNIgicwlja0?hjjsRCYX9Nj1wvD9no<0HIixgg(9m!AmayI~j9*e`ei7sN;%6wB)1B z$whEtiZqAcd8QeufcTKZ-|qVyy7PD(h=iQ(>k(C`3oK9P2Rd*qC$N8@xa`s5YmJt< z0UM`dmo3)addGkcI3W?hIEwGi)Yz#wMODD@K4hbOSqh2^zTgjD&0#TVtRe`p3o7oI zUB0PVzZa(JB(Tl#*AzH?OS(+X6{Uu}w+zzE7j3%GSarD8bZtaq96mtiu(L%@*9 zMh^k}dz@O&W*p0UC`~oj_2f22v-|$G3B}juW}jh@+%1_X@9~egzCA#VoW?Da7E$LX z8s??yny#m6&jp9!z3J2elA%=Wh1n^iLAKY-@rgg)F1PPJmGsiTO*Gub1y@I{%$1K= z@kj3yqX&H+&vWYX>c3Y}e5UG+DVg%F{A;_jpp|l%mbe4w$~6 zaO)|K$>$PS^T#P4A*MCVD3=I)M)G5`oDcXq{{W}x#So!cIk5(BgalHRBW&HeWF7tO zO4&46OhGxQL6oA{t&}GO?~l-bIL9LksoC{{Wl*2j7f_ zy`8yi!FJnlko?9)`gSQ3QoMpj>Vp()TzkJw+|;N-{>+6^)GQ576da;W`#omf#^>W} z35v(ya?!HX^E7;0n<83DETL4*=T8KO7-Re%8;g%#ZO7y>Sw~7r##B6%SpcXFwjJq# zv$ke=4h~V^*OnhH1l)%6F!A4w#Fby_k4+8R(-Xb9h4|Cb3pF z+q*G$nr0tA2j%OiOP1*TUOL(Yfw!LX4ofvyshYMnge&z_MBYFLevtI4ej8+ZKND4y zIX;z-Oz)M&D7+)b)T$hrf%Xv$%F^{Xb$X(XPB}U}bV|mTRH+SmdY=l;KAj%1YmH@2 z(jo8KR-K3S`1BR8&;@mUtyl1sZ0xt$)oa`60lKx;0~%=@trO~yYLq09Mqe4{3;yeJ8k{7)Lb>yq-v8avybnhVOBvnTN?OX8uyuA0;t9SeyX35XlDD$MZm?pBOOt58+5wTJpwHzGZ0rR(E>&!=kAm^%mHvo+zpO5aeDS^%LztJ zIC(2}5$BtaAF5V7qJ`lhF^}Kh%V~Q0^F}$@^!bD*d3r>MxisSyj2P;Q3yhd?lN*2| zg`A_TG~7-?doop)sIw`M*(e)Qj>#by1B@7dWp=7G`Y1#+^|*D1d1XfofQ2D_QAgkE z3wdYLaB?q$i`Uj?%S9$R!Gk<;$e+?$Jv7I4?wIId>Km=M)YArEnId_vxePv7Dt{~p zWf2H+=0u2-4tVP~TW_hXZa__+F^86j$tz(e<-@x(XTc9*{vT6bYjUyDV#>;i8>X^B zpKKsf&Z zFIiVcq?Nt{Cg3P@V!AfbP{3unJ^c5FD>X;soXD!`;SCLDW6@&q(YW?@c=sOtSLax0 zlCQ+bbL6E!hr)*3kHNr<=+=Bg&zsoO>keZu&7`thBIFc%QSOJm8ygx*z5I>-Yll>O zVUyET#c{eH#UM&y*p%-k{{V>AHW8v|M+}s8A2u9`L$&!*fim#HJEr*j~@x&Er++o;6>nR+3mkUoF(>Rm{H>H z7YkJRK*LI180bEB;)#w4&9>VVoZ1y0_PGwYkJAH@6VB3c(ACFnIdV%3-8 z9*p2I__o)&9z1X4TmJxyRjfur$PeJ#Zo_{jPY35~ivu*fKSC*g_!b_&;ryTTDIfSX zN>d8u{{UUYln?&^6@#i*AvP32{4`zCoB1PRKRZIksPbkp zVrF(v$FgLSgb_+SJ(Zlpf}gjS)qX~#9#$SDj%55}HyIozZos{tF}(OT7>*l9K%_;I z`d8)~7-^7`6pAvOYKJ0Qzhy%Mn`6F{)m(V-L(wdu$$H@e5h57J_=wIAf8bQsZ9KnK&uUb zu_5tp8?~H=jfR-l$&mbgdPJfOuM6QJ$c}g4(pVy<{juo{hYmME*W7H22`H3M9|9-A znVUQa;X8AEzQwwzDiKDV^9Y?&+l-7b;drcc^M`r-TFd}MeY3k&s8ag!g$tJ5JEE>H z<|`e?QD%{7k0F`a_IjH)6vAB7bR@<#@i)bp9Q+^FSR6XQSdXNk5~;(H4r6wZUJq6g zk9{9kRFs{!mgYidX<8*BWW?-&n}hTkP{L!CQXFIiY~Q!Pe^EL~kX{Gu+&ZI_mLRJx zJn3T+M#OBKlyW;I7S>NknCel4#maZu z-Nt{PsMvFKyo5+{N>o_16L^f7AQ7)K=d;zjlU`oL&;%N|N_4Ky^rnvNll*rd^%pXD z(-q{Y{Uaz2VD5^f_3|xt$aC4Ibwe&mK!p}%e8pL@pYu6QPsSyJZQAXug z9npRthS^)2JKm=!7P3wnO}7|P##h7fcQB^sn71gvpMU^-?C zsPXvuU&W>5L?bVwUr`oP+p&?4F{H4Jl!o8M!8Y)Bq?(YGMLE{Q4LpEJsU6H z1NRZu^ViE`oVUfm$5uUkK>;*KylE*5IS_}Qj+Hwr_ygJeeJ!~6$&D(cD@nm?l-<(g z5ZTs0%kwbnn##t*Rv!}M@B(}6<j&i|AErwSDUbp0DO?c1{{SCHn#Zjmlrlh_CP)akbYXjq zJKts&X+B$z6?MkSDEU02d&-TAlCw|=f1Ap6x>|;vf&w8=#r~q#v(ed<%yxhGDH>)$ zczD4fg}Cc?wh6c2z0+=NbNf2tsaHvSiaT)@(v(z(Ax#xIauO0!9{&Jg!?-@)mkuQz zR3M9QsE~4>;pldMpyWCxDx%cxkt#zR;P;ktAA4R~ zrBXDeFky97-A$q@p2;Wm>_K;Rl$j|5W1tEng5)OVv~p4;+3a`+sufm2T8-8hFnxV` zHAOd!SR|SQIE04IFfjccnx;%)Fy$Lx*h4h+adwnuk7$*p#B1;C zGv-W2VU!B>c_}E$D|duLdDcu1?zB6RI=T|~_hDZqR}l z5JU2G{45Ndw8Wm4!*o^gbqIe0lV`W=>p$jM@fjWSB?dYuHkOj3LE%0U_1s_7Y559L z@{KPx>U!V$td2cUN>s9Y64_x`P?3`%x%mP3T5Y#DP zHyzV#f9jIVH~FmgySkOqykfs^!;)pRr4{_P~G4~QV4k8kF7+5j*_dQ)Z zJk~5RxXYcC4v^(ckb>JvLI?{05Pebc5qC5L4go$bR?;_0k0vWcq8Ft*A-#V2@ZEO? zs8quuyK$7zyR7i05!od^@7<^1j_gF3}MvhK*Ftmj$H#^%|^J_0Yxj0k7?p1uh3YIr5kAn9xT~1O+ zED?X`ltZLsB4uZ?LVwm1ag#d6?#15Ok{izWA0GY@)-{kKE$W#2X3@l736ANRA*~C4 z$^&ReOT>AI84s_=s(Z2W!Olgyx27}Q5}&kN;%$1G`G;LHazZMRgc_YhaL{?lP)u3I zhcAbVxu#?yV;}^_FJ+R3Dn;a?}T{ohF-J@e30J`0{T~={YBVYtGO=SRCdP9$q8w&_T=k#G4SOY4H$xBo zDrbT}k)~tuv4xIYX3VSH&_cW}d)$7$qd@6a8O&7pix_nvkUNt$>`4-?24B0ZRyezN z>Yk!iYs^xl_|i-HWB#KtL<3Mc`H`qIh)hc*BY^bBwq{zf99JGOa`vH@uNv@P{{TjP zv)5Yv|*?k)`nYVWNaTbw>CM7xPUV?j!% z=y7&XxqxioOSM6w#4KL*S8uoL_wVlLDgr^gJC-w)fBxRQu=#REW6uxc$zArywB!J6 z-^aILS~_C3C)x>br{*2o8QMStXbACRyiz+F-#sU!5L-7)QXmS?BM0l z$%NTZbMo$#HI7b)C6S|F20&OqaFP?EhYw7^Cndh~CJ}yVO1n zDr^rhvTUegqK`?dj|Ou|WB_2??m207SJQC&8pptwD5lAY2}zM4$jF+(4kEnx&sgs* zu-UT$5oJkhE)ty6wmts<#6{H|h?^z@s6ocEx0l!Tic_+m)MjFbq1#2~qLI`!VzYzjn(l zy6s~nDI&PJA&DZ1>B7}OYJMf%Ugi6pP!NdQsWpnlrMqLcY_(RE{qsFVt8#HDj-o!| z##(M@-N$E#f8y!&6DkN~qmwAL0bDk-g~op2clWi~M{Uxq5>K~YKF``d(a#-{(1mQ9)faG`r8caCC zVebvPmyoVGn2h8|LrE~!(kvV#Z7ofg4&~T`;M*;EemrWhv95H{$v!cuicxI*2uVBr z!Jn(8NXvwJNn;;dV<@&Z20@Htv9}%j19prfp=bkRUShGdcOG}N{{W0L)pT`bdjf() zXX=RYnf^wzGvm>cI_#&*@#|kVN~d&jfIhyG?7HJo6C6?FF*1_<)*v^W7JKwr?P|Vi z%KA;nRv#I|{{ZpW^E*%b^Nhc!?2dHp5}%k8{{Ze%HQ4;(Ll;6J0FRFW%PK2<^c2tT zEcJ~Mhi67n(*tJvR45A+5^U#=9@l?UYbuVaHvCSX-t#Y#{XwefmN#{A#dTw23a;H) zasIDIO4GOfX&<(myH@ZsjQ;>n{8pH5B-OPc09!bU-u}<)G=y5PqnUA<)B-|*;0`eL z^y&)4Dg--q9um9Q{a&fFLZH+~w{zC@{{SCeRT_nq3=rNOM_5D0BmAfB{f@x`ds4?y&h?YoGrB(Bas(pjf~LKO82+d2sz(D(Qg$Q);JX_c9hi7^|O zF0tWlOxyhp=fEDR7NO(gJ``DS@=-D|Ycx+|eke0#H;=ey9|>#D9#}PO`Gzp#TQ$=q zeB&PUNd_8{HY|F6ue>(!=k$@?Bwi^Vxs2lg$yyS)9-|r5xCzNDr!NkTEvm;xS z(IFGv87cQ6wgGmi>}2S(0;Ai&UM;`H6^{JfSN{OZSw{%Y3s)^cP7VW9GJf7i7kgMdA}MIXfgM%$%s?+c z$NTJ@o=M{x6gBR>#oJ!WeH0NIc9F2kw4jYWC0h1q#x@Hk^wPDUHII!Pj+C!9)i>>> zf3vUna)0ya{{Z53{{Rk8{(T?(PQT&F{{YXU{{V^C{5e1Q^ndX>{{V+4{{TLZ{wH7X z;4>{{Q5umoqxlV{{Wvy{{R!O_;P>q=>GuXb^ibkPyT%${7!=uNRx@4 z{{Tc#mP#~AXQ#nbh1byP(w>SCjo(E(Yv}v*$*--5iz6{1)$dv}Y8JYU|g{y}_t= zzZ*q$ardqHaFHu}kUReXlgFv};iINxw*p2gIEWO^t zrvMTR%v~eHR}S6!en`-UNTDe)1At0H8bQDp^Y}W;`DZDN`DwNxPL{~t70^%@_3d`p z2Ik<~Z}&Q8OAF?Qv^ptW6)HffijyuG#)y4ddl#`4ZMkE$thF+uDOmWuEG%+ol9?(| zAzm&}T(7W~>X#m{epW$^Rg6hxCeTa#vR4FfKd6m=OqP_c0#`OelE&>lNP>18lfQ#) z_HgKNv@$FdB9EV&LjM3hjkpj;^Zx)dRHZ(OdMWqVf+bO-Ji!PVN>|WfNI5oIU%ySo z(!bfK-THp-r_uY4&f0y*E>Tn(sganoA3*_wfPks}aVmZKemVDS%YI@jw)uogdpR^| zRWWFW#|eDllVrW>LX)zPJaPN}4(QqSwT{R~eA}^5zF!tSz$n_Yk9y8~&x+na(=pYO zHLJ&pk@o#28rTL5xqsj?ei-!&#fxF3YXb04P z=-otMt&MK|1|&O0t>8?T9^L&%bW2FAFvZ3xf+ZTT#VG2;j=-~K%lv&ZG&jU5EoFLQ z*drZ8Y)$qBmInRbkE)GkOYAWrzS!OFeQhR-t5T6#LEI|g3p{H*k5^M7$jM|T(om|v znADV5O+avTX-st3zgySS;mk%Q5ga2O`6%skW=M;D<_Qi9IXG_Q)Ld$<2IeN?@CYj0 zMICt)=_EKU`#{HTYLKT#n*ujm*U5(Xy-qQ>To3}hw3yEh)Th0;vhVB4xY*HhlJU6Q zkIsC-^0@y1F|kSyg9#YW@!xstH|B_@PRjYeDe^2dRuqv$c%to)i~{SO5pMt@Ep!iy z^2m5N5#~=!IcF;!lUIls(+k#YPkXD_q^+)HeMKlQJ!G?egi_{8luuz72@dJ> z;Gfm32T$_8DsD*Emu&3h_TIh{+Eg+%C@%c3zd-*0 znBo5bv$EfEOw5@zcsyZ%G*w!IC(AltNP^mWRHd(pm8Tb`l&5EJZ4b-xF<7<|E3qr4 z!*%P7e?f$aduGFM_pPar*Xi`?PD3AygOrIhBxGR8X;w`XrlYhG8P{FYsK&O?yGScu z&%v&bF9tS7FUlo5Vp{0c?t>#*%WLSqlq&xK->uA+HyIvwNI=&XnBvH6M+$82svxP$ zhJzumX?9YqF5joK(H=fO4~?&u$um?Df-M3h^N);@`p!7jpp6Km^6=Bp6#P1mJ1K^O zxpP(_8VX=_f(l6%Qd{@(3Y6;*iDm5@~kq;JJhDPtmk0yYjjvjMi|Z~_Q>+JNzl!%F4E zE#XnxA~@NAem5sM>&$-(EDB7FX5Yh|%@K(r`#(vqCRe4C;6TKS{v7R&LYMQO*|0m> z^A`MBHLD$oAozEDN5sf42fwc+(y`?Br8xfIhcAb>B_Pju`}_|f`v-&{|4LLz#^u^wH@Y`ZDu0hfxeSoTPUV2^ZefKsA$Z&u~RA$^7GYs>ih zVlvZF(RpTNQW6|epg*Koe8xn;kH#Ab+qUlEdfJ@$)0WSdvdn@D!j%by$fn?My8`2p4!5R)CEfWT36T*_&E&yZAHRB+g^G$U~xT( zE%l2?wqyn4!22%ND-yr*C`wIB*C8Hq`}7a_jvxCwE%zkSA7@!ihF`a{vhJ^KTOGZ= zj@_-lr%j{o-=kT-x!bwDd2Zj^>A!QgxBB{(y>`uJW-AKr-p-$FZ`oJ*B z1G%=EQyF3ExRiN$i7G}^RLUhKP&dRZZ237*dEXzrA}ha8UtGAzgNnyQjgq3{rfq!Gbc>szKR33WiV_& z$7yY!OaZs;j;j?uWXwvI&aPlk)Tnz=RCn26$NK>97e0{M=lsVG0@y-y_vo70=VX1U zhJro^{*1NJPxCHW607vDsJqy>%wzCsEV*7{%rYFpQ?c)>cRX}D^tmb6_0!(qJxzfV zAwG!4i8@r;O`N=pBFU?YK+C@U$AYf6Sg8>*`HE(O0;6HjO_sRD@|b23-7rGU^@j-( zh`9BV#K;IA5-M;xd{4+_yhE8jbe**x!_538GX0-hRmQ&>^iynNvP6X>NkzSToz#Oo zc=iVf_w<(eeN6+Rkz%b(AQsJk`9{y{HIc*R zptlPpQToh)$B;775okI&J~1p(cm9uAnI2m6m`r?VlA$kU=^UIajLnMzUuDU$2@V~3 zgtB8L805{59|pPc(uvlLfAxz?XWz#+d#x|a<#VZt#i@%0m+bi&hrHuI{Kmj)lQ5YH zc*#p4Dn1;7QC;d7avq}RvyquVj}f`iH;|JgK5>}!ZVu+>5e~a4^i%K9Kjt`p?CiJP zksBZ_ZVx9=DLX@ZVM<*s35s9Z0S5~Po|@8>tv-&*pO|K3u=}p99V>4x$Q@DrH%fvo zODf}~IJhWf_qW=J-C;TA&`G;RXjNF-4rRt2vacQ`^O=Za~wn-uQ zTf5*L^RvCDL?J4R7%*t`wM0Zuh{+=4#^*F__qBk8SgnYR%0gxay*|{TR5>xg<4m9K zACP)C81ej3)@5A+&kAxReETsdW(&rApxK5HEMh_bD8VOA1w?&T+B|~_4$G% znTU=m=@WWmK=JyHs$lZ>HI>WNIJ9QJrQ()Ulpi5(L}o7%__paBH3ok*ERDes#EMtJFt!#d!CIEaK0AsH_%7_HC)sROU z7nM=PK^)zCgP#3i)sKW&^rbT0lc^T?x52P4Kd@i5tnN8cod__*AzXr5WQjsY?_jur zC*0xn!&QY6ZsUN3bg6ryE>08r{6Ak)EhI>*GvgV;V@h;!U% zkQWT8+@23T=m6B5tXHy6nSA+@R2X9*Z5_B~%YeXFct_X{ElQg+3lkY12MJw6@v}|v zGH;Zd;kW?SmmfXeAn4_QLjJVTIzJ|ui*QV4GJ~{IQ5k%hMXvmMlD;cuXJ}>BmJ7|r-2Sk z=i63n#6u)D!R9@+2^FK;^yq$Jj-Lkq06_JT9~y;U-Ws)IO4nUH2$E*L(mj}nWQN#1 zmmb=LiqY-#*I)4FcmDvjPX7QCru@GfK6g)A3;H;Zld?s1v~JKA-Ac;#cK-IMOol#m z3YRZg5%I46wKsriTK&ks=?VV;2tR(vMOAwo_GOm3_pT|7(c@x6O6Q?uwZ&v9J%3)% zvD40B{4Y=IdiuoTY;_%rfH<~0!Xc2-fMjOlvwZPjXK1(A)(;vB&(cORemt2;>be_M z)UT{K-%u_gEqRGG%*#hv)s-P8A-*v!v5XQ9KiB%Y@^NMHnM{Dd#i&j^IddV*RL+fQ zcJzqce45SqXXTRVh^ApuDTa|D+l3dybE74v@m&4yUrw2W!ep@6*_hd6;GHgH#yi=<>@(GPA43w@av6`Xnc8sd{RIXz%)qqwIo};*5#+R zW9u?O%9tu21~5sIe*KmPn2P#KFFrgCuJdDi=>Q**uA&u65m1SV*(*s`A0Sz*e7Ub~ zNkJzWf~@H>19Vo#+7XmI=KBb>i^WG969N=?tEaN10FU3`f6Q?I0NL4Zx#n3pN`T{+ ztkdM{f`}82xf*ST#o?ppUmHxd7HEI6K4kO}fBbp< z6s>>qdj9~a`6x137J35))kzM`)wJI>hE%$hrPaQ=q%Sq>d7l9wsJZbn5o43V2k2v? zv{n}}LtffY`+I)}XVa~Wag%V_IEl*P*hP7Ck~@1-Q?C(hGMV9skD=igquV%{UMawvf zKJMpFbPc|hmU`D}6Wb-sCu5;*P`P*Zd}$&2$Lf&ZB$C>V+@-W5>$t;`%|?TP#>UA) zkqhPv$sCCyQq)(d{2=26q2X|rmuHr&3R*6qWDTz-sPB{0A9H*-eT_!nzzAdH$q-uE zkUjAhx;S{!c@1$mi%}^KOnJM}hGWb0)*%HJR|+_}Vz?l$JaS)-7Zkw|a-` z>QSW965VV#Tg7OTXYNFGp5H>|Ya22SCCkV8f2Zrvxwhk^Oqgqjin{Lw2t&_trQFa$ z%iD;X(Y9+^$@p3Euy?H0hF==0zRzm!<=H@P)rjUu+-56Ys?s!Wv4*! zNKa55d*rGz-rvL7qNntLxr(2#`YP-`1j+LjJ+iQGe1C{t$ls zl2$&2S@kTpOask#Sj+zazFEto3|t3frX|rA4Qfzs~vmxH~iWf736CIpd`0g#E+MUe50A~B@H?C&>oYb`4y5&%fcNimfQKZ}gm ziW@!(UC$l*mnIrvxLoM9knBX?03_q=A@G#VgfheRc{M*E^A)NbX3AlgD2fw*_ZoIc zmOHXo);ad^NGG|D-go8do=b<4mnR=F!z1M~CZ9kpi^dM|y~5G#=w-;F`pn#x%WXpb zTkIYp`k(d)AM+eP_I6wDMe=gs)pb^A^AacTQnZm;(W13c7E+^VvYwl(%dauRjd@cw zj;do+N}mOir-Zq^mGxsV{*R=nKfSD8a8X%5E^#uk_crR_Vj6=D%TC(VTl>}4Tg>B$ zDG~BtGoa(Tsw|Kh83OxyjiRCL_I7gmb=G-f{++v zy_NhWQT_3*ohnnAB21Q>N>n&l946k}{_al#}i0;OUw5^>6DP@O9fRE2uOd7ycO}%pn zW1$zjd!QtXhGha zl8A#9x}`#2jsg*PhhS-3Gcj|bgOn~uhWkI&)WbNacF45=EKUs`gJ_(}{>)H)IV{=9EJqSst}TKoqn3Du$> z5h$nB45^IkZV zuIpqyEcKqQITn{HrS6ZLxjaX#;5|TbGHz)mzG#gg1&9Ui%2e`31ffy34NMrXAr4N zVYXm^$@oPGxQ-$kioI;yBhhTVTa38#6ZGy2g>n7FbZnEwUZFyx@Y_BaZVE~ypZ5=) zX6bTHns0Q9=4!9Y8NNUX6Oz65#aAZyH`dWdot`-wdNMT+#G3{@N>JkA4oOd$YZ1u&XUlQ`H!uWC$>c| zX&Zk}jf@sbQ({>Vnvc=OjpG*_PMrM%SU1P+UH;+!=>-!p90AKEM{si}kGa|Br&gKj zdPD5l`bIjNlJ#A3EK1%Ib~(A#0iyrtX#~F#^4NLTRq1DKuc6K~&4*Y}6jQBjkJ%v+ zL&5RaxTZ%#8WF#;11?jNdIWl;xo7~O4f~g%XODzxO1m{3Y|lcCs#haM&~s1 z?`+Jv#r%|G7#{Df)ThN@rU3Q1tZ#Px;hoSEO)TdshxQxVX8Q~-uky49C=&rkE8Wyr z*{P!!l)$6>fj7-AJe6p8WKM@ee`C%|{D^KFW~svFN@TDY>VAGvYje76Z>crYA#9v; z428;%2xM-XR1wl5b(9g;*jEtLDF`zN;CX>mIkkn$CawfCo_&#WQd~GiMI@KXzWK$E z))*wG?%xHXs?0q5O?zK*4UJqZv14M=5?A7QA;_N{X@);}y|7h0_=(`2-;DAiQhcgN z_U~rY?zCz}gTcS@`>LF|z5hw^AHcD7d3r9ZXDlf#c)c=!|A0KA;08QrV zUa$9kh$r4&`SP;yUHCshI9WdjPlffWk<^WEri~>>Y-wsINA}X`vZR+$_VzA8U=?eQ zz}+W{_+tr5s8|)83n;A}Nr>W4KmbY6=cp%xw!YX6FRSK1f7*@GNIbHC4vFeqMQBQO zTK@`ofPFg|`ko$)-y4P-Q^6!{Oy<+QwzE(1CWsUVn_l^Xp1XJdaq>-7OZ-O#O_fKv zje{_+T0H+yUY;u6#H1zVM0};atgOz{4??&V*@PE%R2sdtxeQbbXLHU)#Ev7z*SW6( zkC+b-tME;?vhuTA6iGPh7?t*KlU_seVH_zmofbcbk2jXMqq>(4?SH+MF6XDYU|(B* zf}hSg<8ts-JEG_&;h=+^$WnMl?MLuoUMOJNVB<=+%eVgrm=Q=6JA{^x%Q6tJkhRZV zR?^%kiTR1;Ev8mu-`Pr4l%qH2hMwmTvRi$P?ere`zu%FCx+4(f=(oElE9lBM8CO~ti*PfA@R64uS^BRinxB*4;rdgrt)T29P{{z&XEr?vG|Npa6}%$zAe86v$YM0rpl?;?}bl?n5-vFU_x`D>Gf($LV} zKFu;dqEuR-oRL{Uk*8c};rYdli?X9vMeMlwK$#Y)izTw0L`u#L($M)Du`}hFSW++> zq8--&=ZI-0I&$)0`a{&xQHiRom)_GHK{3mVpLbTodnx$Bdu}VWLwbVkdyS!3E;rA`myh6@#hCtlqR-Y zjsqzsYAXG|izzQ5HQK;91dA_77Ooxk;cX0+=_kXU0t@+%P9e8}w7tZw`)Ggb2p=8{ z1;>`I-ahE8Zc)DH9GjmNZf5E^UtM#4yR0UUaJZ+1f3SxZ`P!%17(*mR==H%^6zC;?LB+y%*<~>#YG557Z^p`u;luzmd)LiU4yx*|3#oN<-mX( z86Ajt%pwz6+~|^uT)fn64S7wQ>Vz503lAYAwp5Vc5r}v6`(_m|yyw2(U}f^~avC}V zDi&oOftVHde+=GV`q$F z{!MMl*h=MJshODV9)}s-RnTHfA!jG?Nvv9#ql=2AO#bFExTSDH{=|e|1!CQ;RxydQ zmvHTt`Q9LHMr*4M?g>bBBYPWZ0&=8h7h6}~XjBi+=KT$Zjxia1Z^%#2BcSaDF&nLD zz<>AW@jy$@m-nra5hkN6r zEO-gqnO%NSstxsLyMKC!({6F9m6vPIT)4kaC>4*XIL24{0;AlcGc*ZswL@-|3d@cG~N;!npl8>G@dbeW`xq zZS3uqOyFK~-(poE<{`=@fX+3pD5lPoR^>iOjV{?f9^flnBLWqC(*bMJlyRwFu2HlTu8B_HEQBV#?{Kx}{ktFgAFAm}JpY zL(#2ifqeLrale*Uoe@!N%F1dXQc&v+Kby7`rM=?i$~Syi6K$Ad!X{SkPM-O!DeqHA z(o$2ck|@t)P`}*Tr}dlgWQ?w0QZQU2l?y!Z{59_U1tg_P3IY}La5ipapD;A*(s${x zM3!0{((QS_f|6ot#HO**7p>9{>bQ|n_Qy}(X4sDoN z*qD}R0P0ay(86p+%KnjW{JOPuhr zWkQk`oXoV-_N)}f;Ld%iuijiH=8m&Vp_R`_v%XgU&i%)uVyF2fTS_^8%J#S|RB?=5 z&i!w5B7v*jLUz$xCg1x`-Q+PR?m1J{o*6{q^ySBdLM8U3!jFy`+F$alHah-&TOX_r zI>HR8jds0nTabyKD!F+vG$&_ybO$Ky;L|@Z^-iUx&u=`EX#He#QAOT z>80ZzSjt(sybrgX=cobw+DiT9YcCQ-W1Q8PsXhMjwh_G-->mn+v%$XSWZXVA$X8j@ z6b(wDi@mJDha6VFlYbNIN8ECRrY4be5(knhg?wFdL51|URrud^YM4t)hp!&?>eYzz z$o)Zd_kZ~ZSal`tE&L77b}Qm+aX4Q!q}av`mvo5Yyl`**oEqSt5ye<+QmPBt`L5spr4dyb(3`APMOH>xIa~0z+Z{< zP?Y5wd#F1jK^JQO)&U4WAT&^n0%8c|2_K^y_(2DtW{b7mj*dDl9;dx{!gIQh@WbhK zmvgvvCDKUh!jAzw(-s4aBAzhVBeXP-p-eEuv3JE4i4Lhu0(nC!2`J$QEVrQwF&ZQQ z#W;EDkR*n(kbDvF`@+m%c~YnoBb_~NQZn*)F1g8#I;DNUDbwX?HsrKmV--jNCT;A` z)&t#W0F)XNShEgJX?}9YfrcOeii^6*ofIqvCH13<3Z?4ZA#H0Xg@xr?hbsde-QUu6 zWwtS}O;!mMuPNZ%KNOj#Pi-c&JY>P!-)+xIsSHUOQ@r+J*v8>WOeH1vst6R?<$*CS zvoFDx92w5>O^fjLrU)K2w2#&Bg0))iKzdZ$Ti|SHQ;Y~(_cb0beE9f#aN9K8dZT9b z{Nw_{I2y*5Jq%ZH4-gQ883yMq?u!FP0^dpiphE@ho4|zVho7tU;5uKa;!a9pdu$|^ zY&n#zNgy0ap)fhz2$xq26@`oGq>=BNO31N)*btdtG-Q9NWPagI-M}*m6%us2Qe<`+9pULC#38yksCq>`k#^nSP5QJO)CJ^vye zas~!*98epUu%QT#Wy8(v0=!m2x{HXb*%rEKHIXuQL&V>xck!_!qa{qZVfoqQHhPHE z5qf#AaL{gG8{>BO018q@+|=3Plx-IZabobd?4atOoMRXUM($Qs1E+OjC}kJuBL2kT zAFS|5(Ang<v;)`q2TkPfuc=a3FzUN3SJZv$mXc3Mr!c{7 z1s-km*U}KfTzUc!ytCv-5<1~`gn7_HG&t%OM5}mB0n(BZ)er?ZaVINAF}S{nkUQ%E zEC~_q)F=l?e?-1x)BU>s2f#~kIQj-wOnYsD>D)6K$NKz5DZrl+X&b;aGezj2jeI?2 z5U_CsLo5W<*j-Om)Xve?JuY|rtuVzhBX6>p=+bY&sNZ_Kwxc0l(+;&S0=dIF5QLh= zi2n0hd%_^Lm`NBD+9hmP8?kQ+`P?J`Igdb6xR5S|nqAOPgosZE0FAhp@2ZWEOi@_DI0k3Kcx1fgx}V-SsJ$_=C+RdDK9SR=Y)d{OPHLBwc^t)h=Lla(vNpxIy9#X0X5y zS{r6L(Vul&2O#9Kf$ojzp)W`ApmDeBI=Z{$s6B6h*7mqJP5x`W-CW-|Sa6NJoxZLk zDW-2UDGU_WukGNpVi8C>7wA-+*cO&T#*%tl-#)%yDbM2qCWPYv(T6d^7o+N&WA8$n z%nmkS;FLv3fyRjdbo*(;%p~?AL6M=7mjE*&3xV7Y7z4K z+vCC)4p7CwP^=XXoWPf)fGXUuYzq-UFD*Z#n!S{vR;lY9%oP#1Tp_rO8n`rhzfHvs z?qbQW(?xR#d|&&;SK$ljg;z-60I@!zD zAX4u%1u*~*<_M~L2$d+ zU=Z&7DGWbriZj~*bQ3xN+5)GT`wiJmVP7EwksKKgGcj6~ahf&Qv2kOhgSWUraTj77 zzATs_gPTTKSU6<|mP0{3?uBJRbhT=|q>`kQMKIHX*EUKp03gLuiT zQH!PSR+Eu28(+%yhqT*b`zWp3L;B|shXGmBxs)!m z+Xbg`!8ea~e$_W<5B2D*WH+9!~htg}du9!3Te9CBADRt`3+SCOq&>My3|QL*bAVcDx}?111^`T0b-x^-w_Cd2}n7GDFoGAdCIpcB1bDLj!jGpB#7ZkwT|W za~3!*-gDKndJw=eXG6uW%Uqy1bZ_^<1X;&El#WzK89B}LJ`xON9sJ})Z zTJ_b&o%rpe*%M1^K#mXactJ~H3CU3k`J0YJw3P^KM>z`ze@^XQ)?sQhiFg{IDIaL? zYJGAaue5y+epTm^99`m4-Wx@7C(ACJGI+a`GIAS=a;+Q3KdA)3u!K$!@wMUW+}6&V&^qZm9OcL8T350QQU#g~fKFzF{ zcK>g6fgc>EA}ilBx7^cv&+uGqV@d`-6AeI_VAosr*AJ}Y0ST#s^gi7f3B{cizkDEE zWtRF~U;tsm_28^A*iqnIXcw2^G?~N2*Mf1_LY_GVjk+GOp`)ONyV${+An|zOU{pt7 z1ZxjFS~V0#8g+VvXoQiq;;GJ3qBcO{$~QC;JzEdT89tpIHOnZ6V<%iv`m~GXC4z5y z9FU%MAHHM6V}XKd$cp-l%af8#xS$JeLuaX{C8t^ znhC0jyXEo+wvE*DGo;9=9CPN)7E6t_m?L3(=4r|Pm^;C`(E z`Bz?6$oFbqCPe0U206{2b?1CjYM#<$sCKlGKDfA^d1SH2&rBt$kPZL0^zW-Zh>g~! zpX=r*R{WH8-UZwP3?k11zJ#1;WbSBksb6F8c}~;uD;=A>obI>dE%EuOHag}h}SAX^cFHyI@!g6oazU4wj4(#(t8_f#z0!pjs1MP#?; zNr&Yns~F+ow;vw-Xdn#BkrCc&^ot39C+y(>r-8Ir6)=FIkW$89Z3$p6LMl@Yj}QS{ zfa%c^YZKx9$#YwP+0QUmrE_vHCfQ95got6g)mZ3Plk!)T@Em}qQY2-;C$Wu~?W(UM z9<)7tvO}Q8z&BVPyO1SDtTi^|<3Fn$h1A+DoLwNwPxSa^Im`!tDZ3zy!S;o!vY$+x zve0M*d&R0EnXy2T(0PNR;09=1?7!q>>Y%uyVR%4zL@X?A_wJ{-RO`D)CK)W+iW z4l1ew%zq8Ljn7EgR|jh*?)pS%i5~2rp!N^&qxGYuib@Tu4$|&OY-_h*K#PGci@U=O zBm2t;UW+?6(PJZ^v*-#ros|X~;Dd{J22E`XMmd%IVi#8^hd_paLISQ^PNs?n3abn7 zlixDnhbBNOOF$mL32*E{k~D2dl_ub^Zgbmq$paKTK6)kTAaLhTj3=RdKeN|)DjK^IK&%{`n&u6!fCURdb zE~X#0Oeq0Aib$^>t5NueFziNer9i@H*we^iJVwo#yFg`GBc3221r!^iKww7+^euv^ z=~}gS9pyiPY96l<(u_Svis=`bbp9A>U6`K ztTybDb2Rk?mo&`B(NoTk623UINOpkP_VKWALy#6wg6ErP0LM7&Sf!On=ttB*-7}4U zfbTYYCl%F!GU2h?>yAt+{E9XF5qU9BFo1IZk{U5Eb!q4 zXXtW9IdPJg{Oa!-6=lNj@-x7Us(Mc2(z30B@K?0ScuFiz&xfB)`SexBgRg|GT$;b< zk06Gy{{T|1+PLU`h|KJTzX;?ThRlxKh+i&-;A*oI+qRMC5yXos@@42XafzIfU36e} z;W1EL!-NP&A0}0W4J5p=DJ#IJsp?N@Jy^M8&K#-*dSNLIhgE2bBK{9>PBR%rzc1za z@QCRsB+Nk-R>7seNXNhX*F!5f;~G?An&ne?V28asWCt$Ug|yUFue8t0X(kh2(^^Ve zn_`NShmyms?I6$pQ2v}M7z&~Q?MZqM{!lYNcI+V5gk7T0Lxm-j?i$=Bp5;Az2_2?G zoHc>2r61PA{jLDb%-&)#xd?dtxKUBLOzb|?v-Ofi9=Sud;2=U)bcLqwrwA)L4SpO z@glWXCj+P-V8jNPBodAb5!59v8q6_zdLaIik;;ghKhG zz(tE~7OVi+R8kpNCIUvgTI1$%rZ9!b> z0#8LF`GwP_wUYCF7iH=>6BQ8uo^hApV6bFYM>o{&meE65r<~F@JM|a&hYh$?gr=6e zm)w6Pgi!|%n9Z{56vaAz7G%y{KJ}Td=MRmi;D=vq3FS3Ny~zVb1-;8~9{ZY||FBHjfHC=WO(_s5&^o>3-9`vI7N>jCbl$ zTD%ZBmeCrr3f+~-)fsWBiBJ}%+NZKnwgtUw)}pFLexyYNJM}47Q@gsC77PT#%U#9-30X4Cw~* z-rtP29)Vd4&#Du(snusc1Q8i5 zAI38uY+-a5glcq&5Ot?u=uu8YG)P4jfHX%9G++=qH7RB-(oL>pu)ueLXJ}ssFWjO55+rMAI2|NDz<&9mUa%lH z#V+v(mvM^f5oU!>yXwkUi2nH(y(-Gd!?eGc=dJn!B=+FOR#lzyVk*D*_@j~zD*=2c z<)#u2OyP%x5mO2TNqYYZtWz#s=Kbi4j=*Vo_KOlF{9!*`e47qb%Mv0Fq$;C2vl|2r zMjw@$ouA;@^I(J+YKn7dJG6?`+4K+O2D}mp{#Nb4Oh$G9q0g>~mVz~q@H-}ydGHNb zEZ-j{kS0VNQzqC(+AX$QlQ56vaN2ULbJz|8o~o?^e#PDY@y?gu@k}3&X~3EWm4VJG zr$2R3k)ZX99?@}M#0b;UpTqChlRh~!lcue^LuzHGSgXXi2#_R!E?0?{GV}Z4-estD zcsTJChc?_y-!6`k`FTw+Py}}b)@7VGq?CKWEX=7YpBD15VGKp5afW>&e#HP97VCgf z69G>0tkArM6#KS{gnuG|L^oM+zyj@@eOS^rC~@Ix*|^eiGN8iUgbBeTQ)F>-FnMVq z5m?g0R!T>no$iIOtSyurV~(c5ZV;a0LfziaxszS>O08F-(Ow+|_%jh;f;OxjUm`Rh zj1t^Ui(ENy4=-+;ZADE%$|Ye4n_ioIiW%mP6&(H3zE50KZ)5+nLAfo^y$1F`nC?ZE z{Ch|&J1~{F9*E5dcoiq3cDZ)#U>^=Ga^p{Yvn57ue#dgWKFroPh9anoTEgq{ZwP^c zLBJpv4RpO1%(If!)mOrAZzAx`yxYP%T&+0x&H`;Gg5m}De+92 z1AxYLOAL(}>!hK-J!9KC)8#Wz1;6#IS}oS~eJdcag1K^S0%qoXpW zsE6Wkg_qyjB_acV8mck0QEpvBJHs0uwJXkyn zT*dgz2%9>(@g!x|{CS8B)}0>j;9ccXVhXxGDi?D%8T5yB5GfO}QWK%aN(vocde09f z_ayW>MiPCmf4vB0+TXVmFhGk&1&d(KLGif;ftU9mU|Tiy&h|6XHt z&@K&eB^e3gK<#w%-y*q4!Nz@0rdmN%#;ZtqEhR&Kcnn4qh8LZE;mzk=0H}23G41X4 zY#){5P&|m)SzLwm?FqpzW>j8y73L~Vl!sba0~NF(@ru(fbH0xj)jhn?VZwddk>+kkNIz-)2Zq< zMN$CJQ`i`X&4pezC~jT2-*@$^8hypj#`(T)EYVrXi-U|R=ueTMJ(^8w2ftGbW|^U-7@F;6WRX(JY*mn zXEKG3h`R|?-=_F;QZpyjB1swa=Owk(0lX+YU3&k2fc1|(wfFm6#E-&lvfaU74yz0k z5RDWv3W5U5rr1AMc?ys}@I~|ZjkV}ka*p+jPA7?e3?B8j54_WKSB(^Kw1;+jyK=&B zxrLcyUrsi*vj+pQAzG1ZZbeY%>ff&A)9U-s(FsqR-7eH@lY&Cjtw&}c*ej`{wN@tM z;rn2$PL5#B7o*6vp5=3fqLqspj%TVhxNb^qWzzE?Tj1U6!gBY+eSN8a`?C7zf+*XSHSKi5CUv%TI7 zj?H`W?Hza#wulWNLCh6SgCcI{#KwZ#Vjh??6{G7ah9;W4D{EUUl&0Q7*o?0Y7$Brhiai^rO(s|~f82V`2Fx^t))^y_2!NG3km zr_ehHzr0)%UVpwm&!a77fWa6#Gw)2-3hgtH3@*EE)4ZRn#_XO6s^1BnH^{`0!^23^ zJXF?JxOUuVThP^cvWOHb+!vw#XeHQq=3%#j^d;9-M|4*wNKDOF3l$uT$@zHqB`=a5 zkL|hE89kf1Vab?5T>g6j{L$QTw7tORXT#mgsQM8-L$Qwt#p{_?19^zrY)*;83zqAs zkq3Nj z=i8h8h>o}KcrAJ}{?lTVuy>0O0-48m{h!ZpPIZ+30EdC1px}OM*J^XdB@X15 zL3#bC{-Xr*BB*|&0HzO~o!37F{zyE~T5yPW8h_;^!|&`~qqxU@-IdTL-3>b*fsTy# z#ojNCG>-smh8M|37a+*WR1UKh@hR_R*%57&Kf|EgX=kvAg#W4TWh#ESa59XFtu%r+ z6oQgi#8c7)U4T*-!DAo%%wi1TJFWi%w12F<_doPQxD$|GA*c8H*Px4_jeh{UkDb^5 zIbuPMSzh+^Y*}x0=Szp-a5XzF`KMr~DByM=&4;kQTh37ZX>&jfcrXj+p&$7ep-JkO zXbTl)B^APFU=JxObda8rLbeb5`OzPIK;s=+TCt)+=b~+GBy$}FipShu@Vbe6D<%*% zRe-2#Bo`W9vn0ByUe&L)hZDyiGj`hkFkQ^`rAsS_yUvQRjv2&xriHb)cHLzKGf}0% zcEOdOG+spugswtyZz&*ro*SD#MSNKMaNi+IpW`UJA4v;RsZ$BSn`{jjdcm?0SeO`m zA?bpUWvdCEa~E_l@e?Rp@TO)e>IZP6GM6b3ize#xq_cm^vxrF^9E-YL-?{90)2;Cc ztD#su`BgBUQqAOJ#Jz82g+1#vhdNbTajq3G6q4aqEFuguEzUvfhflh1d2K864@b3> z5q?2i=EmSMYX{AkZCTsVkjKNFmgi!{+ooa5pJ`xz6FAlE@r>k1oocnU;Kjgl6T=nO zOqNC5W|$2dBK#E#IhS92w5KDD!9-^Blt@!hZl|hwnoX+J@Lr)`(Y;Mg?(i1t^C;En zx;5KWk_M`ef2Je;T@(EHQ!)Y5t>l|_2Yu!3e{ygt7A{x_>+>BRWXe{jKZ!vsy-AS* zaJM1C{bi}2*0PFnq|!hdpTV2jmu+lk4YR4Pdbj)YuzRORfDxsmQc{a_6xNhMbJj&+ z9y_YccfZzf;aNm2r#}D9=hquIiiR`umFkqXs2WDcqjY|`$I!*T0 z@-NO&wY`dXD;xUc4>0$+JV)=N1unaGAXYo^A=2%!ZQAHj+<3%TK%kE<(0H@@v8OQO zwkWB1kua#J)Q4R^zn@Zj=3oHzZ1{yvX|j}Zf4^CTceVJt#UopbuZKECWOjDAlCS1Y zRaI-uS}y^gKfA^|H|6p#6Lm_p88@+B6X{N6Y%D^L85SH`nBKj2)fqBzFbDwFoedPt zM`(gGllF;Dc7zHpGq|vbtDCx0q0mOe{xpq>!6AoH|Jhb+mgJ$Mu2*1iruIC?0@9HokSjmacwaIb!fP(`H}FyB zMotWXUXP^o`108??>`r%j9jeLr3tlEuJ*k1rKq&D+u2qfYU`GOD0r@Y@uHqruaV#C z)fYm1-q{&LS$_)5J9SjbVm|+xbm)aO(VlI+@J%*>klT8pwo)2r{WDtQ2ALv~Q1njD zHXI;eA(p6k%66SyyAhn+Rbv^6mJt-EGwF0A1JT0^7zP} zx_Jc%vw&!XR2D|KNenCaQ1pABZtXubWubrH$Qc|H%ls5=+aV`mqPVt-yH`cw)TBuX z&uOjaR+1MQ0wjkT3b?RQ$q%%@ zj*yCSC^)dhGDU(a_)`o(c#2}}sp4tmw|;NY+|uRZyBgR2U1$Gble_RDZAFL_RaB^8 zABzKoHXBtW?q~B_2f6wre%E9yc&gyS$nnd>syCBeYb0ZN>s_tW40rayB{NQW9m#aYgi$6yYv#>HVE{-uL%(whUsl*xR96NAM@x%cO*WG7k=m! zPO>F|`Cho)!hQe4|L=~jjMUMsuh+x8P*TZ>eVXRj<6<;dcEFrKF-t{|ePtn4w>No4 zz{%{~T|3?D?Icv=DLVD4w03hNnLb5dB*FblNW?b!(F+q0=RDUj6-6WZ*&yBJrKH&I|BRBl-s*{AhEZOh$!Y`3D#< zJ{m~Gzlq8Y@@ow`CJ9X3F*uv5ktx#Y=>1Or5Af;pT3`VyL&28&h1eYn4J!EJ=`rj3 zoj2nBo2$zJ6{08$zT{Q2_l;agk@s6a{KyNbggW>{6_x~jI5wV2X@6u-gCdId1ViV* z?)6f+S7`k@-e{pkSLAv1&pobae^Mg5iZYpK5UE^ITb~9JLwO(j2NKg+#Fi_S60TE*YQQ$Lgg~_VuSWw}F0dyN2t>FH|}$`z>~UgB;U9+u*Y9S^gt(k3vC^dQpaH{G4 zx(gb3;@32W*cR~P{qQdr;@UB(fz9HFBzf- zMZw|5$;6H#%R>);mB*W!0K*wxxMURqhCa%Xe`j{J^N>j9iqSd1Kd8}h~e``GFa{WeQ!|b*qN|`oisoB zxHe^4jRF|V3gtx{2gB^UF}6YdF$>eS&-_3SVlf+u12OA0noZ++!FrN{u|q!xxQ`29 z5XRie{&|mha66_GsUL>F$Pls%jQe9_M+e!^)b{h&0-%?3$#g9`ark_6Uo0TvSsj%X`%PeXuL7NhT2i$kyF1Qh_3XO>J(_EMgdF+M}31(l`yw zMQv!$WY*^rXB01nId13EHDkASaNwxJBLA8?u|Rpx0XM*GP`25PD_F`hDP15DRT8I5 zzxh%C8x+#-bZ2i7mM(LM1BK@*zVm!!F+BhUmY!tIWc(cfCxhrZaUtJ2a>7+}za8E8 z=EgDSg^WPcNTyVj`_!_Y`tzIH%^$2ILQBTi ziJAgy8_}^=g0%s&ZDpmo`5b&y*eo@e)l~xdxR3=H=}b#a6%$*dLc^Gx!I{-$j%)5NVOggJ);q(EGtvoV=Ugt2InHmUEDy%d`Za+C>7n6;6`CPQni zEVbYoK>S`|jU+nR*&OUAwvjz<#e0xR{&eAeg~#GeddB=9Kr8lKz@ml~!ie?@)lmnC zR@9JSYf$j=B1D-MC}I%raZrZ6>Z9{irBJ4PDBW$lToy zA;`)n6@r5t)v(=$-`xHPs>OvBk8+9i%@Rl^+>4{x@jOv(vpO2>NXwM!?--BUzF~8o z6-{W>W#$(fIx2hV+bx#P-9YQuMB!Eu5sX|>`3A5&X7^lTW7lYCsLN()A~j_pb*b}t z5z3J+RzPm;9Rv%|M2J3Tdl`VMN8Fk_8319_FK}|sl4iqZLWI6juT6bvHoRCDo4PmZ zFr|k;o^|2+dtI~~u^J+IBl5v`=M1ta`LPj}MhiqT?%Z6Zox5~cbX4}AI7ZOyO;w&5N6iFNo-oO`ww9Bik`B%dyxx)%eP@_tL5^!vNUxft{_ zF5>HL**`#A{Xf86%YD{IZhIY)f8tjzH?C6ogw~2OWN7^pZ02Mfe(Ssmnw*~;ta+>! z(2c{$4$g5gaPKW(=nEGlQVk8V2`j5N;h6uDnd{;n1Rar2_BQ*ymN?o^( z@Ux04wLFT<6ymp6Dn`og03-Ebqru^l3>47{Gvp|3kKLAVa5mAv*v{>+t^lp&G z8_gSRKN?XU+xrWBV=2lVRsRpt9-8g)o$y9%+sq8tt4~v!`woM~A(6kS&Q#x~gTkW7 zU=?lm-~O&d&G+L6!a%g~q*2J9F&8LEu%|htW3Z^@Qz)h5d;-?NAQoCF4)S-9o>1{e zj1lfWJ-=E}_#I(GP(w_gD5dt-x%SHplYUbDit9gKa&@`ohWon^0uM16)AZsWh~Uvb zK>CQM7$hr2fd)cDVM1d902qM(?~e}I=l?N=iI}=K{~P>&jX>e@xe75O{GV~)FH#|# zY8AP+;QwPp1cw}T^0ER1Rs5d;1gXjY9*^n7ml&X)`&}&ipST4sUdeyO;T*Jj=WQ(x zVVqCi00067fH&HI#i6wf^cE0prArlz?1EujC9232z>opxQ2cieOT}Ib@Q1!SVER4~ zLC)Ym$3t79A2zR%S)y_ji~xWnu-6!b!T*Wd%Y|IQzvhf8R?&1Bp z1OT0?fI$K{42HzfU0M3fXg|h(ZH3kVm{aBHeUqsF6DNv6fLe?_?t}SXe7$E_6H(hO zJP9F$Pz)h-&;SAH(oql%5Fqr9bm>(fAR>ZdsM4i(F!WxeE1>kIARxU72-2H?Sdi!7 zbFTAU@B8QbGqdhB^J8ab&z{WQ_q~>FEC7TRX4Pd3@?Fw^agb#`pYXFp%{P|;CvK8D z5l_5CY?Wr8<>pV5 zkA1$cM|K&g-pTA^ApWCec+B10-}Y;-&FNl7;8!x9|5)Hsw<(_FTs4mg?)evit{1!h z+XK|o-eVIysVy-fr2oeMZzIt#7{bTK^=z2(|1tmFgV>6M@`I?KJYI?aUp)9s^Cz3P zzSN=)@qh8|m-TATUIm@6!L0um4>(x=2RQX()?f|!-#n!Q`WhZ>s`nZHk7u8EZ<_t@ z3C4w9+=j{+q3VAT=;FQG-ts>LEsDStKpbJ6qyHkRQPbj6>^~%Ktkf!40j2tHw*ah~ z*!R`{(PRw)R*9Bk!Os6Z9lW|G`t#pa0;rDIMWNmuuWSDW0F#TU^9AuAa@P{nyi@~m z`}r>b-cTo08~y`iVhGmkQ~k+xm9 zIDu!GrjKB&MYKzh{?Pzcn!wCg>_5a9YGRo0F%0>K0l?xOAM@M) zB0a2TfgHd7f7=dRjw2;=?&yC9V9@Y>0B!!?J`DhriE5aC-4y_wuK3e2w`~6R7yg&{ zzZ*!0Yub-CoBjVm{SOHGANcWdXUbWgkQEgDKa$-jwy%1+}S1iE5dZ^F+G!mfcNv5UH+SWpRMA4;z8J7`gKkx>lT ze~bQnGuZS7?ms{&(I|@(=o+UO%Ha z6BP4Ku*lcg+pU*|5JR`Gd3;#AV!_B{dp{d^(RX#92erooq04w_${!T*02KUOr8;e^ zzI&Z~ozBcB(!D&9yGTLoqgd`B-TdCQS@Fr~wH#D||2E9{JlHS{z3p4U8DhX!M{2&U z$OmePD?xLbU`3BmfT{Rh3ZgW%DGpGeV*;+B{a z$==E9fL9r)4{770rG5qeX!gxqxqUBuMdej*il0SH-8>JeD2u1GW@R7hrku9m z2rYYgoAX1{;#q0R1ZyYhptspLf6Y8o=GSWpS^>J>d?N)WQSXanTgo4%@GZ^!pm3XR z&V+Qo)VZl9$AhXR?{mVJJyw=WdZE%(>f!wn_hBgwNsWCcEX|dj>bYtg=JmpCbc|6x zJztAu!N!9*GU7K&qT?G7HV4DSuBcCGofwKN79%?Rp~RcPMnzHaSRu!_< zHfcPTVrS6C>_EZTl8PCcX?*GH`d1Jvc*?>EI2e#w>|g1q8l;KOz8Cw4{2;=3*F zp2n13pdL{&#UteBkftS{N2%SgeZ6o3Hw{@}8`rtK$#^FxONOhS?fjYsmBvf~*4z&W zLyHooW70J}8&qFSD3f}JFPo1g+Do;-(IhWJ04`Q~0EI1(cql60cr0EIE2A%0H#HcO zUu_2E>k)=c*cy+=gD@Hpl&7LP7ZL?WH-LqFLYaaSulJU!N(GY?bgMcT5Vnc!40M(C zXAc|6RsXmJgq)HGGv%r?g* z9WHY}{+)1jAVELfz8#;_Eh9vip27RLIa}@0=f>nyOu9`WIj|=aK{0DBs=|9UY1jgL z6Geh}c=XKvbR|zr^Pqd=;+I72`N952DFAJ7gvLW&#|0JGg?{9UNxr&_g(bZm%J0*E zbD7M<7Ua)JY1AmTw&rN4+YlGA31`dG6B8MAL-mqxl^FMD9VY1V0jSTGj2~aRcF|#7 zOj!73>i5aTVUtd_Sooq#N)12HW^mE9@7{<-AphofCG*3fD$sfKV zpRLa}Nfgy`&8mNxW(S^^RBVV#A9zJ54izskr~Z=}os@4Zo8hP@Vz1uPhP-3ZwZU-h zW`j~u87_=z0Ygb^*i%EVsnGltn;yMd888RQC<~uv>}Gj7tw%+vvf4pRzu&J*S{tG> zb9FSuCO%Q-;D*ugW~@B07tRa(@NyAYw!=dgj})l*OQi{N;cnR1JfO_V^@j?AT6Z7} zox#imnn4JlS<&GEz8)3|)8QKZYkd4qbmQwA)m>}3ISO@U@SsM5AM21yRV8N{3Y#y*UVkdiMM;hzAvMQPWaGNWs>kw@K#U!d zK$v(;bxmrf}3GzA7(M$ab>O93(vr`?ak9|88EKPMwRMfIPiMss_4 zh^mXAwh2N373Y*w^A^A6`HP!E9#02@q+zup`4E=z;o06ToOI{Qz?1Q36o&omVz_!| zi`)U758+B3pLs;|!Z49LG_Bh7I&v4M-us58lw(}l$sF0${tJF16n zEH6^i*qb_rGuh(i?NmoI7*%*g6`8H}8zmN&Mw;CeX#{sDr<~F6e(AUB5}aaI&SnnYvY`K-B2(e(KnR0Jey<%;z9nP*4I$BuVeZt1&2gR+gZS zecH{YR`jE>Orr4ZUz(7OegTEL7xdijl5LJ!S8Lv9pD+ghWFS4EiN!6WsrNRFzN{l@f zk?~}Ha6{}3c$vV1An+O~o-)+HYE0nq^CaQmpH8#YxOdmh7Vg@0p9Yri&8Lz?9l1yq?>g6)I$k6Cpz<7fqNu7O zrLBlozL7qb!U3;Ba%^M&et1M)4k!$c9_79xBNJ^f;A~w+^3v(q6pGsCHhASL?xX&s z2qCgLac07f>yk?!5*RbGGx(pj301@PzKO}|rwR4DTVI@!&gJw8{eT^VsK?*aB;i3+ zC`(?JNIw`LAL+@nQegt!3er3$njOkjWyjDdm8 z=tSiq00pcAU2V*TNqgB=bb%DgI(7hYiQ&g*$LWFnlPSylm@%!8X%Qrh^m-6Q0 zZ%Qnk)xq#xusCCmnA@~9$E+LWqR5cxh;6-ry{(*$#LL@du zQGe(hHTcz}+FJEh`udWW;$4ZHaG}q4ZJ4iCRg^~3F>^UHY7Sz`Z(W*z44U9!ECST$ zlch$8ai-GSWL;ggU{L+naKZ^=l5-5!x`x!!(M|%BM2t*g82k1}h>P!`Hh4+FuET*5 zAw#7n#UA+5nZvjA>^<;yOG7WWm@Eu6CL_PqmYF^n@ln#oq&^d;P&8Z!x0))RQyLPg zO?P>`y5HvqrN|?#m*sym_*^`-%W2v@%IbelzWy_1Q^aWrBRloIJY@xmxoL!tinrvJ zA$h25;kWs3D*It+8;sI^8LUoKgD0QY_bj+X6qE9gB+gA#LlRxgXD{eKOkL4zP^067 z=ZUQF!HBF2`HXo$gdrUYuME)cSSq>#+J>xq>Z8fAlB71W2`Z@Vw7OQ(wrB=Zey$Bw z=G-mmtlyHbm=hRT9~^y7p$q;zP$J7b29u7<%HRiI*6bYmW{|egKdKEwjtz>)Evl}C z5O@Wg*h$3a22$k9pAv57hM7EJLnw2q*>e`6eBGH@iy@zGa+GOrCB(@$ zZvE%(1LXm(TP!q_4>aA$*W=l4vu-INwV1u!zq$ksvss!W1>9v<@OxBQV&Y?JlL5QXwB{B1o}AAQ*akMkD}O9GDsLHBa&u76OnI5=-?O zP-VnIIe-St6%8dim8JmJC}I(j1*9vTXPgK$VpEvo!IYuwitOPVjBVufNIJqj94N$Mo5DW%!MSzBe9vX^=kh%20dOn9yqp`XN zeNMy(6O$SeyaPSA66p-Xu#lB9k(*Nz!G&}aTFM{J1yAbM+|If9;az={0TEXLFoWc9 zWr2-QYnHLnFMq?yFg3kYGoLnO4WC+NFpcy8?+Y^ae3iQAI(_?W!Ziyoye3bb4EW=_ zq{nEQ2H6vEQ2WA9Ruk;!?y<^w&z5l_t>m`F#bZ^qX}r##A|)|B`bV> zmtLXssoQ$w$6E%!FK2O_T^^r`BA{!DxBHg00dnvO*)&*j+CiW+i#7h1pcW@TXGf{R z6@o|%Q&o!~V0PnIA+=u7Hafb|Dn?Ra%oOozJ*6}gP^$HcphpYG)j0O&O?OS^w$sUjReM)^hM5$p_*Ftyp2infA-GCYo~FHm z`Ib`bW7dH*UXIdl!2&L2Hm;kbyL8E)nNRb0($FG$)-F>`8wI7oMkda1X|%J-nu?lZ zA>|Q^hklFrzB5d6lbq#2h=)*m<4Y0VhUB%~d%xpmMWeQRsQG}h){#$_*KlKdiBXs0;201F$#rmB~hRO#R@zjgLK#+J#o_BgEALSxF%&G;T*T%#w!|*esw4pwAK%u+5w*q}VB& zZ#f|P1JH-c)WWQyY&;B^WWxjFqJo_P7m;o!=mzcw?+nX8>Pya%s|C0eGYnJGLp*{|Ev3Qn*QCXV|u zE27rJzl~|V!Hc?^uHJPp>*T6ap*zO^avqOHo@1DO4M=VMS-S}PMtmaanK{Dn0|PH3 zJH#RY0)*M1iZ1_SSnC3`1BMZ{5kNdqA5gUg2wN|icY<-I*hv{45uy=6xVQ6p2y zmeU3+U6EiXUm8+b9OSH5lK$tUgmLa!4*tFqpg$TP^qa;DzB~ALx=8ch4D)8`WtySi zj`?LtKR}LXTW=AiDTj)v#n%C=H#p*XtU5sa47buA3p}J-!~HP?@7vLH2(QnylWLCv zlOGKBA8>}u7bgo9yeuG;3F8kl-fC)uWxcZFu~PTqp2BBV*7z2j+D)o>%8?emD`uqM zTP6=V_yXt3>BWya<9Bpczs(IZ+6zikndQIc-E-%Op1YB*r0=Mu%*6Bk_Jtl80zdU; zFC^FH^Tm=o*zT_)Be=nMA{Q0}uz-~ju;qAl+hs(NfdvY|8W`q&eLP=*(vr@l4-~ml zY9=0~%TD|O2M`Q*cYAII{rriiLZX_&FN+SS1+T9dN1Lbxa<@GiyBz_?+wu|dh>xYB z@mD#McfdeUWDsBu@KO?K0_BNc=9+8_b@x-a1s2f2uyVZsOPN*Tu`Re@>V~LiO6he) zkB+UnDRRLoLWo?VGxf1Ub7|_kd#342b8yoA(FAw4kROQmJleU)I)f+IHCZQw!dn*d zCGuX9E|;5LT2&#%&pUPEfv#BDNFiqMa>;5(1j3Nre!rK0sMbctxsbMWgek37U^mu8 zd0Wvk&o&IQxsbiI7%woR+bsZxsZFN1aM_3PViz{Cu3+z!I8v1Y+L{s|hbCI$A4DOZ ziAo;QwUx}lyWT*@0hH&-cZVPP`S0k~Pp-7zLo-fzJU0Uyz&>gfw^GJ(Zr$S@nKol; zH5XpvWV&Z8);t?7CHKQ}@StB#13Q2F61L@XEP;2X94%yf9eKsXSu?qBA(O$i<6wlG;rR!K0?giwNax(cU>y3`aZ zTwc7;0pJB7hC^ps)9a=SVPm}{m(Y`$+-7S_Sz=}b7%{MOQ64`wLTLUY;Wl?$uTS=E z@YR?bvri!X&jdk=X%HefQ2D(JLT$`CWsvP=@=qmoIC*3qR+WI2dO)4zr7X~kC%v8} z!OEr)f&p+DBGd=X_q;-L`={gnx8Y=O0n4T9{{V(2g^bDNg{P)cH{8T30ixulHo zWS;TrpFJCnw1YD_Rk$D7m7^jj;V^ZI?+_DKqvcsS!DG-1?M9-YO$xgnMJrl@$`1ZV z{E><3DIahrDq9f{^8j|28D7nxtif-C;noZH!0M$4LV-07M9!+wJ<0Q?H$iAQyu8IXuDs;-YbwR2=ZbG+r0djy3YnfCm&86p!@;bvIlO+7u z1t0j3^@=h(7)Ex`5roF(+NH$7y6c~X$!70dh=?Edxi^<9=p#+S_vu)u9a_#T{yQ6I5Kg6ZHBV&AyicqJ=NM zzQh{1Iw$eTQ3`_jHU%WgGmsaU_(ICkK!qat$Q%j)sf%}ARiiC_A!Hm93}^)@9{$v1 z#cw|h;S55t@8!`xig3jOB1Jm32{C zsZPoS{38r$9fC zJN{-K-#o!GrubZabU@KJ8HJ{!Yl(?$Np(S_>eB9jutbdrE*}j^S;X4weU_U-l3X0} zGgY7sZ@GGiZec9CP*2f^A_y9uZpLUG2A+Z9AZD4WkIIlk23W>#bUXA6JOf~VKtO(M z9D-hk(4hcqNB}^lm$I#7YI>N53Id=+E}|~I!6uBETnVS)*gqKLDs??~<1`UwXdY?X z9MU-I97)bjrb6KB@M%`>Aa)1<*GYV6z84vRZj96PjV3rXG`&sZRb?dqvrNi%tM^!M zo_P0oN1a61y!OWPHajkKB}_KzR}`qH^a>o3`|Cc%eJGk9#=<5&Dx?h_=gVkLtTpcF zqDsgpn9sH)JpKk3pq_9aW;wQCc2w}l^+uj6-m}@OQqlig4;-(~gx6+uNzixjkD=kh zsL^Axe_WHTy(?vRIRxhflMQrsu_ zi*igA*LH;WBiF5ZzJ6>ALy{3#>D?)3)e|BfDhj{01UjLdQ7@H>WEpkGugN^y6lOMG z^J!2qno6T!lgjvbuGPa}Pi%Bk2fx~6z$?3;*(*C;%g93|#bS^#Z3Bvz`)E7?sPs@i!&1Gic*Q+*V`jW* z7mFAtqF0hm0fIsj6bG)qAGMF-dLz;D0t662@ED3ihD3V(HFUI;gu6KBE-y^!;jokPIK>*6ND{74!Semv{Gjna7+G*VnwX$3P} zv8GB`@kAn7VI%;>`2~ws7!-W>#g#XxhjKnla1>e0LW@oAQ8mFkS9S$8R>VPLX_1{ z^u^uHP*QZ*)q3q>aqz7Y)3Gb2pGmVD58}86P=S*gx1smqe}t-MYIeVK9wRvCjV9a; z+0^FDkm5<*OeeR#Oe3Nc5_?$qtynI?<}`(Cu&ZH`E|s?n*%sO?h*PYFd$cJ^R(U*H zVG76@;=vR_uw(+Ypv;B>Q_)y{!>kv4!9C)}t8=1Jdna@c&^9Fh$Q?>Fe+$D(Qb-B< z*hd)403l-qFgqasOb7#rwU8-QkQk6q;3Wzu zZ~DfM7Q$O2BZ?HjcD9Cbv5E+zJ2a~1RUm|N0>W@Ek$7f?yxxFJ zq2dJe4doQ^N4NgRXE1N!2r?fOB0p41dGQ@{O#GG|x>TmMRE{mAn-gUHdNiS)D_*Ox z?37-QYEBCnyRj=0e3N?3Y(F_8%kLg1M5>B`;kXDqq0V^SrZ2CrDCW+$Zzt&kJRxQ< ze@>lGQFtq78F+3GZ+LbngdA$f9I2$s7(qismxp?xMH$H%mC>>sFIatVamLJDzntU& zX+_W})xmxIV7jjHNb=4B0vbqXrk5>OZy8j4p((77sjl0OWZcfG^-cAv@^UIqV(*S6 zamuZ~;Y@Jd!2qr_m>fU|l^8?#FzNG><6XqET6m<*D1+@xlB9lzGng*AFrS8^JVz9t z+Tn4c7wVvRM-aZ8m8_Vn7{2~{fL0$HA30_%9p1xN5D8AD62aDsdrEmqmbUl%9;D`dB3h2USg7`{wX(U153R7_#@mC;{4J81k2oNMI z6-={yX&Kf;C!+W;$5k<&Vg**vNNT?cKY>g&u<4{&>R&T`yqoEHq6%{7C^$M^TTZ8f zKy70}Z_w+`HO~}f;kadaSR2lNq}ZY`e1*ztzDGU+OQ6zn@I4|v`fpxAL}_L%`ML+E zw>hhAo>K;IgSUJ2SisfEAsRjNl3*ps&nI#Gsj$moxc3zaW?KW4lWzR9!sIt)K`6;# z@c5uoFs%n*4NX>Cj#C*Bg@bCzy?EiFkRDBDc7-GsE&u~XyxJkB<=-_7!Sem6M*u8> z3u<_N^T;zw$b4Z?G^fgH==W~*Eq);O?1D#82ing zq@~K!hf$1)FKWkq9vl5lHQ=Rak@@P{YNvwuj4{ebJV-%0o$s$hsqV&Xmx9eQFJA*D zl-@-#WvdQc5X_URf9L7_1ab!IX-zFiaLDLpjRFzKm$|1q4dx#VVR~G$j*Du+QGpc0 zA6Z!^t{?=J5ohTv=S`-kqTN)%FR~pS?rIMpK zWFHj)jtH+*H_en3W9R$gZpX$jqe&0@-EiGmdNIsiLv24)ZeDXeu9LoKuF<6ST6b!IX8pmfS7KS*m zYVbquU|=UEFiqOG=*c|A^p{$#dPoI*%C8<^XMBN>sLm^31$U=5tqqC3RmBS zFZ+6wn~Zq9iuxPXTLHI=vrpuW{dL5#r&xp5&bW=aE;SJhq6@0X161BA*6VXc*wljX zFu3UNFs8?;1kFKC5f{_DaOMPBOr#hfJUO5-Hf4l?(HP0dx)4^e2z%5E+DcJ3TG7;U_#O0M-iJwZ5f>&5 zM=g2#{UyrBoj*Um`5+>1z2tlSLn@PG6ZV>ppOFq_h?lZLfWt@SKwX8JUT@5d%RRI@ zJf1cjcbJS_1}8#H=!&ILlnmCj`5gphdMIR%~(M!LMM;WnK~lU`d2INwiJGUdsPzv_Zzfc9alXR3cFn+QhZ*@~l5!!QnP_ zO-|N!=?VAO^P2d}?`J80dwU~Ex0{C%AwiP5iQ)kk1E@%K{po?T6@33xa;!g1uDcQi7{{E=5))n6qR=_ylIuDzU zA{aGGDB3Y0qN;+V*Z+cjxdZ~Gm6?SFYyeyb*jtdZe@X5)Ig z6sNNwx`RsL*>HDx<>S@TYYlwo=fVTd3uu)0wmX%JH+Sv0w4jP-`M}5FK`I>=gImK> zyy^D5Y=XUFE(U{2TZDdGIelvO(W2HBy0>bwV=J31M@-e{lD6V4}8T`U8Q2Jo*U)WqC5B-qluRO zL?kPcpGkG29eu;0Loel#Wv1JYo)L`+SBC(_`;X@ja`*{%lQhCY3(4^CPx=!hG1o&C zhg70p{{6o?+y68KF7wuU@(V)$&Y!ogX2){8`F0`#^*y*O7SD{Fz2CfF_xMn@;_~(< z<7|~lO2NK-AD5w#5)@9qRL+iT72Iq-SE+|&U2XmoZa7+5{apQN@v}f= zWvNkhMvr@k>u(>&^Gq9Kh#9r4@1>{#D!ne5!JFRhZ%n*nDR1dR+N!|29bmG$`;jCkD0lF^)P5@A{6LuR#(lL?bK zVGC%;_G-P}@t*whH7+wH@R$2J#eRvIN9WJ{Omz2&zY5COx{youwT$BIqo5%7uBncj zyr)U#L3jaq8cfp)*;i{dW07*vtk}4}clch%K}Fm*%{lmbze^e%<{le|hBHFMJo#mt zm?&tQJ!Lww^Yg5oP5qbn`z0I4DyI9M!)8ZwXH%b~D`fR=CXUC)jC1y7nS}__IjMQH^CEc~ z4se4n(PGRv>G2%9H}13i5!(q?qyAo^SMTc3|M{8tTp;C5UZ5w-aN()-t-B4@>s_Op zbvY6bJU5Wi9Ldi<Nb1LO=9Iir{SFZ&wu9o)KAj$w?QSLdh6d&?h@;)e z@#_`(JD(nEQ(hNp0qay7U4KsQr!0SskIi z;)FCzt)>$maMjI%{S{mS21gYVqIY;2I)>^luvn+&#ZWn8o(>L&|{P(2K$Zb}wU zVL21uIM(y~?y1i=IJ@N8Ze}IE#E6Ba=deMm|3?Bs6GDPAR)QUVE?rg<8$NL=D zKl^0qS)U3++@0xF8S&}n=HfqMEKJR82KSI>!(mkrj6IE0}2fypI7dlPE88Q(1!ACTe{>Hk#&iLy5$cFX!G` z;Gdg@6UpO!gt0S}WG`I|CU&0Kgz0^uscFU>B=pfb^-EbUl2=~c_lqUhsQ65U(3o9a z#IwbN391S8gvJPk%Xf7nWw7b>?^}LxIj-ZE)&5mFKf(|nDhS)1cNv^Xg9O5*6T|J_ z6MI*vJ+Jm2fwunm$p+uJlPlN&BKbl{)6q*y|Nuc7}m-a1QY2m>v! z{n_?H<`CYSPp{fZR&1QofBm#-)c7A@`pceEqmRm`JEsg!S3b$*tyezU`efEt#!}l# zQBHJl574};FTf9fxgumG1MvU!(@a-?Q1w!4(S1h~&t=#o+pKRNFlP<{DTa;HGk3|n z;rC++@6^1g>l*4^)@{ap7*E4+`Y=n6ev~J#Y)ZsMZdPUue$@Um?kq7nH?D1`uOTZF zMKGPAS=Ka{CQ!AjN09&7xEJrIq+MKbZ&_wkV%l{eFOcH61CGD1$TVzWb=3K($fGN1 z;`Q%m{C|50?@DE%uLMrH^CfAQj1+oVSxXWF|Q zwyU{~ZhtP`{3zSEkQFKBt7hN3Wj503{yOBHQH9q1xR-_-51YfTd`79mZS`=_&#wAc zcSnZIJ3ffMrdPqFj?RX5BM05))ny`0xXZzhtTa=bR7ZVvW_9=4Ss&;cVh+~5}eSGMEr@_>}azAZ7D4Kqd2 z**3M5hS{IvseI0Pkt!zXZ3V8mFTC%&^fwoAl3$iZx(WWA%21X*uuh zL~5VnoAq!H*)RO&rdqdmHC24Rl+H`_^-^z4ycYhD`X&wmwmgj{O$tZR zQV|>}ZfjZ$UFp#~YlCT8zP5d^d5csGgr$Dhso*&?o7k|-eGctmuK0y3V06UNI;xDk z9i9{%ok0&Leowbi0Kb-93b2zE&rPm;OjeQ93ym4zokF-lwWP|ISa@1DY{Et zlX zP|;iKrDk_OZ2VO{HhYjDZiS1woGRDcl70E+d9W;x!}<4LMeZMar+2kwuSKylh3!}e z)rvi}%&Pd^8d0lm&q1a5fmw^cYNwhki3}hLqD!RflK$f8xeY3W5a21dKoLY26E@&fikW7aBL7J5!&tT^)>g&cyY{lpUzHtjgCV1y~D&GS6csk6+@TchyScr9jQW} zBu@S2D3RZ~1({2qvi;otAArF#Y9$=Vt$Y_M`|)7;YMuY+{f&>-LCiTIk)5iym$s6Y z^8r1V)&x`vo@Vt8HP4ww?-f<%yf>OR*4TS*73lZ$(frPpIM%uLZat=#21nW!T8!;W z^;w^coo_Ncu#dd~&EOVNN6r-8%A()XAKk7O518=-1)0IlCuu=qos)HbDt&O6;j>lmKmjT=eXa%P8kQqx)aIpu;ZTX zpB;V%Pu?M>TO&?n)O-5h=8ONZWGRpLHD^u_3U2-VTIG6OsrA>f>7N>f0?)~td5=?j zYEz#?Z^`yu;NG^@$5hs{zDs@2ctk{e@Lc~%d*LV$G%8)j&q@Is{nT;enNLOQE7yaH zN174u{T_l7r*V6XDJj&*P`(gP#QDmzK|#?_8DdfP`6u@uH3Ne-}tRKGoGP!>}MsY*Ka`W~L!VbL+2-5v=Z5FK^pukQ6&n8S?YErdG}$cg%N+X|G`k8rovjQ{WeYOD zb%;pDbymxlFH{BSth+oS*B!UR8D38jCZwJ}ar1C__2kyKb6Ps5>vt|3CO>{(eT;m- zQ);-EC~{ppONjw#$K{za(_Wx3XtFaT^D8Stx|T+|7PZwm6eL8IjVR<|PcXYce6 z_fkh0_5nI~$kJH`l`?Nib+k|Jn|^ga`2~-GrFr3eG2{BKpPQ-X;e5O|&GQ%Er|xXs z#fCL{q#XZUlo`L6Ouf_#?4E~)4pGxY`=#Gdaj%MrL!2J3n@jn zs7*cTf3hc15oBx&`iUxx3VRRFu1KXB>ilpy{MPxjDU!Bm(veB;XJkcw(vD?+>mQA> zk=pajTM;f)ffU0$wnA9}?(%=j834vRFP}RM#1`IveXdLw^!=#sM%Bjo*Z{tAsx~^~ z4K)#2Tgo%iES&c|x`JL;=(opL=Pw!;EiOx*(hWBo51^@SbIklrq793wo{;nqS5(b! ziw|anqb;5o2cCp1s^Bvv-iFgp2bKW_RRRpE1}1q4A3xe@$l7HQ_Ox328s5Hzc>XrN zGW+BYVf+E3B0gDQ4v(hhe&XyOwvX=E;bxbF;yv*S)%j z+A{&h%BIfHtV@TIKOQ;Xk26KOw}y*y7%1+lcdUcGMlfP zYkDJJG%J;Q!S<%~$-=|Cb3x;Jw?>`?jzlriSiPf<;aM}P_;L8%|H%JA3AG^JRcr;L zHcH!3;5Nf6G?+`b**?Gfs2mM74+KSN!_x z?(o*xMc5lzHE#NJ9nHhQ3)NpQ^%w@_R+C=|$=_;JGR%{(`||5=L5%FB>zaJ#aEY1! z+K-CX8V$PN$2J!CDpHI);0SUP{&IBu3oVo0i1`nfvr7M+T#8#gqKR~EJ1zxbj;*hz z)En*>$eG`-te0y+ca`1K#a_N3h5V#zDZn1e0E zk;372S2#c@RL#F!pkJ-I>T`oxWcA?qkMVubO8n~Lw~jP=wt%~7)oC=D=TL53{%4V4 ziKU|7HTONSLNx2GdBS~6Pd47Od&?QUS-&7`e-}J|`WM{ejzb9DAaL`8gT5?u*gMeG zY7EkV643XUBa!gSD&%K48U;*rSIDMe9-mEaTQnLO%O_s@vBH?m^~kqL7#udt~i!l5Z_Q6quG++;AAyIaH^tWTOhZ zx>f&7R6>znm@w2dG?>vig$pgysQ(Y}Qq%YzCFNT>=^1_Bq(BamNAlMOt#+k}GApiM zoi6W7da-wvZkV~t+nGH+$(GlS9ec(sl+VzhP_94uY1l;RCk5C9Qb;f6@8VrLrsO5x zESso5GJ;f|w5~o_I;q74zQWcH3aw^@CE1)ro&M6o>|lHB2w*&A?N zm|54>_rK5Jy&uSA(R?RR8oSWI+*^Lo8WL}n_cWmstwBvMU0vAN+BRnVMx(_#o+p}K z7_DXKsAleut0k$4iSeF@vkzY$?#|dh{!>`4Ea83Z27$~CHXtk2%e`(s+`Io%?9+DT zlZPYOfPb!ryQ`j?b`_VG%{69>*n<5Jj|ZQX7tCz4jgsb1wfmlr{yZzRvb+;!EdZh< zD#?)V=^~j~?^A5!b~Ng4AB1^Hkl`dL)vplr02Ff9x3D9EPO}5V>*So)E1{Kt4DHaynR*l=Ps^J6Ca+c zc_J@2{vDY}en=M-eB|MUFP39Khq4=PhgIP1O z>q^^*LzAS$LDsbVT{*qhid^=+6GyWiQ^ioIf`zL576uPMa9lQGOsl!NQ}DI1 zSm7HWc1jjIn0b2oV_Nb(B^PY$P*x%;@tEb`(<&flxZh>*`D9{8J6Pwn!@H~tK2TYJ zJ6$vN}S$uuGl7i{9Epu(Bg2~YzSiy^1n#{GMMOt1ip+z zZ*&>Y8$Mz;@N|DwV9Kngu`FVN3}Wlu)~q(r2ZL%^go`LVDUhhK?0R4XsrSSyI2f;@ zC@KyMed??M!jXY^)$)z_QR2ff2kH(ep0Dl^t^;<~mV6@f%CzBQkqw%8_!Ldq@W(+u zbSPOFSh!}A3R}wM6DS0=2_28`os_ECU92siu$lzjtnJXipu(HFU;$cb{((WJ3VRGDo}E0einoqg zv4XSUCY=}`E|z5IEHH`PHVc+S3SN&&jHwM@A*|PMhf8A-9ZNyl{5&7QZVr*DjxOn; zxvv$ejkj9Hu6O;P01p@N=!lF%blgagidQq;^i}2!)Uy|Qs|&zE!CLjMaZ`9OFln7{ zE$1}m9I>hqWSJt^%QuMDuKQR!)P|L7j&J$GrhCwo==u@z1Wv5*Zos{T)65quhX6HR zfqy%f(BmHfqd=y=6;@YrCA`^mI_ETI)`_zb2r;%M%+4nN037G^9_&q)4_3!oY`8cE zYZuWF)F8QW0NDi=QhAl@*RNi^diCqq69t8+_YI^1moi7q_#d*KV5c!lPGo_XYsnYH z_L~yK<+lTvUQH^fQgI9bEV{+Y7o;)>1T`UnZE!X-95uJ-vrgxvnhsp`{l8VNet?bL zQ)cISK2W5*OAJko%BQI&&R7X!HVy0*DKkm@Y3*G?rN^bt0h%V{iLk>BYxd8(Y*_b%L~Ex89im^Y8{ndJ|4~= zoA*x(YYIl2R0Lu~mmOTMei!?9=i=+l?O8eB#rjrnI#6GbGtQhkI5?=}VBk*=5ZJd* z@?*J1ZCifjD&xXQrSJBhU#9}HaU6k_PL~HP)-O9(L)4ZpOL6z|bx*n0(9{G-_HfI^eP~?c>F~GkGYSQYU~4{`YA47YFs)ZAB2B26^rejx95MOqH8#zq#9h} zi+mIrZ^7HW1G*XLP|Q!aB|}OwQ`DtNzE@w2xc*cFPc3-L-eLXm zjB>L4MNZaN`Nq?vUd(>Ky3qK6&zx28hRy>}K;#7xjd>A-cRG$KisC9yNi?aaTCDJZ zhj!Arph^h=P`Dyv`_J-}nrlxl92%h-^||8s-V2)EX(0hpMg=IF3n+DxRe;Gw>t&V6 z)QXB0fbafPL?btX zEqmKf#Z7f9{StNO)6XD(jx{4MJcFLv8Q#(laDD#(G=g3DZgjCdES(){>OqHI)JCU` zZEuMAo8vKNs&4pT`zxQ5z{JNjF$j$ANfV;#?eW2cKp}M=@Zm4YAuZIW;A^DaIi$TI zwI&$VBuOU;GBjIoO)i~lUQtRLpWbMA0wSAarOtm<7QPH89P{f_>AwY7S#;iw zCC{ZOoD1v^IH%2MwF(U}I`lfwl1JP9uX-e2dUNqsC_(8J1iPyTGejZW986R}hQuHCJ0wab;MoedbuU6;)AeExb z-B2!qqYRnUVYl>9Sq8~V<{=0K#!~PR9Exci0yF6~Fasu3!f>eVjs}*P%6c~N+uS;} z{?Lrh8~QJrabW)dwY9i5eI~6Q3H)=~clr(4@G*NKuLk4+*-kU^Hh3}9Wvg|x8lOC#5WOp{G|&{UqBIye(&4M#&v zdc=Uu<(VubX7Z7B2;@r`%S5*lEC&QPR-H~VJ`zU4NTAHfgJ5gDWylkf5Z!DP%`rrv zQcSyGLvg(;`stVmq9WKsnBLNv%!n64CK5Ll00}NrvWd&V0_@|6Vm&HbOhB<97BEOl zsu@Z-(>|?Ki0~1Vn!Vh-BV#wBf;#YcwEqAVKI8SR`u405z(O)5?^77u`Hm(x1XK#) z{=dF_>e59E8v%K{u#nB}W~zt1Y<+inv+>8#qxA4nqVrYZk9t%5`3-z2i-H#c2$BMT zQswDnhs0%~U>1Zd%vy*L1`u&5u9(RqD3MES%nO~RE`f+_Sz&&66b1(rloXg#3QHSH z8Q`=}CPL6fgaj7F<}V}%dPTGK`mJ6GA4Tsz41;=T(KNr-KLtBtAsCN-LXHN>Oafj< z4|A5V;F?uVS3K`PA+}$btVDhP0Lo1WX!#PU0LbT_wQ^?j-inUcbBZwR^Co$EnxGe= z)eW@0rS)Ob9uFODQ{RrpADg```WWCL{6y^AN&rT(fD%cw7a4&eXM>$sSeb7P+#5H% zMM!`k1avsOIR@Bds6+*QtVx{`5yB&inP5RC zkv6y+qh@&qNnSB_p}H;QY#}J5-0v1*^O49IrI$@!fe4HX17V8R6tS|XVCaaN+M92__ygvP9yWv9QI*nIelmWbI|_)YqWPND-yArUz>FBYPNn~F8-ok znroo4^4uTJm#c`E1=;u$e_p?f78JQ|s^d`I1VXHWQ!Xq|T2uC?{@Lx|4A*$(n${CZ{s7eX8|@ zZ3!V`Nx+oHAh;A?TS}s!Q72{6;NJ~GH3=!~H9l!UU^KOvh?db5O+_1UaUTpZHK$WW z?`tef)0tAu?s|r8knou9evcfZ${)kV$G7~UOpq6^rxM-Y`tS+se(#r=&h@mYIG>49 zX7i;m42}E2`ij@CN6-AL0iJ)A5IO#ET3dru;Wr8L8Xstop4NBa5+++qi5YkcjjxU6 z-0Q&TDZi_> zjfe%9mIczn^{|PP+u>28!ZLPO>&8;D zIsEy0>n7UqQO9dO25R-|uU&dR0vpi7gMZV8^^SdbMxni9t1q8=BEg1O01l8r1VIo0 z6kldTz0$JJ84CgliCT4hx=yCPtX1ZmhQQUtAN^6*@iqPz&)e#tVI>+17;1 z3{+P)Pw)M$W}yL`bFD2BS5NY-HAdgR_O+LR@T8&uf#8;O7tsFzJj~jUfb$;@Evh5I z&)bL4qa~M<-ux|>J61Zy@bl&?SLd)Zlc^F!+|7bDg1CFJSo3wa{&%jcrF3)Sh%xzA zR#tm!@lr+zhU9I2-^*TtUcW!{`BDpDr#pY@Xh!4SS*FZ^ZT4-?qfsIUF~7du(<9Ty z0$E7&Wl}YrRPm!JCxxnfO1}~D{GN2IZD4q<)$urPDv}woMt_e^-DvpStGMk#DYmrc zQOT3!Djq9b>-(qo2QyxiqB_jYN))oK{{ZXvy=*0R@kdtyq4Uq{%udSJ_->6Ao@96I ztlaHQefAoMNxE2A8Q69CJa{#^w+TX@&4}r&{95%yAvYZV z0KU6EHMzx9}`? zs2l^z>lqiy!xf4MTn&wWqaYG!+SYo+z}VqO0G|Am0X>c}S?) zlb>AiiCfM5;5IEkbp(V7OA7`wQ^4lwniM3AtlaGuXhz<~(m~gC<|q=HgZQiISEwgX z?%%&VJ$kM>z1(Z^SLXfjX(eiF?^<t(osk+Fo{=FlD~~0FV3a^jL2Bsbv-&#{=R}W9Umi zcp6Zu@D}mGfMt<`hZStAV^OhwdF8BClA#v~cPu8!iM&mwF*WKcHG^5w59Wp37quxe z{{UsV`%}$9LGvwrWb^amHV!~rjOF+Oi+!C_I^#2`5SLRISc>O&@CQq3j{N&@vhhq> zo|l$EGn3FKti*18mmcrm3!Vx|E5kh|~Q z)eyxcWfHi|gucoTX((WVB|^bBgJ{#I+5C?O*<~=QI{Ywncsz}D+7l*uV-=3|oD5s?iSbzb6r@YM??E^+JE1pJ&&a zz2oheomcN#*1U6fulZl+8ppF#IePHu#hmzkvOt5HDpJ`iUA01>GB z`KHYDYy;dan}<##kbP0bSY_#YL{TqD0Iy0#Acm0*^+mWUu$st#?jW6f>E1unJmN4% zk*^6Cdtvx>JRS;p0YN*Z0kH&Q8bk)!0Ln-pG(EZgaJoI~9(vJxpD_q}GJNpDIvu-Z z9hNlT=sKx=77YU4Ceeh23f@#SEUgfTTEI|939O$35>`r}mOJ3F6F}S`nX=Ol7CUn~ z^gtYE3KV_G;PU|>1+>QiaQ zI!2U30KERQd$nF>Z%IO1iPHA1F`{>#02vx6TLr=D*NVF3sW4qlyg>2Gi9a+CC?)JPE=W2mFdrpc=Ka{{TR#PLP8}=P7Fnh2kZc zqrzvS?^s;WE3$+^0tkU5gofqoLgc~@kpM}tmD(;z^Lkq`XpQ^rJvfYf@T6<1+#x+> zhZci>q3WLvM|P6L6&}gTmo#KuRVW@7@=GT)B-`3t(5)B6E=4v}0!z_Yh*~Y2QK!6; zmWxssG_?RZjIN1zwk+P%o1usx#IQ8PUpb?C0{H^hkQ;AwpqAPzOi3{57NfI?BvLFv zG272w&*Hk=`*8iIhL1|WK9!fh^06xrqu`L#g3X|)$Z!u7DSWf*E4y0G(Uu!h92Fnt2=PhGaOFxHOM zi{Q`8J}yQ5I3Swp!9tzVvgtE=CeZ%OeAcyjs32-g4lJ=cgvIElaC7?l9<7i5VrsUv z?=sqeWl51NMSv}%V@eectB))MptIhzKV<{5DeRR1;pT-IIe^eHDoAJ;jTvAa92H=@ zkumCNihe5asLwC;vF`{M;tpkEvk=9}x$s*RiWd_w336^G*bRurb+Ji^v7k&=~Omr{&2c&V+ymiQ< zJAnW_XR44W#)c5a0RUi;Oa!WztV-ov^BgruPT9;kf4@c7CNGrIkl0MKM#R_`YQS8K zSu>DL)Y3zd3`-4322r$9tT-iL68aNPOWKJ6L3ag~OOpyrD3gk5Y)~b}!X_XBuM5m+ zXQfQ%VIt+ZP>UUNVl16(Cg>~LP0|#c00Q*_s;a80vft=eU!TtkAG42b)AV=?W9zL5 z)wN)Tt@u<`Fc1ujt+Z?xkdTH_BwuDUo4RC|yFg2dR`FRD<08?oQOPuY{T0;20NAYs zuq3ciiJ^z(*bJeBIhj`Cz`lq8ge~Ub*7U^XW8RucYDR>@AQQ20R*<0gVy6J9SqL%+ z+9a}<^VdVgS<$0_g_IV`^|*;7&(Px$XV#Jb02(I9*5|eL;J`)LPc_8=JB4L63z<4? zMq^O*7+C2a%_vgD;>SyLzrPNPmwxeY%=Y>|xBRmjiUZ9dAq~-iQ+`4)O~;i=vlOnN zTR9>~AS?qqBAr->CnRi1fry%clBCM8qsjz|Ka+`eAX#khc+p9bBkwH?XqY!-6lNAz z5C~P1VpCCAPR#oJ<;gaYc7Z_fMl6;=)RBi${{TR_x2fng32dos@DNg5a$74Cuf<8H zf|T0O2umv&l+}=gX75;|QjTMIF+d{%MhiIA27oT1``+(-N73~GO_LIdekE`bLfoOF z0Yh1GuvP-912n-Tk>yfM7@OTDOa!1LP>jk_1tMHT*${wZFfIHF5^=Bz6+zRMBSo<| zj~IYCeJcfwxd;gn2rR@PSgQQ4^(f?pIjn(Q=;vrW5F*qW1Q9&--2OZuiX;@bt4f_w zQZx(I9r^a5A|7Ys(~i>*ez11op;cwLV5xHGF(tLgjtIn;BTMCsU7g+95EuFtsAv*g z8w-Zu*MI~FD&)#)Sc$a<0_dAoOSh;=9`!C}p`?4X7=(9Hu3Aw({SdsdFF$YPVL=1QF+8_$qs6e6<5VgEY)b z6C=v?9}4>#+9l6gS2UW%9vX`abwO=dVAdU})CxOpACx=10>l)c=Rwj0JxLqxNHMv; z0B6+=N<@qoji&tx+wGmYftjw|NU^#;ewB<4)zHy*9Qsj%M?AHeeV^qj1(k68Uerg{ v4MaiK6&>k1Q2>q&^fMWVq%Gzq64)syTTSkZ-VB&}j46M=cUABI08{_joT+V7 literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32l432-st-nucleo/project.ewd b/bsp/stm32/stm32l432-st-nucleo/project.ewd new file mode 100644 index 0000000000..4b27053590 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/project.ewd @@ -0,0 +1,2834 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l432-st-nucleo/project.ewp b/bsp/stm32/stm32l432-st-nucleo/project.ewp new file mode 100644 index 0000000000..669952b8e4 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/project.ewp @@ -0,0 +1,2275 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\iar\startup_stm32l432xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + CORTEX-M4 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + diff --git a/bsp/stm32/stm32l432-st-nucleo/project.eww b/bsp/stm32/stm32l432-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l432-st-nucleo/project.uvoptx b/bsp/stm32/stm32l432-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..5b23b3917f --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/project.uvoptx @@ -0,0 +1,1002 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 5 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF534854845187093307 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_256 -FL040000 -FS08000000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + 0 + + 1 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l432xx.s + startup_stm32l432xx.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + stm32l4xx_hal_comp.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + stm32l4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + stm32l4xx_hal_crc_ex.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + stm32l4xx_hal_cryp.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + stm32l4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + stm32l4xx_hal_exti.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + stm32l4xx_hal_rng.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + stm32l4xx_hal_sram.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + stm32l4xx_hal_usart.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + stm32l4xx_hal_usart_ex.c + 0 + 0 + + + +
diff --git a/bsp/stm32/stm32l432-st-nucleo/project.uvprojx b/bsp/stm32/stm32l432-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..8d3433961a --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/project.uvprojx @@ -0,0 +1,738 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L432KCUx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x0000C000) IRAM2(0x10000000,0x00004000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM)) + 0 + $$Device:STM32L432KCUx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L432KCUx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x10000000 + 0x4000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32L432xx + + .;..\..\..\include;.;applications;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Inc;..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Include;..\libraries\STM32L4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32l4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + startup_stm32l432xx.s + 2 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l432xx.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32l4xx.c + 1 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + stm32l4xx_hal.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + stm32l4xx_hal_comp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + stm32l4xx_hal_cortex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + stm32l4xx_hal_crc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + stm32l4xx_hal_crc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + stm32l4xx_hal_cryp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + stm32l4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + stm32l4xx_hal_dma.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + stm32l4xx_hal_dma_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + stm32l4xx_hal_exti.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + stm32l4xx_hal_pwr.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + stm32l4xx_hal_rcc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + stm32l4xx_hal_rng.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + stm32l4xx_hal_sram.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + + + stm32l4xx_hal_gpio.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + stm32l4xx_hal_uart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + stm32l4xx_hal_uart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + stm32l4xx_hal_usart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + stm32l4xx_hal_usart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + + + + + +
diff --git a/bsp/stm32/stm32l432-st-nucleo/rtconfig.h b/bsp/stm32/stm32l432-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..3edb6a46c2 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/rtconfig.h @@ -0,0 +1,179 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 256 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40000 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* sample package */ + +/* samples: kernel and components samples */ + + +/* example package: hello */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L4 + +/* Hardware Drivers Config */ + +#define SOC_STM32L432KC + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_STLINK_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32l432-st-nucleo/rtconfig.py b/bsp/stm32/stm32l432-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..d632114e2d --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict --scatter "board\linker_scripts\link.sct"' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l432-st-nucleo/template.ewp b/bsp/stm32/stm32l432-st-nucleo/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/template.ewp @@ -0,0 +1,2031 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32l432-st-nucleo/template.eww b/bsp/stm32/stm32l432-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l432-st-nucleo/template.uvoptx b/bsp/stm32/stm32l432-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..d18ee55260 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/template.uvoptx @@ -0,0 +1,186 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 5 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF534854845187093307 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_256 -FL040000 -FS08000000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + 0 + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l432-st-nucleo/template.uvprojx b/bsp/stm32/stm32l432-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..01e792faf7 --- /dev/null +++ b/bsp/stm32/stm32l432-st-nucleo/template.uvprojx @@ -0,0 +1,386 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L432KCUx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x0000C000) IRAM2(0x10000000,0x00004000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM)) + 0 + $$Device:STM32L432KCUx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L432KCUx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + +