From e96c958fb1097a7ab6f2c131173324a91986c78f Mon Sep 17 00:00:00 2001 From: xushenghao Date: Wed, 18 Dec 2024 21:53:21 +0800 Subject: [PATCH] =?UTF-8?q?oled=E9=A9=B1=E5=8A=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Src/gpio.c | 33 +- Core/Src/stm32f1xx_it.c | 56 +- MDK-ARM/motor.uvoptx | 45 +- MDK-ARM/motor.uvprojx | 6 +- MDK-ARM/motor/motor.hex | 1579 +++++++++++++++++++++----------- User/application/app.c | 23 +- User/board/board.c | 2 +- User/board/board.h | 2 +- User/board/ssd096_oled.c | 147 --- User/board/ssd096_oled.h | 12 - User/lib/driver/ssd1306_oled.c | 302 +++++- User/lib/driver/ssd1306_oled.h | 14 +- motor.ioc | 4 +- 13 files changed, 1443 insertions(+), 782 deletions(-) delete mode 100644 User/board/ssd096_oled.c delete mode 100644 User/board/ssd096_oled.h diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 632ddd4..7d058ef 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -33,14 +33,14 @@ /* USER CODE END 1 */ /** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI - * Free pins are configured automatically as Analog (this feature is enabled through - * the Code Generation settings) -*/ + * Analog + * Input + * Output + * EVENT_OUT + * EXTI + * Free pins are configured automatically as Analog (this feature is enabled through + * the Code Generation settings) + */ void MX_GPIO_Init(void) { @@ -56,7 +56,7 @@ void MX_GPIO_Init(void) LL_GPIO_ResetOutputPin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); /**/ - LL_GPIO_ResetOutputPin(GPIOB, OLED_SDA_Pin|OLDE_SCK_Pin); + LL_GPIO_ResetOutputPin(GPIOB, OLED_SDA_Pin | OLDE_SCK_Pin); /**/ GPIO_InitStruct.Pin = LED_BLUE_Pin; @@ -66,32 +66,27 @@ void MX_GPIO_Init(void) LL_GPIO_Init(LED_BLUE_GPIO_Port, &GPIO_InitStruct); /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_14|LL_GPIO_PIN_15; + GPIO_InitStruct.Pin = LL_GPIO_PIN_14 | LL_GPIO_PIN_15; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; LL_GPIO_Init(GPIOC, &GPIO_InitStruct); /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_2|LL_GPIO_PIN_3|LL_GPIO_PIN_4 - |LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8 - |LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15; + GPIO_InitStruct.Pin = LL_GPIO_PIN_0 | LL_GPIO_PIN_2 | LL_GPIO_PIN_3 | LL_GPIO_PIN_4 | LL_GPIO_PIN_5 | LL_GPIO_PIN_6 | LL_GPIO_PIN_7 | LL_GPIO_PIN_8 | LL_GPIO_PIN_11 | LL_GPIO_PIN_12 | LL_GPIO_PIN_15; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10 - |LL_GPIO_PIN_11|LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_3 - |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7 - |LL_GPIO_PIN_8|LL_GPIO_PIN_9; + GPIO_InitStruct.Pin = LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_2 | LL_GPIO_PIN_10 | LL_GPIO_PIN_11 | LL_GPIO_PIN_14 | LL_GPIO_PIN_15 | LL_GPIO_PIN_3 | LL_GPIO_PIN_4 | LL_GPIO_PIN_5 | LL_GPIO_PIN_6 | LL_GPIO_PIN_7 | LL_GPIO_PIN_8 | LL_GPIO_PIN_9; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); /**/ - GPIO_InitStruct.Pin = OLED_SDA_Pin|OLDE_SCK_Pin; + GPIO_InitStruct.Pin = OLED_SDA_Pin | OLDE_SCK_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - } /* USER CODE BEGIN 2 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index f374bdc..a09fd58 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -68,8 +68,8 @@ /* Cortex-M3 Processor Interruption and Exception Handlers */ /******************************************************************************/ /** - * @brief This function handles Non maskable interrupt. - */ + * @brief This function handles Non maskable interrupt. + */ void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ @@ -83,8 +83,8 @@ void NMI_Handler(void) } /** - * @brief This function handles Hard fault interrupt. - */ + * @brief This function handles Hard fault interrupt. + */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ @@ -98,8 +98,8 @@ void HardFault_Handler(void) } /** - * @brief This function handles Memory management fault. - */ + * @brief This function handles Memory management fault. + */ void MemManage_Handler(void) { /* USER CODE BEGIN MemoryManagement_IRQn 0 */ @@ -113,8 +113,8 @@ void MemManage_Handler(void) } /** - * @brief This function handles Prefetch fault, memory access fault. - */ + * @brief This function handles Prefetch fault, memory access fault. + */ void BusFault_Handler(void) { /* USER CODE BEGIN BusFault_IRQn 0 */ @@ -128,8 +128,8 @@ void BusFault_Handler(void) } /** - * @brief This function handles Undefined instruction or illegal state. - */ + * @brief This function handles Undefined instruction or illegal state. + */ void UsageFault_Handler(void) { /* USER CODE BEGIN UsageFault_IRQn 0 */ @@ -143,8 +143,8 @@ void UsageFault_Handler(void) } /** - * @brief This function handles System service call via SWI instruction. - */ + * @brief This function handles System service call via SWI instruction. + */ void SVC_Handler(void) { /* USER CODE BEGIN SVCall_IRQn 0 */ @@ -156,8 +156,8 @@ void SVC_Handler(void) } /** - * @brief This function handles Debug monitor. - */ + * @brief This function handles Debug monitor. + */ void DebugMon_Handler(void) { /* USER CODE BEGIN DebugMonitor_IRQn 0 */ @@ -169,8 +169,8 @@ void DebugMon_Handler(void) } /** - * @brief This function handles Pendable request for system service. - */ + * @brief This function handles Pendable request for system service. + */ void PendSV_Handler(void) { /* USER CODE BEGIN PendSV_IRQn 0 */ @@ -182,8 +182,8 @@ void PendSV_Handler(void) } /** - * @brief This function handles System tick timer. - */ + * @brief This function handles System tick timer. + */ void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ @@ -203,8 +203,8 @@ void SysTick_Handler(void) /******************************************************************************/ /** - * @brief This function handles DMA1 channel4 global interrupt. - */ + * @brief This function handles DMA1 channel4 global interrupt. + */ void DMA1_Channel4_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */ @@ -217,8 +217,8 @@ void DMA1_Channel4_IRQHandler(void) } /** - * @brief This function handles DMA1 channel5 global interrupt. - */ + * @brief This function handles DMA1 channel5 global interrupt. + */ void DMA1_Channel5_IRQHandler(void) { /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */ @@ -231,8 +231,8 @@ void DMA1_Channel5_IRQHandler(void) } /** - * @brief This function handles TIM1 update interrupt. - */ + * @brief This function handles TIM1 update interrupt. + */ void TIM1_UP_IRQHandler(void) { /* USER CODE BEGIN TIM1_UP_IRQn 0 */ @@ -249,8 +249,8 @@ void TIM1_UP_IRQHandler(void) } /** - * @brief This function handles TIM3 global interrupt. - */ + * @brief This function handles TIM3 global interrupt. + */ void TIM3_IRQHandler(void) { /* USER CODE BEGIN TIM3_IRQn 0 */ @@ -265,8 +265,8 @@ void TIM3_IRQHandler(void) } /** - * @brief This function handles USART1 global interrupt. - */ + * @brief This function handles USART1 global interrupt. + */ void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ diff --git a/MDK-ARM/motor.uvoptx b/MDK-ARM/motor.uvoptx index ec749b9..c491601 100644 --- a/MDK-ARM/motor.uvoptx +++ b/MDK-ARM/motor.uvoptx @@ -125,7 +125,7 @@ 0 CMSIS_AGDI - -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0CS32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:CS32F103C8$Flash\CS32F10x_128.FLM) + -X"" -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0CS32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:CS32F103C8$Flash\CS32F10x_128.FLM) 0 @@ -148,24 +148,7 @@ - - - 0 - 0 - 146 - 1 -
134224336
- 0 - 0 - 0 - 0 - 0 - 1 - ..\User\board\ssd096_oled.c - - \\motor\../User/board/ssd096_oled.c\146 -
-
+ 0 @@ -187,6 +170,26 @@ 1 ch + + 4 + 1 + dd + + + 5 + 1 + i,0x0A + + + 6 + 1 + progress_text + + + 7 + 1 + x,0x0A + 0 @@ -794,8 +797,8 @@ 0 0 0 - ..\User\board\ssd096_oled.c - ssd096_oled.c + ..\User\lib\driver\ssd1306_oled.c + ssd1306_oled.c 0 0 diff --git a/MDK-ARM/motor.uvprojx b/MDK-ARM/motor.uvprojx index 6464715..06e1df5 100644 --- a/MDK-ARM/motor.uvprojx +++ b/MDK-ARM/motor.uvprojx @@ -339,7 +339,7 @@ STM32,STM32F103xB,USE_FULL_LL_DRIVER,HSE_VALUE=8000000,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,HSI_VALUE=8000000,LSI_VALUE=40000,VDD_VALUE=3300,PREFETCH_ENABLE=1 - ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../User;../User/application;../User/board;../User/system/inc;../User/system/bsp;../User/lib/inc;../User/lib/flow;../User/lib/control/inc + ../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../User;../User/application;../User/board;../User/system/inc;../User/system/bsp;../User/lib/inc;../User/lib/flow;../User/lib/control/inc;../User/lib/driver @@ -1254,9 +1254,9 @@ ..\User\board\board.c - ssd096_oled.c + ssd1306_oled.c 1 - ..\User\board\ssd096_oled.c + ..\User\lib\driver\ssd1306_oled.c diff --git a/MDK-ARM/motor/motor.hex b/MDK-ARM/motor/motor.hex index fc504b8..12cb931 100644 --- a/MDK-ARM/motor/motor.hex +++ b/MDK-ARM/motor/motor.hex @@ -1,543 +1,1060 @@ :020000040800F2 -:10000000802C002005010008A50D0008AB010008A8 -:10001000A10D00087101000889130008000000000C -:10002000000000000000000000000000F5100008C3 -:10003000A901000800000000F50F0008F7100008F3 +:100000008034002005010008CD1300088707000890 +:10001000C91300084D070008B119000800000000CE +:100020000000000000000000000000001D17000894 +:1000300085070008000000001D1600081F170008B3 :100040001F0100081F0100081F0100081F01000810 :100050001F0100081F0100081F0100081F01000800 :100060001F0100081F0100081F0100081F010008F0 -:100070001F0100081F0100088901000899010008FC +:100070001F0100081F010008650700087507000838 :100080001F0100081F0100081F0100081F010008D0 :100090001F0100081F0100081F0100081F010008C0 -:1000A0001F010008ED1100081F0100081F010008D2 -:1000B0001F010008BD1200081F0100081F010008F1 +:1000A0001F010008151800081F0100081F010008A3 +:1000B0001F010008E51800081F0100081F010008C3 :1000C0001F0100081F0100081F0100081F01000890 -:1000D0001F010008791300081F0100081F01000814 +:1000D0001F010008A11900081F0100081F010008E6 :1000E0001F0100081F0100081F010008DFF810D0E1 -:1000F00000F02CF800480047CD160008AFF3008050 -:10010000802C00200648804706480047FEE7FEE7AF +:1000F00000F01AFB0048004779230008AFF30080A6 +:10010000803400200648804706480047FEE7FEE7A7 :10011000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B7 -:10012000E9110008ED000008D2B201E000F8012B4F +:1001200011180008ED000008D2B201E000F8012B20 :10013000491EFBD270470022F6E710B513460A4667 -:1001400004461946FFF7F0FF204610BD064C074D48 -:1001500006E0E06840F0010394E807009847103497 -:10016000AC42F6D3FFF7C6FF28210008482100085B -:1001700000BFFEE7024600BF1AB901E000BF00BFA2 -:10018000FCE700BF0120704710B50248006801F08D -:10019000A2FC10BD5C00002010B50248006801F010 -:1001A0009AFC10BD5C000020704700BFFEE7000015 -:1001B00008B50549C9690143034AD1611146C969B6 -:1001C0000140009100BF08BD0010024008B505497C -:1001D00089690143034A916111468969014000918F -:1001E00000BF08BD0010024008B5054989690143F8 -:1001F000034A9161114689690140009100BF08BD21 -:100200000010024008B5054989690143034A91611C -:10021000114689690140009100BF08BD00100240ED -:1002200010B54A1E044B9A5C825822F001034A1E04 -:10023000014CA25C835010BDCC20000810B54A1EB2 -:10024000044B9A5C825842F001034A1E014CA25CA6 -:10025000835010BDCC20000810B54A1E044B9A5C98 -:10026000825842F002034A1E014CA25C835010BD2A -:10027000CC20000830B54B1E054CE35CC35823F47A -:10028000405313434C1E024D2C5D035130BD000002 -:100290008A20000830B54B1E064CE35C03445B68C3 -:1002A0006FF30F0313434C1E024D2C5D0444636037 -:1002B00030BD0000CC20000830B54B1E054CE35C7F -:1002C000C35844F21004A34313434C1E014D2C5D4C -:1002D000035130BD8A20000810B54B1E024CE35C70 -:1002E0000344DA6010BD0000CC20000830B54B1E7E -:1002F000054CE35CC35823F0800313434C1E024DAE -:100300002C5D035130BD00008A20000830B54B1E23 -:10031000054CE35CC35823F4406313434C1E024D69 -:100320002C5D035130BD00008A20000830B54B1E03 -:10033000054CE35CC35823F0200313434C1E024DCD -:100340002C5D035130BD00008A20000810B54B1E03 -:10035000024CE35C03449A6010BD0000CC2000080E -:1003600030B54B1E054CE35CC35823F040031343E8 -:100370004C1E024D2C5D035130BD00008A20000848 -:1003800030B54B1E054CE35CC35823F44073134354 -:100390004C1E024D2C5D035130BD00008A20000828 -:1003A0002DE9F04102460B461868C0F30F2595FA77 -:1003B000A5F0B0FA80F480E00120A0402840002899 -:1003C0007AD0082C04D240F2011000FA04F106E0C1 -:1003D000A4F108004FF00116864046F0806158688D -:1003E00008280ED11869D66826EA11260F0A97FA4E -:1003F000A7F7B7FA87F700FA07F73E43D66000BFC2 -:1004000000BF586802EB116691FAA1FCBCFA8CFCA3 -:100410004FEA8C084FF00F0C0CFA08FC376827EAFB -:100420000C0791FAA1FCBCFA8CFC4FEA8C0C00FA88 -:100430000CFC47EA0C07376000BF5868012802D05F -:100440005868092838D1986802EB116691FAA1FC26 -:10045000BCFA8CFC4FEA8C084FF0030C0CFA08FC39 -:10046000376827EA0C0791FAA1FCBCFA8CFC4FEA2A -:100470008C0C00FA0CFC47EA0C07376000BFD86808 -:1004800002EB116691FAA1FCBCFA8CFC4FEA8C08D5 -:100490004FF0040C0CFA08FC376827EA0C0791FAB5 -:1004A000A1FCBCFA8CFC4FEA8C0C00FA0CFC47EA6D -:1004B0000C07376000BF00BF641C25FA04F0002859 -:1004C0007FF47AAFBDE8F081C1F30F22426170473B -:1004D000C1F30F2242617047C1F30F2202617047DE -:1004E00002480068401C0149086070472000002055 -:1004F0004FF47A71B0FBF1F2521E4FF0E0235A61D3 -:1005000000229A6105221A6100BF704710B50446A7 -:1005100000F0A6FD2060206800F06EFD606060685D -:1005200000F07AFDA060606800F088FDE06010BD1A -:10053000014908607047000000000020016821F0B8 -:10054000800101607047816821F0800181607047FF -:10055000016841F0010101607047C16841F001018B -:10056000C160704710B5024613681C48824208D02B -:10057000B2F1804F05D01A48824202D01948824217 -:1005800004D123F070004C6840EA0403134882420F -:1005900008D0B2F1804F05D01148824202D01148F4 -:1005A000824204D123F44070CC6840EA0403136013 -:1005B0008868D06200BF0888906200BF0748824206 -:1005C00003D10869106300BF00BF00BF506940F04D -:1005D0000100506100BF002010BD0000002C014050 -:1005E000000400400008004001460869C0F34000D4 -:1005F000704701460869C0F38000704701460869EA -:10060000C0F3C000704701460869C0F3001070478E -:100610000146086900F0010070470146C868C0F350 -:10062000400070470146C868C0F38000704701462B -:10063000C868C0F3C00070470146C868C0F3001026 -:1006400070470146C86800F00100704770B5024667 -:10065000012901D1002416E0042901D1012412E06E -:10066000102901D102240EE0402901D103240AE01F -:10067000B1F5807F01D1042405E0B1F5806F01D18F -:10068000052400E006242346064CE55C02F118042C -:1006900028190468044DEE5C0425B5402C43046021 -:1006A00070BD0000672000086E20000870B502468B -:1006B000012901D1002416E0042901D1012412E00E -:1006C000102901D102240EE0402901D103240AE0BF -:1006D000B1F5807F01D1042405E0B1F5806F01D12F -:1006E000052400E006242346064CE55C02F11804CC -:1006F00028190468044DEE5C0825B5402C430460BD -:1007000070BD0000672000086E2000082DE9F04150 -:1007100006460C4615460127012C08D0102C0CD09B -:10072000B4F5807F0FD0B4F5805F18D111E0294671 -:10073000304600F079FB074612E02946304600F0CB -:10074000AFFB07460CE02946304600F0EBFB0746BE -:1007500006E02946304600F021FC074600E000BFD5 -:1007600000BF3846BDE8F08181637047826844F27B -:1007700007039A430A4382607047426822F070027E -:100780000A434260704708B50168009100BF4168A4 -:10079000009100BF08BD6FF040010160704700008C -:1007A0002DE9FF4104460D4601270026204600F0B2 -:1007B00055F8002833D1E968686808432969084377 -:1007C000E16841F20C6291430843E060A868216946 -:1007D00021F440510143216100BF6869616921F43E -:1007E00040710143616100BF6846FFF78FFE0E480C -:1007F000844201D1039E08E00C48844201D1029E4C -:1008000003E00B48844200D1029E46B1286830B113 -:100810000027314620462A6800F025F800BF3846F8 -:1008200004B0BDE8F0810000003801400044004001 -:100830000048004001460868C0F340007047014688 -:100840000868C0F38000704701460868C0F3C00024 -:10085000704701460868C0F3801070470146C868B9 -:10086000C0F34030704770B501EBC10303EB0113D7 -:100870009400B3FBF4F301EBC10404EB0114950005 -:10088000B4FBF5F46425B4FBF5F404EBC40505EB07 -:100890000414A3EB8403322404EB03136424B3FB9A -:1008A000F4F303F0F00301EBC10404EB0114950031 -:1008B000B4FBF5F46425B4FBF5F403EB041401EB8D -:1008C000C10303EB01139500B3FBF5F301EBC10585 -:1008D00005EB01159600B5FBF6F56426B5FBF6F5BC -:1008E00005EBC50606EB0515A3EB8503322505EBE5 -:1008F00003136425B3FBF5F303F00F0323449BB20A -:10090000836070BD38B50120144949690143134A19 -:100910005161114649690140009100BF00BF00F0DC -:100920004FFD05460022114600F03EFA04462146DE -:100930000E2000F055FD0E2000F028FD00F040FDD7 -:1009400005460022114600F02FFA044621460F20EA -:1009500000F046FD0F2000F019FD38BD00100240E8 -:1009600000B585B014216846FFF7E5FB1020FFF7BE -:100970002DFC2020FFF72AFC0420FFF727FC08208D -:10098000FFF724FC1C491D48FFF79EFD1C491D482C -:10099000FFF79AFD18480090012001900220029074 -:1009A0000020039069461548FFF7FAFC16480090AE -:1009B0000020019069461148FFF7F2FC13480090AF -:1009C0000020019069461248FFF7EAFC11480090A8 -:1009D0000020019069460B48FFF7E2FC08480090B0 -:1009E00001200190032002900020039069460548F1 -:1009F000FFF7D6FC05B000BD200020040010014028 -:100A000030003004000C0140C000C004FDFD99041A -:100A100000080140FFFFCF0430B585B014216846BF -:100A2000FFF789FB4FF40060FFF7DEFB00F0D0FC1E -:100A300005460022032100F0D7F90446214619207B -:100A400000F0E2FC192000F0AEFC41F61F40ADF8CA -:100A50000000002001906320029000200390049089 -:100A600069460948FFF77EFD0748FFF767FD00214B -:100A70000548FFF77BFE00210348FFF77EFE024892 -:100A8000FFF761FD05B030BD002C014000B593B00B -:100A900014210EA8FFF74FFB202106A8FFF74BFB00 -:100AA000142101A8FFF747FB0120FFF781FB00207D -:100AB000ADF838000F9041F61F40109000201190C3 -:100AC0000EA94FF08040FFF74DFD00BF4FF0804072 -:100AD000006840F080004FF08041086000BF0021B6 -:100AE0004FF08040FFF742FE10218806FFF7DEFD41 -:100AF00070200690002007900890099002200A902C -:100B000006AA10214007FFF701FE10218806FFF713 -:100B10009DFD00214FF08040FFF72FFE4FF08040F9 -:100B2000FFF711FD0420FFF75FFB40F20220019068 -:100B300009200290022003900020049001A902489D -:100B4000FFF72EFC13B000BD0008014030B585B0A2 -:100B500014216846FFF7EFFA0220FFF729FB00F0A7 -:100B600037FC05460022032100F03EF904462146E9 -:100B70001D2000F049FC1D2000F015FC41F61F402F -:100B8000ADF8000000200190632002900020039047 -:100B900069460948FFF7E6FC0748FFF7CFFC00214C -:100BA0000548FFF7E3FD00210348FFF7E6FD024893 -:100BB000FFF7C9FC05B030BD000400402DE9F0414D -:100BC0008CB01C2105A8FFF7B6FA14216846FFF780 -:100BD000B2FA4FF48040FFF715FB0420FFF712FB39 -:100BE00068480090092001900320029000200390A3 -:100BF00069466548FFF7D4FB6448009004200190E3 -:100C000069466148FFF7CCFB002205216048FFF7E9 -:100C100053FB002205215E48FFF72CFB0022052133 -:100C20005B48FFF783FB002205215948FFF798FB3B -:100C3000802205215648FFF759FB00220521544820 -:100C4000FFF79EFB002205215148FFF75FFB1022B2 -:100C500004214F48FFF730FB002204214C48FFF7E6 -:100C600009FB002204214A48FFF760FB002204210F -:100C70004748FFF775FB802204214548FFF736FB04 -:100C8000002204214248FFF77BFB00220421404858 -:100C9000FFF73CFB25213F4B1B68C3F302200524D3 -:100CA00000250346C3F1070CBCF1040F02D94FF035 -:100CB000040C01E0C3F1070C674603F1040CBCF11E -:100CC000070F02D24FF0000C01E0A3F1030C6646BF -:100CD0004FF0010C0CFA07FCACF1010C0CEA040C0F -:100CE0000CFA06FC4FF0010808FA06F8A8F1010812 -:100CF00008EA05084CEA080200BF002904DB1007D7 -:100D0000030E2548435407E01007040E21480C3019 -:100D100001F00F031B1FC45400BF2520002809DB6E -:100D200000F01F02012191404209920002F1E022ED -:100D3000C2F8001100BF4FF4E1300590002006908A -:100D4000079008900C20099000200A900B9005A9AC -:100D50001248FFF725FD00BF1048006920F49040BD -:100D60000E4908610846406920F02A00486100BF2A -:100D700000BF0846C06840F40050C86000BF0CB017 -:100D8000BDE8F081020002040008014004000404F0 -:100D9000000002400CED00E000E400E000380140FB -:100DA00000BFFEE700BFFEE7F0B503460C4603F0C8 -:100DB0000701C1F10700042801D9042001E0C1F1B5 -:100DC00007000646081D072801D2002000E0C81EC3 -:100DD00005460120B040401E2040A8400127AF40FA -:100DE0007F1E17403843F0BDF0B503460C4603F0B4 -:100DF0000701C1F10700042801D9042001E0C1F175 -:100E000007000646081D072801D2002000E0C81E82 -:100E100005460120B040401E2040A8400127AF40B9 -:100E20007F1E17403843F0BD70B50246106A20F0AF -:100E300001001062136A5568946924F0030424F0D9 -:100E400070000E6840EA060423F002000E6940EAD2 -:100E5000060323F001004E6840EA06030F48824271 -:100E600013D123F008004E6940EA860323F0040002 -:100E70008E6840EA860325F480708E6940EA060594 -:100E800025F40070CE6940EA460555609461C86853 -:100E9000506300BF1362002070BD0000002C0140B1 -:100EA0002DE9F04104460D46206A20F01000206232 -:100EB000266AD4F80480A76927F4407727F4E04035 -:100EC000296840EA012726F02000296940EA011636 -:100ED00026F01000696840EA01161148844213D1D7 -:100EE00026F08000696940EA811626F04000A96872 -:100EF00040EA811628F48060A96940EA810828F454 -:100F00000060E96940EAC108C4F80480A76120468E -:100F1000E968FFF729FC26620020BDE8F0810000A7 -:100F2000002C014070B50246106A20F480701062F7 -:100F3000136A5568D46924F0030424F070000E6825 -:100F400040EA060423F400700E6940EA062323F405 -:100F500080704E6840EA06230F48824213D123F482 -:100F600000604E6940EA862323F480608E6840EA80 -:100F7000862325F480508E6940EA061525F400503A -:100F8000CE6940EA46155560D461C868D06300BF99 -:100F90001362002070BD0000002C014070B50246B5 -:100FA000106A20F480501062146A5568D36923F4E3 -:100FB000407323F4E0400E6840EA062324F4005016 -:100FC0000E6940EA063424F480504E6840EA063444 -:100FD0000748824204D125F480408E6940EA861594 -:100FE0005560D361C868106400BF1462002070BDF2 -:100FF000002C014070470000014600BF04484068D3 -:1010000000F0F0000009034A125C21FA02F0704778 -:1010100000100240B4200008014600BF05484068A7 -:1010200000F4E060044A02EB1020027821FA02F09A -:101030007047000000100240C4200008014600BFB5 -:101040000548406800F46050044A02EBD020027862 -:1010500021FA02F07047000000100240C42000088E -:1010600010B5002400BF0B48406800F00C0020B110 -:10107000042804D0082808D103E0074C07E0064CF8 -:1010800005E000F00BF8044601E0034C00BF00BF90 -:10109000204610BD0010024000127A0000210022FC -:1010A00000BF1148406800F4803002461AB1B2F522 -:1010B000803F0CD101E00D490BE000BF0A484068B9 -:1010C000C0F34040401C0A4BB3FBF0F101E007497C -:1010D00000BF00BF00BF0448406800F47010022346 -:1010E00003EB9040484370470010024000093D0068 -:1010F00000127A007047704710B50220374909681E -:1011000021F007010143354A116000BF00BF00BF55 -:101110003248006800F007000228F8D100BF3048CC -:10112000006840F480302E49086000BF00BF00BF57 -:101130002B480068C0F340400028F8D04FF48030BE -:101140004FF4E011264A526822F47C1200F4403336 -:101150000B431A43224B5A6000BF00BF1846006879 -:1011600040F080701946086000BF00BF00BF1C48F7 -:101170000068C0F340600028F8D000201849496892 -:1011800021F0F0010143164A516000BF10151146CD -:10119000496821F4E0610143516000BF002011461D -:1011A000496821F460510143516000BF022011469B -:1011B000496821F003010143516000BF00BF00BF37 -:1011C0000748406800F00C000828F8D10548FFF7F0 -:1011D0008FF90448FFF7ACF910BD00000020024071 -:1011E0000010024000A24A047047000010B53148C8 -:1011F000FFF70EFA01285CD100BF2E48FFF7F4F983 -:1012000001280AD12B48FFF708FA012805D100BFB1 -:10121000001F2849086100BF00BF2648FFF7E9F911 -:1012200001280AD12348FFF7FDF9012805D100BFA5 -:10123000801F2049086100BF00BF1E48FFF7DEF98C -:1012400001280BD11B48FFF7F2F9012806D100BF96 -:101250006FF008001749086100BF00BF1548FFF78D -:10126000D2F901280BD11348FFF7E6F9012806D17E -:1012700000BF6FF010000F49086100BF00BF0D48AC -:10128000FFF7C6F901280AD10A48FFF7DAF9012861 -:1012900005D100BFC01E0749086100BF00BF00BFE5 -:1012A000FFF71EF900BF04480068401C02490860AF -:1012B00000BF10BD002C01405800002010B52D4883 -:1012C000FFF7A6F9012853D100BF2A48FFF78CF990 -:1012D00001280AD12748FFF7A0F9012805D100BF4E -:1012E000001F2449086100BF00BF2248FFF781F9B1 -:1012F00001280AD11F48FFF795F9012805D100BF41 -:10130000801F1C49086100BF00BF1A48FFF776F92B -:1013100001280BD11748FFF78AF9012806D100BF31 -:101320006FF008001349086100BF00BF1148FFF7C4 -:101330006AF901280BD10F48FFF77EF9012806D181 -:1013400000BF6FF010000B49086100BF00BF0948E3 -:10135000FFF75EF901280AD10648FFF772F9012864 -:1013600005D100BFC01E0349086100BF00BF00BF18 -:1013700010BD00000004004010B50248006800F0F5 -:10138000D5FC10BD5C00002000BFFEE7002809DB93 -:1013900000F01F02012191404209920002F1E02277 -:1013A000C2F800117047002809DB00F01F0201217C -:1013B00091404209920002F1E022C2F80011704708 -:1013C00002480068C0F30220704700000CED00E006 -:1013D00002480068C0F30220704700000CED00E0F6 -:1013E00010B5002804DB0A07130E054A135406E063 -:1013F0000A07140E034A00F00F031B1FD45410BD3C -:1014000000E400E018ED00E010B5002804DB0A0756 -:10141000130E054A135406E00A07140E034A00F09F -:101420000F031B1FD45410BD00E400E018ED00E0D2 -:1014300002E008C8121F08C1002AFAD1704770479D -:10144000002001E001C1121F002AFBD170470000FB -:10145000014601F1100000E0001D02681AB9024ABD -:1014600012689042F8D370473400002010B5064847 -:10147000046803E02046FFF7EBFF044603480068DA -:101480008442F7D310BD000030000020340000205B -:1014900010B504462146002000F00CFA10BD10B52E -:1014A00001E000F8011B131EA2F10104A2B2F8D161 -:1014B00010BD000010B500200A4908600A49086004 -:1014C00000BF0A48FFF744F80848FFF746F800BF96 -:1014D00000BF0748FFF73CF80548FFF73EF800BF9C -:1014E00010BD0000040000200C000020002C014072 -:1014F0000004004010B5034800F00EF8024800F068 -:10150000AFF810BD040000200C00002010B500F062 -:10151000DDFB00F017FA10BD08B501460020009071 -:10152000086810B1122813D108E000BF00BF0B48B3 -:101530000068486000BF1220086000BF074A486882 -:101540001268101A0A2801D2002008BD00BFEDE77A -:101550000020086000900320F7E7000058000020FA -:1015600001490860704700001C00002010B50849C0 -:101570000848FEF7B1FF08490648FEF7ADFF0449E9 -:101580000448FEF7A5FF04490248FEF7A1FF10BD7D -:1015900010001004000C01402000200410B5064982 -:1015A0000648FEF795FF06490448FEF795FF0249F5 -:1015B0000248FEF791FF10BD10001004000C01401E -:1015C0002000200470B50446002518E004F08000D7 -:1015D000284120B10F491048FEF77EFF03E00D4976 -:1015E0000D48FEF775FF6006040E0C490A48FEF729 -:1015F00073FF0A490848FEF76BFF681CC5B2082D47 -:10160000E4DB06490448FEF767FF04490248FEF799 -:101610005FFF70BD10001004000C0140200020048A -:1016200010B50446FFF7A2FF7820FFF7CBFF00209C -:10163000FFF7C8FF2046FFF7C5FFFFF7AFFF10BD5C -:1016400010B50446FFF792FF7820FFF7BBFF40205C -:10165000FFF7B8FF2046FFF7B5FFFFF79FFF10BD6C -:1016600038B5014600200090086810B1252821D126 -:1016700016E000BF124B134CE068C3F30F2222EABE -:10168000000400EA020544EA05440E4D2C6100BF47 -:1016900000BF0D480068486000BF2520086000BFFB -:1016A000094A48681268101A642801D2002038BD1F -:1016B00000BFDFE70020086000900320F7E700008C -:1016C00020002004001001405800002008B501202F -:1016D000274989690143264A916111468969014078 -:1016E000009100BF00BF00071146C9690143D161E5 -:1016F0001146C9690140009100BF00BF03200246A6 -:101700001C4B19684FF6FF0319401B4B0B4343EA70 -:101710000221184B196000BF00BF1848406820F034 -:10172000E06040F000701549486000BFFFF7E4FC3E -:10173000134800681349B0FBF1F084B22046FFF76C -:101740000FFFFFF70DF9FFF7DDF8FFF79FF9FFF740 -:1017500035FAFFF761F9FFF7F9F9002000F014F806 -:10176000FFF7D4FEFFF7A6FE01E0FFF7C3FEFCE79C -:10177000001002400CED00E00000FA0500000140FE -:101780000000002040420F0010B504460C4951F8FB -:1017900024104A000B4951F82400002100F09EF863 -:1017A000094951F824200749083951F8240000213B -:1017B00000F094F8012103480830015510BD0000E5 -:1017C000102100084C000020202100082DE9F047DE -:1017D00004460F460025A9462348005D20B922484B -:1017E00018380168204688471FB94FF0FF30BDE820 -:1017F000F0871E4850F82400B7FBF0F61B4850F85D -:101800002400B7FBF0F100FB117000B1761C184802 -:1018100050F82400451E22E01348083850F82400F0 -:1018200030F8150010B909F1010901E04FF0000985 -:10183000B14513D14FF0000809E00B48083850F8C3 -:10184000240005EB080220F8126008F10108B045F9 -:10185000F3D3064850F824006843C8E76D1E002DF6 -:10186000DADA4FF0FF30C2E75400002018210008F8 -:101870001021000810B501460023002207E00B48A4 -:1018800050F8210030F8120000B15B1C521C0848CF -:1018900050F821009042F2D864205843044C54F888 -:1018A0002140B0FBF4F0C0B210BD00004C0000209D -:1018B0001021000870B504460E4631462046FFF759 -:1018C00085FF0546681C08B9002070BD024850F825 -:1018D00024002844F9E700004400002030B5034606 -:1018E00001E003F8011B141EA2F10102F9D130BD81 -:1018F00070B500240EE00021204600F06EF80025AF -:1019000004E00020FFF79CFE681CC5B2802DF8DBC8 -:10191000601CC4B2082CEEDB70BD70B500240EE074 -:101920000021204600F059F8002504E0FF20FFF7D1 -:1019300087FE681CC5B2802DF8DB601CC4B2082C81 -:10194000EEDB70BD10B5AE20FFF76AFED520FFF7C5 -:1019500067FE8020FFF764FEA820FFF761FE3F20AE -:10196000FFF75EFED320FFF75BFE0020FFF758FE77 -:101970004020FFF755FEA120FFF752FEC820FFF7D9 -:101980004FFEDA20FFF74CFE1220FFF749FE8120C0 -:10199000FFF746FECF20FFF743FED920FFF740FEBA -:1019A000F120FFF73DFEDB20FFF73AFE3020FFF786 -:1019B00037FEA420FFF734FEA620FFF731FE8D206E -:1019C000FFF72EFE1420FFF72BFEAF20FFF728FEB7 -:1019D000FFF78EFFFFF7A1FF10BD70B504460D465F -:1019E00045F0B000FFF71CFE102141EA1410FFF78C -:1019F00017FE04F00F00FFF713FE70BD10B504468C -:101A000004B910BD00202085A07D012808D1606A9E -:101A100030B1218C89040A0C0021606AFFF73FFD78 -:101A200000BFEEE72DE9F05F064688461546994669 -:101A3000DDE90B7BDDF828A00EB1012100E00021DB -:101A400008462921FEF796FB4420FFF721FD0446B6 -:101A50000CB1012100E0002108462C21FEF78AFB91 -:101A60000120E07500202076C4F83C902584C4F85D -:101A700040B0A786002D0CDD2846FFF709FDE06188 -:101A8000E16909B1012100E0002108463E21FEF78D -:101A900071FB002F0CDD3846FFF7FAFC2063216B49 -:101AA00009B1012100E0002108464521FEF762FB53 -:101AB00084F8158084F82CA066602046BDE8F09F6D -:101AC00010B5044604B910BD002060852046FFF71C -:101AD00095FF00BFF7E710B504460CB1012100E007 -:101AE0000021084640F2D711FEF744FB012084F89C -:101AF00038002169A068FEF793FB2069082865D2A9 -:101B0000DFE800F06404111E2C3A485600BFA068BC -:101B10000168C1F3400121B1A0680221416000BF0A -:101B200000BF00BF53E000BFA0680168C1F34011CF -:101B300021B1A0682021416000BF00BF00BF46E086 -:101B400000BFA0680168C1F3402129B1A0684FF42B -:101B50000071416000BF00BF00BF38E000BFA06857 -:101B60000168C1F3403129B1A0684FF400514160D0 -:101B700000BF00BF00BF2AE000BFA0680168C1F33A -:101B8000404129B1A0684FF40031416000BF00BF5F -:101B900000BF1CE000BFA0680168C1F3405129B13B -:101BA000A0684FF40011416000BF00BF00BF0EE00D -:101BB00000BFA0680168C1F3406129B1A0684FF07F -:101BC0000071416000BF00BF00BF00E000BF00BF68 -:101BD000606800BF00BF00BF00F10C0252E8002F98 -:101BE00042F0400100F10C0242E80013002BF3D157 -:101BF00000BF00BF2069082865D2DFE800F0640458 -:101C0000111E2C3A485600BFA0680168C1F3C001FC -:101C100021B1A0680821416000BF00BF00BF53E0B0 -:101C200000BFA0680168C1F3C01121B1A068802184 -:101C3000416000BF00BF00BF46E000BFA068016870 -:101C4000C1F3C02129B1A0684FF40061416000BF19 -:101C500000BF00BF38E000BFA0680168C1F3C03119 -:101C600029B1A0684FF40041416000BF00BF00BF30 -:101C70002AE000BFA0680168C1F3C04129B1A06893 -:101C80004FF40021416000BF00BF00BF1CE000BF57 -:101C9000A0680168C1F3C05129B1A0684FF40001E8 -:101CA000416000BF00BF00BF0EE000BFA068016838 -:101CB000C1F3C06129B1A0684FF00061416000BF6D -:101CC00000BF00BF00E000BF00BF10BD0EB513484D -:101CD000006808BB0020F0210122114BCDE9002152 -:101CE00002900A4601210F48FFF79CFE0B4908604D -:101CF0000020096808700C480849096888600520B8 -:101D000006490968C860042004490968086100217F -:101D10000248006800F0E2F80EBD00005C00002000 -:101D20005F200008003801400000024038B504463A -:101D300004B938BD6068C168C1F34011B9B16068C9 -:101D40000168C1F3401191B1608D218C884202DBA2 -:101D50002046FFF7B5FE61684A68D2B2608D411C2B -:101D60006185E1690A5400202076E0753FE06068F3 -:101D7000C168C1F30011002939D060680168C1F35E -:101D80000011002933D0607D01282BD1D4E9020154 -:101D90004A1E514B9A5C02445268208C801A60851E -:101DA000207DF8B9D4E90201FEF73AFAE06B80B180 -:101DB000608D00280DDD608D218C884209DC628DEC -:101DC0002078E36BE1699847228C0021E069FFF7F6 -:101DD00066FB228CD4E90201FEF75CFAD4E9020129 -:101DE000FEF72CFA002060856068FEF7CCFC606886 -:101DF000C168C1F3801151B16068FEF72AFD30B1AE -:101E0000206C08B1206C80476068FEF7C4FCA07DA0 -:101E100001285ED101256068C168C1F3002171B15C -:101E20006068016801F0010149B10225606801683C -:101E3000009100BF4168009100BF00BF00BF606813 -:101E4000FEF7F8FC68B16068FEF7F4FC48B10425C1 -:101E500060680168009100BF4168009100BF00BF49 -:101E600000BF6068FEF7EBFC60B16068FEF7E7FC5E -:101E700040B160680168009100BF4168009100BFF7 -:101E800000BF00BF6068FEF7DFFC68B16068FEF766 -:101E9000DBFC48B1102560680168009100BF416813 -:101EA000009100BF00BF00BF012D11D0606A78B162 -:101EB000618D491E88B2228D616A01EB82014880E2 -:101EC000228D616A01F82250218D491C218500BFB5 -:101ED00000BF00BF2DE70000CC20000870B504460D -:101EE0000D46607D90B9A575606800BF00BF00BF5A -:101EF00000F10C0252E8002F42F0200100F10C0228 -:101F000042E80013002BF3D100BF70E00020A07561 -:101F10006068FEF738FC2169A068FEF781F9D4E912 -:101F20000201FEF77DF96068011D0E463246D4E9D4 -:101F30000201FEF70BFAE269D4E90201FEF7CCF9DF -:101F4000228CD4E90201FEF7A5F9D4E90201FEF7DB -:101F500083F9D4E90201FEF771F9606800BF00BFA0 -:101F600000BF00F1140252E8002F42F0400100F1DE -:101F7000140242E80013002BF3D100BF00BF6068D9 -:101F800000BF00BF00BF00F10C0252E8002F42F07A -:101F9000100100F10C0242E80013002BF3D100BF46 -:101FA00000BF6068011D0E4632462169A068FEF739 -:101FB000CDF9226B2169A068FEF78EF92169A0682E -:101FC000FEF74AF9606800BF00BF00BF00F11402CD -:101FD00052E8002F42F0800100F1140242E80013A1 -:101FE000002BF3D100BF00BF012084F83800A07D92 -:101FF000012833D1606A68B9218C8800FFF748FA5C -:102000006062616A09B1012100E000210846822175 -:10201000FEF7B0F8606800BF00BF00BF00F10C021F -:1020200052E8002F42F4807100F10C0242E80013E4 -:10203000002BF3D100BF00BF606800BF00BF00BF2E -:1020400000F1140252E8002F42F0010100F11402E5 -:1020500042E80013002BF3D100BF00BF70BD7047F2 -:10206000081C3044586C8000000000040404000088 -:102070000800000008000008000000080002040634 -:10208000080A0C00010203040506081C3044586CC1 -:1020900080000000000404040000080000000800A4 -:1020A00000080000000800020406080A0C000102F3 -:1020B0000304050600000000000000000102030404 -:1020C000060708090000000001020304081C304450 -:1020D000586C8000000000040404000008000000A8 -:1020E000080000080000000800020406080A0C00AE -:1020F0000102030405065F6C697374006C697374F4 -:1021000020616C6C20636F6D6D616E640000000077 -:1021100000040000000000000800000008000000AB -:1021200000200000000000004821000800000020FE -:102130007000000030140008B82100087000002072 -:10214000102C0000401400080024F40000000000DF -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:102180000000000089170008751800088000002072 -:1021900000C0012080200020380000200000000046 -:1021A0000000000000000000F6200008FC200008ED -:0821B000C6E533B46D1400080C +:1001400004461946FFF7F0FF204610BD421C10F888 +:10015000011B0029FBD1801A7047F0B480EA01022C +:10016000D40F4200B2EB410F02D2024608461146BC +:100170004A0042D0C30DDDB2C1F3C752AD1A202DE3 +:1001800035DAC1F3160141F4000204B15242C5F15F +:10019000200602FA06F12A411044B3EBD05F23D0C7 +:1001A000C4B1012DA0EBC35009DCF0BC4FF00042FC +:1001B00002EAC352DBB200F5000000F02ABA4000A8 +:1001C00000F1807000EBC350A0F1807040EAD17064 +:1001D000490009E0490841EAC071A0EBC35000F5AD +:1001E0000000400800EBC350F0BC00F009BA6142C7 +:1001F000012202EB4101001BF6E7F0BC704781F0E1 +:100200000041AAE780F00040A7E780EA010210B5AC +:1002100002F00043400022D04A001FD0010E01EB43 +:100220001261C0F35600C2F3560240F4000042F4DB +:100230000002A0FB022000047F39140400D0401CFF +:1002400050EA124001D44000491EC2B20C0604EB31 +:10025000D010401C4008802A02D003E0002010BDCE +:1002600020F00100002900DA0020184310BD30B44E +:1002700080EA010202F0004530F0004221F0004027 +:1002800013D090B1C30DD40DC2F31601C0F3160004 +:10029000E41A41F4000140F400027D34914201D39C +:1002A000641C00E04900002C02DA30BC00207047DA +:1002B0004FF400000023914201D3891A0343400800 +:1002C0004FEA4101F7D151B1914202D14FF00041C3 +:1002D00005E002D24FF0010101E06FF0010103EBF4 +:1002E000C450284430BC00F08BB92DE9FE4F804645 +:1002F00081EA0300C00F0C46009021F0004123F07A +:100300000045B8EB0200A94105D24046214690467F +:100310001C460B46024623F00040104347D0270DF1 +:10032000C7F30A00C3F30A510290401A0190402813 +:100330006BDAC3F3130040F4801B0098924620B19F +:100340000023D2EB030A63EB0B0B01985946C0F173 +:100350004002504600F023F906460D4650465946E5 +:10036000019A00F03BF910EB08006141002487EA94 +:10037000115284EAE7731A4340D0009A62B3019A9B +:10038000012A4FEA075215DC001B61EB02014FF016 +:10039000004202EA0752CDE90042001C41F58011FB +:1003A00032462B4600F072F903B0BDE8F08F4046AC +:1003B0002146F9E7001B61EB0201001C41F58013A7 +:1003C00000185B412018A2F5001747EB030140EA33 +:1003D000D570B6196D4111E06D084FEA360645EA51 +:1003E000C0754FEA0752001B61EB0201001C41F58A +:1003F000801149084FEA30000019514132462B461E +:1004000003B0BDE8F04F00F032B90098012240007F +:100410000023D0EB020263EBE073009821464FEA21 +:10042000E074B8EB000061EB0401E9E783F00043FE +:100430005BE781F0004158E7C10F80EAE0700844B3 +:10044000CA079623002100F0E4B896230022114643 +:1004500000F0DFB800F0004220F00040C10DC0F312 +:10046000160040F400007F2901DA00207047962929 +:1004700003DCC1F19601C84001E096398840002AAA +:10048000F4D04042704720F00040C10DC0F3160088 +:1004900040F400007F2901DA00207047962903DC30 +:1004A000C1F19601C840704796398840704770B5D1 +:1004B000C1F30A5201F000450024C1F3130140F2D8 +:1004C000FF3341F480119A4201DA002070BD40F2FE +:1004D00033439A42A2F2334203DC524200F06EF8F8 +:1004E00000E090402C43F1D0404270BD00F000424B +:1004F00030F000400AD0C10D01F56071C0F3160064 +:1005000042EA0151C20840071143704700200146EA +:1005100070470000002801DBC0F10040002901DB2A +:10052000C1F1004181427047002801DBC0F1004069 +:10053000002901DBC1F10041884270472DE9F05FDD +:100540000546002092469B46884606468146402442 +:100550001BE0284641464746224600F02FF8534606 +:100560005A46C01A914110D311461846224600F04F +:1005700016F82D1A67EB01084F462246012000218C +:1005800000F00DF817EB00094E41201EA4F1010404 +:10059000DFDC484631462A464346BDE8F09F202A24 +:1005A00004DB203A00FA02F1002070479140C2F1CA +:1005B000200320FA03F3194390407047202A04DBFC +:1005C000203A21FA02F00021704721FA02F3D040CC +:1005D000C2F120029140084319467047202A06DBE9 +:1005E000CB17203A41FA02F043EAE07306E041FA01 +:1005F00002F3D040C2F120029140084319467047EF +:100600000029A8BF7047401C490008BF20F0010026 +:10061000704710B4B0FA80FC00FA0CF050EA010404 +:1006200004BF10BC704749B1CCF1200421FA04F496 +:1006300011FA0CF118BF012121430843A3EB0C016F +:10064000CB1D4FEA00614FEA102042BF002010BCD2 +:10065000704700EBC35010440029A4BF10BC704782 +:10066000401C490008BF20F0010010BC704710B5C5 +:10067000141E73F1000408DA401C41F100019218C5 +:100680005B411A4301D120F0010010BD2DE9F04D6E +:1006900092469B4611B1B1FA81F202E0B0FA80F2C3 +:1006A00020329046FFF77BFF04460F4640EA0A00DF +:1006B00041EA0B0153465A46084313D0114653EA08 +:1006C000010019D0C8F140025046FFF777FF0546F8 +:1006D0000E46504659464246FFF761FF084305D093 +:1006E000012004E020463946BDE8F08D0020054396 +:1006F00046EAE0762C4337430A986305E40AA0EB08 +:1007000008000022FD0A44EA47540A3002D50020BE +:100710000146E9E7010510196941DDE908450019BD +:100720006941BDE8F04DA2E7064C074D06E0E068E0 +:1007300040F0010394E8070098471034AC42F6D328 +:10074000FFF7D8FC744100089441000800BFFEE7A1 +:10075000024600BF1AB901E000BF00BFFCE700BFBE +:100760000120704710B50248006802F0B8FB10BDC8 +:100770006000002010B50248006802F0B0FB10BD18 +:1007800060000020704700BFFEE7000008B5054983 +:10079000C9690143034AD1611146C9690140009109 +:1007A00000BF08BD0010024008B505498969014332 +:1007B000034A9161114689690140009100BF08BD5B +:1007C0000010024008B5054989690143034A916157 +:1007D000114689690140009100BF08BD0010024028 +:1007E00008B5054989690143034A91611146896940 +:1007F0000140009100BF08BD0010024010B54A1E24 +:10080000044B9A5C825822F001034A1E014CA25C00 +:10081000835010BDD434000810B54A1E044B9A5CB6 +:10082000825842F001034A1E014CA25C835010BD65 +:10083000D434000810B54A1E044B9A5C825842F02A +:1008400002034A1E014CA25C835010BDD434000840 +:1008500030B54B1E054CE35CC35823F4405313439F +:100860004C1E024D2C5D035130BD00009234000837 +:1008700030B54B1E064CE35C03445B686FF30F031B +:1008800013434C1E024D2C5D0444636030BD0000D8 +:10089000D434000830B54B1E054CE35CC35844F219 +:1008A0001004A34313434C1E014D2C5D035130BD76 +:1008B0009234000810B54B1E024CE35C0344DA602E +:1008C00010BD0000D434000830B54B1E054CE35C6D +:1008D000C35823F0800313434C1E024D2C5D03517B +:1008E00030BD00009234000830B54B1E054CE35C6F +:1008F000C35823F4406313434C1E024D2C5D035137 +:1009000030BD00009234000830B54B1E054CE35C4E +:10091000C35823F0200313434C1E024D2C5D03519A +:1009200030BD00009234000810B54B1E024CE35C51 +:1009300003449A6010BD0000D434000830B54B1E4B +:10094000054CE35CC35823F0400313434C1E024D97 +:100950002C5D035130BD00009234000830B54B1EB1 +:10096000054CE35CC35823F4407313434C1E024D03 +:100970002C5D035130BD0000923400082DE9F04198 +:1009800002460B461868C0F30F2595FAA5F0B0FA99 +:1009900080F480E00120A040284000287AD0082C74 +:1009A00004D240F2011000FA04F106E0A4F10800BC +:1009B0004FF00116864046F08061586808280ED135 +:1009C0001869D66826EA11260F0A97FAA7F7B7FA28 +:1009D00087F700FA07F73E43D66000BF00BF5868AC +:1009E00002EB116691FAA1FCBCFA8CFC4FEA8C0870 +:1009F0004FF00F0C0CFA08FC376827EA0C0791FA45 +:100A0000A1FCBCFA8CFC4FEA8C0C00FA0CFC47EA07 +:100A10000C07376000BF5868012802D058680928C1 +:100A200038D1986802EB116691FAA1FCBCFA8CFCF3 +:100A30004FEA8C084FF0030C0CFA08FC376827EAE1 +:100A40000C0791FAA1FCBCFA8CFC4FEA8C0C00FA62 +:100A50000CFC47EA0C07376000BFD86802EB116650 +:100A600091FAA1FCBCFA8CFC4FEA8C084FF0040C04 +:100A70000CFA08FC376827EA0C0791FAA1FCBCFACB +:100A80008CFC4FEA8C0C00FA0CFC47EA0C07376030 +:100A900000BF00BF641C25FA04F000287FF47AAF81 +:100AA000BDE8F08102469068C1F30F231840C1F3FE +:100AB0000F23984201D1012070470020FCE7C1F3C9 +:100AC0000F2242617047C1F30F2242617047C1F3A8 +:100AD0000F220261704770B500EB116391FAA1F526 +:100AE000B5FA85F5AE000F25B5401C68AC4391FA08 +:100AF000A1F5B5FA85F5AD0002FA05F52C431C60A9 +:100B000070BD000002480068401C01490860704741 +:100B1000240000204FF47A71B0FBF1F2521E4FF026 +:100B2000E0235A6100229A6105221A6100BF7047D2 +:100B300010B5044600F0A8FD2060206800F070FDAC +:100B40006060606800F07CFDA060606800F08AFD75 +:100B5000E06010BD014908607047000000000020FF +:100B6000016821F0800101607047816821F08001F7 +:100B700081607047016841F0010101607047C16800 +:100B800041F00101C160704710B5024613681C486E +:100B9000824208D0B2F1804F05D01A48824202D07A +:100BA0001948824204D123F070004C6840EA0403E3 +:100BB0001348824208D0B2F1804F05D011488242DA +:100BC00002D01148824204D123F44070CC6840EA3C +:100BD000040313608868D06200BF0888906200BF79 +:100BE0000748824203D10869106300BF00BF00BFFD +:100BF000506940F00100506100BF002010BD0000AE +:100C0000002C014000040040000800400146086933 +:100C1000C0F34000704701460869C0F38000704788 +:100C200001460869C0F3C000704701460869C0F377 +:100C3000001070470146086900F001007047014646 +:100C4000C868C0F3400070470146C868C0F3800020 +:100C500070470146C868C0F3C00070470146C868C5 +:100C6000C0F3001070470146C86800F001007047EB +:100C700070B50246012901D1002416E0042901D1F2 +:100C8000012412E0102901D102240EE0402901D1F3 +:100C900003240AE0B1F5807F01D1042405E0B1F519 +:100CA000806F01D1052400E006242346064CE55C54 +:100CB00002F1180428190468044DEE5C0425B540BF +:100CC0002C43046070BD00006F34000876340008C7 +:100CD00070B50246012901D1002416E0042901D192 +:100CE000012412E0102901D102240EE0402901D193 +:100CF00003240AE0B1F5807F01D1042405E0B1F5B9 +:100D0000806F01D1052400E006242346064CE55CF3 +:100D100002F1180428190468044DEE5C0825B5405A +:100D20002C43046070BD00006F3400087634000866 +:100D30002DE9F04106460C4615460127012C08D046 +:100D4000102C0CD0B4F5807F0FD0B4F5805F18D193 +:100D500011E02946304600F07BFB074612E02946A9 +:100D6000304600F0B1FB07460CE02946304600F063 +:100D7000EDFB074606E02946304600F023FC074617 +:100D800000E000BF00BF3846BDE8F08181637047D6 +:100D9000826844F207039A430A43826070474268BC +:100DA00022F070020A434260704708B50168009162 +:100DB00000BF4168009100BF08BD6FF040010160B5 +:100DC000704700002DE9FF4104460D46012700262B +:100DD000204600F055F8002833D1E96868680843D8 +:100DE00029690843E16841F20C6291430843E060DD +:100DF000A868216921F440510143216100BF68695D +:100E0000616921F440710143616100BF6846FFF7E9 +:100E10008FFE0E48844201D1039E08E00C488442B4 +:100E200001D1029E03E00B48844200D1029E46B1EC +:100E3000286830B10027314620462A6800F025F89E +:100E400000BF384604B0BDE8F08100000038014022 +:100E5000004400400048004001460868C0F34000DC +:100E6000704701460868C0F3800070470146086873 +:100E7000C0F3C000704701460868C0F38010704797 +:100E80000146C868C0F34030704770B501EBC1033C +:100E900003EB01139400B3FBF4F301EBC10404EB87 +:100EA00001149500B4FBF5F46425B4FBF5F404EBF0 +:100EB000C40505EB0414A3EB8403322404EB0313F1 +:100EC0006424B3FBF4F303F0F00301EBC10404EB7F +:100ED00001149500B4FBF5F46425B4FBF5F403EBC1 +:100EE000041401EBC10303EB01139500B3FBF5F30D +:100EF00001EBC10505EB01159600B5FBF6F564267F +:100F0000B5FBF6F505EBC50606EB0515A3EB85036A +:100F1000322505EB03136425B3FBF5F303F00F0350 +:100F200023449BB2836070BD38B5012014494969E0 +:100F30000143134A5161114649690140009100BFC4 +:100F400000BF00F06BFD05460022114600F040FA9C +:100F5000044621460E2000F071FD0E2000F044FDF5 +:100F600000F05CFD05460022114600F031FA04460F +:100F700021460F2000F062FD0F2000F035FD38BD46 +:100F80000010024000B585B014216846FFF7D3F881 +:100F90001020FFF709FC2020FFF706FC0420FFF7D4 +:100FA00003FC0820FFF700FC1D491E48FFF787FDE2 +:100FB0001D491E48FFF783FD19480090012001904C +:100FC000022002900020039069461648FFF7D6FCE5 +:100FD000174800900020019069461248FFF7CEFCA8 +:100FE000144800900020019069461348FFF7C6FCA2 +:100FF000124800900020019069460C48FFF7BEFCA3 +:1010000009480090012001900320029000200390E5 +:101010000120049069460548FFF7B0FC05B000BD0B +:10102000200020040010014030003004000C01407A +:10103000C000C004FDFD990400080140FFFFCF047B +:1010400030B585B014216846FFF775F84FF400609D +:10105000FFF7B8FB00F0EAFC05460022032100F090 +:10106000D7F904462146192000F0FCFC192000F0B5 +:10107000C8FC41F61F40ADF800000020019063203D +:10108000029000200390049069460948FFF77CFD18 +:101090000748FFF765FD00210548FFF779FE0021AD +:1010A0000348FFF77CFE0248FFF75FFD05B030BD47 +:1010B000002C014000B593B014210EA8FFF73BF8B7 +:1010C000202106A8FFF737F8142101A8FFF733F80D +:1010D0000120FFF75BFB0020ADF838000F9041F6D0 +:1010E0001F401090002011900EA94FF08040FFF794 +:1010F0004BFD00BF4FF08040006840F080004FF093 +:101100008041086000BF00214FF08040FFF740FEA3 +:1011100010218806FFF7DCFD702006900020079064 +:101120000890099002200A9006AA10214007FFF7B4 +:10113000FFFD10218806FFF79BFD00214FF0804046 +:10114000FFF72DFE4FF08040FFF70FFD0420FFF763 +:1011500039FB40F202200190092002900220039006 +:101160000020049001A90248FFF708FC13B000BD5D +:101170000008014030B585B014216846FEF7DBFF5A +:101180000220FFF703FB00F051FC0546002203217B +:1011900000F03EF9044621461D2000F063FC1D20AE +:1011A00000F02FFC41F61F40ADF800000020019038 +:1011B000632002900020039069460948FFF7E4FC91 +:1011C0000748FFF7CDFC00210548FFF7E1FD0021AE +:1011D0000348FFF7E4FD0248FFF7C7FC05B030BD48 +:1011E000000400402DE9F0418CB01C2105A8FEF759 +:1011F000A2FF14216846FEF79EFF4FF48040FFF7E0 +:10120000EFFA0420FFF7ECFA6848009009200190FB +:10121000032002900020039069466548FFF7AEFB6B +:10122000644800900420019069466148FFF7A6FBDE +:10123000002205216048FFF72DFB002205215E48B2 +:10124000FFF706FB002205215B48FFF75DFB00224C +:1012500005215948FFF772FB802205215648FFF708 +:1012600033FB002205215448FFF778FB00220521BB +:101270005148FFF739FB102204214F48FFF70AFBC2 +:10128000002204214C48FFF7E3FA002204214A48D7 +:10129000FFF73AFB002204214748FFF74FFB80226B +:1012A00004214548FFF710FB002204214248FFF7C4 +:1012B00055FB002204214048FFF716FB25213F4B38 +:1012C0001B68C3F30220052400250346C3F1070C65 +:1012D000BCF1040F02D94FF0040C01E0C3F1070C7C +:1012E000674603F1040CBCF1070F02D24FF0000C6B +:1012F00001E0A3F1030C66464FF0010C0CFA07FC69 +:10130000ACF1010C0CEA040C0CFA06FC4FF00108DD +:1013100008FA06F8A8F1010808EA05084CEA0802EC +:1013200000BF002904DB1007030E2548435407E0E3 +:101330001007040E21480C3001F00F031B1FC4548A +:1013400000BF2520002809DB00F01F020121914089 +:101350004209920002F1E022C2F8001100BF4FF4EE +:10136000E130059000200690079008900C2009902D +:1013700000200A900B9005A91248FFF723FD00BF3B +:101380001048006920F490400E4908610846406901 +:1013900020F02A00486100BF00BF0846C06840F442 +:1013A0000050C86000BF0CB0BDE8F081020002042C +:1013B0000008014004000404000002400CED00E0BD +:1013C00000E400E00038014000BFFEE700BFFEE798 +:1013D000F0B503460C4603F00701C1F107000428ED +:1013E00001D9042001E0C1F107000646081D0728C5 +:1013F00001D2002000E0C81E05460120B040401E7A +:101400002040A8400127AF407F1E17403843F0BD61 +:10141000F0B503460C4603F00701C1F107000428AC +:1014200001D9042001E0C1F107000646081D072884 +:1014300001D2002000E0C81E05460120B040401E39 +:101440002040A8400127AF407F1E17403843F0BD21 +:1014500070B50246106A20F001001062136A5568E8 +:10146000946924F0030424F070000E6840EA060436 +:1014700023F002000E6940EA060323F001004E68E3 +:1014800040EA06030F48824213D123F008004E6958 +:1014900040EA860323F004008E6840EA860325F4C0 +:1014A00080708E6940EA060525F40070CE6940EA36 +:1014B000460555609461C868506300BF1362002000 +:1014C00070BD0000002C01402DE9F04104460D469E +:1014D000206A20F010002062266AD4F80480A769F0 +:1014E00027F4407727F4E040296840EA012726F0F6 +:1014F0002000296940EA011626F01000696840EAD8 +:1015000001161148844213D126F08000696940EA2F +:10151000811626F04000A96840EA811628F4806010 +:10152000A96940EA810828F40060E96940EAC10835 +:10153000C4F80480A7612046E968FFF727FC26620B +:101540000020BDE8F0810000002C014070B502468B +:10155000106A20F480701062136A5568D46924F010 +:10156000030424F070000E6840EA060423F40070BF +:101570000E6940EA062323F480704E6840EA062391 +:101580000F48824213D123F400604E6940EA86235B +:1015900023F480608E6840EA862325F480508E69AB +:1015A00040EA061525F40050CE6940EA461555601C +:1015B000D461C868D06300BF1362002070BD000012 +:1015C000002C014070B50246106A20F48050106271 +:1015D000146A5568D36923F4407323F4E0400E681D +:1015E00040EA062324F400500E6940EA063424F44D +:1015F00080504E6840EA06340748824204D125F400 +:1016000080408E6940EA86155560D361C8681064D1 +:1016100000BF1462002070BD002C01407047000024 +:10162000014600BF0448406800F0F0000009034A8A +:10163000125C21FA02F0704700100240BC3400082E +:10164000014600BF0548406800F4E060044A02EB30 +:101650001020027821FA02F07047000000100240CA +:10166000CC340008014600BF0548406800F46050D3 +:10167000044A02EBD020027821FA02F07047000001 +:1016800000100240CC34000810B5002400BF0B4805 +:10169000406800F00C0020B1042804D0082808D1CC +:1016A00003E0074C07E0064C05E000F00BF80446A9 +:1016B00001E0034C00BF00BF204610BD00100240F7 +:1016C00000127A000021002200BF1148406800F497 +:1016D000803002461AB1B2F5803F0CD101E00D49CD +:1016E0000BE000BF0A484068C0F34040401C0A4B72 +:1016F000B3FBF0F101E0074900BF00BF00BF0448A1 +:10170000406800F47010022303EB90404843704798 +:101710000010024000093D0000127A007047704737 +:1017200010B502203749096821F007010143354A05 +:10173000116000BF00BF00BF3248006800F0070022 +:101740000228F8D100BF3048006840F480302E49AC +:10175000086000BF00BF00BF2B480068C0F34040D6 +:101760000028F8D04FF480304FF4E011264A526838 +:1017700022F47C1200F440330B431A43224B5A608C +:1017800000BF00BF1846006840F08070194608602E +:1017900000BF00BF00BF1C480068C0F340600028C5 +:1017A000F8D000201849496821F0F0010143164A99 +:1017B000516000BF10151146496821F4E0610143F2 +:1017C000516000BF00201146496821F46051014377 +:1017D000516000BF02201146496821F00301014316 +:1017E000516000BF00BF00BF0748406800F00C0018 +:1017F0000828F8D10548FFF78DF90448FFF7AAF942 +:1018000010BD0000002002400010024000A24A0467 +:101810007047000010B53148FFF70CFA01285CD181 +:1018200000BF2E48FFF7F2F901280AD12B48FFF735 +:1018300006FA012805D100BF001F2849086100BF32 +:1018400000BF2648FFF7E7F901280AD12348FFF730 +:10185000FBF9012805D100BF801F2049086100BFA6 +:1018600000BF1E48FFF7DCF901280BD11B48FFF72A +:10187000F0F9012806D100BF6FF008001749086190 +:1018800000BF00BF1548FFF7D0F901280BD113485E +:10189000FFF7E4F9012806D100BF6FF010000F49EF +:1018A000086100BF00BF0D48FFF7C4F901280AD145 +:1018B0000A48FFF7D8F9012805D100BFC01E074923 +:1018C000086100BF00BF00BFFFF71CF900BF04485C +:1018D0000068401C0249086000BF10BD002C014098 +:1018E0005C00002010B52D48FFF7A4F9012853D162 +:1018F00000BF2A48FFF78AF901280AD12748FFF7D5 +:101900009EF9012805D100BF001F2449086100BFCE +:1019100000BF2248FFF77FF901280AD11F48FFF7CF +:1019200093F9012805D100BF801F1C49086100BF41 +:1019300000BF1A48FFF774F901280BD11748FFF7C9 +:1019400088F9012806D100BF6FF00800134908612B +:1019500000BF00BF1148FFF768F901280BD10F48FD +:10196000FFF77CF9012806D100BF6FF010000B498A +:10197000086100BF00BF0948FFF75CF901280AD1E0 +:101980000648FFF770F9012805D100BFC01E0349C2 +:10199000086100BF00BF00BF10BD00000004004090 +:1019A00010B50248006801F0C5FB10BD60000020C2 +:1019B00000BFFEE70FB47CB50C0009AD01D0611E7D +:1019C00000E00021CDE90001064B6A46294608984F +:1019D00000F0A8F8002C02D0009A002111707CBC05 +:1019E0005DF814FB7B1F0008002809DB00F01F02D4 +:1019F000012191404209920002F1E022C2F8001157 +:101A00007047002809DB00F01F02012191404209C4 +:101A1000920002F1E022C2F800117047024800680B +:101A2000C0F30220704700000CED00E0024800689F +:101A3000C0F30220704700000CED00E010B5002854 +:101A400004DB0A07130E054A135406E00A07140EB6 +:101A5000034A00F00F031B1FD45410BD00E400E044 +:101A600018ED00E010B5002804DB0A07130E054A44 +:101A7000135406E00A07140E034A00F00F031B1F5D +:101A8000D45410BD00E400E018ED00E002E008C806 +:101A9000121F08C1002AFAD170477047002001E0E8 +:101AA00001C1121F002AFBD170470000014601F15D +:101AB000100000E0001D02681AB9024A1268904244 +:101AC000F8D370473800002010B50648046803E0DA +:101AD0002046FFF7EBFF0446034800688442F7D333 +:101AE00010BD0000340000203800002010B504466E +:101AF0002146002000F034FD10BD10B501E000F8D3 +:101B0000011B131EA2F10104A2B2F8D110BD10B541 +:101B100001E000F8011B131EA2F10104A2B2F8D1EA +:101B200010BD00002DE9FF4F8DB00F460546002681 +:101B300006E025280BD0DDE90F1290476D1C761CBE +:101B400028780028F5D111B03046BDE8F08F002488 +:101B5000A246A1460122E94900E0044315F8013FED +:101B6000203B02FA03F00842F7D128782A2810D047 +:101B70006FF02F022878A0F13001092914D80AEB60 +:101B80008A0102EB410144F0020400EB010A6D1CE2 +:101B9000F0E701CF5FEA000A03D544F40054CAF12C +:101BA000000A44F002046D1C28782E2817D115F87D +:101BB000010F44F004042A280ED06FF02F02287879 +:101BC000A0F1300109290AD809EB890102EB410192 +:101BD00000EB01096D1CF2E757F8049B6D1C287897 +:101BE0006C280FD006DC4C2817D068280DD06A2846 +:101BF00014D104E0742810D07A280FD10DE044F4F9 +:101C000000140AE044F4801401E044F440146978BC +:101C1000814202D104F580146D1C6D1C28786E2859 +:101C20001ED00CDC632830D004DC00288BD0582870 +:101C300011D19FE0642867D069280CD164E0732833 +:101C40002DD004DC6F2872D0702804D194E0752860 +:101C50006ED078286DD0DDE90F129047761C4BE1ED +:101C6000C4F30250022806D0032809D0042801CF6B +:101C700009D0066040E101CFF117C0E900613BE106 +:101C800001CF068038E1067036E117F8040B8DF8B5 +:101C9000000000208DF80100EB46012003E057F81A +:101CA00004BB4FF0FF3061074FF0000102D40DE09C +:101CB00008F10101884649450FDA8045F8DB1BF839 +:101CC00008100029F4D108E008F10101884681429A +:101CD000FADB1BF808100029F6D1DDE90F23AAEB87 +:101CE00008008146214600F031F9304400EB080637 +:101CF00004E0DDE90F121BF8010B9047B8F1010871 +:101D0000F7D221464846F2E00A21C4F302524FF0CE +:101D1000000B0891022A04D001CFC117032A09D071 +:101D20000AE0FF1D27F00707F7E8020108E02CE0B2 +:101D30001EE01FE000B2C117042A01D140B2C11752 +:101D4000021E71F1000206DA0023D0EB030063EB00 +:101D500001012D2202E0220504D52B228DF824203A +:101D6000012203E0E20701D02022F7E7904653E08A +:101D70000A210BE0102109E010214FF0000B44F084 +:101D800004044FF00809089103E008214FF0000B0C +:101D90000891C4F30252022A04D001CF0021032A81 +:101DA00006D006E0FF1D27F00707F7E8020103E071 +:101DB00080B2042A00D1C0B24FF0000822072BD510 +:101DC0002A78702A07D0DDF820C08CF0100C5CEA6D +:101DD0000B0C05D00EE040228DF82420012208E0F3 +:101DE00050EA010306D030238DF824308DF82520E9 +:101DF00002229046089B83F0080353EA0B030BD1A1 +:101E000050EA010201D1620706D530228DF8242064 +:101E10004FF00108A9F101092A78582A04D038A204 +:101E20000B9208AA0A920BE03AA2F9E75B46089ADD +:101E3000FEF784FB0B9B9B5C0A9A521E0A9213705E +:101E400050EA0102F2D10A98ADEB000000F1200B3C +:101E5000600702D524F4803401E04FF00109D94530 +:101E600002DDA9EB0B0000E0002000EB0B01414478 +:101E70000890AAEB010AE00306D4DDE90F2321460E +:101E8000504600F063F806444FF0000908E009A945 +:101E900011F80900DDE90F12904709F10109761CDC +:101EA000C145F4DBE0030CD5DDE90F2321465046A4 +:101EB00000F04CF8064404E0DDE90F1230209047B2 +:101EC000761C0899481E08900029F5DC08E00A985D +:101ED0000A990078491C0A91DDE90F129047761C97 +:101EE000BBF10001ABF1010BF1DC21465046DDE90D +:101EF0000F2300F019F806446D1C21E609280100A3 +:101F0000303132333435363738396162636465666F +:101F10000000000030313233343536373839414231 +:101F200043444546000000002DE9F04104460025E9 +:101F30001E461746880404D405E039462020B047E1 +:101F40006D1C641EF9D52846BDE8F0812DE9F041ED +:101F5000044600251E469046C80301D5302700E000 +:101F60002027880404D505E041463846B0476D1C5B +:101F7000641EF9D52846BDE8F0814A68002A06D0DB +:101F80000A68531C0B6010704868401E4860704718 +:101F900010B515A1032000F005FCC82000F06EF874 +:101FA00000F002FB002405E0204600F0A1FB04F154 +:101FB0000A00C4B2642CF7DD00200E4908600E4907 +:101FC000086000BF0D48FEF7D5FD0C48FEF7D7FDB1 +:101FD00000BF00BF0A48FEF7CDFD0948FEF7CFFD60 +:101FE00000BF00F0DBFA10BD4C4F4144494E472E74 +:101FF0002E2E0000040000200C000020002C0140C8 +:102000000004004010B5034800F00EF8024800F04C +:1020100061F910BD040000200C00002010B501F093 +:1020200059F800F052FE10BD08B50146002000909E +:10203000086810B1112813D108E000BF00BF0B4899 +:102040000068486000BF1120086000BF074A486868 +:102050001268101A642801D2002008BD00BFEDE705 +:102060000020086000900320F7E700005C000020DB +:1020700001490860704700002000002070B5044648 +:102080001E2094FBF0F594FBF0F100FB114604E0F8 +:1020900047F2305000F00CF86D1E002DF8D12EB133 +:1020A0004FF47A7106FB01F000F002F870BD0000F9 +:1020B00070B5034600224FF0E02675690D4E366874 +:1020C00003FB06F44FF0E026B16910E04FF0E02684 +:1020D000B06988420BD0884202D20E1A324402E024 +:1020E0002E1A0E4432440146A24200D300E0EDE72E +:1020F00000BF70BD2000002010B500BF01220E49B6 +:102100000E48FEF7E8FC00BF0B490C48FEF7DFFC69 +:102110000B490A48FEF7DBFC0420FFF7C9FF06491C +:102120000648FEF7D0FC0420FFF7C2FF044903482D +:10213000FEF7C9FC10BD000010001004000C0140A7 +:102140002000200410B500BF01220E490E48FEF702 +:10215000C2FC00BF0D490C48FEF7B5FC09490A480E +:10216000FEF7B1FC0420FFF7A3FF08490648FEF77D +:10217000AEFC04490448FEF7AAFC0420FFF798FFD0 +:1021800010BD000010001004000C014020002004CD +:1021900010B50024082213491348FEF79CFC11498E +:1021A0001148FEF794FC0420FFF782FF0F490E4808 +:1021B000FEF78DFC0420FFF77BFF07E0601CC4B234 +:1021C000FA2C03DDFFF7BEFF002010BD05490648CD +:1021D000FEF768FC0028F1D104490348FEF773FCC0 +:1021E0000120F2E710001004000C01402000200440 +:1021F00070B50446002500BF012217491748FEF7B5 +:102200006AFC00BF16491548FEF75DFC00BF1FE0E1 +:10221000E00920B110491148FEF759FC03E00E49CE +:102220000E48FEF750FC6006040E0220FFF740FF48 +:102230000B490A48FEF74BFC0220FFF739FF08491B +:102240000648FEF740FC0220FFF732FF681CC5B2CB +:10225000082DDDDB70BD000010001004000C0140F3 +:102260002000200438B5044600208DF800008DF8C9 +:102270000140FFF741FF7820FFF7BAFFFFF788FF23 +:102280009DF80000FFF7B4FFFFF782FF9DF8010003 +:10229000FFF7AEFFFFF77CFFFFF754FF38BD38B5FF +:1022A000044640208DF800008DF80140FFF724FF20 +:1022B0007820FFF79DFFFFF76BFF9DF80000FFF709 +:1022C00097FFFFF765FF9DF80100FFF791FFFFF70C +:1022D0005FFF38BD38B5044600200090206810B17B +:1022E0002E2837D12CE000BF1D481E4BD968C0F303 +:1022F0000F2222EA010301EA020543EA0543194DD0 +:102300002B6100BF18A20221002000F055FC1849E3 +:1023100008680968491C164B1960FEF796F80546CF +:1023200000232A460221282000F052FA00F022FD64 +:1023300000BF10480068606000BF2E20206000BF12 +:102340000C4960680968081A642801D2002038BD69 +:1023500000BFC9E70020206000900320F7E70000DD +:102360002000200400100140207469636B3A0000D3 +:102370001C0000205C00002008B501202749896965 +:102380000143264A9161114689690140009100BFCD +:1023900000BF00071146C9690143D1611146C969EF +:1023A0000140009100BF00BF032002461C4B19688A +:1023B0004FF6FF0319401B4B0B4343EA0221184B16 +:1023C000196000BF00BF1848406820F0E06040F08E +:1023D00000701549486000BFFFF7A2F91348006874 +:1023E0001349B0FBF1F084B22046FFF741FEFEF73F +:1023F000C9FDFEF799FDFEF75DFEFEF7F3FEFEF761 +:102400001FFEFEF7B7FE002000F014F8FFF706FEEF +:10241000FFF7BEFD01E0FFF7F5FDFCE7001002400D +:102420000CED00E00000FA05000001400000002073 +:1024300040420F0010B504460C4951F824104A00E0 +:102440000B4951F82400002100F09EF8094951F889 +:1024500024200749083951F82400002100F094F89D +:10246000012103480830015510BD0000183500084F +:1024700050000020283500082DE9F04704460F469B +:102480000025A9462348005D20B922481838016874 +:10249000204688471FB94FF0FF30BDE8F0871E483F +:1024A00050F82400B7FBF0F61B4850F82400B7FBA7 +:1024B000F0F100FB117000B1761C184850F82400B0 +:1024C000451E22E01348083850F8240030F8150063 +:1024D00010B909F1010901E04FF00009B14513D12C +:1024E0004FF0000809E00B48083850F8240005EBCD +:1024F000080220F8126008F10108B045F3D306483D +:1025000050F824006843C8E76D1E002DDADA4FF05A +:10251000FF30C2E7580000202035000818350008B9 +:1025200010B501460023002207E00B4850F82100B7 +:1025300030F8120000B15B1C521C084850F8210012 +:102540009042F2D864205843044C54F82140B0FB28 +:10255000F4F0C0B210BD0000500000201835000893 +:1025600070B504460E4631462046FFF785FF054606 +:10257000681C08B9002070BD024850F824002844A7 +:10258000F9E700004800002030B5034601E003F8F9 +:10259000011B141EA2F10102F9D130BD10B500F0EB +:1025A00003F800F0E7FB10BD10B54FF48062002186 +:1025B0000448FFF7ACFA4FF48062FF210248FFF7AE +:1025C000A6FA10BD80280020802C00202DE9FC4FA9 +:1025D00004460D4616461F46301B01D5A01B00E0E1 +:1025E000301B8146781B01D5E81B00E0781B824632 +:1025F000B44201DA012001E04FF0FF300190BD420A +:1026000001DA012001E04FF0FF300090A9EB0A0051 +:102610000FFA80F821E0294620460B9A00F022F8B4 +:10262000B44202D1BD4200D118E04FEA48000FFA8F +:1026300080FBCAF10000834506DDA8EB0A000FFA13 +:1026400080F801982044C4B2CB4506DA08EB0900B3 +:102650000FFA80F800982844C5B2DCE700BFBDE857 +:10266000FC8F0000F0B503461446802B01DA4029A8 +:1026700000DBF0BD012C1CD1CD1701EB5575ED1021 +:1026800003EBC515194E755D0A46CE1701EB56765C +:10269000F610A1EBC6070126BE403543EEB2084650 +:1026A000CD1701EB5575ED1003EBC5150F4F7E559A +:1026B0001AE0CD1701EB5575ED1003EBC5150B4E68 +:1026C000755D0A46CE1701EB5676F610A1EBC607EC +:1026D0000126BE40B5430846CE1701EB5676F610EC +:1026E00003EBC616014FBD5500BFC2E7802800208E +:1026F0003EB504460A25012005F118010A236C2283 +:102700000090184600F01CF801200090201DC2B275 +:1027100005F11A0107230C2000F0BCFA234606A29B +:10272000052101A8FFF746F901AA02212C2000F09B +:1027300071FA00F01FFB3EBD253364252500000023 +:102740002DE9F84104460D4616461F46DDF81C806B +:10275000A019C2B22B4629462046CDF80080FFF7CB +:1027600035FFE819C3B2A019C2B2E819C1B22046B8 +:10277000CDF80080FFF72AFFE819C3B222462946A8 +:102780002046CDF80080FFF721FFE919CBB2A1194F +:10279000CAB2A119C8B22946CDF80080FFF716FFCA +:1027A000BDE8F88170B505460C462046FDF7CEFC25 +:1027B00000EB40008021A1EB4000C0F34706224619 +:1027C0002946304600F0F8F900F0D4FA70BD000058 +:1027D0002DE9F04F87B005460E4691469A460020F7 +:1027E00003900490059002900024834600214846FF +:1027F000FDF790FE07D22D222046611CCCB203A922 +:102800000A5489F00049E3494846FDF78DFE02D29B +:1028100007B0BDE8F08FC4F10800C0B20290DE49F5 +:102820004846FDF781FE59D8DB494846FDF71FFDB4 +:102830008046DA49FDF791FC0746FDF724FEC2B257 +:102840002046611CCCB203A90A544846FDF702FE9B +:1028500042F2107190FBF1F201FB12004FF47A7119 +:1028600090FBF1F03030C2B22046611CCCB203A91B +:102870000A544846FDF7EEFD4FF47A7190FBF1F2F1 +:1028800001FB1200642190FBF1F03030C2B220460F +:10289000611CCCB203A90A544846FDF7DBFD642154 +:1028A00090FBF1F201FB12000A2190FBF1F03030B5 +:1028B000C2B22046611CCCB203A90A544846FDF7B7 +:1028C000C9FD0A2190FBF1F201FB12003030C2B2C7 +:1028D0002046611CCCB203A90A54C2E0B049484664 +:1028E000FDF722FE48D84846FDF7B4FD42F21071CC +:1028F00090FBF1F201FB12004FF47A7190FBF1F0C2 +:102900003030C2B22046611CCCB203A90A544846FA +:10291000FDF7A0FD4FF47A7190FBF1F201FB12007C +:10292000642190FBF1F03030C2B22046611CCCB281 +:1029300003A90A544846FDF78DFD642190FBF1F28E +:1029400001FB12000A2190FBF1F03030C2B22046A8 +:10295000611CCCB203A90A544846FDF77BFD0A214D +:1029600090FBF1F201FB12003030C2B22046611C34 +:10297000CCB203A90A5474E08A494846FDF7D4FD55 +:1029800034D84846FDF766FD4FF47A7190FBF1F2BA +:1029900001FB1200642190FBF1F03030C2B22046FE +:1029A000611CCCB203A90A544846FDF753FD6421CB +:1029B00090FBF1F201FB12000A2190FBF1F03030A4 +:1029C000C2B22046611CCCB203A90A544846FDF7A6 +:1029D00041FD0A2190FBF1F201FB12003030C2B23E +:1029E0002046611CCCB203A90A543AE06E4948461D +:1029F000FDF79AFD21D84846FDF72CFD642190FB98 +:102A0000F1F201FB12000A2190FBF1F03030C2B26A +:102A10002046611CCCB203A90A544846FDF71AFDB2 +:102A20000A2190FBF1F201FB12003030C2B22046C5 +:102A3000611CCCB203A90A5413E000214846FDF7FB +:102A400073FD0ED84846FDF705FD0A2190FBF1F213 +:102A500001FB12003030C2B22046611CCCB203A987 +:102A60000A54BAF1000F6ADD072C68DA2E222046DC +:102A7000611CCCB203A90A544846FDF7EBFC804622 +:102A8000FDF7DAFC07464946FDF7BCFB8146BAF183 +:102A9000010F1ED1082C1CDA43494846FDF7B5FB4F +:102AA00081464846FDF722FD0022404BCDE900015A +:102AB000FDF71BFC0746FDF7FAFC0A2190FBF1F23B +:102AC00001FB12003030C2B22046611CCCB203A917 +:102AD0000A54BAF1020F32DB082C30DA3149484689 +:102AE000FDF793FB81464846FDF7B4FC642190FB5B +:102AF000F1F201FB12000A2190FBF1F03030C2B27A +:102B00002046611CCCB203A90A54082C17DA4846A7 +:102B1000FDF7ECFC0022254BCDE90001FDF7E5FBBC +:102B20000746FDF7C4FC0A2190FBF1F201FB1200FD +:102B30003030C2B22046611CCCB203A90A5422E054 +:102B400003A810F80B002038C0B20290782D02DDE7 +:102B50000025701CC6B200240DE0029800EB400076 +:102B6000134901EB4000005D05EBC6112144114AF9 +:102B70005054601CC4B2062CEFDBA81DC5B20BF18B +:102B8000010000F0FF0B03A810F80B000028D7D1BC +:102B900000BF3DE60000FA4600401C4600004042EF +:102BA00000007A440000C842000020410000E03FDD +:102BB0005A35000880280020F0B513460025002271 +:102BC00000241EE01E5D203EF5B27E2802DD0020BE +:102BD0004E1CF1B200220EE005EB45060B4F07EB51 +:102BE0004606B65C00EBC1171744DFF824C00CF8AA +:102BF0000760561CF2B2062AEEDB861DF0B2661C98 +:102C0000F4B21E5D002EDDD1F0BD00005A35000883 +:102C100080280020F0B5034614460022002000253D +:102C200030E0665D203EF2B2782B02DD00234E1CC0 +:102C3000F1B200200CE000EB0216144FBE5D03EB76 +:102C4000C1170744DFF848C00CF80760461CF0B213 +:102C50000828F0DB00200EE000EB021608360B4FD0 +:102C6000BF5D4E1C03EBC6160644DFF824C00CF80B +:102C70000670461CF0B20828EEDB03F10806F3B23A +:102C80006E1CF5B2665D002ECBD1F0BD8237000818 +:102C9000802800202DE9F84306460D461746984641 +:102CA000DDF8209000240CE02819C3B2F019C2B25C +:102CB0002819C1B23046CDF80090FFF787FC601CA0 +:102CC000C4B24445F0DBBDE8F88310B5AE20FFF791 +:102CD000C9FA2020FFF7C6FA1020FFF7C3FAC82070 +:102CE000FFF7C0FA0020FFF7BDFA1020FFF7BAFA8D +:102CF0004020FFF7B7FA8120FFF7B4FAFF20FFF773 +:102D0000B1FAA120FFF7AEFAA620FFF7ABFAA82090 +:102D1000FFF7A8FA3F20FFF7A5FAA420FFF7A2FAD1 +:102D2000D320FFF79FFA0020FFF79CFAD520FFF78A +:102D300099FAF020FFF796FAD920FFF793FA2220AC +:102D4000FFF790FADA20FFF78DFA1220FFF78AFAE0 +:102D5000DB20FFF787FA2020FFF784FA8D20FFF7AA +:102D600081FA1420FFF77EFAAF20FFF77BFAFFF716 +:102D700015FC10BD70B500242DE0002600200DE0EC +:102D800000EBC4111D4A515C00EBC4121C4B9A5C51 +:102D9000914201D0012603E0411CC8B28028EFDB3C +:102DA00000BFB6B104F1B001C8B2FFF75BFA012071 +:102DB000FFF758FA1020FFF755FA002507E005EB5A +:102DC000C4110E4A505CFFF76AFA681CC5B2802D28 +:102DD000F5DB601CC4B2082CCFDB094807494FF46F +:102DE000806203E011F8013B00F8013B131EA2F1E1 +:102DF0000104A2B2F6D100BF70BD000080280020FF +:102E0000802C002010B5044604B910BD0020208598 +:102E1000A07D012808D1606A30B1218C89040A0C98 +:102E20000021606AFEF769FE00BFEEE72DE9F05F62 +:102E30000646884615469946DDE90B7BDDF828A055 +:102E40000EB1012100E0002108462921FDF780FC98 +:102E50004420FEF74BFE04460CB1012100E00021A6 +:102E600008462C21FDF774FC0120E0750020207637 +:102E7000C4F83C902584C4F840B0A786002D0CDD32 +:102E80002846FEF733FEE061E16909B1012100E067 +:102E9000002108463E21FDF75BFC002F0CDD384683 +:102EA000FEF724FE2063216B09B1012100E000211F +:102EB00008464521FDF74CFC84F8158084F82CA0C9 +:102EC00066602046BDE8F09F10B5044604B910BD09 +:102ED000002060852046FFF795FF00BFF7E710B59B +:102EE00004460CB1012100E00021084640F2D71150 +:102EF000FDF72EFC012084F838002169A068FDF759 +:102F00007DFC2069082865D2DFE800F06404111E0A +:102F10002C3A485600BFA0680168C1F3400121B1B6 +:102F2000A0680221416000BF00BF00BF53E000BFA6 +:102F3000A0680168C1F3401121B1A068202141605F +:102F400000BF00BF00BF46E000BFA0680168C1F33A +:102F5000402129B1A0684FF40071416000BF00BF5B +:102F600000BF38E000BFA0680168C1F3403129B15B +:102F7000A0684FF40051416000BF00BF00BF2AE0CD +:102F800000BFA0680168C1F3404129B1A0684FF4B7 +:102F90000031416000BF00BF00BF1CE000BFA0685F +:102FA0000168C1F3405129B1A0684FF4001141609C +:102FB00000BF00BF00BF0EE000BFA0680168C1F302 +:102FC000406129B1A0684FF00071416000BF00BFAF +:102FD00000BF00E000BF00BF606800BF00BF00BFCF +:102FE00000F10C0252E8002F42F0400100F10C0207 +:102FF00042E80013002BF3D100BF00BF206908286E +:1030000065D2DFE800F06404111E2C3A485600BF78 +:10301000A0680168C1F3C00121B1A0680821416026 +:1030200000BF00BF00BF53E000BFA0680168C1F34C +:10303000C01121B1A0688021416000BF00BF00BF66 +:1030400046E000BFA0680168C1F3C02129B1A068B3 +:103050004FF40061416000BF00BF00BF38E000BF17 +:10306000A0680168C1F3C03129B1A0684FF40041E4 +:10307000416000BF00BF00BF2AE000BFA068016838 +:10308000C1F3C04129B1A0684FF40021416000BFE5 +:1030900000BF00BF1CE000BFA0680168C1F3C051C1 +:1030A00029B1A0684FF40001416000BF00BF00BF1C +:1030B0000EE000BFA0680168C1F3C06129B1A0683B +:1030C0004FF00061416000BF00BF00BF00E000BFE3 +:1030D00000BF10BD0EB51348006808BB0020F021EA +:1030E0000122114BCDE9002102900A4601210F482F +:1030F000FFF79CFE0B4908600020096808700C4827 +:10310000084909688860052006490968C8600420E4 +:1031100004490968086100210248006800F0E2F8EB +:103120000EBD000060000020673400080038014038 +:103130000000024038B5044604B938BD6068C16873 +:10314000C1F34011B9B160680168C1F3401191B198 +:10315000608D218C884202DB2046FFF7B5FE616856 +:103160004A68D2B2608D411C6185E1690A54002031 +:103170002076E0753FE06068C168C1F30011002966 +:1031800039D060680168C1F30011002933D0607D37 +:1031900001282BD1D4E902014A1E514B9A5C02440A +:1031A0005268208C801A6085207DF8B9D4E902012C +:1031B000FDF724FBE06B80B1608D00280DDD608D94 +:1031C000218C884209DC628D2078E36BE1699847A5 +:1031D000228C0021E069FEF790FC228CD4E90201E8 +:1031E000FDF746FBD4E90201FDF716FB00206085E0 +:1031F0006068FDF7DAFD6068C168C1F3801151B104 +:103200006068FDF738FE30B1206C08B1206C804753 +:103210006068FDF7D2FDA07D01285ED101256068C0 +:10322000C168C1F3002171B16068016801F001015A +:1032300049B1022560680168009100BF41680091B2 +:1032400000BF00BF00BF6068FDF706FE68B16068A0 +:10325000FDF702FE48B1042560680168009100BFD7 +:103260004168009100BF00BF00BF6068FDF7F9FD35 +:1032700060B16068FDF7F5FD40B1606801680091DC +:1032800000BF4168009100BF00BF00BF6068FDF74C +:10329000EDFD68B16068FDF7E9FD48B11025606893 +:1032A0000168009100BF4168009100BF00BF00BFEE +:1032B000012D11D0606A78B1618D491E88B2228DCE +:1032C000616A01EB82014880228D616A01F8225017 +:1032D000218D491C218500BF00BF00BF2DE70000E4 +:1032E000D434000870B504460D46607D90B9A575CC +:1032F000606800BF00BF00BF00F10C0252E8002F61 +:1033000042F0200100F10C0242E80013002BF3D13F +:1033100000BF70E00020A0756068FDF746FD2169E0 +:10332000A068FDF76BFAD4E90201FDF767FA60685F +:10333000011D0E463246D4E90201FDF7F5FAE269B5 +:10334000D4E90201FDF7B6FA228CD4E90201FDF7B7 +:103350008FFAD4E90201FDF76DFAD4E90201FDF715 +:103360005BFA606800BF00BF00BF00F1140252E8C2 +:10337000002F42F0400100F1140242E80013002B3C +:10338000F3D100BF00BF606800BF00BF00BF00F105 +:103390000C0252E8002F42F0100100F10C0242E84A +:1033A0000013002BF3D100BF00BF6068011D0E4663 +:1033B00032462169A068FDF7B7FA226B2169A0683F +:1033C000FDF778FA2169A068FDF734FA606800BF5C +:1033D00000BF00BF00F1140252E8002F42F080014C +:1033E00000F1140242E80013002BF3D100BF00BF2C +:1033F000012084F83800A07D012833D1606A68B9C3 +:10340000218C8800FEF772FB6062616A09B10121BC +:1034100000E0002108468221FDF79AF9606800BFAC +:1034200000BF00BF00F10C0252E8002F42F480718F +:1034300000F10C0242E80013002BF3D100BF00BFE3 +:10344000606800BF00BF00BF00F1140252E8002F07 +:1034500042F0010100F1140242E80013002BF3D105 +:1034600000BF00BF70BD7047081C3044586C80001E +:103470000000000404040000080000000800000828 +:103480000000000800020406080A0C000102030400 +:103490000506081C3044586C800000000004040439 +:1034A00000000800000008000008000000080002FA +:1034B0000406080A0C0001020304050600000000CF +:1034C00000000000010203040607080900000000D4 +:1034D00001020304081C3044586C80000000000402 +:1034E00004040000080000000800000800000008B4 +:1034F00000020406080A0C000102030405065F6CC2 +:10350000697374006C69737420616C6C20636F6DF7 +:103510006D616E6400000000000400000000000007 +:10352000080000000800000000200000000000006B +:10353000081C3044586C80000000000404040000A3 +:10354000080000000800000800000008000204064F +:10355000080A0C0001020304050600000000000038 +:103560000000002F000000000700070000147F1477 +:103570007F1400242A7F2A12006264081323003675 +:103580004955225000000503000000001C224100A4 +:10359000000041221C000014083E08140008083EE8 +:1035A0000808000000A060000008080808080000E3 +:1035B00060600000002010080402003E5149453EB2 +:1035C0000000427F400000426151494600214145D0 +:1035D0004B31001814127F10002745454539003C37 +:1035E0004A49493000017109050300364949493605 +:1035F00000064949291E00003636000000005636F4 +:1036000000000008142241000014141414140000D7 +:103610004122140800020151090600324959513E65 +:10362000007C1211127C007F49494936003E41411D +:103630004122007F4141221C007F49494941007FCE +:1036400009090901003E4149497A007F0808087FBD +:103650000000417F4100002040413F01007F0814ED +:103660002241007F40404040007F020C027F007FEB +:103670000408107F003E4141413E007F09090906D0 +:10368000003E4151215E007F091929460046494903 +:1036900049310001017F0101003F4040403F001FD0 +:1036A0002040201F003F4038403F0063140814634F +:1036B00000070870080700615149454300007F4139 +:1036C000410000552A552A55000041417F00000461 +:1036D000020102040040404040400000010204009A +:1036E000002054545478007F4844443800384444FF +:1036F000442000384444487F00385454541800088B +:103700007E0901020018A4A4A47C007F08040478A8 +:103710000000447D4000004080847D00007F102830 +:1037200044000000417F4000007C04180478007CC5 +:103730000804047800384444443800FC2424241845 +:103740000018242418FC007C080404080048545481 +:10375000542000043F444020003C4040207C001C9A +:103760002040201C003C4030403C004428102844AD +:10377000001CA0A0A07C004464544C4414141414F5 +:103780001414000000000000000000000000000011 +:103790000000000000F800000000000000333000CE +:1037A000000000100C06100C0600000000000000D5 +:1037B000000040C07840C0784000043F04043F044B +:1037C0000400007088FC08300000001820FF211E53 +:1037D0000000F008F000E018000000211C031E218A +:1037E0001E0000F00888700000001E212324192705 +:1037F000211010160E000000000000000000000064 +:103800000000000000E0180402000000000718207B +:10381000400000020418E0000000004020180700EB +:103820000000404080F0804040000202010F010291 +:103830000200000000F0000000000101011F010172 +:103840000100000000000000000080B070000000D7 +:103850000000000000000000000000010101010163 +:1038600001010000000000000000003030000000F6 +:1038700000000000000080601804006018060100CD +:10388000000000E010080810E000000F10202010D9 +:103890000F00001010F8000000000020203F202042 +:1038A00000000070080808887000003028242221D9 +:1038B000300000300888884830000018202020118F +:1038C0000E000000C02010F8000000070424243F70 +:1038D000240000F808888808080000192120201119 +:1038E0000E0000E0108888180000000F1120201141 +:1038F0000E0000380808C83808000000003F00002B +:1039000000000070880808887000001C2221212215 +:103910001C0000E010080810E00000003122221115 +:103920000F00000000C0C0000000000000303000A8 +:103930000000000000800000000000008060000027 +:103940000000000080402010080000010204081060 +:10395000200040404040404040000404040404046F +:10396000040000081020408000000020100804021D +:103970000100007048080808F0000000003036011F +:103980000000C030C828E810E000071827242314DE +:103990000B000000C038E0000000203C230202279A +:1039A000382008F8888888700000203F20202011E7 +:1039B0000E00C03008080808380007182020201022 +:1039C000080008F808080810E000203F2020201018 +:1039D0000F0008F88888E8081000203F20202320E6 +:1039E000180008F88888E8081000203F200003002D +:1039F0000000C03008080838000007182020221EE8 +:103A0000020008F808000008F808203F2101012101 +:103A10003F20000808F8080800000020203F202070 +:103A2000000000000808F8080800C08080807F00BF +:103A3000000008F888C028180800203F2001263818 +:103A4000200008F8080000000000203F202020206F +:103A5000300008F8F800F8F80800203F003F003F69 +:103A6000200008F830C00008F808203F20000718A0 +:103A70003F00E01008080810E0000F102020201080 +:103A80000F0008F808080808F000203F2101010194 +:103A90000000E01008080810E0000F182424385037 +:103AA0004F0008F8888888887000203F2000030CA9 +:103AB00030200070880808083800003820212122B2 +:103AC0001C00180808F8080818000000203F200013 +:103AD000000008F808000008F808001F2020202037 +:103AE0001F000878880000C83808000007380E0159 +:103AF0000000F80800F80008F800033C0700073C45 +:103B00000300081868808068180820302C03032CF4 +:103B100030200838C800C83808000000203F2000C6 +:103B2000000010080808C838080020382621202086 +:103B30001800000000FE020202000000007F40406A +:103B40004000000C30C000000000000000010638FA +:103B5000C00000020202FE000000004040407F0062 +:103B60000000000004020202040000000000000047 +:103B70000000000000000000000080808080808045 +:103B8000808000020204000000000000000000002D +:103B90000000000080808080000000192422222282 +:103BA0003F2008F8008080000000003F1120201115 +:103BB0000E000000008080800000000E11202020F8 +:103BC0001100000000808088F800000E11202010F5 +:103BD0003F200000808080800000001F22222222DF +:103BE0001300008080F0888888180020203F202063 +:103BF00000000000808080808000006B949494938B +:103C0000600008F8008080800000203F2100002034 +:103C10003F2000809898000000000020203F2020D6 +:103C20000000000000809898000000C08080807F25 +:103C3000000008F8000080808000203F24022D3022 +:103C40002000000808F8000000000020203F20208D +:103C500000008080808080808000203F20003F2006 +:103C6000003F8080008080800000203F21000020F5 +:103C70003F200000808080800000001F2020202046 +:103C80001F00808000808000000080FFA1202011A4 +:103C90000E000000008080808000000E112020A017 +:103CA000FF80808080008080800020203F212000D5 +:103CB00001000000808080808000003324242424C0 +:103CC0001900008080E0808000000000001F20209C +:103CD00000008080000000808000001F2020201055 +:103CE0003F20808080000080808000010E30080628 +:103CF000010080800080008080800F300C030C3039 +:103D00000F0000808000808080000020312E0E3166 +:103D10002000808080000080808080818E70180666 +:103D2000010000808080808080000021302C2221D2 +:103D3000300000000000807C020200000000003F14 +:103D4000404000000000FF00000000000000FF00F5 +:103D500000000002027C800000000040403F0000A4 +:103D6000000000060101020204040000000000003F +:103D700000000003050911FF118905C300E000F0F0 +:103D800000F8000000000000004428FF11AA4400D1 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000083013844F3 +:103DD000829292740183000000000000007C44C7BE +:103DE000017D7D7D7D017D7D7D7D017D7D7D7D01F3 +:103DF000FF000000000000010001000100010001BF +:103E000000010000000000000000000101000000AF +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000101000070 +:103E5000000000000101000000000000000000015F +:103E60000101010101010101010101010101010142 +:103E70000100000000000000000000404040404001 +:103E800000006D6D6D6D6D00006060606060000031 +:103E900040404040400000000000000000000000E2 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF0000000000000000000000000DBDBDBDBDB7B +:103F00000000DBDBDBDBDB0000DBDBDBDBDB000023 +:103F1000DBDBDBDBDB0000DADADADADA0000D8D868 +:103F2000D8D8D80000C0C0C0C0C00000C0C0C0C049 +:103F3000C00000C0C0C0C0C00000C0C0C0C0C00041 +:103F400000808080808000000000000000000000F1 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000060606060623 +:103F800000000606060606000006060606060000F5 +:103F900006060606060000060606E6662000060679 +:103FA00086060600000606060686000006060606C9 +:103FB000060000868686868680808686068686C07F +:103FC000C08686860606D0307606060606000006FF +:103FD0000606060600000606060606000006060699 +:103FE00006060000060606060600000000000000A7 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:10401000000000000000000000000000601C00FE26 +:1040200000010200C41820029E63B20E00FF8181CD +:10403000FF00008040300F00000000FF0023EAAACC +:10404000BFAAEA033F00FF000000000000000000DC +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000808080000000000080808040 +:104080000000000000000000000000000000000030 +:10409000000000000000000000000E0C08000001FD +:1040A0000101010100000001000000010081808089 +:1040B0008180818080808001010101000000010079 +:1040C000000001000101090C0E00000000000000CA +:1040D00000000000000000000000C0C0C0C0C0C060 +:1040E000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0 +:1040F000C000001E21404050215E001E2140405063 +:10410000215E000000000000000000000000000030 +:10411000000000000000000000000000000000009F +:1041200000000000000000000000000000FFFFC1D0 +:10413000C1FFFFC1C1FFFF00000000000000000040 +:10414000000000000000000000000000000000006F +:1041500000000000000000000000FFFF80FCF3EF03 +:10416000F3FC80FF80EEEEEEF5FBFF9CBEB6B6885A +:10417000FF000000944100080000002074000000CF +:104180008C1A000808420008740000200C3400005B +:104190009C1A00080024F400000000000000000049 +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D0000000000035240008212500088000002090 +:1041E00000C00120802000203C00002000000000D2 +:1041F0000000000000000000FE3400080435000844 +:08420000C6E533B4C91A000839 :04000005080000ED02 :00000001FF diff --git a/User/application/app.c b/User/application/app.c index 7ed4a70..529428f 100644 --- a/User/application/app.c +++ b/User/application/app.c @@ -3,7 +3,6 @@ #include "board.h" #include "flow.h" - static struct flow business_fw; // 业务流程 static struct flow idle_fw; // 空闲任务 @@ -15,7 +14,13 @@ static uint8_t business_inspection(struct flow *fl) for (;;) { - FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC); + FL_LOCK_DELAY(fl, FL_CLOCK_SEC); + // ssd1306_clear_buffer(); + // ssd1306_f8x16_string(0, 0, " PERCENT:"); + // ssd1306_f8x16_number(88, 0, 100, 0); + // ssd1306_f8x16_string(0, 2, " CUR:"); + // ssd1306_f8x16_number(48, 2, 0, 0); + // ssd1306_update_screen(); } FL_TAIL(fl); } @@ -31,9 +36,13 @@ static uint8_t business_inspection(struct flow *fl) static uint8_t idle_inspection(struct flow *fl) { FL_HEAD(fl); + static uint32_t tick = 0; for (;;) { GPIO_TOGGLE(LED_BLUE_GPIO_Port, LED_BLUE_Pin); + ssd1306_f6x8_string(0, 2, " tick:"); + ssd1306_f6x8_number(40, 2, tick++, 0); + ssd1306_update_screen(); FL_LOCK_DELAY(fl, FL_CLOCK_SEC); } FL_TAIL(fl); @@ -59,10 +68,20 @@ void app_run(void) */ void app_init(void) { + ssd1306_draw_text_center(3, "LOADING..."); + delay_ms(200); + // 显示加载进度条 + ssd1306_clear_buffer(); + for (uint8_t i = 0; i <= 100; i += 10) + { + ssd1306_draw_progress_bar(i); + } FL_INIT(&business_fw); // 业务流程 FL_INIT(&idle_fw); // 空闲任务 ENABLE_TIM(TASK_TIM); ENABLE_TIM(WORK_TIM); + + ssd1306_clear(); } diff --git a/User/board/board.c b/User/board/board.c index bbc564b..7c203f4 100644 --- a/User/board/board.c +++ b/User/board/board.c @@ -38,5 +38,5 @@ void uart_send(uint8_t *data, uint16_t len) void board_init(void) { uart_init(); - ssd096_init(); + ssd1306_init(); } diff --git a/User/board/board.h b/User/board/board.h index bf2e21c..1568bba 100644 --- a/User/board/board.h +++ b/User/board/board.h @@ -1,7 +1,7 @@ #ifndef __BOARD_H__ #define __BOARD_H__ #include "lib.h" -#include "ssd096_oled.h" +#include "ssd1306_oled.h" #define UART_RXSIZE (240u) // 接收240个字节 #define UART_TXSIZE (240u) // 发送240个字节 diff --git a/User/board/ssd096_oled.c b/User/board/ssd096_oled.c deleted file mode 100644 index c13a23e..0000000 --- a/User/board/ssd096_oled.c +++ /dev/null @@ -1,147 +0,0 @@ -#include "ssd096_oled.h" -static void i2c_start(void) -{ - GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); - GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); - GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); - GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); -} - -static void i2c_stop(void) -{ - GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); - GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); - GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); -} - -void i2c_write_byte(uint8_t data) -{ - uint8_t i; - for (i = 0; i < 8; i++) - { - if ((data & 0x80) >> i) - GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN); - else - GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN); - data <<= 1; - GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); - GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); - } - GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); // 额外的一个时钟,不处理应答信号 - GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN); -} - -/** - * @brief 向I2C设备写入命令 - * - * 通过I2C接口向指定设备写入一个命令字节。 - * - * @param command 要写入的命令字节 - */ -static void i2c_write_command(uint8_t command) -{ - i2c_start(); - i2c_write_byte(0x78); - i2c_write_byte(0x00); - i2c_write_byte(command); - i2c_stop(); -} - -/** - * @brief 向I2C设备写入一个字节的数据 - * - * 该函数通过I2C总线向指定设备写入一个字节的数据。 - * - * @param data 要写入的数据字节 - */ -static void i2c_write_data(uint8_t data) -{ - i2c_start(); - i2c_write_byte(0x78); - i2c_write_byte(0x40); - i2c_write_byte(data); - i2c_stop(); -} - -/** - * @brief 设置SSD096 OLED显示屏上的光标位置 - * - * 设置SSD096 OLED显示屏上的光标位置到指定的x和y坐标。 - * - * @param x 横向位置,取值范围为0到127 - * @param y 纵向位置,取值范围为0到63 - */ -void ssd096_set_position(uint8_t x, uint8_t y) -{ - i2c_write_command(0xb0 | y); - i2c_write_command(0x10 | ((x & 0xf0) >> 4)); - i2c_write_command(0x00 | (x & 0x0f)); -} - -/** - * @brief 清空SSD096显示屏 - * - * 该函数将SSD096显示屏的内容清空,即将所有像素点设置为关闭状态。 - * - * @note 该函数通过I2C接口向SSD096发送数据,以实现清屏操作。 - */ -void ssd096_clear(void) -{ - uint8_t i, j; - for (i = 0; i < 8; i++) - { - ssd096_set_position(i, 0); - for (j = 0; j < 128; j++) - { - i2c_write_data(0x00); - } - } -} -void ssd096_full(void) -{ - uint8_t i, j; - for (i = 0; i < 8; i++) - { - ssd096_set_position(i, 0); - for (j = 0; j < 128; j++) - { - i2c_write_data(0xff); - } - } -} - -/** - * @brief 初始化SSD096显示驱动 - * - * 该函数用于初始化SSD096显示驱动,完成基本的配置和初始化工作。 - */ -void ssd096_init(void) -{ - i2c_write_command(0xae); - i2c_write_command(0xd5); - i2c_write_command(0x80); - i2c_write_command(0xa8); - i2c_write_command(0x3f); - i2c_write_command(0xd3); - i2c_write_command(0x00); - i2c_write_command(0x40); - i2c_write_command(0xa1); - i2c_write_command(0xc8); - i2c_write_command(0xda); - i2c_write_command(0x12); - i2c_write_command(0x81); - i2c_write_command(0xcf); - i2c_write_command(0xd9); - i2c_write_command(0xf1); - i2c_write_command(0xdb); - i2c_write_command(0x30); - i2c_write_command(0xa4); - i2c_write_command(0xa6); - i2c_write_command(0x8d); - i2c_write_command(0x14); - i2c_write_command(0xaf); - - ssd096_clear(); - - ssd096_full(); -} diff --git a/User/board/ssd096_oled.h b/User/board/ssd096_oled.h deleted file mode 100644 index e66a082..0000000 --- a/User/board/ssd096_oled.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __SSD096_OLED_H -#define __SSD096_OLED_H -#include "main.h" -#define SSD096_SDA_PORT OLED_SDA_GPIO_Port -#define SSD096_SDA_PIN OLED_SDA_Pin -#define SSD096_SCK_PORT OLDE_SCK_GPIO_Port -#define SSD096_SCK_PIN OLDE_SCK_Pin - -void ssd096_init(void); -void ssd096_clear(void); -void ssd096_set_position(uint8_t x, uint8_t y); -#endif // __SSD096_OLED_H diff --git a/User/lib/driver/ssd1306_oled.c b/User/lib/driver/ssd1306_oled.c index fad35c0..a232cae 100644 --- a/User/lib/driver/ssd1306_oled.c +++ b/User/lib/driver/ssd1306_oled.c @@ -1,13 +1,12 @@ /** * @file ssd1306_oled.c * @author xushenghao - * @brief SSD1306 OLED display driver + * @brief 0.96 SSD1306 OLED display driver * @version 0.1 * @note PB13-SCK PB12-SDA */ #include "ssd1306_oled.h" - -#include "ssd1306_oled.h" +#include "string.h" /************************************6*8的点阵************************************/ const uint8_t F6x8[][6] = @@ -205,7 +204,76 @@ const uint8_t F8X16[] = 0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94 }; -static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区 +const uint8_t LOGO[] = { + 0x00, 0x03, 0x05, 0x09, 0x11, 0xFF, 0x11, 0x89, 0x05, 0xC3, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x28, 0xFF, 0x11, 0xAA, 0x44, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x38, 0x44, 0x82, 0x92, + 0x92, 0x74, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0xC7, 0x01, 0x7D, + 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, + 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB, + 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0x00, 0x00, 0xD8, 0xD8, 0xD8, 0xD8, + 0xD8, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0xE6, 0x66, 0x20, 0x00, 0x06, 0x06, 0x86, 0x06, + 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x86, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x00, 0x86, 0x86, 0x86, 0x86, 0x86, 0x80, 0x80, 0x86, 0x86, 0x06, 0x86, 0x86, 0xC0, 0xC0, 0x86, + 0x86, 0x86, 0x06, 0x06, 0xD0, 0x30, 0x76, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1C, 0x00, 0xFE, 0x00, 0x01, + 0x02, 0x00, 0xC4, 0x18, 0x20, 0x02, 0x9E, 0x63, 0xB2, 0x0E, 0x00, 0xFF, 0x81, 0x81, 0xFF, 0x00, + 0x00, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x23, 0xEA, 0xAA, 0xBF, 0xAA, + 0xEA, 0x03, 0x3F, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0C, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, 0x80, 0x80, 0x81, 0x80, + 0x81, 0x80, 0x80, 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x09, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E, 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xC1, 0xFF, + 0xFF, 0xC1, 0xC1, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0xFC, 0xF3, 0xEF, 0xF3, 0xFC, + 0x80, 0xFF, 0x80, 0xEE, 0xEE, 0xEE, 0xF5, 0xFB, 0xFF, 0x9C, 0xBE, 0xB6, 0xB6, 0x88, 0xFF, 0x00, + // end +}; + +static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区 +static uint8_t _buffer_copy[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 屏幕缓冲区副本 static void i2c_start(void) { @@ -408,11 +476,16 @@ void ssd1306_init(void) i2c_write_command(SSD1306_CMD_CHARGE_PUMP); //--set DC-DC enable i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); // i2c_write_command(SSD1306_CMD_DISPLAY_ON); //--turn on oled panel - ssd1306_fill(0); + ssd1306_clear(); // ssd1306_test(); } +void ssd1306_logo(void) +{ + ssd1306_draw_bmp(0, 0, SSD1306_WIDTH, 2, LOGO); +} + void ssd1306_display_on(void) { i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵 @@ -440,14 +513,28 @@ void ssd1306_update_screen(void) { for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++) { - i2c_write_command(0xb0 + i); - i2c_write_command(0x01); - i2c_write_command(0x10); + uint8_t update_needed = 0; for (uint8_t j = 0; j < SSD1306_WIDTH; j++) { - i2c_write_data(_buffer[j + i * SSD1306_WIDTH]); + if (_buffer[j + i * SSD1306_WIDTH] != _buffer_copy[j + i * SSD1306_WIDTH]) + { + update_needed = 1; + break; + } + } + if (update_needed) + { + i2c_write_command(0xb0 + i); + i2c_write_command(0x01); + i2c_write_command(0x10); + for (uint8_t j = 0; j < SSD1306_WIDTH; j++) + { + i2c_write_data(_buffer[j + i * SSD1306_WIDTH]); + } } } + + osel_memcpy(_buffer_copy, _buffer, ARRAY_LEN(_buffer)); } /** @@ -455,10 +542,11 @@ void ssd1306_update_screen(void) * * 该函数将 SSD1306 OLED 显示屏的每一个像素点都设置为指定的颜色。 * - * @param color 颜色值,0x00 表示关闭像素点(黑色),0xFF 表示打开像素点(白色) + * @param color 颜色值,SSD1306_BLACK 表示关闭像素点(黑色),SSD1306_WHITE 表示打开像素点(白色) */ void ssd1306_fill(uint8_t color) { + ssd1306_clear_buffer(); osel_memset(_buffer, color, ARRAY_LEN(_buffer)); ssd1306_update_screen(); } @@ -478,13 +566,14 @@ void ssd1306_fill(uint8_t color) */ void ssd1306_clear(void) { - osel_memset(_buffer, 0, ARRAY_LEN(_buffer)); + ssd1306_clear_buffer(); ssd1306_update_screen(); } void ssd1306_clear_buffer(void) { - osel_memset(_buffer, 0, ARRAY_LEN(_buffer)); + osel_memset(_buffer, SSD1306_BLACK, ARRAY_LEN(_buffer)); + osel_memset(_buffer_copy, 0xff, ARRAY_LEN(_buffer_copy)); } /** @@ -497,11 +586,11 @@ void ssd1306_clear_buffer(void) * @param x1 BMP绘制的结束X坐标 * @param y1 BMP绘制的结束Y坐标 */ -void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp) +void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t *bmp) { uint8_t j = 0; uint8_t x, y; - osel_memset(_buffer, 0, ARRAY_LEN(_buffer)); + ssd1306_clear_buffer(); if (y1 % 8 == 0) y = y1 / 8; else @@ -543,6 +632,93 @@ void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch) } } +/** + * @brief 将浮点数显示在SSD1306显示屏上 + * + * 该函数将给定的浮点数num转换为字符串,并将其显示在SSD1306显示屏的指定位置。 + * + * @param x 显示的起始x坐标 + * @param y 显示的起始y坐标 + * @param num 要显示的浮点数 + * @param dot_num 小数点后的位数,0表示不显示小数部分 + */ +void ssd1306_f6x8_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num) +{ + uint8_t ch[9] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; + uint8_t c = 0, i = 0, j = 0; + if (num < 0) + { + ch[i++] = '-'; + num = -num; + } + if (num > 32000) + return; + + c = 8 - i; + + if (num >= 10000) + { + ch[i++] = num / 10000 + 48; + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 1000) + { + ch[i++] = (int32_t)(num) % 10000 / 1000 + 48; + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 100) + { + ch[i++] = (int32_t)(num) % 1000 / 100 + 48; + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 10) + { + ch[i++] = (int32_t)(num) % 100 / 10 + 48; + ch[i++] = (int32_t)(num) % 10 + 48; + } + else if (num >= 0) + { + ch[i++] = (int32_t)(num) % 10 + 48; + } + if (dot_num > 0 && i < 7) + { + ch[i++] = '.'; + num = num - (int32_t)num; + + if (dot_num == 1 && i < 8) + { + num = num * 10; + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + if (dot_num >= 2 && i < 8) + { + num = num * 100; + ch[i++] = (int32_t)num % 100 / 10 + 48; + if (i < 8) + ch[i++] = (int32_t)(num + 0.5) % 10 + 48; + } + } + + while (ch[j] != '\0') + { + c = ch[j] - 32; + if (x > 120) + { + x = 0; + y++; + } + for (i = 0; i < 6; i++) + _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i]; + x += 6; + j++; + } +} /** * @brief 在SSD1306 OLED屏幕上显示字符串和数字 * @@ -735,3 +911,101 @@ void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num) j++; } } + +// 在 SSD1306 显示屏上绘制一个像素 +void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color) +{ + if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT) + { + // 超出屏幕范围 + return; + } + + // 设置像素颜色 + if (color == SSD1306_WHITE) + { + _buffer[x + (y / 8) * SSD1306_WIDTH] |= 1 << (y % 8); + } + else + { + _buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8)); + } +} + +// 在 SSD1306 显示屏上绘制一条线 +void ssd1306_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color) +{ + int16_t dx, dy, sx, sy, err, e2; + + dx = ABS(x2 - x1); + dy = ABS(y2 - y1); + sx = (x1 < x2) ? 1 : -1; + sy = (y1 < y2) ? 1 : -1; + err = dx - dy; + + while (1) + { + ssd1306_draw_pixel(x1, y1, color); + if (x1 == x2 && y1 == y2) + break; + e2 = err * 2; + if (e2 > -dy) + { + err -= dy; + x1 += sx; + } + if (e2 < dx) + { + err += dx; + y1 += sy; + } + } +} + +// 在 SSD1306 显示屏上绘制一个矩形 +void ssd1306_draw_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color) +{ + // 绘制矩形的四条边 + ssd1306_draw_line(x, y, x + w, y, color); // 上边 + ssd1306_draw_line(x, y + h, x + w, y + h, color); // 下边 + ssd1306_draw_line(x, y, x, y + h, color); // 左边 + ssd1306_draw_line(x + w, y, x + w, y + h, color); // 右边 +} + +// 在 SSD1306 显示屏上绘制一个填充矩形 +void ssd1306_fill_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color) +{ + for (uint8_t i = 0; i < h; i++) + { + ssd1306_draw_line(x, y + i, x + w, y + i, color); + } +} + +// 绘制进度条 +void ssd1306_draw_progress_bar(uint8_t progress) +{ + uint8_t offset_y = 10; + char progress_text[5]; // 用于存储百分比文本 + // 绘制边框 + ssd1306_draw_rect_angle(10, 24 + offset_y, 108, 10, SSD1306_WHITE); + + // 绘制进度条 + ssd1306_fill_rect_angle(12, 26 + offset_y, 4 + progress, 7, SSD1306_WHITE); + + // 显示百分比文本 + snprintf(progress_text, sizeof(progress_text), "%3d%%", progress); + ssd1306_f8x16_string(SSD1306_WIDTH * 0.35, 2, (const uint8_t *)progress_text); + + // 更新显示 + ssd1306_update_screen(); +} + +// 在中间显示文字 +void ssd1306_draw_text_center(uint8_t y, const char *text) +{ + uint8_t x = (SSD1306_WIDTH - strlen(text) * 6) / 2; + ssd1306_f6x8_string(x, y, (const uint8_t *)text); + + // 更新显示 + ssd1306_update_screen(); +} diff --git a/User/lib/driver/ssd1306_oled.h b/User/lib/driver/ssd1306_oled.h index 013ea30..32a3304 100644 --- a/User/lib/driver/ssd1306_oled.h +++ b/User/lib/driver/ssd1306_oled.h @@ -14,6 +14,9 @@ // OLED显示参数 #define SSD1306_WIDTH 128 #define SSD1306_HEIGHT 64 +// OLED颜色 +#define SSD1306_WHITE 1 +#define SSD1306_BLACK 0 // OLED命令定义 #define SSD1306_CMD_DISPLAY_OFF 0xAE @@ -53,6 +56,7 @@ // 函数声明 void ssd1306_init(void); +void ssd1306_logo(void); void ssd1306_display_on(void); void ssd1306_display_off(void); void ssd1306_update_screen(void); @@ -60,9 +64,17 @@ void ssd1306_update_screen(void); void ssd1306_fill(uint8_t color); void ssd1306_clear(void); void ssd1306_clear_buffer(void); -void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp); +void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, const uint8_t *bmp); void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch); +void ssd1306_f6x8_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num); void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num); void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch); void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num); + +void ssd1306_draw_text_center(uint8_t y, const char *text); +void ssd1306_draw_progress_bar(uint8_t progress); +void ssd1306_fill_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color); +void ssd1306_draw_rect_angle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t color); +void ssd1306_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color); +void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color); #endif // __SSD1306_OLED_H diff --git a/motor.ioc b/motor.ioc index 84d0141..533bdec 100644 --- a/motor.ioc +++ b/motor.ioc @@ -88,14 +88,14 @@ PA9.Signal=USART1_TX PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PB12.GPIO_Label=OLED_SDA PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP -PB12.GPIO_PuPd=GPIO_NOPULL +PB12.GPIO_PuPd=GPIO_PULLUP PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PB12.PinState=GPIO_PIN_RESET PB12.Signal=GPIO_Output PB13.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PB13.GPIO_Label=OLDE_SCK PB13.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP -PB13.GPIO_PuPd=GPIO_NOPULL +PB13.GPIO_PuPd=GPIO_PULLUP PB13.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PB13.PinState=GPIO_PIN_RESET PB13.Signal=GPIO_Output