From 4d9db5ebd3dadd4efb58962d23e59668a2801065 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Mon, 13 Jan 2020 18:51:49 +1000 Subject: [PATCH] In-progress 2020 update --- .../Src/stm32f2xx_hal_sd.c | 105 +++++++++++------ .../SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h | 2 +- STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h | 1 + STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h | 2 +- STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h | 4 +- STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h | 2 +- STM32CubeMX/SCSI2SD-V6/SCSI2SD-V6.ioc | 108 +++++++++++------- STM32CubeMX/SCSI2SD-V6/Src/fsmc.c | 2 +- STM32CubeMX/SCSI2SD-V6/Src/gpio.c | 11 +- STM32CubeMX/SCSI2SD-V6/Src/main.c | 11 +- STM32CubeMX/SCSI2SD-V6/Src/sdio.c | 5 +- .../SCSI2SD-V6/Src/stm32f2xx_hal_msp.c | 8 -- STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c | 20 +++- STM32CubeMX/SCSI2SD-V6/Src/usb_device.c | 13 +-- STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c | 37 +++++- rtl/fpga_bitmap.o | Bin 32724 -> 32724 bytes src/firmware/cubemx.patch | 93 --------------- src/firmware/led.c | 8 +- src/firmware/main.c | 10 +- src/firmware/usb_device/usbd_desc.c | 2 +- 20 files changed, 225 insertions(+), 219 deletions(-) diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c index 4df41a0a..233f4249 100755 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c +++ b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c @@ -893,7 +893,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead SDIO_IT_STBITERR)); /* Enable SDIO DMA transfer */ - __HAL_SD_SDIO_DMA_ENABLE(); + // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE(); /* Configure DMA user callbacks */ hsd->hdmarx->XferCpltCallback = SD_DMA_RxCplt; @@ -901,27 +901,29 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead /* Enable the DMA Stream */ HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4); + + sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; + sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; + sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; if (hsd->CardType == HIGH_CAPACITY_SD_CARD) { BlockSize = 512; ReadAddr /= 512; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + } else { + /* Set Block Size for Card */ + sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; + sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; + + SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); + /* Check for error conditions */ + errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - if (errorstate != SD_OK) - { - return errorstate; + if (errorstate != SD_OK) + { + return errorstate; + } } /* Configure the SD DPSM (Data Path State Machine) */ @@ -931,6 +933,11 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; + + // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the + // data is just discarded before the dpsm is started. + __HAL_SD_SDIO_DMA_ENABLE(); + SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); /* Check number of blocks command */ @@ -1017,28 +1024,29 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4); /* Enable SDIO DMA transfer */ - __HAL_SD_SDIO_DMA_ENABLE(); + // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE(); + sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; + sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; + sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; if (hsd->CardType == HIGH_CAPACITY_SD_CARD) { BlockSize = 512; WriteAddr /= 512; - } + } else { + /* Set Block Size for Card */ + sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; + sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); + /* Check for error conditions */ + errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - if (errorstate != SD_OK) - { - return errorstate; + if (errorstate != SD_OK) + { + return errorstate; + } } /* Check number of blocks command */ @@ -1049,6 +1057,26 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri } else { + /* MM: Prepare for write */ + sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); + sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; + SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); + if (errorstate != SD_OK) + { + return errorstate; + } + sdio_cmdinitstructure.Argument = (uint32_t)NumberOfBlocks; + sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCK_COUNT; + SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); + errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCK_COUNT); + if (errorstate != SD_OK) + { + return errorstate; + } + + /* /MM */ + /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK; } @@ -1078,6 +1106,11 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; + + // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the + // data is just discarded before the dpsm is started. + __HAL_SD_SDIO_DMA_ENABLE(); + SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); hsd->SdTransferErr = errorstate; @@ -1116,7 +1149,9 @@ HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Ti timeout = Timeout; - /* Wait until the Rx transfer is no longer active */ + /* Wait until the Rx transfer is no longer active. IE. fifo is empty. +Once FIFO is empty, the DMA will have finished and DmaTransferCplt should +be true */ while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0)) { timeout--; @@ -1916,10 +1951,12 @@ HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd) __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); /* Test if the switch mode HS is ok */ - if ((SD_hs[13]& 2) != 2) - { - errorstate = SD_UNSUPPORTED_FEATURE; - } + // MM: These bits (0 to 271) are reserved in the spec I'm looking at ??? + // Should be safe to ignore the result. + //if ((SD_hs[13]& 2) != 2) + //{ + //errorstate = SD_UNSUPPORTED_FEATURE; + //} } return errorstate; diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h index ef23c94f..223aa4a2 100755 --- a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h +++ b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h @@ -76,7 +76,7 @@ //#define HAL_SMARTCARD_MODULE_ENABLED //#define HAL_WWDG_MODULE_ENABLED #define HAL_PCD_MODULE_ENABLED -//#define HAL_HCD_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h index 5c39a9d7..293f87be 100755 --- a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h +++ b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h @@ -49,6 +49,7 @@ void SysTick_Handler(void); void EXTI4_IRQHandler(void); void SDIO_IRQHandler(void); void DMA2_Stream3_IRQHandler(void); +void OTG_FS_IRQHandler(void); void DMA2_Stream6_IRQHandler(void); void OTG_HS_IRQHandler(void); diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h b/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h index dd6f2867..4ccb6216 100755 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h +++ b/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h @@ -42,7 +42,7 @@ #include "stm32f2xx_hal.h" #include "usbd_def.h" -extern USBD_HandleTypeDef hUsbDeviceHS; +extern USBD_HandleTypeDef hUsbDeviceFS; /* USB_Device init function */ void MX_USB_DEVICE_Init(void); diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h index a3c56187..b4dd875e 100755 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h +++ b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h @@ -57,7 +57,7 @@ */ /*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 1 +#define USBD_MAX_NUM_INTERFACES 2 /*---------- -----------*/ #define USBD_MAX_NUM_CONFIGURATION 1 /*---------- -----------*/ @@ -70,8 +70,6 @@ #define USBD_LPM_ENABLED 0 /*---------- -----------*/ #define USBD_SELF_POWERED 1 -/*---------- -----------*/ -#define MSC_MEDIA_PACKET 512 /****************************************/ /* #define for FS and HS identification */ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h index a7036688..50dfc6fc 100755 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h +++ b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h @@ -75,7 +75,7 @@ /** @defgroup USBD_DESC_Exported_Variables * @{ */ -extern USBD_DescriptorsTypeDef HS_Desc; +extern USBD_DescriptorsTypeDef FS_Desc; /** * @} */ diff --git a/STM32CubeMX/SCSI2SD-V6/SCSI2SD-V6.ioc b/STM32CubeMX/SCSI2SD-V6/SCSI2SD-V6.ioc index a1b5b62b..2255c6e8 100755 --- a/STM32CubeMX/SCSI2SD-V6/SCSI2SD-V6.ioc +++ b/STM32CubeMX/SCSI2SD-V6/SCSI2SD-V6.ioc @@ -67,16 +67,17 @@ KeepUserPlacement=true Mcu.Family=STM32F2 Mcu.IP0=DMA Mcu.IP1=FSMC -Mcu.IP10=USB_OTG_HS +Mcu.IP10=USB_OTG_FS +Mcu.IP11=USB_OTG_HS Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=SDIO Mcu.IP5=SPI1 -Mcu.IP6=TIM4 -Mcu.IP7=UART4 -Mcu.IP8=USB_DEVICE -Mcu.IP9=USB_OTG_FS -Mcu.IPNb=11 +Mcu.IP6=SYS +Mcu.IP7=TIM4 +Mcu.IP8=UART4 +Mcu.IP9=USB_DEVICE +Mcu.IPNb=12 Mcu.Name=STM32F205V(B-C-E-F-G)Tx Mcu.Package=LQFP100 Mcu.Pin0=PE2 @@ -160,23 +161,32 @@ Mcu.Pin79=PB9 Mcu.Pin8=PH0-OSC_IN Mcu.Pin80=PE0 Mcu.Pin81=PE1 -Mcu.Pin82=VP_TIM4_VS_ControllerModeClock -Mcu.Pin83=VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS +Mcu.Pin82=VP_SYS_VS_Systick +Mcu.Pin83=VP_TIM4_VS_ControllerModeClock +Mcu.Pin84=VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS Mcu.Pin9=PH1-OSC_OUT -Mcu.PinsNb=84 +Mcu.PinsNb=85 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F205VCTx -MxCube.Version=4.11.0 -MxDb.Version=DB.4.0.110 +MxCube.Version=5.4.0 +MxDb.Version=DB.5.0.40 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.DMA2_Stream3_IRQn=true\:0\:0\:false\:false\:true\:true\:true NVIC.DMA2_Stream6_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.EXTI4_IRQn=true\:10\:0\:true\:false\:true\:true\:true NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.OTG_HS_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SDIO_IRQn=true\:0\:0\:true\:false\:true\:true\:true +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false PA0-WKUP.Locked=true PA0-WKUP.Mode=Asynchronous PA0-WKUP.Signal=UART4_TX @@ -217,7 +227,7 @@ PA7.Locked=true PA7.Mode=Full_Duplex_Master PA7.Signal=SPI1_MOSI PA8.GPIOParameters=GPIO_Speed -PA8.GPIO_Speed=GPIO_SPEED_HIGH +PA8.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA8.Mode=Clock-out-1 PA8.Signal=RCC_MCO_1 PA9.GPIOParameters=GPIO_Label @@ -246,8 +256,9 @@ PB14.GPIOParameters=GPIO_Label PB14.GPIO_Label=nTERM_EN PB14.Locked=true PB14.Signal=GPIO_Output -PB15.GPIOParameters=GPIO_Label +PB15.GPIOParameters=GPIO_PuPd,GPIO_Label PB15.GPIO_Label=LED_IO +PB15.GPIO_PuPd=GPIO_PULLDOWN PB15.Locked=true PB15.Signal=GPIO_Output PB2.GPIOParameters=GPIO_PuPd,GPIO_Label @@ -266,7 +277,7 @@ PB5.Signal=USB_OTG_HS_ULPI_D7 PB6.Locked=true PB6.Signal=GPIO_Analog PB7.GPIOParameters=GPIO_Speed_High_Default -PB7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PB7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PB7.Signal=FSMC_NL PB8.GPIOParameters=GPIO_PuPd,GPIO_Label PB8.GPIO_Label=nSD_WP @@ -333,16 +344,24 @@ PC9.GPIOParameters=GPIO_PuPd PC9.GPIO_PuPd=GPIO_PULLUP PC9.Mode=SD_4_bits_Wide_bus PC9.Signal=SDIO_D1 +PCC.Checker=false +PCC.Line=STM32F2x5 +PCC.MCU=STM32F205V(B-C-E-F-G)Tx +PCC.PartNumber=STM32F205VCTx +PCC.Seq0=0 +PCC.Series=STM32F2 +PCC.Temperature=25 +PCC.Vdd=3.3 PD0.GPIOParameters=GPIO_Speed_High_Default -PD0.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD0.Mode=16b-da1 PD0.Signal=FSMC_DA2 PD1.GPIOParameters=GPIO_Speed_High_Default -PD1.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD1.Mode=16b-da1 PD1.Signal=FSMC_DA3 PD10.GPIOParameters=GPIO_Speed_High_Default -PD10.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD10.Mode=16b-da1 PD10.Signal=FSMC_DA15 PD11.Locked=true @@ -355,11 +374,11 @@ PD13.GPIO_PuPd=GPIO_NOPULL PD13.Locked=true PD13.Signal=GPIO_Output PD14.GPIOParameters=GPIO_Speed_High_Default -PD14.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD14.Mode=16b-da1 PD14.Signal=FSMC_DA0 PD15.GPIOParameters=GPIO_Speed_High_Default -PD15.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD15.Mode=16b-da1 PD15.Signal=FSMC_DA1 PD2.GPIOParameters=GPIO_PuPd @@ -372,11 +391,11 @@ PD3.GPIO_PuPd=GPIO_PULLDOWN PD3.Locked=true PD3.Signal=GPIO_Input PD4.GPIOParameters=GPIO_Speed_High_Default -PD4.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD4.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD4.Mode=MuxedPsram1 PD4.Signal=FSMC_NOE PD5.GPIOParameters=GPIO_Speed_High_Default -PD5.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD5.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD5.Mode=MuxedPsram1 PD5.Signal=FSMC_NWE PD6.GPIOParameters=GPIO_Label @@ -384,47 +403,47 @@ PD6.GPIO_Label=NWAIT_UNUSED PD6.Locked=true PD6.Signal=GPIO_Analog PD7.GPIOParameters=GPIO_Speed_High_Default -PD7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD7.Mode=NorPsramChipSelect1_1 PD7.Signal=FSMC_NE1 PD8.GPIOParameters=GPIO_Speed_High_Default -PD8.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD8.Mode=16b-da1 PD8.Signal=FSMC_DA13 PD9.GPIOParameters=GPIO_Speed_High_Default -PD9.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PD9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PD9.Mode=16b-da1 PD9.Signal=FSMC_DA14 PE0.GPIOParameters=GPIO_Speed_High_Default -PE0.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE0.Mode=2ByteEnable1 PE0.Signal=FSMC_NBL0 PE1.GPIOParameters=GPIO_Speed_High_Default -PE1.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE1.Mode=2ByteEnable1 PE1.Signal=FSMC_NBL1 PE10.GPIOParameters=GPIO_Speed_High_Default -PE10.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE10.Mode=16b-da1 PE10.Signal=FSMC_DA7 PE11.GPIOParameters=GPIO_Speed_High_Default -PE11.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE11.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE11.Mode=16b-da1 PE11.Signal=FSMC_DA8 PE12.GPIOParameters=GPIO_Speed_High_Default -PE12.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE12.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE12.Mode=16b-da1 PE12.Signal=FSMC_DA9 PE13.GPIOParameters=GPIO_Speed_High_Default -PE13.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE13.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE13.Mode=16b-da1 PE13.Signal=FSMC_DA10 PE14.GPIOParameters=GPIO_Speed_High_Default -PE14.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE14.Mode=16b-da1 PE14.Signal=FSMC_DA11 PE15.GPIOParameters=GPIO_Speed_High_Default -PE15.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE15.Mode=16b-da1 PE15.Signal=FSMC_DA12 PE2.GPIOParameters=GPIO_PuPd,GPIO_Label @@ -449,15 +468,15 @@ PE6.GPIO_PuPd=GPIO_PULLDOWN PE6.Locked=true PE6.Signal=GPIO_Input PE7.GPIOParameters=GPIO_Speed_High_Default -PE7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE7.Mode=16b-da1 PE7.Signal=FSMC_DA4 PE8.GPIOParameters=GPIO_Speed_High_Default -PE8.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE8.Mode=16b-da1 PE8.Signal=FSMC_DA5 PE9.GPIOParameters=GPIO_Speed_High_Default -PE9.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM +PE9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM PE9.Mode=16b-da1 PE9.Signal=FSMC_DA6 PH0-OSC_IN.Mode=HSE-External-Oscillator @@ -505,29 +524,30 @@ RCC.EthernetFreq_Value=108000000 RCC.FCLKCortexFreq_Value=108000000 RCC.FamilyName=M RCC.HCLKFreq_Value=108000000 -RCC.HSE_VALUE=20000000 +RCC.HSE_VALUE=12000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=96000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQ,RCC_MCO1Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQ,PLLSourceVirtual,RCC_MCO1Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S RCC.LSE_VALUE=32768 RCC.LSI_VALUE=32000 RCC.MCO1PinFreq_Value=108000000 RCC.MCO2PinFreq_Value=108000000 RCC.PLLCLKFreq_Value=108000000 -RCC.PLLM=20 +RCC.PLLM=12 RCC.PLLN=432 RCC.PLLP=RCC_PLLP_DIV4 RCC.PLLQ=9 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.RCC_MCO1Source=RCC_MCO1SOURCE_PLLCLK RCC.RTCFreq_Value=32000 -RCC.RTCHSEDivFreq_Value=10000000 +RCC.RTCHSEDivFreq_Value=6000000 RCC.SYSCLKFreq_VALUE=108000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.VCOI2SOutputFreq_Value=192000000 RCC.VCOInputFreq_Value=1000000 RCC.VCOOutputFreq_Value=432000000 RCC.VcooutputI2S=96000000 -SH.FSMC_NL.0=FSMC_NL,MuxedPsram1 +SH.FSMC_NL.0=FSMC_NL,AddressValid1 SH.FSMC_NL.ConfNb=1 SH.GPXTI4.0=GPIO_EXTI4 SH.GPXTI4.ConfNb=1 @@ -537,13 +557,15 @@ SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 SPI1.CLKPhase=SPI_PHASE_2EDGE SPI1.CLKPolarity=SPI_POLARITY_HIGH SPI1.CalculateBaudRate=13.5 MBits/s -SPI1.IPParameters=VirtualType,Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase,Direction SPI1.Mode=SPI_MODE_MASTER SPI1.VirtualType=VM_MASTER UART4.BaudRate=9600 UART4.IPParameters=VirtualMode,BaudRate UART4.VirtualMode=Asynchronous -USB_DEVICE.IPParameters=VirtualMode-MSC_HS,USBD_HandleTypeDef-MSC_HS,VirtualModeHS +USB_DEVICE.CLASS_NAME_HS=MSC +USB_DEVICE.IPParameters=VirtualMode-MSC_HS,USBD_HandleTypeDef-MSC_HS,VirtualModeHS,CLASS_NAME_HS USB_DEVICE.USBD_HandleTypeDef-MSC_HS=hUsbDeviceHS USB_DEVICE.VirtualMode-MSC_HS=Msc USB_DEVICE.VirtualModeHS=Msc_HS @@ -552,6 +574,8 @@ USB_OTG_FS.VirtualMode=Device_Only USB_OTG_HS.IPParameters=VirtualMode-Device_HS,dma_enable-Device_HS USB_OTG_HS.VirtualMode-Device_HS=Device_HS USB_OTG_HS.dma_enable-Device_HS=ENABLE +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_TIM4_VS_ControllerModeClock.Mode=Clock Mode VP_TIM4_VS_ControllerModeClock.Signal=TIM4_VS_ControllerModeClock VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS.Mode=MSC_HS diff --git a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c index c2579243..9f34729a 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c @@ -91,7 +91,7 @@ static void HAL_FSMC_MspInit(void){ } FSMC_Initialized = 1; /* Peripheral clock enable */ - #__FSMC_CLK_ENABLE(); + __FSMC_CLK_ENABLE(); /** FSMC GPIO Configuration PE7 ------> FSMC_DA4 diff --git a/STM32CubeMX/SCSI2SD-V6/Src/gpio.c b/STM32CubeMX/SCSI2SD-V6/Src/gpio.c index eb469982..78e5996f 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/gpio.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/gpio.c @@ -117,13 +117,20 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(BOOT1_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pins : PBPin PBPin */ - GPIO_InitStruct.Pin = nTERM_EN_Pin|LED_IO_Pin; + /*Configure GPIO pins : PBPin */ + GPIO_InitStruct.Pin = nTERM_EN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pins : PBPin */ + GPIO_InitStruct.Pin = LED_IO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pins : PD11 PDPin */ GPIO_InitStruct.Pin = GPIO_PIN_11|NWAIT_UNUSED_Pin; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; diff --git a/STM32CubeMX/SCSI2SD-V6/Src/main.c b/STM32CubeMX/SCSI2SD-V6/Src/main.c index 78207ba2..281ec07d 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/main.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/main.c @@ -32,13 +32,11 @@ */ /* Includes ------------------------------------------------------------------*/ #include "stm32f2xx_hal.h" -#include "dma.h" #include "sdio.h" #include "spi.h" -#include "tim.h" #include "usart.h" #include "usb_device.h" -#include "usb_otg_fs.h" +//#include "usb_otg_fs.h" #include "gpio.h" #include "fsmc.h" @@ -88,15 +86,10 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); - MX_DMA_Init(); - SystemClock_Config(); MX_FSMC_Init(); MX_SDIO_SD_Init(); MX_SPI1_Init(); - MX_TIM4_Init(); - MX_USB_DEVICE_Init(); MX_UART4_Init(); - MX_USB_OTG_FS_PCD_Init(); /* USER CODE BEGIN 2 */ mainInit(); @@ -130,7 +123,7 @@ void SystemClock_Config(void) RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 20; + RCC_OscInitStruct.PLL.PLLM = 12; RCC_OscInitStruct.PLL.PLLN = 432; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 9; diff --git a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c index e8b2ad88..3d4a3572 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c @@ -36,7 +36,6 @@ #include "sdio.h" #include "gpio.h" -#include "dma.h" /* USER CODE BEGIN 0 */ @@ -59,9 +58,6 @@ void MX_SDIO_SD_Init(void) hsd.Init.BusWide = SDIO_BUS_WIDE_1B; hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; hsd.Init.ClockDiv = 0; - HAL_SD_Init(&hsd, &SDCardInfo); - - HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B); } @@ -143,6 +139,7 @@ void HAL_SD_MspInit(SD_HandleTypeDef* hsd) __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx); /* Peripheral interrupt init*/ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0); HAL_NVIC_EnableIRQ(SDIO_IRQn); /* USER CODE BEGIN SDIO_MspInit 1 */ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c index e6b77838..cc6e0c44 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c @@ -50,14 +50,6 @@ void HAL_MspInit(void) 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); - /* DebugMonitor_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); diff --git a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c index a22ddca6..b562ca45 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c @@ -40,7 +40,8 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd_USB_OTG_HS; +extern PCD_HandleTypeDef hpcd_USB_OTG_FS; +extern HCD_HandleTypeDef hhcd_USB_OTG_HS; extern DMA_HandleTypeDef hdma_sdio_tx; extern DMA_HandleTypeDef hdma_sdio_rx; extern SD_HandleTypeDef hsd; @@ -113,6 +114,21 @@ void DMA2_Stream3_IRQHandler(void) /* USER CODE END DMA2_Stream3_IRQn 1 */ } +/** +* @brief This function handles USB On The Go FS global interrupt. +*/ +void OTG_FS_IRQHandler(void) +{ + /* USER CODE BEGIN OTG_FS_IRQn 0 */ + + /* USER CODE END OTG_FS_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); + /* USER CODE BEGIN OTG_FS_IRQn 1 */ + + /* USER CODE END OTG_FS_IRQn 1 */ +} + + /** * @brief This function handles DMA2 Stream6 global interrupt. */ @@ -135,7 +151,7 @@ void OTG_HS_IRQHandler(void) /* USER CODE BEGIN OTG_HS_IRQn 0 */ /* USER CODE END OTG_HS_IRQn 0 */ - HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS); + //HAL_HCD_IRQHandler(&hhcd_USB_OTG_HS); /* USER CODE BEGIN OTG_HS_IRQn 1 */ /* USER CODE END OTG_HS_IRQn 1 */ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c b/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c index 5a044dfe..f410ba7b 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c @@ -37,23 +37,20 @@ #include "usb_device.h" #include "usbd_core.h" #include "usbd_desc.h" -#include "usbd_msc.h" -#include "usbd_storage_if.h" +#include "usbd_hid.h" /* USB Device Core handle declaration */ -USBD_HandleTypeDef hUsbDeviceHS; +USBD_HandleTypeDef hUsbDeviceFS; /* init function */ void MX_USB_DEVICE_Init(void) { /* Init Device Library,Add Supported Class and Start the library*/ - USBD_Init(&hUsbDeviceHS, &HS_Desc, DEVICE_HS); + USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); - USBD_RegisterClass(&hUsbDeviceHS, &USBD_MSC); + USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID); - USBD_MSC_RegisterStorage(&hUsbDeviceHS, &USBD_Storage_Interface_fops_HS); - - USBD_Start(&hUsbDeviceHS); + USBD_Start(&hUsbDeviceFS); } /** diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c index 915a3fce..29e0812f 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c @@ -37,7 +37,7 @@ #include "usbd_def.h" #include "usbd_core.h" -PCD_HandleTypeDef hpcd_USB_OTG_HS; +PCD_HandleTypeDef hpcd_USB_OTG_FS; /* External functions --------------------------------------------------------*/ void SystemClock_Config(void); @@ -355,8 +355,35 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { /* Init USB_IP */ - if (pdev->id == DEVICE_HS) { + if (pdev->id == DEVICE_FS) { /* Link The driver to the stack */ + hpcd_USB_OTG_FS.pData = pdev; + pdev->pData = &hpcd_USB_OTG_FS; + + hpcd_USB_OTG_FS.Instance = USB_OTG_FS; + hpcd_USB_OTG_FS.Init.dev_endpoints = 7; + hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; + hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_64; + hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; + hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; + hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; + hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; // VBUS NOT CONNECTED ?? CHECK. + hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; + HAL_PCD_Init(&hpcd_USB_OTG_FS); + + // Sum of all FIFOs must be <= 320. + HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x40); + + HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); + + } else if (pdev->id == DEVICE_HS) { + /* Link The driver to the stack */ + /* hpcd_USB_OTG_HS.pData = pdev; pdev->pData = &hpcd_USB_OTG_HS; @@ -374,8 +401,10 @@ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) HAL_PCD_Init(&hpcd_USB_OTG_HS); HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200); - HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80); - HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x40); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x40); + HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 2, 0x174); + */ } return USBD_OK; } diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index e877e44b206e1382f9752496cd099314343dc659..7eb0ff639d8f6f957b3c8763023749d56c6eb1a4 100644 GIT binary patch literal 32724 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 M>()kuw2kin18aymb^rhX literal 32724 zcmeHwdtgO!oA?Ds2e2}t(JI;ExlshBv{Z|NpI02A{;@B^#O+}7qn5n-VMk#SG51j z&HwDt>MPIsYW*wdFRD3fEByuLZ&bdb`@ca!G;X~@U-9j;929MmDB83-LX@XZ=xQN4 zIy&{=yKk)uEBC;y+ssgun}tE$r#}jy)|wG5X%H|Mu=FUp6f8B7CXYJ$A8a6SD_N!_ zjhT7Xt{PA=bhAV?S%^!ye0?w9Le*2yQb$1$^x%)Bw6554`z%IG6{>nypM4DjiAtL* zsKE2Co9YA4LfKVtv*HTx9@J?)6%f?~hXq(9sugW$QidZ&*#MSAGGSV3c2dS4$~%WS7A`a^@ioz%|MPYVhhTDwu^6w{1HQAaObYKQIxQhdDMuf!~(`g z^2ha7DCOSAFmR8kkeDTarEIjg*1#8fT{rQ-sW|R(K~o*M4EHfh*Ql0g^1gdP8*zF~ z3^W~WzyFRQgqBJcu|AEI4GAFSE${9XlF#lUk?lE|VOi)>!O zs6Ink4|As;;0E=Mn}I{%dq`1sH&5T{G+Ug0BBp{sMG}0sOHE*@0ubIlL!^KKNrn>H zQcCojThXa8;`f-)q6kA&97PnDPrhAF z6>h%MzSeKpg3dX~{~Uj8p0M~i5i;GyK9HlNZ@8r;P_36+n}M?}a5YM`IxQRuu+bA}=_LafA^Vr?R%Q zfX?lVnviDow**$etr73JTu?HS3>=#>k$2D=duXb_V~$!KfTNBsQy{3^u?s%vQA9T~ z{TND~%VlgnWF0>@3o+c7T%{2jI#^18czmW2ZOFbP5OEDux}X);yng+kQz%D#iVK4q z>hfrH7>)h;xTx{z2#Q0Z7PH6NxR+RFqWhq1vPI43(4`xpHdm6GxGU;9g2wh%9(nfX zqnU*ADK&8uq@2EQAzIFDnv|UIMlqyxNI-Y8cJiy52_en2?KV;7<{%}ApXrG7)fuwf zV`!Wi`1DJL7&@XI&uS`?gS+w&Z5%`*RX#Wqr-lU>>J&V6@@JV&Lz(J5=t7OKvDz;; z!ocEGvbi07{kBaEprP1HCh|}ukB0b~Y<1e%;AZYEo3J&DN@wI&Oh}SH{$m=2gB)Sd zg;Wt!SNIKR13aS9dI+t`qY01e`Q%-_eOHa?$a98hqNPLY@Mzay%IS>=20k^v8WYm3 znHZ4GS#dVDJ;AkplK&O6DAnRp2W5iv`<_F_LrNcy-;gnCqBF5YPe zqUJWngR3hZ!NA4zAa2|f$S93pJjf&QP_I=?Q~yQ0G*XsbrRp#?0}Eup1OFY>Xm0oE zj+Zf(63X3grX5$Ui!mV)4Q^o9w(ZX!t2OEfrKEws0g1*R#i=pQY18LM1LI5I&kXoR4tEBb1+Q zGFZ}mAf-JpIRAi6Jv4AmBy)2s8z50Pev{VGTf=y1MZl8#2iG;_q$E8Kx+L9WFLOD#rppx+X><9?W`|07tDiDF?bscl>-^1JQyzjGDIG# zeF5>(IKyW@+k|;QDn2FDx}sm(3vFb=1+uDm3VGHoxo4H$GY@yn8W?blG$4;hml*FN zUY<&#_P1t2Iy5yg_rcRV7urnWq9E3Ju?IhxL)s~IOSGg3^6JNoyG8EKjtYp@2^Dui z#;`!0-jO6)LZaS=l&3^|#?q)e<|z!EXmixG$&N=OFPB?Xt>JJ0vG;AmlIT1>`b3)3VQ1spB!e5)thsEO)wCAjb&m0& z?RWsmQST!i$ibk7pD;sMJW3rw@3?CWH|pR&rah%Q7HrJ145;J5eMa7x6)5=Scfg*Z z^k;uk@NDZl$krHaTgnuNe5{LAC~68mWD$yCt*T;D19xrz@gxC)fMwDVF;PE+EJcx&CW+_l{}i1> zXZ|$naY-_xXfdpxzZ@(*Dx;$8G=&sGl)}paRT*9(*?EA4LrFU81!mbRBN8kR2K(4d zp2!)y6`taWQVbwXtHClw{g>gUD2Y93B7_ktfK!o80WypT?ZmwR0?%>V8{R$aVlZ< zRFHGRGG(6*13p?qfkm+g&Pn4&66wPZl{(9`tBNZi@hIS6p3|+Gj(8H>ndGNa$?gb> zR>My%wzw^CYfVuP@xZU13$*gZCo@4s(EZM~fV}>chLol3?Ev>&grKPr&fJiK|G32< zDR12E4yAXegB4(3)CMF!h$=dr4GPK8oe@tvB0?%41wuiu!!)Q2 z8X3V6OBE7;`=@KPF>@b5YD8RD9%mjEbi#v>ie%Zjf;Qqgh4Yxs9ul;IO$(k|ASEmg zQS&Fxp(5W}7WbKgN|${v02fO~d^j&1@>tpXV7Z9ciGic_{avAXoQ9#w1s~Na$aaPH zNH@Cd+*=>Cc;Hm_sfk$;op;$53S`EM_-4TDJ$-I#5Z-A-LsN>1(>q$3-daKPCI$sG zS_G{Ed|rec>*%I8DcQ3vA?jBmh?HOwvm$<%;hnBo$88M^gJLODv;!_gbYk5Tip#|9 z*h)c^kvv#~A-F%Jl$2Ki?~yTgGLx;k7 zR!CneA!+M|?H(RGdUGd+9D-OKv1o8ST2*Qnd0rh` zoOAV_V*=P@{Jz6fqZxx|gJoL;SwSEIs%d7w1oGNNUa{@Q0=BY~0+A!7iI+}aJ#;D( zzO=(37_;oo(NZHE2_!HAGX?`2t$1?UXSIrY@U>b)i_0FHA6<@aMf-p?5I2zsIx+Fm z7vE;Hd5G%$#|ADRMu1HSxq+ulaO)jJ-flDawN|E>D`GVW42VB+ymYLle|;`!BD!JQ zE*>G}YZA&3nB^uP1DWqYqS`|p5>6k5;|7pQqi&0FRP3$ z7u`~W3VAz>ZBT=FNuNv1H;*VCMsX&= zhGUDp7c48GSokrFRk+Y44Nc?O8`%uwKIYQi4{NpqX zM(0;)Evl%j+q?dduOKCPem5l@TYm!AS2Vv1k5EWaxRsnLEy|GvveKG*nK$LAg_%2{|=e~qTq9O3428FJEL<9%^voBcmmxQn=pfHD?R>h4=uD0 zjtej|)5kqZ)Jro)MoZcu&Z1H*6tIqbPYhxnvBEh+6;`(quW;BkU>}q9A=K0BJG#7n zB+res87G1+;g7-6Q>a$2Ydr zH)6j)q8mf_hEe>LE;ZUYHHRF(;g&C$awT*&RN&S*u;fy%jg0548(<&^E3QR19YQ>^ zxs`*G1*pv3)~ZaqK$daolHRzx5Z;k7Sbj#Hs7Ku^LL3iqW|6=&bhAStF{RaCLVTEm zl+Xv=qoALM9gQEJ>|^3y8LVzd8cd$X+9Ydr_lnegKT%H=z{ji?59bu|Zy>}Y%Cbsx z1;D}p5*2v1NFTMhA*Y8&pafYX6De)_yDu^N^Yxn$=O+ffK?$lGf?AY5IN%usM^FO| zg%dBr7C5?i-;@yH4+2ZEvCp%eIl}HjPZ{5i`en+;)x%%U%YDc@`~3sc6j}gnu1NYX z+f;ys>ld5PGl;W%Na^+t1Qt0N(zqp*kDD39DrprS-NL~ zDj`zt5lCPWYc?;)(zq_UoIab;>M~;HFF66Yvs=bYTzH!+5A<5ANtFz`$)KFr{nuBxg1i~I!y-66`z69a_P`D6p@r#NS_XpDrEKg5Y^caS zPHS^3>VxLLn6}V3uTk5QEOi)ff^dJq&!1N|6%9WW(jjP+eIMpY(v9!zDm3|zS9LrNS#nR6HJ>u(~DJnCRbNY!It@jz4Khio34yI|l2 z>@^S1!Ek8uGm(rQ?lG}YWOS+PF#Kww^a9sb3VY5z==6)G*F6{NlHaYocuz)CL+t%! zM1Kl~{B(;41<(?qF`PyAF+Xj98W=>oHZ04|PAW9L20k4EdimJfv7=LSFM7;*ZV!~>Vq?^533m(@%SP$Z>@Pk2t@9A?(%2P$-_ zxi>VAeeHp9kh16W$nzVJd6MH6&T*T9$gb6KKP2Pp>**$n(b;oUL7a{aer#O9Dg8aH zNb3f@(ppUsrivR^Pm*}*GMLA+?)~9XPXnJ!)MAd8)b=hI#mx{9FWpEX&v8{HzikGt z3*(nOAFvkde-r9bLJe?rM}P7RR!Hx}3@lD`GTcbqS`fs=^rFNH-Zlf$nBQqHZ&|;y z5ijGmcjk&vN*devZ={ZmZ9j}%JQEtf465bppN&JyN;aJSVG0EL>9q#w!C90Om7{;CM^3ri&l?}68 z=10?1fG3C*c$J7cJ+bWz^T8y8m5Ynb=9)G0Q0P=!B`{vKCeBZwj=Z)Fm;dlZCeUkOWHC) zW499?GGV_+&kmi0{M0@a38j>D&)kb~O6ckgcHy3+NGtB<$HlH#PL31Zu*0*%90#ZK z3E@(Y!U5;CV>>E7pA9GCH%6hJB%9MQkqq+)P+A?rc`_M#C@ZIcInVZ zQuATcfHp5QxWasgohgB1aqv<#m+-^Ub`EMPP&9C7C<^+DJoF@~k)>7?Tka>#z$vfx z3_)^I^sw)Q%9N9z`KgDuU5lLxjG}m8dIau(ZuHo;PPo9y*Sured};V>1+Ja3lQkZi zzW%49J@_$IijGNa@#Q~+o(N!z4qkx02#toTdou?5)zG99n-WhsMwt#Bqrx7$Ab>Y|7a(k=SzZ0sr2G|XG}YylsVmx) z9oZ|LetZVnnBxf~8B>eXBO+~hlmYw1L>682Q2&7Q%e2qf3MzeGQ-s#Q7bR?BV9-qm z2a#xMI=q}}9=T%S4^yOpcbjX^2q&EXYM_+Q1}%jSta~v5QId!>KcstFe^^W{ zh7L=cN~~gq(DDk07DcUwAnYjm)pP&0MCqaRk?A=~b>jscPzZ^iY$3a3@{>=V<#CUT zH2{Tt^;Zo!-H~;;FzG0wuHLxF@trHs@8MnkziJlOzADU$akdg2d)2|qFphT~SqjFx zPVqetq_ABz)YU@cChV2+1--5L~lbmcr_NJ{A0a9rD~FG_@D6s1wK_Dh$3 zd2sbQv4O0ThZ{_fo7adrAk+{irH5*RDi;Z#dXbyr)1d;Z^IRSV#v=2zEb@lFdrmQFM{4rg@C zrviWSdkvLbr$pgLYjFp@*yvD7GsZ5Fc#$CRa^=rx`&WLa17iU+{7I9RB<AV zq3|Izc-fPIhIap4!g8NU@5VjHKIuJ z5L&Qxy5cUs+|$4u5~>(y$(a!!x=5ygAWK<^6gU_0Ygf-6epMx7!R0R+rY@m3vZonC zN-HfcIp7t*JU78?l5T#-!}lYgefXLU3bHQV>!D%bn5G0qCMZ>cYuVhXBOnl<;L>?L z70xm@WvdMtlrpD3lu)7ZS)ayBgPngqHSBo($}Zd?&zqlyEf}moKuWNzv;tlzUd&ls z92_5jWZI`g&I$=dI(f+fjJz!|H=v+d4Onav7>}%W?b%RR_sorZbfN@HoDY1gNiV|tSm+sz0i`Gb-xp+FZ}qSG zBL9l5bAdehw@4^L@G9d*mvr5FaL!!xLWp+m7&HSlkK(!EkgrBR$$Z^$cW6+`bO-vA zc=4b)@90meH4OxVmwxjd&&GSF(MvVf*TTD!o`Y=1c^_LTEDm=?vW5&Hq~orQkH9V6 zWCadKE|M3*1+{`M?->_pd|tKVuxBVSDC?>uVU}mERTPkXDC3bvSDt7NP^3mjx|O>t zV|FXYQL-2vQR^k#OZdQ{v{#j$kKu%?BILIx(5#5(*xETBkCN#=8l5ng^FCair;pEWY){&it#qWEVA5l`_e3@7`78p~R&rRuy7g~mZpoipb%HIV2 z)gI@ojsNTVe~aaRCezoS?4hZ?K%tgX%NMBbiludT6=fK&8Ic>6_t$mUg;A{a|0#R} zOKLDo^w(MCnqR{j`Tyq+4FliT+5bPbqF#`G!EZsJ^AfQnnvm`rAA7slUizo-qNJz8v$aa`+A!r;{H<|fka4X zV<{yS?Oqe}5Y1jg+$XmIN&w4%Sx(-1^&AxX(@u;};cavuRZY_B%6)AP3|NXb>_VSA zagWB`V#WO)3QB)OQ4}o`USOeb+^tD(JH-bJ**ZbvJ>&4Exn?$aSWZTRLKe@X3_=kb zO|0Z(*NOXWtdnAqF^>kz=8SS^*ln9iff+<9C7C7eo!l^mZya+|==a#1+DV{Sxmo0b zR50dvX34PVxzU4RLhFE!4GO?JC<8^*ydk2AH15GC+NYoji%%$mFU6a&QX4?nKt~bM*?5C*qYsOk47SNj`=nSKqJ!Osol?_WdDu*>EDT zwB~Pa!H{jN3dtUZWfP@721iOBV0{6`EWt%l%R?Is6$?z7z8|nINd=zyg#EXl`H22_%(s82^LP=M=~R2V6L^&+>h zgnHEc8ft=dX-7n9-Zd}^D;F%wQ7OK))Q2dtGU6a*HGMS0B2N!holF>-N0F{LYHL5V z(z|tvS$d?S64MjIc`mJ)j+~jD%u?2Tn!?qV)ioG6@KC{kwLy7``m{e5`sEm$)B%Rw za~l_<0w{FYZJO(==Vovf^VT=rhufe_7gu(5zT!}f>mFNfadu9CVtD)0j?zFMy(Edx z#@rJ&Y!XQES$SUbudx-v*G)-P85ME87gPY42O3IRT@@*xb%wfedkWNm$`}+@DYJ%< zyvJrCI@L7qfOSaKlO-oLZ%0asmm!TF?vtxB#<(6e^-&eLr^?&f29HP0Q9P4i`K%03 z_OAJi9|Y~~pU-|dZq1%1_$9ms^~d}Kxw4hcyq1)Fcv~g1HUQ?h=Tgnyf7tpKvm64Y zZ2vZXeBwlWj}vhmc`ar-0Vxp$Y1}ghON+ztQ1dI?6HSyt_g>G(4^_GZ3TnD^3a;YK z(}a&t;8azL&0~I3k=2~24{M@DQ~*t%p1&%F8&0r)zsScOEP3;5;$iaVCmQf85faC( zukf^2m zn5CsHa_7H*(4gvd(e8I~P>Dz$kmhIr!Q@>!pPcA{^U{*ar;ZQq-v*!X=!SEsg4b@h z6GRqcsKO(yC_+hv^BQcLN)@{7g8hd`74YJakB9`AyNJr z+h?6h)bQ<+oO$?{0M6jE=1pT;eiDyj1J+yW+Pah3Ndb9%gWz2 z=>_e0_}rD;v!31f1~g*tD>)S$tYw?7ZNsO~N-z9~AIMTdvxvDog8n_gH*sLi;0!)T zsBPh;v>qGZdDfFGGN;Pih?|AW*@>2 zD+*Vh4gw7gb54YXqom8|QZp$&N7MMKv!zzyFu6`KA;j_ykX%$u-fU9b_dt6Y<;-bM@X`T$|10!Ppa@BK9>uS$s;ZBa{E z3;dLhr+Sa(-WXd zCRs{`%41h?F)^dCS|0Pvk9=l{!xV>EwsLmsASW7uJFM@zPvC9Yj!GD_X=idJvs4+# zU|1?JNgvR-ik7OigypPW*3iP?FYnXZwPyCx7;xdrI`l(9&?N)%OZFmJHIJO**Ck8w zEU@G+{V?zla*4GMT?Y7A0>~cuCHK=NYM$BaSR21^W0vhe+jSCefQ&8=Va5b74=5-;x6Lf^DJLb&Nc4mQo_NJSuMNCp4F)cw z?>0cVLdv86=3uPVa6<}XxF?+d0kTh%{Wz&cwF_- zO=n2?XJy;Ebi7KfXxF=yGt(}{$3s?E=~|pPMS~d#boE7;oPoUXlNxBjYLCP*96>){ zf)qbR!W{@GRV9=gmU{ zkpwIm#w=l}k-#)PfTF%8>e0jvIDRGCdyWs^aK@)m$9&oY=RQmk0wPtGAuRjAG0Kl+g&>9#WJ+m)xq*-aUTwI>pV0i8NT&D4Fc_*=P4>Nf+i%n-sz1Z-?~@6hdX>oeb<$RjkXD249TsaR|-XMk$1n zaj^|(_@ztdOO~a1Z%V>$j2j4xYe<$A9k`)#$a)88EJK5z+N15W{fl*JP6XBba!gZC z#lh|jt*aIEG1%@RrYrk$$74*DfN`Jn+DA7}oo%L98f z0)2t*YuZ4W%niSoI9c;y_4pllq_OomRnRaCmwU$umR{Quh0aC=lKkMXQ%v6_@&`Y; zy9L8Q24Dc6 zvmoWi=uEBZy<#~^qpfkzFVv{*-4UcQ@K?KfED0Q`klrIXbc7yfv_NtTiJe+o84<@g%Tu{0T765yF2qy+mD-uxL` z!0c)LqmnAG_8rV|Rqv)h(rJ)C{@u?015q*z-*ISw!r8`HHXl{&!0!<8=(2?AjIJ9d zY*S0Y6Y@rViXB82%UtLJUK*9FQqr;}(Zrpr@H=JhQSPAEAfyYw^gLQ`t$Pnj@*Tu6;MgsZe2wwQ{fJfOl*qGsoYz8h+7C)E`87WK zcgAO?k`rX8WwjAb@8r+Is2gi~6L83H@gocLhFnCCbp_Y?J{Wy7ocg-hxMpZWJI4V28R=Zj@ zClY0b_MGc77`ZI&4DZC7z{f9oOk=0(Kl~c6)%^oxNDew91rW|r5|7YKixI3k?ob9x zeWanhf}%Y?_{iW3C^l`Q_E?wwv7F@~@euaoi3ZP(5RKoSb#09fkq8h!deG^p2lzA4 z&>1vg4_RY-(JH(;41tts$u1CsN@S{f1O-+H@_4TD3+R{sC*N!AnLC>LVx`N`yW;MCI2rJ0wS2= zYgXmof--n~K`dkN%$0OleC2AS{7U<4Rc55vHaPJ>)e5>D5*b+S(~!Yr=wMM?mSvTR zdoc4+amEMKq=5j)b)RTFH@A-%{>oM)LX5}8A6LYu{@h})+G8yySnxCDs?u<@m{VZs zI8~X-3{!y@*ni?L8D+P`9`lKjD*0Xv15O>i16u+(TElF%LZU7aC+pS zJHAw0;G=|^j&io5JuzIXBMGAdL7&RH*O2wI1kaG98ga?1oaLyY*r^BK4(8p3!`D4{=mwmmu_8Pd?AJ3G3{tT z556zig`#-}yOPEt;EzB>R3Yl4WQI8Ld5dcatT$-a8AcSQc6)8*+#!8XXIxI9 zdr(sv??NzeES8vr_nOgwP}9;3zI+YeMcEiQTo({e;71IjF$rI4W6uE~`Q8R<_@#}O zhvRNx@H$Ia6_|ge;uf7g?79xIMMlBDV|2 zc`C5%%UNw>mX8U3gOemf$PSgD0-R_>8<7M;%bm2SL>J+_umZnN?%mj8QVY=XF4Kiy z9uOT`BHx9Sj;^F1rnrxW&4=aFh9%~BmQ4j$hnT!~0Hi72D)BNufW=dpe+UWtEhT(b zB>V$pH5b^t9kG!Nz}5BO$#|uq{~79IfKdZz1}s^*&?T!9%0i}8jN`7=ti9ORV4r_?jisk~cmRFQgvF+i_#f9@k z67%{M4UGW=UYfnT6_sHrZ!&(XD8BnVVW>*wC4b(L;R(4PTtYa0Ju*+$Wf`}NPfEe8 zQmaSLRsw@vdQDRc<0%!9L*849inrgihyS6|G1@C?7=d>mB&tEDO&6rZ$Q>`4J)!a=`O{xk%}F1$22R<6_$v(A~td-NV^@`~7#o zN1@9qouuNSTQjstD{7ti?~U4nFQ$AMFeP;PZJb+c52+wn4B!4cQRaYBwTm(0sikLkb+X)>_q`Vod%Nt7#9Z6mxu}g+|Y^4y~eoew? z-+5+DIg{M^QC>)CuJ_>vNC}So{%H+P&F~H)Rh0Bl9@4mULyt~q0NXuici3W`_xKrF zL6>U=;~$}sM{Vw=qEYJ)F2d08+O?7BvVw8024_vJV~cD&LtG;=A*ql~oa#8Ns`IU8CSejg@e!z2|Mcm0iE=^o0FB}v}) zp3Y$Y9}sGCiiUpob`72qQa-wSI*1+&a+Dn0jMty?^AD7w$z651j@A>FM?C!%DKW=0 zhcL&B&b{8!ik|Jt+S9X?O1D=}D1-mW5y0f4n9T4`g~b|`d9sYTDi zi}4+w?Toz^2|{w*s|&*{4Rc(!;KR$K0*-Nfq(+1Eyw6Hl3hKE8Ay}Iy$#>@V5Sus z*wo|!Ix|}#55h+YOor6pt}c;TPtMaCe0tiwn>0^dvOk$siy(pbD~60JG!1_KLk*>c za~!`=2s`MM0rPCa?8%_5!)b8hKQ!7sb((+eC29Ch-|W2b$Y*y~fap}CKO?wM8f=_M zw7){afykYwK%i*uuWuyjSvOPe>6q^?QU>wy;LRItULiFfjsX_K`8-8S+i(*g!UJ!k z0FgBsRN~>7JvkWrN~Mjt^_K?I#zDKh%ly_ne%6YOK=E>>Oqctw0nA8e`u*Pu5fq)H zOOu$>67Ns6Vaaw2=qA-TpOkg8_%XL3t6Y9_>Bp#@yAmT7%`a0?HFv;Bv4A{U@U)Q` zW}-+t3_TghgYn_&MuxhP6uJY&8(1AtIkw zxV1!gw}pNQ+Tk5F&}6-C!%sdA z{(BVj48aZ3v8(u_EmV;X;2MGzD;jIc_!cyNpeb@; zQ5%j_pWBfNWr0Ze+_M-g&v{X@=wNT&sUfH%xP1(naPF={B^S6iZHxjl z=@Y!PGN8=1N>ktSYAS`4crZqhPO6PJq$^WkdE;9AM#KP{2hl8k^N>B-qv0FZ7Zfnw z>9ukLPL|wf^j%?oiKqlAg+hLb_b5p*WnAtf)I0w08vfx!IpT0*=$A=dkEj%PkQy}Y zYLRN_l-*7IDLm2de_5k>54q=oi}?}YHmrFGn+i)BeKd>_6+H$DU_!5mt_YAFdNn7ngbBpq{v;tGBv*vhsxjZjlWJqWs7Z31l z&5kqGbPJ4de85#std%Ez@(TWGOaqB0f(mvVkmwMDffr0daKk%h>AA&tu(7auo^wN( zL7;dBW%L zDYy5hJ^T=Zotl~&C)>WREmnyXAt?AQ_0Qz^=Sa4RWbDKE+HsRmx*qX4iH0;m*g?@b6o z7}j3Cg5=TbHCp6-D12_izj%v^nH0a_S&kU;$18A!FwQ%l)M}!!>oa9QFv=^@n~@???-7==>j3yv6P!6U=mxNa>gXB^zi8vNXA#SYXZfDRhZaS?_Ct(4s2#ty zcE~rwv+gX-Ms$Dx)k+uH$HO=FHQ45n4I;1XEurmBI@gC#ZriWdmYF$S(9ksqPj||) zkdF*_)&3%!H4HhwV74af&Po%ANZnp?Q3Sli%_5^gCl3fY;sZAWIfiq#>?Sup_K;^7 z{NiKJRY)~`x7xJ9`I3!!VBZ4O*l?cH-9;#feu7^h&$nstK6*DC4q3NvMU-;l`Snal zeeP&tI(!Yd?rrGXWhrwYn?FQN<2{!L^L=*cK7&`sj9HmPP26mnBsI!Sjc*0;wR-4| z#_fC*C>5J26SNKmCAaig=bek}WgbGT_y=x<2oF@CMDpwzR<~jgHmFdw5M=kIyqg zKz=#$gVX}@v4`BKr5t+ZbNA5*2w^{U$csP^?f%_5N9&yuZ-%HVgQLPKFnY}cQg4p()e>1HlTV{%E~B*j@#IVREj@Lnm8N(@FvZNYOEaPk>ZF3 zj%eWTQUmi5m5+phzf02}8T1hibZel8IFb)^>*7dxL<4`f8aR><{N0-V$iRn@_$?uh+e5zA-hY@by`tgDX_ro)Ip_P+ z8ZNzV4*s9!zmB^6>KR{0TsQNk%kgiJTzBL5=S-W9a?b3qtnaSPzGlX>In%xrU