diff --git a/calib_board/Core/Src/main.c b/calib_board/Core/Src/main.c
index e632689..3d8ff4e 100644
--- a/calib_board/Core/Src/main.c
+++ b/calib_board/Core/Src/main.c
@@ -92,7 +92,7 @@ int main(void)
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
- App_Init();
+ app_init();
/* USER CODE END 2 */
/* Infinite loop */
@@ -102,7 +102,7 @@ int main(void)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
- App_Task();
+ app_task();
}
/* USER CODE END 3 */
}
diff --git a/calib_board/Core/Src/stm32f4xx_it.c b/calib_board/Core/Src/stm32f4xx_it.c
index 4a0118e..6d5f635 100644
--- a/calib_board/Core/Src/stm32f4xx_it.c
+++ b/calib_board/Core/Src/stm32f4xx_it.c
@@ -23,7 +23,7 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
-#include "os_timer.h"
+#include "app_timer.h"
#include "bsp_Uart.h"
/* USER CODE END Includes */
@@ -194,12 +194,12 @@ void PendSV_Handler(void)
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
- OsTimer_Increment(1);
- COM_Uart1.Rx_TimeIncrementInt(&COM_Uart1,1);
- COM_Uart2.Rx_TimeIncrementInt(&COM_Uart2,1);
- COM_Uart4.Rx_TimeIncrementInt(&COM_Uart4,1);
+ app_timer.increment_int(1);
+ com_uart1.rx_time_increment_int(&com_uart1,1);
+ com_uart2.rx_time_increment_int(&com_uart2,1);
+ com_uart4.rx_time_increment_int(&com_uart4,1);
/* USER CODE END SysTick_IRQn 0 */
- HAL_IncTick();
+ HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
@@ -277,7 +277,7 @@ void USART1_IRQHandler(void)
// if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
// {
// __HAL_UART_CLEAR_IDLEFLAG(&huart1);
-// COM_Uart1.Rx_IdleInt(&COM_Uart1);
+// com_uart1.Rx_IdleInt(&com_uart1);
// }
// /* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
@@ -295,7 +295,7 @@ void USART2_IRQHandler(void)
// if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
// {
// __HAL_UART_CLEAR_IDLEFLAG(&huart2);
-// COM_Uart2.Rx_IdleInt(&COM_Uart2);
+// com_uart2.Rx_IdleInt(&com_uart2);
// }
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
@@ -313,7 +313,7 @@ void UART4_IRQHandler(void)
// if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE))
// {
// __HAL_UART_CLEAR_IDLEFLAG(&huart4);
-// COM_Uart4.Rx_IdleInt(&COM_Uart4);
+// com_uart4.Rx_IdleInt(&com_uart4);
// }
/* USER CODE END UART4_IRQn 0 */
HAL_UART_IRQHandler(&huart4);
diff --git a/calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx b/calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx
new file mode 100644
index 0000000..c83294b
Binary files /dev/null and b/calib_board/Doc/漏液监控主系统_屏幕通讯协议_20260122.docx differ
diff --git a/calib_board/MDK-ARM/CalibBoard.uvoptx b/calib_board/MDK-ARM/CalibBoard.uvoptx
index 2665748..c78b991 100644
--- a/calib_board/MDK-ARM/CalibBoard.uvoptx
+++ b/calib_board/MDK-ARM/CalibBoard.uvoptx
@@ -10,7 +10,7 @@
*.s*; *.src; *.a*
*.obj; *.o
*.lib
- *.txt; *.h; *.inc
+ *.txt; *.h; *.inc; *.md
*.plm
*.cpp
0
@@ -117,6 +117,25 @@
Segger\JL2CM3.dll
+
+ 0
+ ARMRTXEVENTFLAGS
+ -L70 -Z18 -C0 -M0 -T1
+
+
+ 0
+ DLGTARM
+ (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)
+
+
+ 0
+ ARMDBGFLAGS
+
+
+
+ 0
+ DLGUARM
+
0
JL2CM3
@@ -140,7 +159,7 @@
0
0
0
- 0
+ 1
0
0
0
@@ -283,7 +302,7 @@
Drivers/STM32F4xx_HAL_Driver
- 0
+ 1
0
0
0
@@ -483,7 +502,7 @@
Drivers/CMSIS
- 0
+ 1
0
0
0
@@ -526,8 +545,8 @@
0
0
0
- ..\usr\app\os_timer.c
- os_timer.c
+ ..\usr\app\gas_data.c
+ gas_data.c
0
0
@@ -538,8 +557,32 @@
0
0
0
- ..\usr\app\gas_data.c
- gas_data.c
+ ..\usr\app\app_timer.c
+ app_timer.c
+ 0
+ 0
+
+
+ 5
+ 28
+ 1
+ 0
+ 0
+ 0
+ ..\usr\app\app_leakage.c
+ app_leakage.c
+ 0
+ 0
+
+
+ 5
+ 29
+ 1
+ 0
+ 0
+ 0
+ ..\usr\app\app_com.c
+ app_com.c
0
0
@@ -553,7 +596,7 @@
0
6
- 28
+ 30
1
0
0
@@ -573,7 +616,7 @@
0
7
- 29
+ 31
1
0
0
@@ -585,7 +628,7 @@
7
- 30
+ 32
1
0
0
@@ -597,19 +640,7 @@
7
- 31
- 1
- 0
- 0
- 0
- ..\usr\bsp\bsp_Uart.c
- bsp_Uart.c
- 0
- 0
-
-
- 7
- 32
+ 33
1
0
0
@@ -621,7 +652,7 @@
7
- 33
+ 34
1
0
0
@@ -633,7 +664,7 @@
7
- 34
+ 35
1
0
0
@@ -645,25 +676,33 @@
7
- 35
+ 36
1
0
0
0
- ..\usr\bsp\tjc_usart_hmi.c
- tjc_usart_hmi.c
+ ..\usr\bsp\bsp_uart.c
+ bsp_uart.c
0
0
+
+
+
+ gui
+ 1
+ 0
+ 0
+ 0
- 7
- 36
- 5
+ 8
+ 37
+ 1
0
0
0
- ..\usr\bsp\tjc_usart_hmi.h
- tjc_usart_hmi.h
+ ..\usr\gui\gui_tjc_hmi.c
+ gui_tjc_hmi.c
0
0
@@ -676,8 +715,8 @@
0
0
- 8
- 37
+ 9
+ 38
1
0
0
@@ -688,8 +727,8 @@
0
- 8
- 38
+ 9
+ 39
1
0
0
@@ -700,8 +739,8 @@
0
- 8
- 39
+ 9
+ 40
1
0
0
@@ -712,8 +751,8 @@
0
- 8
- 40
+ 9
+ 41
1
0
0
diff --git a/calib_board/MDK-ARM/CalibBoard.uvprojx b/calib_board/MDK-ARM/CalibBoard.uvprojx
index bf2dccc..0cb53fb 100644
--- a/calib_board/MDK-ARM/CalibBoard.uvprojx
+++ b/calib_board/MDK-ARM/CalibBoard.uvprojx
@@ -10,14 +10,14 @@
CalibBoard
0x4
ARM-ADS
- 5060750::V5.06 update 6 (build 750)::ARMCC
+ 5060960::V5.06 update 7 (build 960)::.\ARMCC
0
STM32F407VGTx
STMicroelectronics
- Keil.STM32F4xx_DFP.2.15.0
- http://www.keil.com/pack/
+ Keil.STM32F4xx_DFP.3.0.0
+ https://www.keil.com/pack/
IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE
@@ -185,6 +185,7 @@
0
2
0
+ 0
1
0
8
@@ -338,7 +339,7 @@
USE_HAL_DRIVER,STM32F407xx
- ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol
+ ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../usr/algo;../usr/app;../usr/bsp;../usr/protocol;..\usr\gui
@@ -351,7 +352,7 @@
0
0
0
- 0
+ 4
@@ -527,16 +528,26 @@
1
..\usr\app\app.c
-
- os_timer.c
- 1
- ..\usr\app\os_timer.c
-
gas_data.c
1
..\usr\app\gas_data.c
+
+ app_timer.c
+ 1
+ ..\usr\app\app_timer.c
+
+
+ app_leakage.c
+ 1
+ ..\usr\app\app_leakage.c
+
+
+ app_com.c
+ 1
+ ..\usr\app\app_com.c
+
@@ -562,11 +573,6 @@
1
..\usr\bsp\bsp_Led.c
-
- bsp_Uart.c
- 1
- ..\usr\bsp\bsp_Uart.c
-
bsp_Wdg.c
1
@@ -583,14 +589,19 @@
..\usr\bsp\bsp_Flash.c
- tjc_usart_hmi.c
+ bsp_uart.c
1
- ..\usr\bsp\tjc_usart_hmi.c
+ ..\usr\bsp\bsp_uart.c
+
+
+
+ gui
+
- tjc_usart_hmi.h
- 5
- ..\usr\bsp\tjc_usart_hmi.h
+ gui_tjc_hmi.c
+ 1
+ ..\usr\gui\gui_tjc_hmi.c
@@ -639,4 +650,13 @@
+
+
+
+ CalibBoard
+ 1
+
+
+
+
diff --git a/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex b/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex
index 579e497..a2b2ddc 100644
--- a/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex
+++ b/calib_board/MDK-ARM/CalibBoard/CalibBoard.hex
@@ -1,2242 +1,949 @@
:020000040800F2
-:10000000C0A600201503000801470008C3430008EC
-:10001000FD46000839230008DD61000800000000EB
-:100020000000000000000000000000009F470008E2
-:10003000E3240008000000009D470008A1470008D5
-:100040002F0300082F0300082F0300082F030008C8
-:100050002F0300082F0300082F0300082F030008B8
-:100060002F0300082F0300082F0300082F030008A8
-:100070002F030008792300082F03000889230008B4
-:1000800099230008A92300082F0300082F03000864
-:100090002F0300082F0300082F0300082F03000878
-:1000A0002F0300082F0300082F0300082F03000868
-:1000B0002F0300082F0300082F0300082F03000858
-:1000C0002F0300082F0300082F0300082F03000848
-:1000D0002F030008BD610008CD6100082F03000850
-:1000E0002F0300082F0300082F0300082F03000828
-:1000F0002F0300082F0300082F0300082F03000818
-:100100002F0300082F0300082F0300082F03000807
-:10011000795A00082F0300082F0300082F03000856
-:100120002F0300082F030008B92300082F0300083D
-:100130002F0300082F0300082F0300082F030008D7
-:100140002F0300082F0300082F0300082F030008C7
-:100150002F0300082F030008C92300082F030008FD
-:100160002F0300082F0300082F0300082F030008A7
-:100170002F0300082F0300082F03000800000000D1
-:100180002F0300082F03000800F002F800F0B2F877
+:10000000D88B0020690200083D280008FF24000862
+:1000100039280008A5050008153000080000000078
+:10002000000000000000000000000000432800085D
+:1000300013070008000000004128000845280008B8
+:10004000830200088302000883020008830200087C
+:10005000830200088302000883020008830200086C
+:10006000830200088302000883020008830200085C
+:1000700083020008A905000883020008B9050008EA
+:10008000C9050008D905000883020008830200089A
+:10009000830200088302000883020008830200082C
+:1000A000830200088302000883020008830200081C
+:1000B000830200088302000883020008830200080C
+:1000C00083020008830200088302000883020008FC
+:1000D00083020008F52F000805300008830200089D
+:1000E00083020008830200088302000883020008DC
+:1000F00083020008830200088302000883020008CC
+:1001000083020008830200088302000883020008BB
+:1001100045290008830200088302000883020008C2
+:100120008302000883020008E90500088302000832
+:10013000830200088302000883020008830200088B
+:10014000830200088302000883020008830200087B
+:100150008302000883020008F905000883020008F2
+:10016000830200088302000883020008830200085B
+:1001700083020008830200088302000800000000D8
+:10018000830200088302000800F002F800F05CF827
:100190000AA090E8000C82448344AAF10107DA45E2
-:1001A00001D100F0A7F8AFF2090EBAE80F0013F082
-:1001B000010F18BFFB1A43F0010318478C8700009A
-:1001C000AC8700000A444FF0000C10F8013B13F01C
+:1001A00001D100F051F8AFF2090EBAE80F0013F0D8
+:1001B000010F18BFFB1A43F001031847B8370000BE
+:1001C000D83700000A444FF0000C10F8013B13F040
:1001D000070408BF10F8014B1D1108BF10F8015BA0
:1001E000641E05D010F8016B641E01F8016BF9D193
:1001F00013F0080F1EBF10F8014BAD1C0C1B09D1EA
:100200006D1E58BF01F801CBFAD505E014F8016B5B
:1002100001F8016B6D1EF9D59142D6D370470000ED
:100220000023002400250026103A28BF78C1FBD8FF
-:10023000520728BF30C148BF0B6070476E2900F0DD
-:10024000E784702900F03186662908F0B0826529BC
-:1002500008F0AD82672908F0AA82612908F0A98216
-:1002600003681B0A28BF41F08001692900F0428120
-:10027000642900F03F81752900F03C816F2900F06E
-:10028000BE85782900F0FD85E92900F05985E4292B
-:1002900000F05685F52900F05385EF2900F0BB8565
-:1002A000F82900F0FC850368DB0928BF41F08001D4
-:1002B000632901F02582732901F02A82E32901F0E4
-:1002C0003582F32901F03A82002070471FB508F00B
-:1002D00069FA01F0CBFA04000020002108F036FA98
-:1002E000401C60600020002108F046FAE0601FBD5D
-:1002F00010B510BD01F095FA1146FFF7E7FF06F0C3
-:1003000079FA01F077FB03B4FFF7F2FF03BC01F0C9
-:100310007BFB00000948804709480047FEE7FEE7ED
-:10032000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7A5
-:1003300004480549054A064B7047000089480008F3
-:1003400089010008C0960020C0A60020C09E0020A1
-:10035000C09E002053EA020C00F069802DE9F04BAA
-:100360004FF00006002B1FBFB3FA83F503FA05F424
-:1003700024FA05F65E4012BF1643B2FA82F502FA7D
-:1003800005F4C5F120051EBF22FA05FC44EA0C0461
-:10039000203556EA044C4FEA144418BF641C4FF051
-:1003A00000084FF00009904271EB030C39D300298B
-:1003B00019BFB1FA81F701FA07F6B0FA80F700FA2F
-:1003C00007F6C7F120071EBF20FA07FC46EA0C0615
-:1003D0002037B6FBF4FCA7EB0507103F07F01F0B17
-:1003E000CBF120060CFA0BFB2CFA06F644BFB34601
-:1003F0000026202FA4BF5E464FF0000B5BEA060CE0
-:1004000008BF4FF0010B19EB0B09ABFB027C48EB6B
-:100410000608C01B06FB02CC0BFB03CC71EB0C01E6
-:10042000C1E70B46024641464846BDE8F08B13B58E
-:100430004FF000004FF00001AFF30080BDE81C401A
-:10044000704700007CB51D4616460C00009001D098
-:100450002044401E074B7B442A46694601903046A3
-:1004600000F0EFFB05461CB10020694600F0FCFBE4
-:1004700028467CBD190800000FB41CB5084B06AA1D
-:100480007B4469460090059800F0DBFB04460020A1
-:10049000694600F0E9FB20461CBC5DF814FB000037
-:1004A000E507000070B5044685690068C10601D5FE
-:1004B000302600E02026C00707D070BDD4E9012116
-:1004C00030469047206A401C20626D1EF6D570BDF4
-:1004D00070B5044685690078C00707D170BDD4E9BE
-:1004E000012120209047206A401C20626D1EF6D515
-:1004F00070BD00002DE9F041064600241068752902
-:10050000314616A510D000F0EFFA002802DA40427A
-:1005100013A507E031688A0701D512A502E0490753
-:1005200004D511A5012401E000F0E7FA00210A2218
-:1005300006F1240709E0B0FBF2FCB0FBF2F302FB8A
-:100540001C00303078541846491C0028F3D123464B
-:100550002A463046BDE8F04100F001BB0000000033
-:100560002D0000002B000000200000002DE9F05FAE
-:10057000894604464FF0000ADFF874B1FB44C0F826
-:1005800020A02046E1688847002874D0252806D09E
-:10059000D4E901219047206A401C2062F1E700263F
-:1005A0005F462046E16888472028054607DB312D55
-:1005B00005D2781910F8200C08B10643F1E7B0070E
-:1005C00001D526F00406C4F81CA00027C4F818A022
-:1005D0002A2D09D0284605F037FE38B304EB8708EA
-:1005E000303DC8F8185019E059F8041B204604EBB8
-:1005F00087029161E1688847012F054618D1E069BB
-:10060000002820DA26F020061DE0D8F8180000EBBC
-:10061000800005EB40003038C8F818002046E1683B
-:100620008847054605F010FE0028EED1012F0AD0BC
-:100630002E2D08D12046E16888477F1C0546022FF1
-:1006400046F02006C4DBA069002803DA404246F0E9
-:100650000106A061F00701D026F010066C2D0BD02A
-:10066000682D09D04C2D39D06A2D35D0742D35D058
-:100670007A2D33D016E038E0E1682F4620468847CF
-:10068000B842054609D16C2F26D04FF48060E1684E
-:10069000064320468847054604E06C2F1AD04FF4E5
-:1006A000807006430DB3A5F14100192802D820350A
-:1006B00046F400664A462946204626604E46FFF725
-:1006C000BDFD80B101280BD0F61D26F0070000F11A
-:1006D000080956E74020E4E78020D8E70020D6E765
-:1006E00006F104094DE7284652E7206ABDE8F09F6D
-:1006F000C882000070B5064600F0F2F904680546AD
-:1007000030460A22002100F0DBFB2C6070BD40EA7D
-:10071000010310B59B070FD1042A0DD310C808C9D7
-:10072000121F9C42F8D020BA19BA884201D9012080
-:1007300010BD4FF0FF3010BD1AB1D30703D0521CCB
-:1007400007E0002010BD10F8013B11F8014B1B1B06
-:1007500007D110F8013B11F8014B1B1B01D1921E70
-:10076000F1D1184610BD40EA0103024630B59B079F
-:1007700010D14FF0013400E008C208C91D1B9D4391
-:1007800015EAC41FF8D013F0FF0102F8011B0DD0C9
-:100790001B0AF8E711F8013B002B02F8013B05D0DA
-:1007A00011F8013B002B02F8013BF3D130BD10B52D
-:1007B000431C02E010F8011B71B18107FAD14FF020
-:1007C000013202C88C1A8C4314EAC211F9D0C01A43
-:1007D0000A0603D0C01E10BDC01A10BD0A0401D005
-:1007E000801E10BD0902FCD0401E10BD40EA01036E
-:1007F00070B59B072ED14FF00136042A2AD308C8C2
-:1008000010C99D1B9D43121F15EAC61517D0D8B2FB
-:10081000E1B2401A50EA056110D198B2A1B2401A73
-:1008200050EA05410AD123F07F4024F07F41401A6D
-:1008300050EA052102D1180EA0EB146070BDA3424E
-:10084000DBD018BA21BA884201D9012070BD4FF01F
-:10085000FF3070BD0AB9002070BD10F8013B11F8DF
-:10086000014B63B1A3420AD1521E08D010F8013BDC
-:1008700011F8014B1BB1A34201D1521EEDD1181B3F
-:1008800070BD032A40F2308010F0030C00F0158098
-:1008900011F8013BBCF1020F624498BF11F801CB83
-:1008A00000F8013B38BF11F8013BA2F1040298BFE8
-:1008B00000F801CB38BF00F8013B11F0030300F052
-:1008C0002580083AC0F0088051F8043B083A51F8F6
-:1008D00004CBA0E80810F5E7121D5CBF51F8043BFB
-:1008E00040F8043BAFF30080D20724BF11F8013B6E
-:1008F00011F801CB48BF11F8012B24BF00F8013BD0
-:1009000000F801CB48BF00F8012B704710B5203A22
-:10091000C0F00B80B1E81850203AA0E81850B1E8B8
-:100920001850A0E81850BFF4F5AF5FEA027C24BF6E
-:10093000B1E81850A0E8185044BF18C918C0BDE865
-:1009400010405FEA827C24BF51F8043B40F8043B2E
-:1009500008BF7047D20728BF31F8023B48BF11F8E3
-:10096000012B28BF20F8023B48BF00F8012B70473D
-:100970004FF000020429C0F0128010F0030C00F0C8
-:100980001B80CCF1040CBCF1020F18BF00F8012B46
-:10099000A8BF20F8022BA1EB0C0100F00DB85FEA14
-:1009A000C17C24BF00F8012B00F8012B48BF00F8E0
-:1009B000012B70474FF0000200B51346944696464F
-:1009C000203922BFA0E80C50A0E80C50B1F1200162
-:1009D000BFF4F7AF090728BFA0E80C5048BF0CC010
-:1009E0005DF804EB890028BF40F8042B08BF70476E
-:1009F00048BF20F8022B11F0804F18BF00F8012BE0
-:100A0000704710B5044610F0030F08BF11F0030F34
-:100A100040F015804FF0013E121FC0F20E8051F8D9
-:100A2000043BA3EB0E0C2CEA030C1CEACE1C08BF03
-:100A300040F8043BF0D0A1F1040102F10402521E7F
-:100A400008DB11F8013B002B00F8013BF7D1114600
-:100A5000FFF78EFF204610BD4FF0013C50F8042BED
-:100A600051F8043B9A4221D1A2EB0C03934313EAC1
-:100A7000CC1317D150F8042B51F8043B9A4215D1EE
-:100A8000A2EB0C03934313EACC130BD150F8042BC5
-:100A900051F8043B9A4209D1A2EB0C03934313EAA9
-:100AA000CC13DBD04FF00000704700BFD01A01BA62
-:100AB000B1FA81F101F0180122FA01F0CB40C1F145
-:100AC0002001DBB2C0B2C01A2CFA01F3D11A914353
-:100AD00011EAC311E6D170477047704770470000B4
-:100AE000004870475C96002009684A0501D540B26D
-:100AF0007047C905FCD500B2704709684A0501D5A1
-:100B0000C0B27047C905FCD580B2704770B50C46BD
-:100B10000546012A05D02878800600D5EA69002319
-:100B200002E0012305E05B1C934202D2E05C002856
-:100B3000F9D1A869E618C01AA861286A1844286281
-:100B40002846FFF7AFFC04E0D5E9012114F8010BBA
-:100B50009047B442F8D32846FFF7BAFC70BD2DE9A0
-:100B6000F0470D4699469246044600F12408016874
-:100B7000880604D5E06921F01001216000E0012021
-:100B8000A84201DD471B00E00027A1697A1902EBAA
-:100B90000900081AA0612078C00602D42046FFF799
-:100BA00081FC002608E0D4E901211AF806009047EC
-:100BB000206A401C761C20624E45F4DB2078C0067B
-:100BC0000AD52046FFF76EFC06E0D4E9012130206B
-:100BD0009047206A401C2062381EA7F10107F4DC10
-:100BE00007E0D4E9012118F805009047206A401C6D
-:100BF0002062281EA5F10105F3DC2046FFF768FC02
-:100C00002078000602D50220BDE8F0870120FBE72E
-:100C100011680268006A530501D508700AE0D3051F
-:100C200001D5088006E0130603D5C217C1E900020A
-:100C300000E008600120704701694A1C02610878E1
-:100C4000704700B58FB0CDE901310021059105490C
-:100C50007944CDE9031011466846FFF787FC0FB0D1
-:100C600000BD0000E5FFFFFF0A6802F8010B0A6003
-:100C70007047D1E900239A4202D2531C0B601070D6
-:100C8000704700002DE9FF5F15468A460446DFF8ED
-:100C9000AC80F8440027D8E900103E46CDE90010AA
-:100CA00010E03AF816106A4602A800F09AFD411CBE
-:100CB00007D02178890603D5E269391891420DD809
-:100CC0000744761C2078800602D5E069B84205DD2D
-:100CD000AE42E6DB3AF816000028E2D1A069C01B5C
-:100CE000A0612046FFF7DEFBD8E90010CDE9001037
-:100CF000002017E03AF818106A4602A800F071FDCB
-:100D0000B0F1FF3F81460BD000250DF1080B05E047
-:100D1000D4E901211BF8050090476D1C4D45F7D320
-:100D200008F10100B0428046E4DB206A38442062CA
-:100D30002046FFF7CDFBBDE8FF9F0000C67B00000B
-:100D40002DE9F0418046D21D22F007020025D2E9AC
-:100D50000002F52915A614D0011E72F1000106DA71
-:100D60000023D0EB030063EB020211A608E0D8F8E1
-:100D700000108B0701D50FA602E0490701D50EA68A
-:100D800001251146002408F1240704E000F0DCF8F6
-:100D900030323A55641C50EA0102F7D12B463246F4
-:100DA00021464046BDE8F041FFF7D9BE00000000F3
-:100DB0002D0000002B0000002000000030B40021B6
-:100DC00000F1240408E002F00705D208303542EAB9
-:100DD0004372DB086554491C52EA0305F3D10468E9
-:100DE000002310A2250707D5A40600D421B1C469A9
-:100DF00001230DA2641EC46130BCFFF7B0BE10B564
-:100E0000044621461068FFF778FE02462046BDE8FA
-:100E100010400023D2E7D21D22F00701D1E90023C0
-:100E2000CCE700000000000030000000F0B40D46E8
-:100E30000188090502D5214C7C4402E01F4C7C440A
-:100E40000E34002100F1240608E002F00F07120919
-:100E5000E75D42EA03721B097754491C52EA030713
-:100E6000F3D102780023120704D5702D06D009B102
-:100E7000022311342246F0BCFFF771BE0123103467
-:100E8000F8E770B504460D4621461068FFF735FEB9
-:100E9000024629462046BDE870400023C6E7D21D21
-:100EA00022F00703D3E90023C0E70368126843F088
-:100EB000200303600823C3610023B7E7287A0000FA
-:100EC0002DE9F04791460F4680460446002614F867
-:100ED000015B2DB100F030F80068405DC007F6D12D
-:100EE0002B2D02D02D2D18D0641E4A46394620469F
-:100EF00000F028FC27B13968A14201D1C7F8008071
-:100F00004FF0020471050BD54042002803DDFFF7C6
-:100F1000E7FD0460A007BDE8F08746F48066E4E7DB
-:100F20000028F8DAFFF7DCFD04606FF00040F2E71C
-:100F3000004870475C96002010B500F097FC001D3B
-:100F400010BD00BF0978000030B5B0F10A024FEAC9
-:100F5000900E71F100034EEA817EB0EB0E0061EB62
-:100F600091014FEA101E4EEA017E10EB0E0041EB9C
-:100F700011114FEA102E4EEA016E10EB0E0041EBFC
-:100F800011214FEA104E4EEA014E10EB0E0041EBDC
-:100F90001141401841F100014FEAD00040EA417090
-:100FA0004FEAD10110EB80054FEA810444EA9074C6
-:100FB00044EB01046D1944EB0404521BA3414FF0B0
-:100FC000000348BF0A3200D530BD401C41F100018A
-:100FD00030BD70472DE9FF4F0C461E464FF0FF37DE
-:100FE0008BB0D2E90001DDF860800A908A46C1F337
-:100FF0000A5505B93D46002108464FF00000BAF1F8
-:10100000000F00F4400005DA00EB80004FF44001CF
-:1010100001EA50004FEA9059B9F1010F00DDB946DD
-:101020000A9850EA4A000ED044F61050A5F2FF3557
-:1010300045432F14B8F1000F1ED07542291E1EDD46
-:10104000C9F100021CE0B8F1010F4FF0000001D01F
-:10105000302103E0F24305E02154401CB042FBDBA9
-:1010600030460022002121540B99C1F80880C1E9C3
-:1010700000200FB0BDE8F08FBD1B6D1CDEE74A46B7
-:1010800000DA694206A800F043FC06AB93E80700CB
-:1010900003AB83E8070050460A9900F0BCFC8DE8DA
-:1010A0000700A0F500501F3800900398002D0ADDBE
-:1010B00042F21F014A460844002303A903906846F0
-:1010C00000F025FF09E0A0F500504A461F38002334
-:1010D00003A90390684600F02FFF8DE80700000485
-:1010E000000C03D04FF0FF30410800E01046B8F18B
-:1010F000000F03D00022009215461EE0751E05D495
-:10110000FFF722FF303262556D1EF9D5B34601223A
-:10111000084302D000227F1C04E02078302801D14F
-:1011200000227F1E002A099784D01DE0112D07DAC6
-:10113000FFF70AFF303262556D1C50EA0102F5D10B
-:10114000084302D00098C8B10EE00021681E05E0F7
-:10115000235C625C63542254401E491C8142F7DBCD
-:10116000AB46A81B401E0990002004F80B000B980A
-:10117000099AC0F80880C0E9002B7AE711264FF0E1
-:10118000000857E72DE9F04F88460446D21D22F0AB
-:10119000070191B0D1E90001CDE90A0105F020F87D
-:1011A00002460B98C00F01D02D2007E02068810770
-:1011B00001D52B2002E0202101EAC000032A09907A
-:1011C00001D0072A05DB03464146204600F052FBCA
-:1011D0000BE12078800601D5E06900E00620B8F137
-:1011E000650F814606D0B8F1660F18D0B8F1670FC9
-:1011F00070D131E00020B9F1110F009001DB112313
-:1012000001E009F101030AAA01A90CA8FFF7E2FE17
-:10121000DDE90C70002609F10105834647E0012055
-:101220004B4600904FF000470AAA01A90CA8FFF70F
-:10123000D1FEDDE90DB00C995D46002610B909F12B
-:1012400001000D18B9EB050003D4C0F1FF3609F118
-:101250000105A5EB09002BE0B9F1010F01DA4FF010
-:1012600001090020B9F1110F0090484601DD11235A
-:1012700000E003460AAA01A90CA8FFF7ABFEDDE9CE
-:101280000C704D4600268346207800070AD4AB45F3
-:1012900000DA5D4601A8012D04DD411911F8011C99
-:1012A000302907D04F4502DA17F1040F04DA012084
-:1012B00082460FE06D1EEEE7002F02DCED1B3E4480
-:1012C00003E0781CA84200DD7D1CB81B00F1010A78
-:1012D0004FF000472078000703D4AA4501DB4FF008
-:1012E000FF3A0021B7F1004F0DF143088DF843108C
-:1012F00024D002202B23002F01DA7F422D230A2144
-:10130000021EA0F1010000DC5FB197FBF1FC97FB2E
-:10131000F1F201FB1C7C17460CF1300C08F801CDF2
-:10132000EEE7A8F1010003702188090501D54521E8
-:1013300000E06521A0F1010800F8011C09980FA93F
-:10134000A1EB0807FF1D00B10120411901EBEA7074
-:10135000A1693844081A401EA0612078C00602D452
-:101360002046FFF79FF8099828B1D4E9012190475A
-:10137000206A401C20622078C00622D52046FFF754
-:1013800091F81EE0002E04DBB34502DD01A8805D6C
-:1013900000E03020D4E901219047206A401C2062FF
-:1013A000761CAAF101005FEA000A0AD100F05EFA99
-:1013B000C0680168405CD4E901219047206A401C64
-:1013C0002062281EA5F10105DCDC07E0D4E901213B
-:1013D00018F8010B9047206A401C2062381EA7F1C4
-:1013E0000107F3DC2046FFF773F8032011B041E654
-:1013F0002DE9F04F04460D46D21D22F0070089B0BA
-:10140000D0E900974846394604F0EAFE0246F80F54
-:1014100001D02D2307E02068810701D52B2302E0AE
-:10142000202101EAC0038DF820300BB1012000E03B
-:101430000020032A824601D0072A04DB29462046E1
-:1014400000F018FA3FE12078800601D40D2500E075
-:10145000E569C7F30A560D2D49DA00214FEA175BFB
-:1014600008464FF00000002F00F4400007DA00EBC0
-:1014700080004FF4400100EBD07001EA600081155C
-:10148000012901DD4FF0FF3100224FEA850CBCF14C
-:10149000180F06D31346ACF118004FF08052C2402B
-:1014A00003E04FF4801323FA0CF30CF10C0CBCF1A5
-:1014B000200F04D3ACF1200C09FA0CF001E007FA7C
-:1014C0000CF000294FF0004801DD18B90FE00ED1F3
-:1014D00040450CD319EB02095F4121B9404502D1C7
-:1014E0009F4329EA0209BBEB175F00D0761C2088D6
-:1014F000000502D57B48784402E07A4878441938E0
-:1015000008AA302302F80A30037C0AF10101002EF8
-:101510000AF1020A53546A4602DC4FF0300101E03E
-:101520004FF031014FF001088DF8001002D0A6F203
-:10153000FF3603E059EA470100D06B4E002D02DC74
-:101540002178090704D54FF002082E218DF80110EB
-:10155000C44600210BE0C7F303433F01C35C491CB1
-:101560006D1E02F80830052908F1010801DA002D86
-:10157000F1DC00210CE000EB1973491C1B786D1E97
-:10158000082902F808304FEA091908F1010801DAC0
-:10159000002DF0DC21688B0602D516E0A8F10108C9
-:1015A000E04505DD02EB080313F8013C302BF5D0D4
-:1015B000B8F1000F09DD02EB080313F8013C2E2BF4
-:1015C00003D1090701D4A8F10108002D05DD3E2152
-:1015D00002F808106D1E08F10108407C002E02F888
-:1015E000080008F1010804DA2D20764202F808000C
-:1015F00002E02B2002F808000A214FF47A7086429C
-:1016000008F101080BDB96FBF0F3303302F80830E9
-:1016100096FBF0F308F1010800FB136601E0642E6D
-:101620000CDB642096FBF0F3303302F8083096FBB5
-:10163000F0F308F1010800FB136601E00A2E06DB57
-:1016400096FBF1F0303002F8080008F1010896FB33
-:10165000F1F001FB1060303002F80800A16908F1D8
-:10166000010808EB050202EB0A00081AA0612078C5
-:10167000C00602D42046FEF715FF216A08AE01EB32
-:101680000A00206204E0D4E9012116F8010B90471A
-:10169000BAF1010AF7D22078C00602D52046FEF73B
-:1016A00001FF6E4609E016F8010B3E280FD0D4E981
-:1016B00001219047206A401C2062B8F10108F2D253
-:1016C0002046FEF705FF09B00320BDE8F08F206A31
-:1016D0002844206203E0D4E90121302090476D1EA8
-:1016E000EBD3F8E7A573000002FCFFFF10B54369D8
-:1016F00013B1AFF3008001E0FFF708FA012010BD3D
-:10170000127800F124010A7000224A700122EDE7EC
-:1017100011684FF0FF32E9E710B5436913B1AFF339
-:10172000008001E0FFF7AEFA012010BD128800F141
-:10173000240182840022C2840122EDE711684FF067
-:10174000FF32E9E72DE9F05F824615468B46002718
-:101750000AF10104B9460078302801D09DB113E0A8
-:1017600014F8010B0127782803D0582801D045B17F
-:101770000AE00DB1102D07D1002714F8010B102538
-:1017800002E0082500E00A250026B0460EE005FB31
-:10179000080005FB06F101271FFA80F801EB10464F
-:1017A000B6F5803F00D3B94614F8010B294600F086
-:1017B000A1F80028EBDABBF1000F05D00FB1641ED1
-:1017C00000E05446CBF80040B9F1000F06D0FFF717
-:1017D00087F902210160C81EBDE8F09F48EA064073
-:1017E000FAE770B516460C460546FFF7A5FB0368F9
-:1017F00093F80101012806D0FF2C0FD8185D68B1BD
-:1018000001202C7070BDD3F807013246214603F247
-:10181000071303442846BDE8704018474FF0FF30D7
-:1018200070BD7546FFF784FBAE460500694653461A
-:1018300020F00700854618B020B5FEF779FDBDE819
-:1018400020404FF000064FF000074FF000084FF027
-:10185000000B21F00701AC46ACE8C009ACE8C009B8
-:10186000ACE8C009ACE8C0098D4670470048704735
-:101870007C9600202DE9F0411F46044603260168AE
-:10188000072A01F4006004DB08B116A505E016A5DF
-:1018900003E008B115A500E015A521F010002060B7
-:1018A000A069C01EA0610FB1401EA0612046FEF7D6
-:1018B000F9FD4FB1D4E9012138469047206A401C18
-:1018C0002062C01C206206E0206AFAE7D4E9012108
-:1018D00015F8010B9047761EF8D22046FEF7F8FD6A
-:1018E000BDE8F0814E414E006E616E00494E4600EB
-:1018F000696E66003A2800D2303820F02002412A72
-:1019000001D3A2F13700884201D34FF0FF30704776
-:101910002DE9F047814616468AB0354878440DC80F
-:101920008DE80D0032487844801C03AC0DC884E873
-:101930000D0041F69B300844372190FBF1F290FBFB
-:10194000F1F5A5F1800501FB12041B3C02D56442B0
-:10195000012000E00020DFF898A080460027FA442C
-:10196000AAF1BE0A0EE0E0070AD03246684607EB4D
-:10197000470101230AEB810100F0DEFA8DE8070040
-:1019800064107F1C002CEED1194F7F44AE3F19E04C
-:10199000E80715D007EB04100DF1180A90E80E00C7
-:1019A0008AE80E00C068F04201D1981908903246CA
-:1019B000012306A903A800F0BFFA03AB83E80700E0
-:1019C0006D10641C002DE3D14FF0010332466946CF
-:1019D000B8F1000F03A802D000F099FA01E000F07E
-:1019E000ABFAC9E90001C9F808200AB0BDE8F087E0
-:1019F0001070000010B50446AFF300802046BDE82B
-:101A00001040FEF780BC000001491820ABBEFEE785
-:101A10002600020070475FEA400C08BF91F0000FFB
-:101A20004FEA8C234FEAC12243EA51514FEA1C503E
-:101A300018BF00F5F0404FEA300018BF41F00041F8
-:101A40005FEA6C5C00F02980BCF1FF3F08BF40F00A
-:101A500080407047130C06BF12044FF0100C4FF07B
-:101A6000000C130E04BF12020CF1080C130F04BF7C
-:101A700012010CF1040C930F04BF92000CF1020C44
-:101A8000D30F04BF52000CF1010C11464FF00002BD
-:101A9000A0F11F00A0EB0C00704711F0004F08BF31
-:101AA000704731F000413FF4D5AF0B0C06BF09047D
-:101AB0004FF0100C4FF0000C0B0E04BF09020CF19C
-:101AC000080C0B0F04BF09010CF1040C8B0F04BFB1
-:101AD00089000CF1020CCB0F04BF49000CF1010C82
-:101AE000CCF12003A0EB0C0022FA03F302FA0CF273
-:101AF00041EA030100F10100704720F07F4C80EAC9
-:101B0000030023F07F47ACEB070303F57C5300F0A1
-:101B1000004003F1FF032DE980494FEA154B09B45A
-:101B20004FEA144325EA0B4E24EA03480FF2042639
-:101B300006EB132749083E785FEA320203FB06678B
-:101B4000C7F5000707FB06F64FEA54374FEAD646BB
-:101B500006F1020607FB066CCCF1005C4FEA1C475D
-:101B60002CEA074C07FB06F40CFB06F504EB1546C4
-:101B70004FEA961634BF00204FF000404FEAD137AD
-:101B800006FB07FC4FEA1C4C0CFB0BF7D21B03FBBC
-:101B90000CF761EB07010CFB0EF7B0EB074072EBA3
-:101BA00017420CFB08F734BFA2EB0742B2EB074227
-:101BB00061EB17414FEA0C444FEA910706FB07FC23
-:101BC0004FEA1C4C0CFB0BF7B0EBC74072EB5732E3
-:101BD00003FB0CF734BFA2EBC742B2EBC74261EB89
-:101BE00057310CFB0EF7B0EBC70072EB57720CFBD2
-:101BF00008F734BFA2EBC702B2EBC70261EB577123
-:101C0000039F4FEA816141EA921104EBCC044FEA51
-:101C1000D1374FEA826206FB07FC42EA90124FEA94
-:101C200080604FEA1C4C0CFB0BF7D21B03FB0CF73C
-:101C300061EB07010CFB0EF7B0EB074072EB1742AC
-:101C40000CFB08F734BFA2EB0742B2EB074261EB93
-:101C500017414FEA8C554FEA910704EB9C2406FB91
-:101C600007FC4FEA1C4C0CFB0BF7B0EBC74072EBC8
-:101C7000573203FB0CF734BFA2EBC742B2EBC742AB
-:101C800061EB57310CFB0EF7B0EBC70072EB5772EC
-:101C90000CFB08F734BFA2EBC702B2EBC70261EB43
-:101CA000577115EB4C254FEA816141EA92114FEAD9
-:101CB00082624FEAD13742EA901206FB07FC44F1F8
-:101CC00000044FEA80604FEA1C4C0CFB0BF7D21B60
-:101CD00003FB0CF761EB07010CFB0EF7B0EB0740C1
-:101CE00072EB17420CFB08F734BFA2EB0742B2EBD2
-:101CF000074261EB174115EB1C154FEA813141EAB0
-:101D000092414FEA823242EA90424FEA80304FEAF3
-:101D10000C7644F1000448EA03434EEA0B484FF0C6
-:101D2000000EB2EB080C71EB030724BF6246394684
-:101D30004EEB0E0E4FF0000B0018524149414BEB99
-:101D40000B0BB2EB080C71EB03077BF1000B24BF0C
-:101D5000624639464EEB0E0E4FF0000B0018524112
-:101D600049414BEB0B0BB2EB080C71EB03077BF11A
-:101D7000000B24BF624639464EEB0E0E51EA0207B5
-:101D800018BF46F0010616EB0E7655F1000254F12D
-:101D9000000103D5BDE88901BDE80088BDE88901DF
-:101DA000BDE80048B619524141EB0101A3F101031E
-:101DB000704780807F7E7D7C7B7A797877767675B8
-:101DC0007473727171706F6E6E6D6C6C6B6A6A6930
-:101DD0006868676666656464636362616160605FCA
-:101DE0005F5E5E5D5D5C5C5B5B5A5A595958585743
-:101DF00057565655555554545353525252515150AB
-:101E000050504F4F4F4E4E4D4D4D4C4C4C4B4B4BFD
-:101E10004A4A4A4949494848484747474746464643
-:101E2000454545444444444343434342424242417E
-:101E30004141002B9C4630D477002BD01CB54FEA93
-:101E4000370703B44FF010004FF01001BAF1000F44
-:101E500006D0BCF1000FDCBF40F0080040F00801E4
-:101E60004FF000000FBCBDE810400BF1010BBBF1BF
-:101E7000010F08BF5FEA170722BF12F1010211F13B
-:101E800001014FF0004143F1000300F0004043EA3C
-:101E900000007047F9D35708D0E746EA064613F129
-:101EA000400F4FEA16461FDD13F1200FDFBF164328
-:101EB0000A46002120335B42BED0C3F1200746EA28
-:101EC000064602FA07F74FEA164646EA0706C3F146
-:101ED000200722FA03F201FA07F721FA03F14FF083
-:101EE000000342EA0702A7E746EA020646EA064678
-:101EF0004FEA164646EA0106BCBF46EA0646360CDD
-:101F00004FF000034FF000024FF0000194E72DE97D
-:101F1000804C9A46934670B491E8380007C831EA7D
-:101F2000400C48BF34EA430C03D5FFF7E6FDFFF74A
-:101F300080FFF0BCBDE8008C2DE9804C9A469346AA
-:101F400070B491E8380007C810F0804F08BF13F054
-:101F5000804F03D100F005F8FFF76BFFF0BCBDE840
-:101F6000008C20F07F4780EA030023F07F4C07EBD2
-:101F70000C03A3F57C5300F00040A3F1FE0392F0A4
-:101F8000000F00F0B38095F0000F00F077802DE98E
-:101F900001494FEA11404FEA144621EA004800FB8C
-:101FA00006FC24EA064708FB06F607FB08F800FBD8
-:101FB00007F718EB06484CEB164C4FEA124B18EBA0
-:101FC00007484FEA15464CEB174022EA0B4E0BFB35
-:101FD00006FC25EA06470EFB06F607FB0EFE0BFB8A
-:101FE00007F71EEB064E4CEB164C4FF000061EEBAF
-:101FF000074E4CEB174B18EB0B0840F1000018EBA9
-:102000000E0B58EB000840F100008F1A4FF0000152
-:102010003CBFC943661B14BFB5EB040C00213CBF99
-:10202000C943F61B4FEA17444EEA8E0E27EA0445D1
-:102030004FEA1C4704FB07622CEA074C05FB07F735
-:102040000CFB05F604FB0CFC16EB074642EB1742B3
-:1020500016EB0C4642EB1C421BEB060658EB020249
-:10206000414146EA9E0601D5BDE80189B6195241B3
-:1020700041EB0101A3F10103BDE801894FEA1445D9
-:102080004FEA114724EA054621EA074C05FB07F40D
-:1020900006FB07F70CFB06F105FB0CFC11EB0741F7
-:1020A00044EB17444FEA124711EB0C4144EB1C443C
-:1020B00022EA074C05FB07F206FB07F70CFB06F6C6
-:1020C00005FB0CFC16EB074642EB174216EB0C46E1
-:1020D00042EB1C456A1854F1000148BF7047B6191D
-:1020E000524141EB0101A3F10103704795F0000F4C
-:1020F00037D04FEA11424FEA144721EA024624EA58
-:10210000074C02FB07F106FB07F70CFB06F402FB8A
-:102110000CFC14EB074441EB17414FEA154714EB55
-:102120000C4441EB1C4125EA074C02FB07F506FB7A
-:1021300007F70CFB06F602FB0CFC16EB074645EB1B
-:10214000174516EB0C4645EB1C42121951F10001E4
-:1021500048BF7047B619524141EB0101A3F1010399
-:1021600070474FEA14454FEA114724EA054621EA31
-:10217000074C05FB07F106FB07F70CFB06F24FF0D7
-:10218000000605FB0CFC12EB074241EB174112EB7A
-:102190000C4251EB1C4148BF7047921841EB0101C2
-:1021A000A3F10103704700001FB51749086A804773
-:1021B0001648416B88471648416B88471548416B64
-:1021C00088471549086880471449086880471449BA
-:1021D000D1F8680180471349C86880470C4802F06D
-:1021E00069FD04F0F3FA10A30FCB8DE80F006846E9
-:1021F000FEF7DDFA84B20649642322464868694640
-:1022000001F0F0FF1FBD0000340200207800002024
-:10221000C80000201801002028000020280200200B
-:10222000880200200C040020CFB5CDB3B3F5CABCA2
-:10223000BBAF2E2E2E0D0A0010B50A22364801889B
-:102240003648008802F05EFA012805D1324800883D
-:102250003249088003F001FC32222F4801883048BF
-:10226000008802F04FFA012805D12B4800882C493C
-:10227000088003F0FFFB6422274801882948008872
-:1022800002F040FA012805D123480088254908803A
-:1022900003F0E2FBC822204801882348008802F0AE
-:1022A00031FA012805D11C4800881F49088003F035
-:1022B000D6FB4FF4FA72184801881C48008802F0D7
-:1022C00021FA012805D1144800881849088003F034
-:1022D000C9FB4FF47A72104801881548008802F053
-:1022E00011FA012805D10C4800881149088003F033
-:1022F000B5FB4FF4FA62084801880E48008802F0E6
-:1023000001FA012805D1044800880A49088003F031
-:10231000A7FB02F0C3FA10BD100000201A00002035
-:102320001C0000201E0000202000002022000020B1
-:10233000240000202600002000BFFEE730B5024642
-:102340000B464FF6FF70002112E0555C68400024F8
-:102350000AE000F0010525B140104AF2010568408D
-:1023600000E04010651CACB2082CF2DB4D1CA9B299
-:102370009942EADB30BD000010B5024800F07EFA59
-:1023800010BD0000F804002010B5024800F076FAF5
-:1023900010BD00005805002010B5024800F06EFA8C
-:1023A00010BD00007806002010B5024800F066FA63
-:1023B00010BD0000D806002010B5024800F05EFAFB
-:1023C00010BD0000B805002010B5024800F056FA14
-:1023D00010BD0000180600200146087810381823A8
-:1023E000B0FBF3F20848805CC865032A05D9086889
-:1023F0006FF30900001D886503E008686FF30900AA
-:102400008865886D70470000B68700080146002087
-:102410008A6A8B69CBB932B1012A0DD0022A03D066
-:10242000032A10D10EE000BFCB6A03F08073B3F132
-:10243000807F00D1012007E0CB6AB3F1C07F00D1DB
-:10244000012001E000E000BF34E08B69B3F5005FDC
-:102450001AD132B1012A07D0022A03D0032A11D19E
-:102460000AE000BF01200EE0CB6A03F08073B3F1F5
-:10247000807F00D1012006E0CB6AB3F1C07F00D19C
-:10248000012000E000BF15E032B1012A05D0022A88
-:1024900004D0032A0CD103E000BF00BF012008E0F4
-:1024A000CB6A03F08073B3F1807F00D1012000E09C
-:1024B00000BF00BF704730B50468246824F480244E
-:1024C00005682C60046863608468402C04D104684B
-:1024D000A2600468E16003E00468A1600468E2604F
-:1024E00030BD704710B50446204600F0A7FB10BD74
-:1024F00072B600BFFEE7000010B5002201B909E086
-:10250000012901D10A0205E0022901D10A0201E0F4
-:102510004FF440720E4B1B6823F440730C4C236045
-:1025200023461B681343236023461B6823F0F803EC
-:10253000236023461B68022444EAC0042343044C5E
-:10254000236023461B6843F48033236010BD0000E2
-:10255000103C02401C48006800F40070B0B11A48FA
-:10256000006820F400701849086000BF0846006841
-:1025700040F4006008600846006820F400600860CD
-:1025800000BF0846006840F4007008600E4800680C
-:1025900000F48060B0B10C48006820F480600A4903
-:1025A000086000BF0846006840F480500860084694
-:1025B000006820F48050086000BF0846006840F4BE
-:1025C0008060086070470000003C02400A4A1268C0
-:1025D00022F44072084B1A601A46126842F0040254
-:1025E0001A601A4612684FF4803343EA00231A43F4
-:1025F000014B1A6070470000103C0240074A126805
-:1026000022F44072054B1A601A4612681A601A4684
-:10261000126842F001021A6001707047103C0240DB
-:1026200010B50D49096821F440710B4C2160214619
-:10263000096841F4407121602146096841F00101B7
-:102640002160026000BF00BF00BFBFF36F8F00BFFB
-:1026500000BF00BF436010BD103C0240084A126832
-:1026600022F44072064B1A601A46126842F48072D5
-:102670001A601A46126842F001021A60018070471F
-:10268000103C0240084A126822F44072064B1A605D
-:102690001A46126842F400721A601A46126842F032
-:1026A00001021A6001607047103C02402348006834
-:1026B00000F0100040B12248C06940F010002049ED
-:1026C000C86110201D4908601C48006800F0200007
-:1026D00040B11B48C06940F008001949C86120207A
-:1026E000164908601548006800F0400040B11448E1
-:1026F000C06940F004001249C86140200F490860D9
-:102700000E48006800F0800040B10D48C06940F0FC
-:1027100002000B49C861802008490860074800682A
-:1027200000F0020040B10648C06940F020000449B2
-:10273000C861022001490860704700000C3C02405B
-:102740003807002070B50446002500201449C861F0
-:1027500000F058FC054609E0601C38B124B100F0D7
-:1027600051FC401BA04201D9032070BD0D480068F8
-:1027700000F480300028EFD10A48006800F0010022
-:1027800010B10120074908600648006800F0F20017
-:1027900018B1FFF78BFF0120E7E70020E5E7000015
-:1027A000380700200C3C024070B50446A56D00F0CF
-:1027B00029FC064694F83500022808D08020606580
-:1027C00000BF002084F8340000BF012070BD2068E5
-:1027D000006820F01600216808602068406920F039
-:1027E000800021684861206C08B9A06C28B120687D
-:1027F000006820F00800216808602068006820F068
-:1028000001002168086010E000F0FCFB801B052837
-:102810000BD920206065032084F8350000BF00201C
-:1028200084F8340000BF0320D0E72068006800F07F
-:1028300001000028E8D194F85C103F208840A8608F
-:10284000012084F8350000BF002084F8340000BF68
-:1028500000BFBBE7014691F83500022803D0802075
-:10286000486501207047052081F835000868006838
-:1028700020F001000A6810600020F3E7F8B5044674
-:10288000002000908C4800684FF41651B0FBF1F71F
-:10289000A56D2E6894F85C1008208840304098B1EF
-:1028A0002068006800F0040070B12068006820F023
-:1028B00004002168086094F85C1008208840A86033
-:1028C000606D40F00100606594F85C100120884064
-:1028D000304068B12068406900F0800040B194F851
-:1028E0005C1001208840A860606D40F002006065C7
-:1028F00094F85C1004208840304068B1206800687B
-:1029000000F0020040B194F85C1004208840A860F8
-:10291000606D40F00400606594F85C101020884001
-:10292000304078B32068006800F0080050B394F895
-:102930005C1010208840A8602068006800F48020A7
-:1029400080B12068006800F4002028B9206CC8B16C
-:102950002046216C884715E0A06C98B12046A16CF8
-:1029600088470FE02068006800F4807028B920686C
-:10297000006820F0080021680860206C10B1204633
-:10298000216C884794F85C10202088403040002853
-:1029900065D02068006800F0100000285FD094F82F
-:1029A0005C1020208840A86094F83500052828D1C4
-:1029B0002068006820F016002168086020684069DF
-:1029C00020F0800021684861206C08B9A06C28B113
-:1029D0002068006820F008002168086094F85C1006
-:1029E0003F208840A860012084F8350000BF002007
-:1029F00084F8340000BF206D10B12046216D884757
-:102A0000F8BD2068006800F4802080B1206800686C
-:102A100000F4002028B9606C10B12046616C884732
-:102A20001DE0E06BD8B12046E16B884717E02068D5
-:102A3000006800F4807068B92068006820F0100019
-:102A400021680860012084F8350000BF002084F868
-:102A5000340000BFE06B10B12046E16B8847606D29
-:102A600038B3606D00F00100F0B1052084F8350046
-:102A70002068006820F001002168086000BF00980D
-:102A8000401C0090B84200D905E02068006800F0C2
-:102A900001000028F3D100BF012084F8350000BFF9
-:102AA000002084F8340000BFE06C10B12046E16CD7
-:102AB000884700BFA4E700000C0000202DE9F0418A
-:102AC0000446002500F09EFA074614B90120BDE82F
-:102AD000F081606A00B100BF022084F8350000BFB9
-:102AE000002084F8340000BF2068006820F0010056
-:102AF000216808600AE000F085FAC01B052805D9A6
-:102B000020206065032084F83500E0E72068006835
-:102B100000F001000028EED120680568214805403A
-:102B2000D4E901010843E168084321690843616968
-:102B30000843A1690843E1690843216A0843054342
-:102B4000606A042803D1D4E90B01084305432068D7
-:102B500005602068456925F00705606A0543606ADD
-:102B600004280DD1A06A0543E06A48B12046FFF76A
-:102B70004DFC28B140206065012084F83500A6E7AF
-:102B8000206845612046FFF727FC064694F85C1054
-:102B90003F208840B06000206065012084F8350047
-:102BA000002094E73F8010F02DE9F04704460D46E1
-:102BB00016461F464FF00008D4F8589000BF94F80E
-:102BC0003400012802D10220BDE8F087012084F8FA
-:102BD000340000BF94F83500012825D1022084F884
-:102BE0003500002060653B46324629462046FFF707
-:102BF00062FC94F85C103F208840C9F80800206807
-:102C0000006840F0160021680860206C28B1206838
-:102C1000006840F00800216808602068006840F003
-:102C200001002168086006E000BF002084F834003D
-:102C300000BF4FF002084046C6E7000070B50446EA
-:102C400000F0E0F906462546681C10B104480078FB
-:102C5000054400BF00F0D6F9801BA842FAD370BD2E
-:102C6000080000202DE9F04104460E46012700250A
-:102C700000BF2548007E012802D10220BDE8F08176
-:102C800001202149087600BF4CF25030FFF75AFD71
-:102C90000746002F31D1401E3060206801280FD137
-:102CA000207C6168FFF792FC4CF25030FFF74AFD40
-:102CB00007461648006820F00400144908601AE02E
-:102CC000A56812E0217C2846FFF716FC4CF2503034
-:102CD000FFF738FD07460D48006820F0FA000B4961
-:102CE00008600FB1356005E06D1CD4E9021008449E
-:102CF000A842E7D800BFFFF72DFC00BF0020024923
-:102D0000087600BF3846B9E738070020103C02407B
-:102D10000348006840F00040014908600020704707
-:102D2000103C02402DE9F04106460F4614461D4670
-:102D30004FF0010800BF1F48007E012802D1022089
-:102D4000BDE8F08101201B49087600BF4CF25030ED
-:102D5000FFF7F8FC8046B8F1000F23D126B9E1B2A5
-:102D60003846FFF74BFC12E0012E04D1A1B23846E1
-:102D7000FFF774FC0BE0022E04D121463846FFF722
-:102D800081FC04E022462B463846FFF749FC4CF212
-:102D90005030FFF7D7FC80460748006820F001005C
-:102DA0000549086000BF00200249087600BF404680
-:102DB000C6E7000038070020103C02400020094907
-:102DC000096801F0004159B10749064A0C3A1160FF
-:102DD000064911600349096801F0004101B1012071
-:102DE00070470000103C024023016745AB89EFCDDE
-:102DF000F8B502460B460025002400200021D6E04D
-:102E0000012606FA01F51E6806EA0504AC4274D1F3
-:102E10001E7906F00306012E04D01E7906F0030683
-:102E2000022E13D190684F000326BE40B0434F00DE
-:102E3000DE68BE4030439060506801268E40B0434B
-:102E40001E79C6F300168E40304350601E7906F09E
-:102E50000306032E09D0D0684F000326BE40B043BE
-:102E60004F009E68BE403043D0601E7906F00306D6
-:102E7000022E13D1CF0802F1200656F827004E0784
-:102E8000F70E0F26BE40B0434F07FF0E1E69BE402F
-:102E90003043CF0802F1200646F8270010684F00A3
-:102EA0000326BE40B0431E7906F003064F00BE4025
-:102EB000304310605E6806F44036002E76D000BFC6
-:102EC000002600963C4E366846F480463A4F3E60F7
-:102ED0003E46366806F48046009600BF00BF374E77
-:102EE0008F0856F827008E07370F0F26BE40B043D5
-:102EF000334EB24202D1002624E057E0314EB242B6
-:102F000001D101261EE0304EB24201D1022619E065
-:102F10002E4EB24201D1032614E02D4EB24201D111
-:102F200004260FE02B4EB24201D105260AE02A4EBC
-:102F3000B24201D1062605E0284EB24201D1072651
-:102F400000E008268F073F0FBE4030431B4E8F081E
-:102F500046F82700224E3068A0435E6806F48016CB
-:102F600006B120431E4E3060361D3068A0435E68B7
-:102F700006F4001606B12043194E361D3060184E77
-:102F8000361F3068A0435E6806F4003606B1204361
-:102F9000134E361F3060361F3068A0435E6806F45B
-:102FA000803606B120430E4E083E3060491C102981
-:102FB000FFF426AFF8BD0000443802400838014055
-:102FC000000002400004024000080240000C0240E1
-:102FD000001002400014024000180240001C024091
-:102FE000083C014010B5426921EA020302EA0104EB
-:102FF00043EA0443836110BD0AB1816101E00B041F
-:10300000836170470148006870470000000000209D
-:10301000034800680349097808440149086070477B
-:10302000000000200800002010B50D48006840F4A2
-:1030300000700B4908600846006840F48060086032
-:103040000846006840F480700860032000F0A6F88D
-:10305000032000F007F800F02BF8002010BD00005E
-:10306000003C024070B504460E4800784FF47A7177
-:10307000B1FBF0F00C490968B1FBF0F5284600F00F
-:103080002FFC08B1012070BD102C07D20022214670
-:10309000501E00F045F80548046001E00120F2E709
-:1030A0000020F0E7080000200C00002004000020B1
-:1030B00008B500BF002000901048006840F4804030
-:1030C0000E4908600846006800F48040009000BF88
-:1030D00000BF00BF00200090081F006840F0805033
-:1030E000091F08600846006800F08050009000BF8B
-:1030F00000BF052000F052F808BD0000443802402F
-:1031000001460846002809DB00F01F0301229A400F
-:1031100043099B0003F1E023C3F8002100BF70477F
-:103120002DE9F05F80460D461646002703F070F843
-:10313000074639462A46334601F00700C0F1070A20
-:10314000BAF1040F02D94FF0040A01E0C0F1070AF6
-:10315000D14600F1040ABAF1070F02D24FF0000A7B
-:1031600001E0A0F1030AD4464FF0010A0AFA09FA75
-:10317000AAF1010A0AEA020A0AFA0CFA4FF0010B54
-:103180000BFA0CFBABF1010B0BEA030B4AEA0B0445
-:103190002146404603F044F8BDE8F09F00BF00F030
-:1031A0000702064B19684FF6FF031940044B0B4307
-:1031B00043EA0221014B196000BF70470CED00E0AB
-:1031C0000000FA0570B504460D460CB9012070BD2B
-:1031D0005848006800F00700A84209D255490D7010
-:1031E0000846006800F00700A84201D00120EEE781
-:1031F000207800F0020002281DD1207800F00400A1
-:10320000042805D14C48006840F4E0504A49086061
-:10321000207800F00800082805D14748006840F4ED
-:103220006040454908604448006820F0F000A1680B
-:10323000084341490860207800F00100A8B36068A5
-:10324000012807D13C4808380068C0F34040B8B9AD
-:103250000120BCE76068022802D06068032807D11B
-:10326000354808380068C0F3406048B90120AEE72F
-:10327000314808380068C0F3400008B90120A6E7CB
-:103280002D48006820F00300616808432A4908605F
-:10329000FFF7B8FE064609E0FFF7B4FE801B41F2D7
-:1032A0008831884202D9032091E707E0224800686C
-:1032B00000F00C006168B0EB810FEDD11D48006893
-:1032C00000F00700A84209D91A490D7008460068A5
-:1032D00000F00700A84201D0012078E7207800F034
-:1032E0000400042807D11448006820F4E050E16885
-:1032F000084311490860207800F00800082808D128
-:103300000D48006820F46040216940EAC1000A4984
-:10331000086000F03FF808490968C1F30311074A43
-:10332000515CC8400649086006480068FFF79AFEED
-:1033300000204CE7003C024008380240BE870008ED
-:103340000C000020040000200148006870470000C5
-:103350000C00002000B5FFF7F7FF04490968C1F32E
-:103360008221034A515CC84000BD00000838024079
-:10337000CE87000800B5FFF7E7FF04490968C1F3ED
-:103380004231034A515CC84000BD00000838024089
-:10339000CE8700082DE9F047002400250026A1462D
-:1033A0002548006800F00C0020B1042805D008284A
-:1033B0003AD105E0DFF8849039E0DFF8849036E018
-:1033C0001D48001F006800F03F041B48001F0068F4
-:1033D00000F4800078B11A481749091F0968C1F341
-:1033E0008811A0FB01700146224600233846FCF7F5
-:1033F000B1FF05460EE011480F49091F0968C1F3E6
-:103400008811A0FB01700146224600233846FCF7D4
-:10341000A1FF05460848001F0068C0F30140401C9A
-:103420004600B5FBF6F902E0DFF8109000BF00BFE0
-:103430004846BDE8F0870000083802400024F40048
-:1034400000127A00F8B504460CB90120F8BD2078C6
-:1034500000F00100002874D0F948006800F00C006A
-:1034600004280DD0F648006800F00C00082813D19D
-:10347000F348001F006800F48000B0F5800F0BD106
-:10348000EF4808380068C0F34040002859D0606811
-:10349000002856D10120D9E700BF6068B0F5803F11
-:1034A00008D1E7480838006840F48030E44908391A
-:1034B00008601EE06068B0F5A02F0DD1E048083824
-:1034C000006840F48020DE4908390860084600683A
-:1034D00040F4803008600CE0D9480838006820F4D7
-:1034E0008030D749083908600846006820F48020F9
-:1034F000086000BF606890B1FFF784FD054606E0F4
-:10350000FFF780FD401B642801D903209EE7CC48CB
-:1035100008380068C0F340400028F1D011E0FFF700
-:1035200071FD054606E0FFF76DFD401B642801D9DB
-:1035300003208BE7C24808380068C0F340400028E9
-:10354000F1D1207800F0020002285FD1BC48006869
-:1035500000F00C0058B1BA48006800F00C000828D0
-:103560001CD1B748001F006800F48000B0B9B4480F
-:1035700008380068C0F3400020B1E068012801D09D
-:10358000012063E7AE480838006820F0F8002169A0
-:1035900040EAC100AA490839086037E0E06800B392
-:1035A0000120A8490860FFF72DFD054606E0FFF75A
-:1035B00029FD401B022801D9032047E7A04808380D
-:1035C0000068C0F340000028F1D09D48083800682A
-:1035D00020F0F800216940EAC100994908390860E3
-:1035E00014E0002097490860FFF70CFD054606E04F
-:1035F000FFF708FD401B022801D9032026E7904869
-:1036000008380068C0F340000028F1D1207800F0AD
-:10361000080008282CD16069A8B101208A490860F7
-:10362000FFF7F0FC054606E0FFF7ECFC401B022824
-:1036300001D903200AE782486C300068C0F34000DB
-:103640000028F1D014E000207F490860FFF7DAFC81
-:10365000054606E0FFF7D6FC401B022801D90320EF
-:10366000F4E677486C300068C0F340000028F1D1E0
-:10367000207800F00400042870D10027704838300A
-:10368000006800F0805090B900BF002000906C48A6
-:103690003830006840F08050694938310860084689
-:1036A000006800F08050009000BF00BF012767480D
-:1036B000006800F48070B0B96448006840F480701D
-:1036C00062490860FFF79EFC054606E0FFF79AFC9A
-:1036D000401B022801D90320B8E65C48006800F4CA
-:1036E00080700028F2D000BFA068012808D154489B
-:1036F0006830006840F001005149683108601DE001
-:10370000A06805280DD14E486830006840F00400DC
-:103710004B49683108600846006840F001000860C5
-:103720000CE047486830006820F0010044496831E7
-:1037300008600846006820F00400086000BFA06828
-:10374000A8B1FFF75FFC054609E0FFF75BFC401BF3
-:1037500041F28831884202D9032077E626E03848D2
-:1037600068300068C0F340000028EED013E0FFF797
-:1037700049FC054608E0FFF745FC401B41F2883153
-:10378000884201D9032061E62D4868300068C0F303
-:1037900040000028EFD1012F07D1294838300068B8
-:1037A00020F0805026493831086000BFA069002809
-:1037B00045D02348006800F00C0008285DD0A069BF
-:1037C000022845D100201F490866FFF71BFC05466B
-:1037D00006E0FFF717FC401B022801D9032035E65D
-:1037E000174808380068C0F340600028F1D1D4E9D8
-:1037F00007010843616A40EA81110122A06AC2EB15
-:10380000500041EA00412C20005D41EA00600C4973
-:10381000091F086001200B490866FFF7F3FB054606
-:1038200006E0FFF7EFFB401B022801D903200DE65D
-:10383000034808380068C0F340600028F1D049E030
-:103840000838024000004742800E474200700040A6
-:10385000002021490866FFF7D5FB054606E0FFF783
-:10386000D1FB401B022801D90320EFE51B4800686B
-:10387000C0F340600028F2D12CE0A069012800D1FB
-:10388000E4E51648001D0668A069012820D006F46A
-:103890008001E06981421BD106F03F01206A81422C
-:1038A00016D147F6C0703040616AB0EB811F0FD16E
-:1038B00006F440310122A06AC2EB5000B1EB004F88
-:1038C00006D106F070612C20005DB1EB006F01D0D5
-:1038D0000120BBE50020B9E5000047420038024066
-:1038E00070B504462546681EB0F1807F01D30120E3
-:1038F0000FE0681E4FF0E02148610F214FF0FF30CC
-:1039000002F08EFC00204FF0E02188610720086162
-:10391000002070BDF8B504460E46174694F83E00E8
-:10392000202836D106B10FB90120F8BD00BF94F8A8
-:103930003C00012801D10220F7E7012084F83C0077
-:1039400000BF20633A463146204602F055FB05464B
-:10395000EDB9206B012819D100BF0020009020682C
-:103960000068009020684068009000BF00BF00BF62
-:1039700000BF21680C3151E8001F41F010002168A0
-:103980000C3141E80002002AF3D100E0012528466D
-:10399000CBE70220C9E7000070B504460D460C498C
-:1039A0002068884203D10B4802F01EFE0EE00A494F
-:1039B0002068884203D1094802F016FE06E0084953
-:1039C0002068884202D1074802F00EFE70BD000058
-:1039D000001001407800002000440040C800002092
-:1039E000004C00401801002070B5044600252068F6
-:1039F0004069C0F3C01594F83D00212817D1B5B136
-:103A000000BF00BF2168143151E8001F21F0800081
-:103A10002168143141E80002002AF3D100BF606B35
-:103A200010B1606BFEF7C0FE204602F040F920683E
-:103A30004069C0F3801594F83E00222817D1B5B133
-:103A400000BF00BF2168143151E8001F21F0400081
-:103A50002168143141E80002002AF3D100BFA06BB5
-:103A600010B1A06BFEF7A0FE204602F0DAF80020AD
-:103A700070BD000038B5044600252B4920688842F7
-:103A800001D12A4D0AE02A492068884201D1294DF6
-:103A900004E029492068884200D1284D206C00F0BC
-:103AA000020050B100BF0020009020680068009024
-:103AB00020684068009000BF00BF206C00F0040048
-:103AC00050B100BF0020009020680068009020687E
-:103AD0004068009000BF00BF20680068C0F3C000CD
-:103AE00050B100BF0020009020680068009020685E
-:103AF0004068009000BF00BF20680068C0F340002D
-:103B000050B100BF0020009020680068009020683D
-:103B10004068009000BF00BF25B1EA8BA9696868C2
-:103B2000FFF7F8FE38BD00000010014078000020CB
-:103B300000440040C8000020004C00401801002054
-:103B40002DE9F84F0446206805682068C66820689B
-:103B500047694FF00009CA4605F00F09B9F1000F97
-:103B60000AD105F0200038B106F0200020B120462F
-:103B700002F0B0F8BDE8F88FB9F1000F7CD007F083
-:103B8000010018B906F49070002875D005F0010006
-:103B900030B106F4807018B1206C40F00100206450
-:103BA00005F0040030B107F0010018B1206C40F0BE
-:103BB0000200206405F0020030B107F0010018B1E6
-:103BC000206C40F00400206405F0080048B106F0C5
-:103BD000200010B907F0010018B1206C40F0080077
-:103BE0002064206C002846D005F0200028B106F0A3
-:103BF000200010B1204602F06DF820684069C0F343
-:103C0000801A206C00F0080010B9BAF1000F2DD016
-:103C1000204602F006F82068406900F04000402885
-:103C200020D100BF00BF2168143151E8001F21F0EE
-:103C300040002168143141E80002002AF3D100BF9E
-:103C4000A06B50B17548A16B0865A06BFEF702FE32
-:103C500088B1A06B016D88470DE02046FFF70AFF91
-:103C600009E009E02046FFF705FF04E02046FFF7E2
-:103C700001FF002020647DE7206B012876D105F04C
-:103C80001000002872D006F010000028FAD000BF03
-:103C90000020009020680068009020684068009034
-:103CA00000BF00BF2068406900F0400040285ED19E
-:103CB000A06B006840681FFA80F8B8F1000F54D07C
-:103CC000A08D404551DDA4F82E80A06BC069B0F5F1
-:103CD000807F43D000BF00BF21680C3151E8001F36
-:103CE00021F4807021680C3141E80002002AF3D1F0
-:103CF00000BF00BF00BF2168143151E8001F21F050
-:103D000001002168143141E80002002AF3D100BF0C
-:103D100000BF00BF2168143151E8001F21F04000AE
-:103D20002168143141E80002002AF3D100BF2020AD
-:103D300084F83E000020206300BF00BF21680C31E2
-:103D400051E8001F21F0100021680C3141E8000209
-:103D5000002AF3D100BFA06BFEF726FDA08DE28DF7
-:103D6000801A81B22046FFF717FE03E740E0A08DDE
-:103D7000E18D401A1FFA80F8E08DC0B3B8F1000F52
-:103D800035D000BF00BF21680C3151E8001F21F47D
-:103D9000907021680C3141E80002002AF3D100BF85
-:103DA00000BF00BF2168143151E8001F21F001005D
-:103DB0002168143141E80002002AF3D100BF20201D
-:103DC00084F83E000020206300BF00BF21680C3152
-:103DD00051E8001F21F0100021680C3141E8000279
-:103DE000002AF3D100BF41462046FFF7D5FDC1E6CA
-:103DF00005F0800030B106F0800018B1204602F0D6
-:103E000063F9B7E605F0400030B106F0400018B1A4
-:103E1000204601F03CFFADE600BFABE6895A000842
-:103E200010B504460CB9012010BDA06900B100E036
-:103E300000BF94F83D0028B9002084F83C002046DB
-:103E400000F028F8242084F83D002068C06820F4A1
-:103E500000502168C860204601F0B8FF2068006962
-:103E600020F49040216808612068406920F02A0011
-:103E7000216848612068C06840F400502168C8602B
-:103E800000202064202084F83D0084F83E000020BB
-:103E9000CAE7000010B586B00446142101A8FCF75B
-:103EA00089FDC149206888427AD100BF0020009076
-:103EB000BE48006840F40020BC490860084600681D
-:103EC00000F40020009000BF00BF00BF0020009061
-:103ED000B6481038006840F00100B4491039086055
-:103EE0000846006800F00100009000BF00BF0320FA
-:103EF00001900220029000200390032004900820EB
-:103F0000059001A9AA48FEF773FFAA48AA490860CC
-:103F1000400548600021A8488160C1604FF480617D
-:103F20000161002141618161C1614FF44031016251
-:103F300000214162FEF7C2FD08B1FEF7D9FA00BFC9
-:103F40009D48A063846300BF9A4830309B49086055
-:103F50004FF0006048604021984881600021C160B6
-:103F60004FF480610161002141618161C1614FF4C1
-:103F70000031016200214162FEF7A0FD08B1FEF7A9
-:103F8000B7FA00BF8D486063846300BF002201213F
-:103F90003420FFF7C5F83420FFF7B2F802E1FFE75D
-:103FA0008749206888427ED100BF002000907F486A
-:103FB000001D006840F010007C49091D086008469B
-:103FC000006800F01000009000BF00BF00BF00209C
-:103FD000009076481038006840F0010073491039AD
-:103FE00008600846006800F00100009000BF00BFB4
-:103FF0004FF4C06001900220029000200390032043
-:1040000004900720059001A96948FEF7F1FE6D486C
-:104010006D4908604FF00060486000216A48816087
-:10402000C1604FF480610161002141618161C16122
-:104030004FF48031016200214162FEF73FFD08B17B
-:10404000FEF756FA00BF6048A063846300BF5D4876
-:1040500078305E4908604FF00060486040215B485E
-:1040600081600021C1604FF48061016100214161E4
-:104070008161C1614FF48031016200214162FEF72C
-:104080001DFD08B1FEF734FA00BF50486063846339
-:1040900000BF002201212520FFF742F82520FFF76D
-:1040A0002FF87FE0FFE74A49206888427AD100BFB5
-:1040B000002000903D48006840F400303B49086013
-:1040C0000846006800F40030009000BF00BF00BF49
-:1040D0000020009035481038006840F0080033494F
-:1040E000103908600846006800F00800009000BF22
-:1040F00000BF602001900220029000200390032066
-:1041000004900720059001A93248FEF771FE294866
-:104110004830314908604FF00060486000212E4867
-:104120008160C1604FF48061016100214161816162
-:10413000C1614FF44031016200214162FEF7BEFCD3
-:1041400008B1FEF7D5F900BF2348A063846300BF20
-:1041500018486030214908604FF0006048604021F5
-:104160001E4881600021C1604FF48061016100211F
-:1041700041618161C1614FF40031016200214162FE
-:10418000FEF79CFC08B1FEF7B3F900BF134860636B
-:10419000846300BF002201212620FEF7C1FF2620F4
-:1041A000FEF7AEFF06B010BD004C004040380240A4
-:1041B0000000024040600240F80400205805002042
-:1041C0000010014040640240B8050020180600209D
-:1041D00000440040000C024078060020D806002071
-:1041E000704770472DE9F84F04460E46174699462A
-:1041F0004FF0000A94F83D0020285AD106B117B9B3
-:104200000120BDE8F88F00BF94F83C00012801D1DF
-:104210000220F6E7012084F83C0000BF0020206463
-:10422000212084F83D00FEF7EDFE8246A784E78456
-:10423000A068B0F5805F04D1206910B90025B046B0
-:1042400002E035464FF0000800BF002084F83C0033
-:1042500000BF1BE05346002280212046CDF800908D
-:1042600001F062FF08B10320CBE745B9B8F80000C0
-:10427000C0F308002168486008F1020803E02878CC
-:10428000216848606D1CE08C401EE084E08C0028B2
-:10429000E0D15346002240212046CDF8009001F0A5
-:1042A00043FF08B10320ACE7202084F83D00002044
-:1042B000A7E70220A5E70000F7B50446154694F8E5
-:1042C0003D00202846D1019800B10DB90120FEBD66
-:1042D00000BF94F83C00012801D10220F7E701203B
-:1042E00084F83C0000BF01982062A584E58400208A
-:1042F0002064212084F83D001748616BC86317488B
-:10430000616B08641648616BC8640020616B0865C6
-:1043100001AE23681A1D31682B46606BFEF744FC22
-:104320006FF040002168086000BF002084F83C0066
-:1043300000BF00BF00BF2168143151E8001F41F0E9
-:1043400080002168143141E80002002AF3D100BF47
-:104350000020BCE70220BAE7BD5B0008155C00083E
-:104360009D5A000810B504460E492068884203D1C2
-:104370000D48C16B884713E00C492068884203D17F
-:104380000B48C16B88470BE00A492068884207D177
-:10439000012204210848FEF72FFE0848C16B884718
-:1043A00010BD0000001001407800002000440040D3
-:1043B000C8000020004C004000000240180100200E
-:1043C000704700BFFEE7000008B500BF0020009066
-:1043D0002648006840F40010244908600846006838
-:1043E00000F40010009000BF00BF00BF002000904C
-:1043F0000846006840F4800008600846006800F441
-:104400008000009000BF00BF002211460D20FEF783
-:1044100087FE0D20FEF774FE002211460F20FEF7E6
-:104420007FFE0F20FEF76CFE002211461020FEF7E3
-:1044300077FE1020FEF764FE002211461120FEF7E1
-:104440006FFE1120FEF75CFE002211463A20FEF7B7
-:1044500067FE3A20FEF754FE002211464620FEF782
-:104460005FFE4620FEF74CFE08BD000030380240DB
-:1044700000B587B0142102A8FCF79CFA00BF002009
-:1044800001906E48006840F010006C4908600846D2
-:10449000006800F01000019000BF00BF00BF0020C6
-:1044A00001900846006840F08000086008460068F7
-:1044B00000F08000019000BF00BF00BF002001900D
-:1044C0000846006840F0010008600846006800F0F7
-:1044D0000100019000BF00BF00BF0020019008460E
-:1044E000006840F0020008600846006800F0020022
-:1044F000019000BF00BF00BF002001900846006887
-:1045000040F0080008600846006800F008000190CC
-:1045100000BF00BF00BF002001900846006840F0C7
-:10452000040008600846006800F00400019000BF25
-:1045300000BF00227F214248FEF75EFD01220421D8
-:104540004048FEF759FD01224FF4E0613C48FEF778
-:1045500053FD01224FF470413B48FEF74DFD01220F
-:104560004FF47F413948FEF747FD01224FF4707147
-:104570003748FEF741FD002210213448FEF73CFD8C
-:1045800000224FF440713048FEF736FD6F20029054
-:1045900001200390002004900320059002A92848E0
-:1045A000FEF726FC4FF4E260029001200390002009
-:1045B0000490059002A92248FEF71AFC04200290FC
-:1045C00001200390002004900320059002A91D48BB
-:1045D000FEF70EFC4FF47040029001200390002083
-:1045E0000490059002A91848FEF702FC4FF61070DF
-:1045F00002900120039000200490059002A9134826
-:10460000FEF7F6FB4FF4707002900120039000203B
-:104610000490059002A90E48FEF7EAFB4FF44070A3
-:10462000029001200390002004900320059002A92D
-:104630000548FEF7DDFB07B000BD00003038024042
-:10464000001002400000024000040240000C024042
-:104650000008024010B50B480B4908604FF4E130E8
-:104660004860002108488160C16001610C214161FE
-:1046700000218161C161FFF7D3FB08B1FDF738FF6D
-:1046800010BD0000004C00402C04002010B50B4869
-:104690000B4908604FF4E130486000210848816010
-:1046A000C16001610C21416100218161C161FFF79D
-:1046B000B7FB08B1FDF71CFF10BD00000010014062
-:1046C0007004002010B50B480B4908604FF41650D9
-:1046D0004860002108488160C16001610C2141618E
-:1046E00000218161C161FFF79BFB08B1FDF700FF6D
-:1046F00010BD000000440040B404002000BFFEE7ED
-:1047000000BFFEE710B503461446E01882B29A4295
-:1047100005DD914201DA994207DA012010BD91428C
-:1047200003DB994201DA0120F8E70020F6E70000F8
-:10473000154909880144144A118014490988014423
-:10474000124A1180124909880144114A11800F4907
-:104750000988B1F57A7F07D300210C4A11800D49F1
-:104760000988491C0B4A11800949098842F21072D4
-:10477000914207D30021064A118007490988491C44
-:10478000054A11807047000010000020160000202C
-:10479000180000201200002014000020704770470D
-:1047A00010B50120FFF7C4FF07480121426C904774
-:1047B00006480121426C904705480121426C904710
-:1047C000FEF726FC10BD000078000020C800002085
-:1047D0001801002000B593B0302107A8FCF7EAF8D3
-:1047E000142102A8FCF7E6F800BF0020019024483D
-:1047F000006840F08050224908600846006800F0D8
-:104800008050019000BF00BF00BF002001901D48F4
-:10481000006840F480401B4908600846006800F4C6
-:104820008040019000BF00BF012007900004089065
-:1048300002200D9041050E9104210F91A8211091A5
-:10484000022111910421129107A8FEF7FBFD08B186
-:10485000FDF74EFE0F2002900220039000200490EE
-:104860004FF4A05005904FF480500690052102A807
-:10487000FEF7A8FC08B1FDF73BFE13B000BD000039
-:1048800040380240007000400348006840F4700067
-:10489000014908607047000088ED00E010B5054848
-:1048A000C16C88470448C16C88470448C16C88477C
-:1048B00010BD000078000020C80000201801002072
-:1048C0000FB410B59CB01448006818B91CB010BCE7
-:1048D0005DF814FB11A0006801901FA800906421EE
-:1048E00002A8009B1E9AFBF7ADFD04460020009035
-:1048F000002C0FDDA2B20848006802A9836B0648AD
-:104900000068984704480068032201A9836B0248A5
-:104910000068984700BFD9E76C020020FFFFFF0046
-:104920002DE9F041A2B006460F46062F03DA00201B
-:1049300022B0BDE8F0810025022400BF0DE0312D3A
-:1049400009D22046611C8CB2325C2846691CCDB26B
-:1049500001A90A5401E0601C84B2BC4202DA305D55
-:10496000AA28ECD1BC4201DB0020E1E7002001A92C
-:10497000485503226CA101A8FBF738FF38B90DF1A7
-:104980000700FBF7B7FEC0B28DF8380005E001A8BC
-:10499000FBF7B0FEC0B28DF838009DF83800012852
-:1049A00003DB9DF83800042806DD9DF838105FA071
-:1049B000FFF786FF0020BBE7601C84B200250DE0F6
-:1049C000312D09D22046611C8CB2325C2846691C0C
-:1049D000CDB201A90A5401E0601C84B2BC4202DAE3
-:1049E000305DAA28ECD1BC4201DB0020A0E700200A
-:1049F00001A9485513220DF13900FCF702F80021F6
-:104A00000EA80175601C84B200250DE0312D09D27D
-:104A10002046611C8CB2325C2846691CCDB201A9CB
-:104A20000A5401E0601C84B2BC4202DA305DAA285C
-:104A3000ECD1BC4201DB00207AE7002001A94855F7
-:104A400001A8FBF757FEC0B28DF84D009DF84D0050
-:104A5000012803DB9DF84D00FE2801DD002067E7FB
-:104A6000601C84B200250DE0312D09D22046611C66
-:104A70008CB2325C2846691CCDB201A90A5401E00F
-:104A8000601C84B2BC4202DA305DAA28ECD10DB9B8
-:104A900000204DE7002001A9485513220DF14E00DA
-:104AA000FBF7AFFF00218DF8611000208DF8620048
-:104AB0008DF863008DF86400804618E008EB8800EC
-:104AC000244901EB0010407D9DF84D1088420AD129
-:104AD00008EB88011F4A02EB011050220EA9FBF7D8
-:104AE00015FF012024E708F1010000F0FF081A4833
-:104AF00000788045E2DB18480078202811DA164952
-:104B0000097801EB8101134A02EB011050220EA932
-:104B1000FBF7FCFE10480078401C0F49087001208C
-:104B200006E7002004E70000434F4D0074302E7468
-:104B300078743D22B6CBBFDABAC5CEDED0A73A250F
-:104B40006428D6BBD6A7B3D6434F4D312D434F4D26
-:104B5000342922004C84002070020020F8B5002582
-:104B600001F02EFE064625E0002406E0204603F074
-:104B7000ABFD0DF80400601CC4B2042CF6DB9DF8FC
-:104B80000000042814D19DF80100FF2810D19DF8E1
-:104B90000200FF280CD19DF80300FF2808D1042053
-:104BA00001F0C2FD281D85B201F00AFE064600E0B4
-:104BB00002E000BF042ED7DA00BF2846F8BD00008F
-:104BC0002DE9F043ADF6242D80460E463748007897
-:104BD00018B90DF6242DBDE8F083002720210DF62D
-:104BE0000420FBF7E7FE00200AE018F80010012976
-:104BF00004D10DF604221154791CCFB2411CC8B265
-:104C0000B04203DA294909788842EEDB07B9E0E7C8
-:104C1000002500241DE04FF00009B44205DA0DF62E
-:104C20000420005D012800D18146B9F1000F0ED1AA
-:104C300004EB84021E4B03EB021105EB850201AB72
-:104C400003EB02105022FBF761FE681CC5B2601C2A
-:104C5000C4B2164800788442DDDB14480570002495
-:104C60000EE004EB840201AB03EB021104EB8402BF
-:104C70000F4B03EB02105022FBF748FE601CC4B23E
-:104C80000A4800788442ECDB0848047809E004EB29
-:104C90008401074A02EB01105021FBF78BFE601CD8
-:104CA000C4B2202CF3DB00BF93E7000070020020A9
-:104CB0004C84002010B5044604B910BD0B480460B4
-:104CC00001F084FDFFF74AFF094808490968886434
-:104CD0000020084908704FF420610748FBF76AFE7E
-:104CE00006A0FFF7EDFD00BFE7E700006C02002023
-:104CF000E14E0008700200204C84002074302E74B5
-:104D000078743D22544A43B3F5CABCBBAFCDEAB375
-:104D1000C922000070B504460D4605B970BD032DCB
-:104D20000ADB2078AA2807D16078552804D12946C3
-:104D3000204600F003F8F1E700BFEFE72DE9F04768
-:104D400004460D46062D01DABDE8F0872078AA2832
-:104D500002D16078552800D0F6E7A81E215C681EB5
-:104D6000205C41EA0029A81E81B22046FDF7E6FA40
-:104D70000746B94500D0E7E7A678432E08D1294673
-:104D80002046FFF7CDFD10B125A0FFF799FDDBE729
-:104D9000042E04D12946204600F04CF8D4E7062D15
-:104DA0003BD194F80380022E02D0032E32D121E0B1
-:104DB000B8F1070F1BD2DFE808F01A04070A0E1239
-:104DC000160000F00DF913E000F01AFD10E00120CC
-:104DD00000F086FB0CE0022000F082FB08E00320DC
-:104DE00000F07EFB04E0042000F07AFB00E000BF4E
-:104DF00000BF10E0B8F1010F03D0B8F1020F06D1E7
-:104E000002E000F0A7F903E000F094FA00E000BF30
-:104E100000BF00E000BF00BF00BF00BF94E700007C
-:104E200062322E7478743D2261646420737563224B
-:104E30000000000030B58FB004460D460D2D10D097
-:104E40002A4616A16846FBF717FB6846FFF738FDB0
-:104E50004FF49670FDF7F2FE18A0FFF731FD0FB08A
-:104E600030BDA07804280AD017A0FFF729FD4FF421
-:104E70009670FDF7E3FE11A0FFF722FDEFE700209B
-:104E800004E0C11C615C0DAA1154401C0828F8DB29
-:104E900008210DA8FFF794FE00BFE0E774302E74E0
-:104EA00078743D22C9BEB3FDD6B8C1EEB3A4B6C86E
-:104EB000B4EDCEF33A2564220000000074302E7465
-:104EC00078743D222200000074302E7478743D22E4
-:104ED000C9BEB3FDB9A6C4DCC2EBB4EDCEF322006B
-:104EE0002DE9F74FB4B08146002405E019F804001D
-:104EF00003F002FC601C84B235988442F6DB6AE061
-:104F000001F05EFC33903398032800DA64E000205F
-:104F100003F0DAFB3290012003F0D6FB074632980B
-:104F2000AA2801D1552F03D0012001F0FDFB52E04A
-:104F3000022003F0C9FB04464FF0000A432C05D0C1
-:104F4000022C03D0032C01D0042C01D14FF0010A14
-:104F5000BAF1000F03D1022001F0E6FB3BE000258F
-:104F6000432C04D101F006FC05464DB934E0022C77
-:104F700001D0032C01D1062502E0042C00D10D251F
-:104F80003398A84200DA27E0002606E0304603F016
-:104F90009BFB0DF80600701C86B2AE42F6DBA81E25
-:104FA0001DF80010681E1DF8000041EA002BA81E25
-:104FB00081B26846FDF7C2F98046C34503D0284652
-:104FC00001F0B2FB07E029466846FFF7A3FE28463A
-:104FD00001F0AAFB00BF93E700BF37B0BDE8F08F38
-:104FE0002DE9F041012416E0012511E02A46214671
-:104FF00032A0FFF765FC04FB05F0C11700EB9171CF
-:105000008910A0EB810111B90520FDF717FE6D1C79
-:10501000042DEBDD641C082CE6DD6420FDF70EFE9C
-:105020002A48007870B92AA0FFF74AFC2EA0FFF7A3
-:1050300047FC4FF49670FDF701FE31A0FFF740FCEE
-:10504000BDE8F08121480078082801DD082001E052
-:105050001E480078064600242BE004EB84002B4910
-:1050600001EB0015671C6A1C394629A0FFF728FCD4
-:105070000A20FDF7E3FD2A78394629A0FFF720FC36
-:105080000A20FDF7DBFD6A7D39462AA0FFF718FCF0
-:105090000A20FDF7D3FD05F11602394629A0FFF7D6
-:1050A0000FFC0A20FDF7CAFD1420FDF7C7FD601CA8
-:1050B000C4B2B442D1DB00BFC2E700007425645F14
-:1050C00025642E7478743D222200000070020020B6
-:1050D00074315F312E7478743D22CEDEC9E8B1B8E8
-:1050E000CAFDBEDD2200000074302E7478743D22AB
-:1050F000C9E8B1B8C1D0B1EDCEAABFD52200000039
-:1051000074302E7478743D22220000004C840020FC
-:105110007425645F312E7478743D2225732200005B
-:105120007425645F322E7478743D22434F4D25649C
-:10513000220000007425645F332E7478743D2225AC
-:10514000642200007425645F342E7478743D222537
-:10515000732200002DE9F04796B06420FDF76EFD44
-:10516000012491E0052C04DC4AA113A8FBF7FBFA0B
-:105170000AE00A2C04DC48A113A8FBF7F4FA03E0C8
-:1051800046A113A8FBF7EFFA204604EBD0714910B3
-:10519000A4EB410121B942A110A8FBF7E4FA03E016
-:1051A00041A110A8FBF7DFFA224641A103A8FBF7B3
-:1051B00063F9601E1E2190FBF1F201FB120000F169
-:1051C0001309601E90FBF1F000F1010A601E062138
-:1051D00090FBF1F000F1080504EB44003C2190FB4A
-:1051E000F1F201FB1208182D00DB17254B46524641
-:1051F00031A10BA8CDE90058FBF73EF9AE1C08F130
-:105200000F073C2F01DB3C3F761C182E01DB1726D5
-:105210003B274B46524628A106A8CDE90067FBF77D
-:105220002BF913AA21462BA0FFF74AFB0520FDF717
-:1052300005FD03AA21462BA0FFF742FB0520FDF741
-:10524000FDFC21462BA0FFF73BFB0520FDF7F6FCFC
-:1052500010AA21462BA0FFF733FB0520FDF7EEFC3B
-:105260000BAA21462BA0FFF72BFB0520FDF7E6FC40
-:1052700006AA21462BA0FFF723FB0520FDF7DEFC45
-:105280001420FDF7DBFC641C0F2C7FF76BAF16B00E
-:10529000BDE8F0874C48000053480000424A000037
-:1052A000C2A9D2BA00000000B6CFB4F800000000D6
-:1052B0002530326400000000323032362D25303285
-:1052C000642D2530326420253032643A2530326432
-:1052D000000000007425645F312E7478743D22252F
-:1052E000732200007425645F322E7478743D222589
-:1052F000732200007425645F332E7478743D224855
-:105300004B2200007425645F342E7478743D22258E
-:10531000732200007425645F352E7478743D222555
-:10532000732200007425645F362E7478743D222544
-:10533000732200002DE9F047A0B03220FDF77EFC7B
-:10534000502245490CA8FBF7E1FA4FF0000A202251
-:105350004149503104A8FBF7D9FA0DF131013FA0C2
-:10536000FFF7AEFA0A20FDF769FC9DF845103FA053
-:10537000FFF7A6FA0A20FDF761FC0DF146013FA0F8
-:10538000FFF79EFA0A20FDF759FCBAF1000F03D08F
-:10539000BAF1010F04D101E03CA403E03DA401E017
-:1053A0003EA400BF00BF21463EA0FFF789FA0A20B5
-:1053B000FDF744FC002549E004A800EBC50605EB19
-:1053C000450000F10509307810B1012804D101E051
-:1053D0002EA703E037A701E030A700BF00BF3A4681
-:1053E000494636A0FFF76CFA0520FDF727FC7078D8
-:1053F00010B1012806D102E00FF2900805E00FF28B
-:10540000CC0802E00FF2940800BF00BF424609F149
-:1054100001012AA0FFF754FA0520FDF70FFC3078B0
-:10542000012805D12BA101A87268FBF725F803E03C
-:105430002AA101A8FBF720F801AA09F102011FA087
-:10544000FFF73EFA0520FDF7F9FB6D1C042DB3DBD9
-:1054500020B0BDE8F0870000D887000874315F31C4
-:105460002E7478743D2225732200000074315F325F
-:105470002E7478743D2225642200000074315F335D
-:105480002E7478743D22257322000000D5FDB3A34D
-:1054900000000000D2ECB3A300000000CEB4D6AAF6
-:1054A0000000000074315F342E7478743D2225733F
-:1054B00022000000C2A9D2BA0000000074315F25AA
-:1054C000642E7478743D222573220000B6CFB4F8A0
-:1054D000000000002564C3D70000000030C3D700DF
-:1054E0002DE9F04FB9B08046012516E0012611E004
-:1054F0003246294693A0FFF7E3F905FB06F0C117F2
-:1055000000EB91718910A0EB810111B90520FDF725
-:1055100095FB761C0F2EEBDD6D1C042DE6DD642063
-:10552000FDF78CFB8B48007828B98BA0FFF7C8F9F2
-:1055300039B0BDE8F08F0024002532E005EB85008E
-:105540008B4901EB00194FF0000A00260EE006EB34
-:10555000860107AA02EB810009F10101FBF77CFA41
-:1055600010B94FF0010A03E0701CC6B2A642EEDB90
-:1055700000BFBAF1000F12D104EB840107AA02EBBD
-:105580008100132209F10101FBF73BFA002004EB33
-:10559000840107AA02EB8101C874601CC4B2681CB4
-:1055A000C5B26C480078854201DA0A2CC6DBB8F136
-:1055B000010F01DBA04503DD6EA0FFF781F9B7E71E
-:1055C0000027002515E005EB8500694901EB001671
-:1055D000A8F1010000EB800007AA02EB8001701C1B
-:1055E000FBF73AFA18B906A8C555781CC7B2681C6B
-:1055F000C5B258480078854201DA042FE3DB4FF04A
-:10560000000999E006A810F8090000EB800058494D
-:1056100001EB001509F1010005906A7D5AA005997A
-:10562000FFF74EF90A20FDF709FB05F116025AA013
-:105630000599FFF745F90A20FDF700FB95F82C00C6
-:1056400010B1012806D102E00FF25C1A05E00FF25A
-:10565000601A02E00FF2601A00BF00BF524658A065
-:105660000599FFF72DF90A20FDF7E8FA00265AE020
-:1056700006EB4600001D049005F1300010F83600DE
-:1056800010B1012806D102E00FF21C1B05E00FF259
-:10569000401B02E00FF2401B00BF00BF5B464FA063
-:1056A000DDE90421FFF70CF90520FDF7C7FA05F144
-:1056B000300000EBC600407810B1012806D102E0AE
-:1056C00039A0039005E049A0039002E042A00390B6
-:1056D00000BF00BFDDE90332521C40A00599FFF76F
-:1056E000EFF80520FDF7AAFA05F1300010F83600B2
-:1056F000012809D105F1300000EBC6003DA1426848
-:105700006846FAF7B9FE03E03CA16846FAF7B4FE32
-:105710006B46049A921C31A00599FFF7D1F8052039
-:10572000FDF78CFA761C042EA2DB1E20FDF786FA0C
-:1057300009F1010000F0FF09B945FFF663AF00BFB2
-:10574000F6E600007425645F25642E7478743D22AB
-:10575000220000007002002074315F312E747874D2
-:105760003D22CEDEC9E8B1B8CAFDBEDD2200000090
-:105770004C84002074315F312E7478743D22C7F858
-:10578000D3F2CEDED0A722007425645F312E747868
-:10579000743D2225642200007425645F322E7478E3
-:1057A000743D222573220000D5FDB3A30000000044
-:1057B000D2ECB3A300000000CEB4D6AA00000000D3
-:1057C0007425645F332E7478743D222573220000A3
-:1057D000C2A9D2BA000000002D0000007425645F49
-:1057E00025642E7478743D2225732200B6CFB4F858
-:1057F000000000002564C3D70000000030C3D700BC
-:105800002DE9F043BDB06420FDF718FA7648007822
-:1058100028B976A0FFF754F83DB0BDE8F083002426
-:1058200000279DE007EB8700764901EB00164FF05B
-:10583000000900254EE005EB450101AA02EBC1007D
-:10584000711CFBF709F9E8BB4FF0010905EB4500B6
-:1058500001A901EBC000007D401C05EB450101AA38
-:1058600002EBC101087596F82A0001280BD105EB5F
-:10587000450001A901EBC000407D401C05EB45013E
-:1058800002EBC101487596F82B0001280CD105EBFD
-:10589000450001A901EBC000807D401C05EB4501DE
-:1058A00001AA02EBC101887596F82C0001280ED1DF
-:1058B00005EB450001A901EBC000C07D401C05EBD4
-:1058C000450100E004E001AA02EBC101C87503E054
-:1058D000681CC5B2A542AEDB00BFB9F1000F3DD1D7
-:1058E0000A2C3BDA04EB440101AA02EBC1001322AB
-:1058F000711CFBF786F8002004EB440101AA02EBBF
-:10590000C101C874012004EB440102EBC101087518
-:1059100096F82A00012800D100E0002004EB4401A1
-:1059200001AA02EBC101487596F82B00012800D1AD
-:1059300000E0002004EB440101AA02EBC1018875DC
-:1059400096F82C00012800D100E0002004EB44016F
-:1059500001AA02EBC101C875601CC4B2781CC7B2B1
-:10596000214800788742FFF65DAF042C01DD04205A
-:1059700000E020468046002632E006EB460001A902
-:1059800001EBC005771C2A4639461FA0FEF798FF99
-:105990000A20FDF753F92A7D39461FA0FEF790FF34
-:1059A0000A20FDF74BF96A7D39461FA0FEF788FFF4
-:1059B0000A20FDF743F9AA7D39461FA0FEF780FFB4
-:1059C0000A20FDF73BF9EA7D39461FA0FEF778FF74
-:1059D0000A20FDF733F91E20FDF730F9701CC6B21E
-:1059E0004645CADB00BF17E77002002074315F3103
-:1059F0002E7478743D22CEDEC9E8B1B8CAFDBEDD92
-:105A0000220000004C8400207425645F312E7478DD
-:105A1000743D2225732200007425645F322E747851
-:105A2000743D2225642200007425645F332E74784F
-:105A3000743D2225642200007425645F342E74783E
-:105A4000743D2225642200007425645F352E74782D
-:105A5000743D2225642200007047704770477047EC
-:105A60007047000010B502494868804710BD00002B
-:105A7000280000207047000010B50248FEF760F8CB
-:105A800010BD00002C04002070B50546AC6B002052
-:105A9000E085E0842046FDF7EDFF70BD70B5064659
-:105AA0000025B46B20684069C0F3C01594F83D0030
-:105AB000212805D125B10020E084204600F0F7F828
-:105AC00020684069C0F3801594F83E00222805D173
-:105AD00025B10020E085204600F0A3F8206C40F0BE
-:105AE000100020642046FDF7C5FF70BD70B5054667
-:105AF000AC6B2868006800F48070002842D1E08513
-:105B000000BF00BF21680C3151E8001F21F48070F4
-:105B100021680C3141E80002002AF3D100BF00BF28
-:105B200000BF2168143151E8001F21F001002168F5
-:105B3000143141E80002002AF3D100BF00BF00BFCA
-:105B40002168143151E8001F21F040002168143110
-:105B500041E80002002AF3D100BF202084F83E0073
-:105B6000206B01280ED100BF00BF21680C3151E825
-:105B7000001F21F0100021680C3141E80002002ACA
-:105B8000F3D100BF206B012804D1A18D2046FDF781
-:105B900003FF02E02046FEF723FB70BD70B505460B
-:105BA000AC6B206B012805D1A08D41082046FDF784
-:105BB000F3FE02E02046FEF714FB70BD70B505460B
-:105BC000AC6B2868006800F48070F8B90020E084AD
-:105BD00000BF00BF2168143151E8001F21F0800090
-:105BE0002168143141E80002002AF3D100BF00BF50
-:105BF00000BF21680C3151E8001F41F040002168CE
-:105C00000C3141E80002002AF3D102E02046FEF701
-:105C1000A9FB70BD70B50446A56B2846FEF7D0FB06
-:105C200070BD00BF00BF02680C3252E8002F22F4A2
-:105C3000907102680C3242E80013002BF3D100BFD0
-:105C400000BF00BF0268143252E8002F22F00101A9
-:105C50000268143242E80013002BF3D100BF016B3D
-:105C600001290ED100BF00BF02680C3252E8002F9C
-:105C700022F0100102680C3242E80013002BF3D12D
-:105C800000BF202180F83E1000210163704710B54D
-:105C900004462068C06820F040002168C8602020C9
-:105CA00084F83D002046FEF75DFB002010BD00BFDC
-:105CB00000BF02680C3252E8002F22F0C0010268D7
-:105CC0000C3242E80013002BF3D100BF202180F8F2
-:105CD0003D107047F8B5044694F83E00222873D171
-:105CE000A068B0F5805F0CD1206950B90025A66A84
-:105CF00020684068C0F308003080A06A801CA06261
-:105D000015E0A56A0026A068B0F5805F03D0A06802
-:105D100028B9206918B920684068287004E0206814
-:105D2000406800F07F002870A06A401CA062E08DEF
-:105D3000401E80B2E085002844D12068C06820F071
-:105D400020002168C8602068C06820F48070216845
-:105D5000C8602068406920F0010021684861202067
-:105D600084F83E00206B012826D10020206300BF6C
-:105D700000BF21680C3151E8001F21F0100021689C
-:105D80000C3141E80002002AF3D100BF206800680E
-:105D900000F0100010280AD100BF002000902068F9
-:105DA0000068009020684068009000BF00BFA18D8F
-:105DB0002046FDF7F1FD02E02046FEF711FA002033
-:105DC000F8BD01E00020FBE70220F9E72DE9F84FDC
-:105DD00004462068006920F44050E16808432168C7
-:105DE00008612169A068084361690843E1690843C3
-:105DF00000902068C06849F20C618843009908430C
-:105E00002168C8602068406920F44070A169084397
-:105E10002168486176492068884203D07549206826
-:105E2000884203D1FDF7A6FA814602E0FDF792FA17
-:105E30008146E069B0F5004F6CD102206168A0FB9B
-:105E4000015003461920A9FB007001462A46384636
-:105E5000FAF780FA6421B0FBF1F04FEA001A022051
-:105E60006168A0FB01510B461920A9FB00712A466D
-:105E70003846FAF76FFA834602206168A0FB0150AA
-:105E800003461920A9FB00712A463846FAF762FA40
-:105E90006421B0FBF1F000EBC00101EB0010ABEBB3
-:105EA0008000322101EBC0006421B0FBF1F000F072
-:105EB000F8000AEB400A02206168A0FB015003468B
-:105EC0001920A9FB007001462A463846FAF742FA23
-:105ED000834602206168A0FB015003461920A9FBFC
-:105EE00000712A463846FAF735FA6421B0FBF1F022
-:105EF00000EBC00101EB0010ABEB8000322101EBA5
-:105F0000C0006421B0FBF1F000F0070050442168AC
-:105F100088606AE004206168A0FB015003461920F4
-:105F2000A9FB007001462A463846FAF713FA824662
-:105F300004206168A0FB015003461920A9FB0070F2
-:105F400001462A463846FAF705FA6421B0FBF1F01B
-:105F500000EBC00101EB0010AAEB8000322101EB45
-:105F600000106421B0FBF1F000F0F00A0420616839
-:105F7000A0FB017003461920A9FB00513A462846B0
-:105F8000FAF7E8F96421B0FBF1F00AEB001A0420FB
-:105F90006168A0FB01510B461920A9FB00712A463C
-:105FA0003846FAF7D7F9834604206168A0FB015010
-:105FB00003461920A9FB007001462A463846FAF725
-:105FC000C9F96421B0FBF1F000EBC00101EB001056
-:105FD000ABEB8000322101EB00106421B0FBF1F04B
-:105FE00000F00F00504421688860BDE8F88F000081
-:105FF000001001400014014077B581B004461546F9
-:106000000298A062A58500202064222084F83E002A
-:106010002A48A16BC8632A48A16B08642948A16B70
-:10602000C8640020A16B086502AE32682368191DA0
-:106030002B46A06BFCF7B8FD00BF00200090206845
-:106040000068009020684068009000BF00BF00BF5B
-:10605000002084F83C0000BF206970B100BF00BF81
-:1060600021680C3151E8001F41F4807021680C3127
-:1060700041E80002002AF3D100BF00BF00BF216841
-:10608000143151E8001F41F001002168143141E84A
-:106090000002002AF3D100BF00BF00BF2168143105
-:1060A00051E8001F41F040002168143141E800022E
-:1060B000002AF3D100BF002004B070BDED5A0008E3
-:1060C0009D5B00089D5A0008014691F83D0021287B
-:1060D00028D18868B0F5805F0BD1086948B90A6A91
-:1060E0001088C0F308000B685860086A801C0862BA
-:1060F00005E00B6A581C086218780B685860C88C59
-:10610000401E80B2C88458B90868C06820F080007A
-:106110000B68D8600868C06840F040000B68D86021
-:10612000002070470220FCE72DE9F04104460D46AF
-:1061300017469846069E34E0701C88B32EB1FCF7D3
-:1061400061FFA0EB0800B0422BD900BF00BF21685F
-:106150000C3151E8001F21F4D07021680C3141E866
-:106160000002002AF3D100BF00BF00BF2168143134
-:1061700051E8001F21F001002168143141E80002BC
-:10618000002AF3D100BF202084F83D0084F83E00AF
-:1061900000BF002084F83C0000BF0320BDE8F08170
-:1061A000FFE7206800682840A84201D1012000E0F4
-:1061B0000020B842C0D00020F0E7000010B502482F
-:1061C000FDF7BEFC10BD00007004002010B50248B1
-:1061D000FDF7B6FC10BD0000B404002000BFFEE7D0
-:1061E00003B401984100009850EAC12018BF042070
-:1061F0004A0D18BF40F0010040F2FF72B2EB515F50
-:1062000008BF40F00200012808BF052002B0704717
-:1062100002480068C0F30220704700000CED00E067
-:1062200010B5002804DB0A07130E054A135406E0D4
-:106230000A07140E034A00F00F031B1FD45410BDAD
-:1062400000E400E018ED00E030380A2801D2012017
-:106250007047002070470000014800787047000038
-:106260002402002010B500200749087000221021E8
-:106270000648FCF7C1FE002210210548FCF7BCFED1
-:10628000002000F007F810BD24020020001002409A
-:10629000000C02402DE9F04180460025102D01DB65
-:1062A000BDE8F0812C4805702C48465D2C48475DC0
-:1062B000002431E046FA04F000F0010048B1294A18
-:1062C00032F81410284A52F824000122FCF794FEF8
-:1062D00008E0244A32F81410234A52F8240000221D
-:1062E000FCF78AFE47FA04F000F0010048B11F4AAB
-:1062F00032F814101E4A52F824000122FCF77CFEEA
-:1063000008E01A4A32F81410194A52F82400002200
-:10631000FCF772FE601CC4B2042CCBDB002416E038
-:10632000AC4209D1134A32F81410134A52F824002F
-:106330000022FCF761FE08E00E4A32F814100E4A03
-:1063400052F824000122FCF757FE601CC4B2102C46
-:10635000E6DB00BFA4E700002402002004020020C6
-:106360001402002084010020740100209C01002000
-:106370008C010020E4010020A401002010B586B0AB
-:106380000446002001900B2003900120049002207D
-:10639000059000200090694601A8FCF763FC06B058
-:1063A00010BD000010B50649486880471022054915
-:1063B000054800F055F802494868804710BD0000C4
-:1063C000680100204402002000000E0870B5102271
-:1063D0000E49A1F11000FAF79AF9A8B10C494868E2
-:1063E000804772B6102209490A4800F05DF8044659
-:1063F0002CB906481038054610352ECD2EC062B691
-:1064000003494868804700BF70BD00004402002077
-:106410006801002000000E0810B5FFF7D7FF10BD7F
-:1064200010B5FFF7BFFF0C480068808BB0F57A7F8E
-:1064300003DD282108480068818307480068C08B75
-:10644000102803DD102104480068C1830348044676
-:1064500010341ECC1EC010BD640200203402002087
-:106460002DE9F84103460C4621461D46960802F0E8
-:106470000307002005E055F820C0C1F800C0091D41
-:10648000401CB042F7D36FB155F826000090EC469F
-:10649000002004E01CF8008001F80080401CB84295
-:1064A000F8D300BFBDE8F8812DE9FC5F07468846B8
-:1064B000154600244646A808019005F00309BA468F
-:1064C000FCF77CFC3846FFF759FF044624B1FCF783
-:1064D0001FFC2046BDE8FC9F4FF0000B0FE0D6F8F4
-:1064E00000C06246002351460220FCF71BFC044614
-:1064F00004B107E00AF1040A361D0BF1010B019803
-:106500008345ECD300BFB4B9B9F1000F13D04FF0FD
-:10651000FF300090EB46002003E0315C0BF80010E8
-:10652000401C4845F9D3002351460220009AFCF74D
-:10653000F9FB044600BFFCF7EBFB2046CAE700006E
-:1065400010B54FF480710248FCF74CFD10BD0000FF
-:106550000010024010B5002409E03220FBF7C2FF12
-:106560004FF480710348FCF73DFD601CC4B2142C4D
-:10657000F3DB10BD001002402DE9F04104468846CF
-:1065800017460020A074A08BB84200DAA78B3A46C9
-:1065900041466069FAF775F93A4661696068FDF746
-:1065A0008BFEFCF72FFD054608E0FCF72BFD0646A9
-:1065B000701BC82802D90120A07402E0A07C00282A
-:1065C000F3D000BFBDE8F08110B5044660680068F4
-:1065D000C06840F0100061680968C860E28BA1697A
-:1065E0006068FDF797F910BD70B504466068FDF767
-:1065F000FBF9E08BE16809684968401A86B206B980
-:1066000070BD002506E0A2695119206802F030F83B
-:10661000681C85B2B542F6DB204600F041F8E28BFB
-:10662000A1696068FDF776F900BFE9E770B5044637
-:10663000A08C618C884227DA2068808920842046DB
-:1066400000F034F8208CE18B88421DDC208CD8B11E
-:10665000208C40F6B831884203D9206801F0BCFF95
-:1066600012E0002506E0094A5119206801F0BCFF3C
-:10667000681C85B2208CA842F5DCA06C20B1218C6E
-:1066800022460248A36C984770BD0000802F00206E
-:1066900090F82620012A02D1428C0A444284704795
-:1066A000012180F82610002141847047002180F8E4
-:1066B00026104184704700002DE9F04104460F4642
-:1066C00016461448844204D1012204211248FCF7E2
-:1066D00093FCA08B96FBF0F01FFA80F8002507E0F2
-:1066E000A28B02FB05712046FFF746FF681C85B2AE
-:1066F0004545F5DBA08B00FB156086B20EB9BDE801
-:10670000F081A08B00FB057132462046FFF734FF75
-:1067100000BFF4E71801002000000240012181744D
-:10672000704770477047000010B5044610488088D5
-:10673000A04202DC00F04AF810BD002013E00C4932
-:10674000898801B911E00A490988491C4FF4FA7295
-:1067500091FBF2F302FB1311054A1180114689885F
-:10676000491E9180401CA042E9DB00BF00BFE3E767
-:10677000888100202DE9F04100F022F805460A2D1D
-:1067800002DA0020BDE8F08100260027022412E092
-:10679000204601F099FF8046B8F1AA0F09D1701C7C
-:1067A000C6B22746042E04DBF81CA84201DC80B2E6
-:1067B000E8E7601C84B2AC42EADB0020E2E70000BC
-:1067C00001488088704700008881002010B50020B3
-:1067D00006490880488088804FF4FA710348801D7C
-:1067E000FAF7C6F800200249088010BD8881002011
-:1067F00068020020FCF718FCFDF7ECFFFDF738FEFF
-:10680000FDF7E2FDFDF726FFFDF740FFFDF75AFF1C
-:10681000FBF7CAFC01E0FBF70FFDFCE770B5034690
-:106820000C4603E014F8015B03F8015B151EA2F1AE
-:106830000102F7D170BD2DE9F04104460D46164620
-:1068400014B90020BDE8F081082E01DA0020F9E734
-:10685000B01E81B2284600F038F80746A81910F893
-:10686000018C4FF6FF7000EA0828A81910F8020CF6
-:1068700040EA0808B84501D00020E3E728782070F6
-:1068800068786070A878000260806088E9780843C2
-:1068900060806078062802D1281DA06013E060782F
-:1068A000102809D128790002A080A08869790843BE
-:1068B000A080E81DA06006E028790002A080A088E2
-:1068C00069790843A0800120BCE730B502464FF645
-:1068D000FF7012E012F8014B6040002308E000F066
-:1068E000010424B14AF2010484EA600000E040108F
-:1068F0001C465D1CABB2082CF1DB0C1EA1F101059E
-:10690000A9B2E7D130BD2DE9FC4106460C4615463B
-:1069100098468DF8006041208DF80100200A8DF81E
-:106920000200E0B28DF80300280A8DF80400E8B2F6
-:106930008DF8050006216846FFF7C7FF0746F8B245
-:106940008DF80600380A8DF8070008216846C04710
-:10695000BDE8FC812DE9F0478EB081460E46154614
-:106960001F46DDF858A08DF8049010208DF8050022
-:10697000300A8DF80600F0B28DF80700280A8DF86D
-:106980000800E8B28DF809006806000E8DF80A00CC
-:1069900000240DE037F81400010A6000C01D01AAB0
-:1069A000115417F81410600008301154601C84B2A0
-:1069B0009DF80A0000EBD071B4EB610FEADB6000D8
-:1069C000C01D81B201A8FFF780FF80466000C01D96
-:1069D00001AA02F800804FEA182160000830115423
-:1069E0006000093081B201A8D0470EB0BDE8F08741
-:1069F0002DE9F05F81468A46934652464946A948AA
-:106A0000FFF719FF08B9BDE8F09FA74800680078B4
-:106A1000A4490978884204D0A2480078E82800D028
-:106A2000F1E74FF00008A148C0F800B09D48407859
-:106A300006287CD004DC032807D0042878D105E0A0
-:106A4000102876D04128F9D13BE000BF954847880F
-:106A500000789749087093484078487091480079C9
-:106A60004006000E887000250FE0384600F040F91F
-:106A70000646310A6800C01C8D4A11546800001D8A
-:106A80001654781C87B2681C85B286488088A84254
-:106A9000EBDC87488078C11C8548FFF716FF044669
-:106AA00083488078C01C824A1454210A104680789A
-:106AB000001D115410468078401D1146A1F80008B1
-:106AC000CBE0784847880078794908707548407865
-:106AD0004870744840880012887072488078C87086
-:106AE00070488088C0F3D71008716E48007940065E
-:106AF000000E487100250FE0384600F0F9F8064610
-:106B0000310A6800801D6A4A11546800C01D16547D
-:106B1000781C87B2681C85B262488088A842EBDC8A
-:106B2000604880884000801D81B2614802E018E022
-:106B30008EE04BE0FFF7C9FE04465A4880884000CB
-:106B4000801D5B4A1454210A564880884000C01DAD
-:106B5000115454488088400008301146A1F80008BC
-:106B60007BE050484788806840784E4989680978BA
-:106B700040EA01263146384601F062F88046B8F115
-:106B8000000F00D06FE008204949A1F800084548EF
-:106B900000780870434840784870424840880012A6
-:106BA000887040488078C8703E48806800780871D6
-:106BB0003C4880684078487106213D48FFF785FED3
-:106BC00004463B498C71200AC87144E03548478827
-:106BD000002517E03348806810F815603148816857
-:106BE0006800401C085C40EA06263146384601F041
-:106BF00027F88046781C87B2B8F1000F00D032E049
-:106C0000681C85B227488088A842E3DC0820284910
-:106C1000A1F800082348007808702248407848709E
-:106C200020484088001288701E488078C8701D482F
-:106C30008088001208711B480079487106211C48A1
-:106C4000FFF743FE04461A498C71200AC87102E01E
-:106C50004FF0010807E000BF00BF1548B0F800186A
-:106C600000F028F8CFE605201149A1F800080D48EA
-:106C7000007808700B48407840F080004870084663
-:106C800080F802800321FFF720FE04460849CC70FB
-:106C9000200A08710846B0F8001800F00BF800BF91
-:106CA000B1E600004C8E00202404002028040020BF
-:106CB000588E002070B504460D460A480A490968F6
-:106CC000884204D12A462146836B984708E007484A
-:106CD00005490968884203D12A462146836B9847B3
-:106CE00070BD00007800002028040020180100205A
-:106CF000F0B501460020B1F5A27F06D006DCA2293E
-:106D000005D005DCA22904D204E0A7E29AE2A6E2BB
-:106D10004AE14EE18E0000BF7E447668B744000031
-:106D2000820900008409000086090000880900002B
-:106D30008A0900008C0900008E09000090090000FB
-:106D400092090000940900009609000098090000CB
-:106D50009A0900009C0900009E090000A00900009B
-:106D6000A2090000A4090000A6090000A80900006B
-:106D7000AA090000AC090000AE090000B00900003B
-:106D8000B2090000B4090000B6090000B80900000B
-:106D9000BA090000BC090000BE090000C0090000DB
-:106DA000C2090000C4090000C6090000C8090000AB
-:106DB000CA090000CC090000CE090000D00900007B
-:106DC000D2090000D4090000D6090000D80900004B
-:106DD000DA090000DC090000DE090000E00900001B
-:106DE000E2090000E4090000E6090000E8090000EB
-:106DF000EA090000EC090000EE090000F4090000B7
-:106E0000F6090000F8090000FA090000FC0900007A
-:106E1000FE090000000A0000020A0000040A000047
-:106E2000060A0000080A00000A0A00000C0A000016
-:106E30000E0A0000100A0000120A0000140A0000E6
-:106E4000160A0000180A00001A0A00001C0A0000B6
-:106E50001E0A0000200A0000220A0000240A000086
-:106E6000260A0000300A0000320A0000340A00003E
-:106E7000360A0000380A00003A0A00003C0A000006
-:106E80003E0A0000400A0000420A0000440A0000D6
-:106E9000460A0000480A00004A0A00004C0A0000A6
-:106EA0004E0A0000500A0000520A0000540A000076
-:106EB000560A0000580A00005A0A00005C0A000046
-:106EC0005E0A00006E0A0000700A0000720A0000EC
-:106ED000740A0000760A0000780A00007A0A0000AE
-:106EE0007C0A00007E0A0000800A0000820A00007E
-:106EF000840A0000860A0000880A00008A0A00004E
-:106F00008C0A00008E0A0000900A0000920A00001D
-:106F1000940A0000960A0000980A00009A0A0000ED
-:106F20009C0A00009E0A0000A00A0000A20A0000BD
-:106F3000A40A0000A60A0000A80A0000AA0A00008D
-:106F4000AC0A0000AE0A0000B00A0000B20A00005D
-:106F5000B40A0000B60A0000B80A0000BA0A00002D
-:106F6000BC0A0000BE0A0000C00A0000C20A0000FD
-:106F7000C40A0000C60A0000C80A0000CA0A0000CD
-:106F8000CC0A0000CE0A0000D00A0000D20A00009D
-:106F9000D40A0000D60A0000D80A0000DA0A00006D
-:106FA000DC0A0000DE0A0000A1F1A305A12D00D239
-:106FB00000E052E1AE0000BF7E447668B7440000B6
-:106FC000420800004408000046080000480800008D
-:106FD0004A0800004C0800004E080000500800005D
-:106FE000520800005408000056080000580800002D
-:106FF0005A0800005C0800005E08000060080000FD
-:1070000062080000640800006608000068080000CC
-:107010006A0800006C0800006E080000700800009C
-:10702000720800007408000076080000780800006C
-:107030007A0800007C0800007E080000800800003C
-:10704000820800008408000086080000880800000C
-:107050008A0800008C0800008E08000090080000DC
-:1070600092080000940800009608000098080000AC
-:107070009A0800009C0800009E080000A00800007C
-:10708000A2080000A4080000A6080000A80800004C
-:10709000AA080000AC080000AE080000B00800001C
-:1070A000B2080000B4080000B6080000B8080000EC
-:1070B000BA080000BC080000BE080000C0080000BC
-:1070C000C2080000C4080000C6080000C80800008C
-:1070D000CA080000CC080000CE080000D00800005C
-:1070E000D2080000D4080000D6080000D80800002C
-:1070F000DA080000DC080000DE080000E0080000FC
-:10710000E2080000E4080000E6080000E8080000CB
-:10711000EA080000EC080000EE080000F00800009B
-:10712000F2080000F4080000F6080000F80800006B
-:10713000FA080000FC080000FE080000000900003A
-:107140000209000004090000060900000809000007
-:107150000A0900000C0900000E09000010090000D7
-:1071600012090000140900001609000018090000A7
-:107170001A0900001C0900001E0900002009000077
-:107180002209000024090000260900002809000047
-:107190002A0900002C0900002E0900003009000017
-:1071A00032090000340900003609000038090000E7
-:1071B0003A0900003C0900003E09000040090000B7
-:1071C0004209000044090000460900004809000087
-:1071D0004A0900004C0900004E0900005009000057
-:1071E0005209000054090000560900005809000027
-:1071F0005A0900005C0900005E09000060090000F7
-:1072000062090000640900006609000068090000C6
-:107210006A0900006C0900006E0900007009000096
-:107220007209000074090000760900007809000066
-:107230007A0900007C0900007E0900008009000036
-:1072400082090000B1F5F37F05D005DCA1F24515F8
-:10725000A12D02D204E0FDE34AE1ACE172E3CFE20A
-:10726000AE0000BF7E447668B7440000DA06000036
-:10727000DC060000DE060000E0060000E20600007A
-:10728000E4060000E6060000E8060000EA0600004A
-:10729000EC060000EE060000F0060000F20600001A
-:1072A000F4060000F6060000F8060000FA060000EA
-:1072B000FC060000FE0600000007000002070000B8
-:1072C0000407000006070000080700000A07000086
-:1072D0000C0700000E070000100700001207000056
-:1072E0001407000016070000180700001A07000026
-:1072F0001C0700001E0700002007000022070000F6
-:107300002407000026070000280700002A070000C5
-:107310002C0700002E070000300700003207000095
-:107320003407000036070000380700003A07000065
-:107330003C0700003E070000400700004207000035
-:107340004407000046070000480700004A07000005
-:107350004C0700004E0700005007000052070000D5
-:107360005407000056070000580700005A070000A5
-:107370005C0700005E070000600700006207000075
-:107380006407000066070000680700006A07000045
-:107390006C0700006E070000700700007207000015
-:1073A0007407000076070000780700007A070000E5
-:1073B0007C0700007E0700008007000082070000B5
-:1073C0008407000086070000880700008A07000085
-:1073D0008C0700008E070000900700009207000055
-:1073E0009407000096070000980700009A07000025
-:1073F0009C0700009E070000A0070000A2070000F5
-:10740000A4070000A6070000A8070000AA070000C4
-:10741000AC070000AE070000B0070000B207000094
-:10742000B4070000B6070000B8070000BA07000064
-:10743000BC070000BE070000C0070000C207000034
-:10744000C4070000C6070000C8070000CA07000004
-:10745000CC070000CE070000D0070000D2070000D4
-:10746000D4070000D6070000D8070000DA070000A4
-:10747000DC070000DE070000E0070000E207000074
-:10748000E4070000E6070000EC070000EE0700003C
-:10749000F0070000F2070000F4070000F607000004
-:1074A000F8070000FA070000FC070000FE070000D4
-:1074B00000080000020800000408000006080000A0
-:1074C000080800000A0800000C0800000E08000070
-:1074D0001008000012080000140800001608000040
-:1074E000180800001A0800001C0800001E08000010
-:1074F00040F237268D1BB1425CD055DCA1F2E71576
-:10750000502D58D2DFE815F0C302C402C502C602EE
-:10751000C702C802C902CA02CB02CC02CD02CE0207
-:10752000CF02D002D102D202D302D402D502D602B7
-:10753000D702D802D902DA02DB02DC02DD02DE0267
-:10754000DF02E002E102E202E302E402E502E60217
-:10755000E702E802E902EA02EB02EC02ED02EE02C7
-:10756000EF02F002F102F202F302F402F502F60277
-:10757000F702F802F902FA02FB02FC02FD02FE0227
-:10758000FF020003010302030303040305030603D0
-:107590000703080309030A030B030C030D030E037F
-:1075A0000F03100311031203292D70D02FDC292D96
-:1075B000A7D201E0BBE2E5E0DFE815F0E400BA02A3
-:1075C000BB02BC02BD02BE02BF02C002C102C202B7
-:1075D000C302C402C502C602C702C802C902CA0267
-:1075E000CB02CC02CD02CE02CF02D002D102D20217
-:1075F000D302D402D502D602D702D802D902DA02C7
-:10760000DB02DC02DD02DE02DF02E002E1023D2DF0
-:107610007ED018DCA5F12A05132DC9D2DFE815F0BC
-:10762000B102B202B302B402B502B602B702B802A6
-:10763000B902BA02BB02BC02BD02BE02BF02C00256
-:10764000C102C202C302472D7ED00EDCA5F13E0569
-:10765000092DADD2DFE815F0A902AA02AB02AC02F7
-:10766000AD02AE02AF02B002B10244F6EC37EE1B3F
-:10767000BD426AD00CDC482D68D0A5F59645E93DA1
-:10768000002D7DD0012D7CD0022D7BD1BCE277E294
-:10769000012E78D0022E77D0032E76D0042EF4D18E
-:1076A000C2E200BF00BF00BF00BF00BF00BF00BFFD
-:1076B00000BF00BF00BF00BF00BF00BF00BF00BFD2
-:1076C00000BF00BF00BF00BF00BF00BF00BF00BFC2
-:1076D00000BF00BF00BF00BF00BF00BF00BF00BFB2
-:1076E00000BF00BF00BF00BF00BF00BF00BF00BFA2
-:1076F00000BF00BF00BF00BF00BF00BF00BF00BF92
-:1077000000BF00BF00BF00BF00BF00BF00BF00E060
-:107710004AE200BF00BF00BF00BF00BF00BF00BF04
-:1077200000BF00BF00BF00BF00BF00BF00BF00BF61
-:1077300000BF00BF00BF00BF00BF00BF00BF00BF51
-:1077400000BF00BF00BF02E038E25EE237E200BFE8
-:1077500000BF00BF00BF00BF00BF00BF00BF00BF31
-:1077600000BF00BF00BF00BF00BF00BF00BF00BF21
-:1077700000BF00BF00BF00BF00BF00BF00BF05E0EB
-:1077800040E240E253E241E248E24AE200BF00BF89
-:1077900000BF00BF00BF00BF00BF00BF00BF00BFF1
-:1077A00000BF00BF00BF00BF00BF00BF00BF00BFE1
-:1077B00000BF00BF00BF00BF00BF00BF00BF00BFD1
-:1077C00000BF00BF00BF00BF00BF00BF00BF00BFC1
-:1077D00000BF00BF00BF00BF00BF00BF00BF00BFB1
-:1077E00000BF00BF00BF00BF00BF00BF00BF00BFA1
-:1077F00000BF00BF00BF00BF00BF00BF00BF00BF91
-:1078000000BF00BF00BF00BF00BF00BF00BF00BF80
-:1078100000BF00BF00BF00BF00BF00BF00BF00BF70
-:1078200000BF00BF00BF00BF00BF00BF00BF00BF60
-:1078300000BF00BF00BF00BF00BF00BF00BF00BF50
-:1078400000BF00BF00BF00BF00BF00BF00BF00BF40
-:1078500000BF00BF00BF00BF00BF00BF00BF00BF30
-:1078600000BF00BF00BF00BF00BF00BF00BF00BF20
-:1078700000BF00BF00BF00BF00BF00BF00BF00BF10
-:1078800000BF00BF00BF00BF00BF00BF00BF00BF00
-:1078900000BF00BF00BF00BF00BF00BF00BF00BFF0
-:1078A00000BF00BF00BF00BF00BF00BF00BF00BFE0
-:1078B00000BF00BF00BF00BF00BF00BF00BF00BFD0
-:1078C00000BF00BF00BF00BF00BF00BF00BF00BFC0
-:1078D00000BF00BF00BF00BF00BF00BF00BF00BFB0
-:1078E00000BF00BF00BF00BF00BF00BF00BF00BFA0
-:1078F00000BF00BF00BF00BF00BF00BF00BF00BF90
-:1079000000BF00BF00BF00BF00BF00BF00BF00BF7F
-:1079100000BF00BF00BF00BF00BF00BF00BF00BF6F
-:1079200000BF00BF00BF00BF00BF00BF00BF00BF5F
-:1079300000BF00BF00BF00BF00BF00BF00BF00BF4F
-:1079400000BF00BF00BF00BF00BF00BF00BF00BF3F
-:1079500000BF00BF00BF00BF00BF00BF00BF00BF2F
-:1079600000BF00BF00BF00BF00BF00BF00BF00BF1F
-:1079700000BF00BF00BF00BF00BF00BF00BF00BF0F
-:1079800000BF00BF00BF00BF00BF00BF00BF00BFFF
-:1079900000BF00BF00BF00BF00BF00BF00BF00BFEF
-:1079A00000BF00BF00BF00BF00BF00BF00BF00BFDF
-:1079B00000BF00BF00BF00BF00BF00BF00BF00BFCF
-:1079C00000BF00BF00BF00BF00BF00BF00BF00BFBF
-:1079D00000BF00BF00BF00BF00BF00BF00BF00BFAF
-:1079E00000BF00BF00BF00BF00BF00BF00BF00BF9F
-:1079F00000BF00BF00BF00BF00BF00BF00BF00BF8F
-:107A000000BF00BF00BF00BF00BF00BF00BF00BF7E
-:107A100000BF00BF00BF00BF00BF00BF00BF00BF6E
-:107A200000BF00BF00BF00BF00BF00BF00BF00BF5E
-:107A300000BF00BF00BF00BF00BF00BF00BF00BF4E
-:107A400000BF00BF00BF00BF00BF00BF00BF00BF3E
-:107A500000BF00E01AE000BF00BF00BF00BF00BFD2
-:107A600000BF00BF00BF00BF00BF00BF00BF00BF1E
-:107A700000BF00BF00BF00BF00BF00BF00BF00BF0E
-:107A800000BF00BF00BF00BF00BF00BF00BF00BFFE
-:107A900000BF00BF00BF00BF00BF00BF00BF00BFEE
-:107AA00000BF00BF00BF00BF00BF00BF00BF00BFDE
-:107AB00000BF00BF00BF00BF00BF00BF00BF00BFCE
-:107AC00000BF00BF00BF00BF00BF00BF00BF00BFBE
-:107AD00000BF00BF00BF00BF00BF00BF00BF00BFAE
-:107AE00000BF00BF00BF00BF00BF00BF00BF00BF9E
-:107AF00000BF00BF00BF00BF00BF00BF00BF00BF8E
-:107B000000BF00BF00BF00BF00BF00BF00BF00BF7D
-:107B100000BF00BF00BF00BF00BF00BF00BF00BF6D
-:107B200000BF00BF00BF00BF00BF00BF00BF00BF5D
-:107B300000BF00BF00BF00BF00BF00BF00BF00BF4D
-:107B400000BF00BF00BF00BF00BF00BF00BF00BF3D
-:107B500000BF00BF00BF00BF00BF00BF00BF00BF2D
-:107B600000BF00BF00BF00BF00BF00BF00BF00BF1D
-:107B700000BF00BF00BF00BF00BF00BF00BF00BF0D
-:107B800000BF00BF00BF00BF00BF00BF00BF00BFFD
-:107B900000BF00BF00BF00BF00BF00BF00BF00BFED
-:107BA00000BF00BF00BF00BF00BF00BF00BF00BFDD
-:107BB00000BF00BF00BF00BF00BF00BF00BF502517
-:107BC0001D4EB68B7600AE4203D11C4A32F811002E
-:107BD00017E0194EB68B7600502E12D2164EB68B89
-:107BE00091FBF6F6B3B2144EB68B91FBF6F706FB9B
-:107BF0001716B4B203EB8306104F07EB061232F8E8
-:107C0000140016E000BF00BF00BF00BFA1F59C45F7
-:107C1000203D094E103636F815000AE0064DA87EC4
-:107C200007E0054DA88B04E0034DE88B01E0002040
-:107C300000BF00BFF0BD0000340200205807002044
-:107C40002DE9F04105460C464FF0000842F635316B
-:107C5000681A8D4259D051DC42F61831A5EB01006B
-:107C60008D4253D037DC42F60A31A5EB01008D423C
-:107C70007ED025DC42F60331A5EB01008D4278D0A1
-:107C800016DC42F6FA21A5EB01008D4272D008DC29
-:107C9000FC2D70D0A5F52850F838A8B301286BD179
-:107CA00086E0012869D0022868D00828F7D1A0E032
-:107CB000072861D2DFE800F0609FA0A1A2A3A40082
-:107CC0000E28F6D2DFE800F0589E9FA0A1A2A3A440
-:107CD000A5A6A7A8A9AA1D28EBD2DFE800F04DA110
-:107CE000A2A3A4A5A6A7A8AFB0B1B2B3B4B5B6B7C6
-:107CF000B8B9BABBBCBDBEBFC0C1C2001D2871D0DF
-:107D000016DC1D28D5D202E049E0ABE087E0DFE8D1
-:107D100000F033AAABACADAEAFB0B1B2B3B4B5B650
-:107D2000B9BABBBCBDBEBFC0C1C2C3C4C5C6C70013
-:107D30002C287DD00CDCA0F11E000E28B9D2DFE883
-:107D400000F0B1B2B3B4B5B6B7B8B9BABBBCBDBE3A
-:107D500042F2EC22811A90426BD018DC302869D0B4
-:107D60000DDC2D2867D02E2866D02F2897D1AAE0C9
-:107D700047E03FE026E0F6E019E02DE033E08B2815
-:107D80007ED0A0F50850EB38002888D1B9E007294B
-:107D90008FD2DFE801F0EDB8B9BAC4CFDC00764885
-:107DA0004FF6FF721146D0F8603120B29847DFE0FD
-:107DB00071484FF6FF722146D0F860314FF0FF3026
-:107DC0009847D5E06C4822464FF6FF71D0F86031F5
-:107DD0004FF0FF309847CBE06748D0F850110020B3
-:107DE0008847C5E05DE06448D0F8541120468847D4
-:107DF000BEE000BF00BF00BF00BF00BF00BF00BFAC
-:107E000000BF00BF00BF00BF00BF00BF00BF00BF7A
-:107E100000BF00BF00BF00BF00BF00BF00BF00BF6A
-:107E200000BF00BF00BF00BF00BF00BF00BF04E035
-:107E300046E067E048E044E044E000BF00BF00BF28
-:107E400000BF00BF00BF00BF00BF00BF00BF00BF3A
-:107E500000BF00BF00BF00BF00BF00BF00BF00BF2A
-:107E600000BF00BF00BF00BF00BF00BF00BF00BF1A
-:107E700000BF00BF00BF00BF00BF00BF00BF00E0E9
-:107E800039E000BF00BF00BF00BF00BF00BF00BFA0
-:107E900000BF00BF00BF00BF00BF00BF00BF00BFEA
-:107EA00000BF00BF00BF00BF00BF00BF00BF00BFDA
-:107EB00000BF00BF00BF00BF00BF00BF00BF00BFCA
-:107EC00000BF00BF00BF00BFA5F52C5002380A213B
-:107ED00090FBF1F0C6B2A5F52C50023890FBF1F200
-:107EE00001FB1200C7B2244832463946D0F85C3153
-:107EF000204698473CE0E0B21F4AD2F86411884718
-:107F000036E000BF00BF00BF00BFA5F59C40203891
-:107F10001A4921F810401039486A804728E017486C
-:107F200010388476807E1649087014491039486AE2
-:107F300080471DE0B4F57A7F02DD4FF0030805E0CD
-:107F40000E48103884830146486A804710E0102CA0
-:107F500002DD4FF0030805E008481038C4830146ED
-:107F6000486A804704E0E0B2064A5168884700BF8B
-:107F700000BF4046BDE8F081880200204402002096
-:107F80000C040020780200200548807E054909681D
-:107F900008700548054988640549886470470000F1
-:107FA0003402002024040020F16900087800002039
-:107FB0001801002070470000032809DC05490988E2
-:107FC000814203D10021034A118001E00149088068
-:107FD00070470000740200200848008830B1012872
-:107FE00005D0022804D0032804D102E003E002E017
-:107FF00001E000E000BF00BF7047000074020020F5
-:1080000010B50446024841682046884710BD00006C
-:108010002802002070B50346002012E0052500EB81
-:1080200080060A4C2468103404F82650074C246853
-:10803000E380064C24682171044C24686271441C5E
-:10804000E0B2034CE48B8442E8DC70BD0404002001
-:108050003402002010B504460948C08BA0420DDD53
-:10806000084800684480072104EB84020548006842
-:10807000103000F822102046FFF7C2FF10BD0000AC
-:10808000340200200404002070B5034600202DE0D7
-:10809000062500EB8006184C2468103404F826509E
-:1080A000B3F1FF3F04D1144C2468B4F9084000E058
-:1080B0001C46114D2D682C814FF6FF74A24203D14E
-:1080C0000D4C2468648900E014460B4D2D686C81CA
-:1080D0004FF6FF74A14203D1074C2468A48900E045
-:1080E0000C46054D2D68AC81441CE0B2034CE48B7A
-:1080F0008442CDDC70BD0000040400203402002066
-:10810000002009E0042200EB8003064909681031D1
-:1081100001F82320411CC8B20349C98B8142F1DC1C
-:1081200070470000040400203402002010B501460E
-:1081300000200CE0032300EB8004074A1268103291
-:1081400002F82430044A1268D180421CD0B2034A9B
-:10815000D28B8242EEDC10BD0404002034020020E9
-:1081600010B5014600200CE0022300EB8004074A12
-:108170001268103202F82430044A1268D180421C7E
-:10818000D0B2034AD28B8242EEDC10BD0404002040
-:108190003402002003480068D0F870010249886466
-:1081A0007047000004040020180100202DE9F74F5B
-:1081B00084B004460F46002003905B480068408866
-:1081C00000EB800158480068103000EB81055748EB
-:1081D000006890F82800012809D154490968C86A44
-:1081E00052490968C96A3A468B6B214698474E48FE
-:1081F000006800782178884202D0641C781E87B21B
-:1082000094F800B094F80180781E215CB81E205CC0
-:1082100041EA00200290444800680078584502D0A6
-:1082200007B0BDE8F08FB8F1040F09D0B8F1060F20
-:1082300006D0B8F1100F03D0B8F1410F00D0EFE72E
-:10824000B81E81B22046FEF740FB81464FEA292046
-:1082500040EA09201FFA80F90298484500D0DFE77C
-:10826000B8F1410F01D104F1060A314906980860BE
-:1082700000202882E86820F08040E86028780828FC
-:108280002AD2DFE800F0040523242526272823E04E
-:1082900025480068408800EB8000264901EB00106B
-:1082A000019000260DE0012000EB46001AF80000C6
-:1082B0001AF8161040EA0121019820F81610701CD7
-:1082C00086B21D48808BB042EDDC05E004E003E09F
-:1082D00002E001E000E000BF00BF039800B19FE7AB
-:1082E000012028702A7801219140E8688843E860DD
-:1082F000002068800C4800684088401C0A490968D2
-:1083000048800948006841880B48C08B814203DBE4
-:108310000020054909684880034909688878FFF703
-:108320006FFE00BF7CE7000004040020080400206A
-:1083300084020020580700203402002070B5044653
-:108340000D4603482A462146836B984770BD0000BE
-:108350001801002008B500200121FE22009208BD6E
-:1083600070B544F620640548057F0549096808781A
-:10837000044B2A462146FEF7C6FA70BD340200209F
-:10838000040400203D8300087CB542F60234012538
-:108390000C480068C08801900A480068407900EBEA
-:1083A000800004EB40000749096809794418064831
-:1083B000044900900968087801AB2A462146FEF777
-:1083C000C9FA7CBD040400203D8300087CB5FA2472
-:1083D00001250320019005480549009009680878A7
-:1083E00001AB2A462146FEF7B5FA7CBD3D83000865
-:1083F000040400203EB542F6F82403250C4800682A
-:108400000089ADF804000A4800688089ADF80600CC
-:10841000074800684089ADF8080006480449009004
-:108420000968087801AB2A462146FEF793FA3EBD5B
-:10843000040400203D8300087CB50D240125074875
-:108440000068C088019006480449009009680878CF
-:1084500001AB2A462146FEF77DFA7CBD04040020CC
-:108460003D83000870B500254D480068408800EB4A
-:1084700080014B480068103000EB8104E06800F098
-:108480008040A0B9208A401C80B2208208280EDDDE
-:10849000E06840F08040E06041490968498801EBAC
-:1084A0008101404A02EB01105021F8F761FA20786F
-:1084B000082848D2DFE800F00405080B0E11141755
-:1084C00042E0FFF74DFF3FE000F072F83CE0FFF7BD
-:1084D000B3FF39E0FFF73EFF36E0FFF755FF33E02B
-:1084E000FFF788FF30E0608830B901202E49096825
-:1084F00081F82800FFF76AFF6088401C6080608870
-:1085000032281EDD00202849096881F82800608093
-:1085100001202070224800684088401C20490968DA
-:1085200048801F48006841882048C08B814203DB97
-:1085300000201B4909684880194909688878FFF7B5
-:108540005FFD012500E000BF00BF05B170BD608880
-:10855000401C60806088032820DB22780121914044
-:10856000E0680843E06000206080012020700C4833
-:1085700000684088401C0A4909684880084800682B
-:1085800041880A48C08B814203DB00200449096806
-:108590004880034909688878FFF732FD00BFD5E7B6
-:1085A00004040020580700200804002034020020A2
-:1085B0007CB50C2401250020019005480549009058
-:1085C0000968087801AB2A462146FEF7C3F97CBD4D
-:1085D0003D8300080404002000B970470021416178
-:1085E0000161C16000BFF8E770B504460D460CB9E3
-:1085F000002070BDE06808B90020FAE745B1D4E971
-:108600000006236903FB060132462846FEF706F9F9
-:108610002069401CA16890FBF1F201FB120020616F
-:10862000E068401EE0600120E3E770B504460D46B7
-:108630000CB9002070BDD4E90210884201D100209D
-:10864000F8E745B1D4E90016636903FB061032462A
-:108650002946FEF7E3F86069401CA16890FBF1F23F
-:1086600001FB12006061E068401CE0600120E1E76E
-:1086700070B504460D460CB9002070BDD4E9021057
-:10868000884204DA29462046FFF7CFFFF5E745B1D7
-:10869000D4E90016636903FB061032462946FEF74B
-:1086A000BDF86069401CA16890FBF1F201FB12006B
-:1086B00060612069401CA16890FBF1F201FB12008F
-:1086C00020610120D9E7000010B5014609488088E3
-:1086D000884201DC002010BD0648008808444FF4A1
-:1086E000FA7390FBF3F403FB140082B20148801D7F
-:1086F000805CF0E78881002013498988B1F5FA7F12
-:108700000EDB11490988491C4FF4FA7291FBF2F310
-:1087100002FB13110C4A118011468988491E918071
-:1087200009494A88891D8854891F4988491C4FF482
-:10873000FA7291FBF2F302FB1311034A51801146C6
-:108740008988491C918070478881002010B50029D4
-:108750000AD00878002807D005487844F8F77CF953
-:10876000002801D0002010BD0248784410BD000050
-:108770000E0200000602000010B500290AD0087899
-:10878000002807D005487844F8F766F9002801D09A
-:10879000002010BD0248784410BD0000F202000025
-:1087A000EA0200004FF04070E1EE100A7047F8F75F
-:1087B000E9BCF8F71DBE00061016000610160000F2
-:1087C0000000000000000102030406070809000081
-:1087D00000000102030400000153480000000000F3
-:1087E0000000000000000000000000000019484BDD
-:1087F00030303100000000000000000000000000E8
-:108800000000000000000000000000000000000068
-:108810000000000000000000000000000000000058
-:108820000000000000000000000100000000000047
-:108830000100000003000000000000000000000034
-:108840000100000004000000040000080000000017
-:108850000000000200010000100000000000000005
-:108860000000000030313233343536373839414278
-:108870004344454640305800303132333435363782
-:108880003839616263646566403078003031323374
-:108890003435363738396162636465667870003024
-:1088A00031323334353637383941424344454658FE
-:1088B0005000000002400000000000A00000000086
-:1088C00005400000000000C8000000000C4000004F
-:1088D0000000409C00000000194000000020BCBEC9
-:1088E0000000000034400000BFC91B8E00000004DF
-:1088F000B5400000504BCFD06607E2CF010000002A
-:108900006C4100003E8251AADFEEA7340100000056
-:10891000D9420000DCB5A0E23A301F97FFFFFFFF0D
-:10892000B4450000FD25A0C8E9A3C14FFFFFFFFF2C
-:10893000FF3F00000000008000000000FF3F00003B
-:108940000000008000000000948A00080000002061
-:108950002C040000C4010008F08B00082C04002047
-:1089600094A2000020020008100100004300000053
-:10897000F8FFFFFF00404040404040404040414140
-:1089800041414140404040404040404040404040E4
-:10899000404040404005020202020202020202027E
-:1089A000020202020220202020202020202020027B
-:1089B000020202020202909090909090101010100B
-:1089C00010101010101010101010101010101010A7
-:1089D000020202020202888888888888080808083B
-:1089E0000808080808080808080808080808080807
-:1089F000020202024000000000000000000000002F
-:108A00000000000000000000000000000000000066
-:108A10000000000000000000000000000000000056
-:108A20000000000000000000000000000000000046
-:108A30000000000000000000000000000000000036
-:108A40000000000000000000000000000000000026
-:108A50000000000000000000000000000000000016
-:108A60000000000000000000000000000000000006
-:108A700000000000000000001C0000004300000097
-:108A8000F8FFFFFF0C0000000E0000000F000000C8
-:108A90002E0000004132104201031924F4135565E1
-:108AA0001B08410413580C2A202CE3B80B0B14109C
-:108AB00018180B14C823182230142070041420181E
-:108AC000061420B8052A208213383B1C20F04610DB
-:108AD000EA0B2E611AC98013B96614081D671B08BA
-:108AE000E90C1A910C411A2D081A48501AB4501A60
-:108AF000D8501A7804295013A8520C1020605E50E8
-:108B00002B180120091C501A60501A2C501A589C1E
-:108B10001AF808295013186A0C3420D075A01A25A9
-:108B2000141A23042A687CAC100240041A40131261
-:108B300008220469144A04041A02741129051A0847
-:108B400010A9040A1D0C045940790419441280220A
-:108B5000402905197E396D29585910100E0D0E0F38
-:108B60000C0B0A090807040302011B06051016086E
-:108B7000090A0B0C4008010203040506071365628D
-:108B80001B0895041A590401201321641408CD63AD
-:108B90001B08A5041A190C1B34026681620613D93E
-:108BA0007F1B08B9045A781C02FFE8015013618149
-:108BB0001B082D041A01041315801B0889041A557B
-:108BC000041A95101365841B08AD088113880214DC
-:108BD00020180133200113F16C1C08417C30127FF6
-:108BE0001B08B50413F16914080C044220000000AE
+:10023000520728BF30C148BF0B6070471FB503F09D
+:100240005BFB1FBD10B510BD00F072F91146FFF742
+:10025000F5FF03F079FA00F090F903B4FFF7F2FF2D
+:1002600003BC00F099F9000009488047094800479D
+:10027000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE756
+:10028000FEE7FEE704480549054A064B70470000B3
+:100290003129000889010008D87B0020D88B002074
+:1002A000D8830020D883002053EA020C00F0698034
+:1002B0002DE9F04B4FF00006002B1FBFB3FA83F57A
+:1002C00003FA05F424FA05F65E4012BF1643B2FAAB
+:1002D00082F502FA05F4C5F120051EBF22FA05FCDD
+:1002E00044EA0C04203556EA044C4FEA144418BF83
+:1002F000641C4FF000084FF00009904271EB030CB2
+:1003000039D3002919BFB1FA81F701FA07F6B0FA1B
+:1003100080F700FA07F6C7F120071EBF20FA07FC96
+:1003200046EA0C062037B6FBF4FCA7EB0507103FA6
+:1003300007F01F0BCBF120060CFA0BFB2CFA06F68C
+:1003400044BFB3460026202FA4BF5E464FF0000BEB
+:100350005BEA060C08BF4FF0010B19EB0B09ABFB76
+:10036000027C48EB0608C01B06FB02CC0BFB03CC4F
+:1003700071EB0C01C1E70B46024641464846BDE819
+:10038000F08B13B54FF000004FF00001AFF3008089
+:10039000BDE81C40704740EA010310B59B070FD130
+:1003A000042A0DD310C808C9121F9C42F8D020BAE5
+:1003B00019BA884201D9012010BD4FF0FF3010BD9D
+:1003C0001AB1D30703D0521C07E0002010BD10F86B
+:1003D000013B11F8014B1B1B07D110F8013B11F831
+:1003E000014B1B1B01D1921EF1D1184610BD032AEF
+:1003F00040F2308010F0030C00F0158011F8013B42
+:10040000BCF1020F624498BF11F801CB00F8013B28
+:1004100038BF11F8013BA2F1040298BF00F801CBEC
+:1004200038BF00F8013B11F0030300F04F80083A99
+:10043000C0F0088051F8043B083A51F804CBA0E81A
+:100440000810F5E7121D5CBF51F8043B40F8043B6F
+:10045000AFF30080D20724BF11F8013B11F801CBA4
+:1004600048BF11F8012B24BF00F8013B00F801CB75
+:1004700048BF00F8012B70474FF0000200B513464B
+:1004800094469646203922BFA0E80C50A0E80C50B4
+:10049000B1F12001BFF4F7AF090728BFA0E80C5065
+:1004A00048BF0CC05DF804EB890028BF40F8042B5E
+:1004B00008BF704748BF20F8022B11F0804F18BFCB
+:1004C00000F8012B704770477047704710B5203A0D
+:1004D000C0F00B80B1E81850203AA0E81850B1E8FD
+:1004E0001850A0E81850BFF4F5AF5FEA027C24BFB3
+:1004F000B1E81850A0E8185044BF18C918C0BDE8AA
+:1005000010405FEA827C24BF51F8043B40F8043B72
+:1005100008BF7047D20728BF31F8023B48BF11F827
+:10052000012B28BF20F8023B48BF00F8012B704781
+:10053000754600F02BF8AE4605006946534620F09C
+:100540000700854618B020B5FFF79CFEBDE82040A7
+:100550004FF000064FF000074FF000084FF0000B7F
+:1005600021F00701AC46ACE8C009ACE8C009ACE832
+:10057000C009ACE8C0098D46704710B50446AFF31A
+:1005800000802046BDE81040FFF767BE0048704776
+:10059000787B00207047000001491820ABBEFEE7C1
+:1005A0002600020000BFFEE710B5024800F078FA0E
+:1005B00010BD0000E803002010B5024800F070FAFA
+:1005C00010BD00004804002010B5024800F068FA91
+:1005D00010BD00006805002010B5024800F060FA68
+:1005E00010BD0000C805002010B5024800F058FA00
+:1005F00010BD0000A804002010B5024800F050FA19
+:1006000010BD0000080500200146087810381823A6
+:10061000B0FBF3F20848805CC865032A05D9086876
+:100620006FF30900001D886503E008686FF3090097
+:100630008865886D70470000023900080146002077
+:100640008A6A8B69CBB932B1012A0DD0022A03D054
+:10065000032A10D10EE000BFCB6A03F08073B3F120
+:10066000807F00D1012007E0CB6AB3F1C07F00D1C9
+:10067000012001E000E000BF34E08B69B3F5005FCA
+:100680001AD132B1012A07D0022A03D0032A11D18C
+:100690000AE000BF01200EE0CB6A03F08073B3F1E3
+:1006A000807F00D1012006E0CB6AB3F1C07F00D18A
+:1006B000012000E000BF15E032B1012A05D0022A76
+:1006C00004D0032A0CD103E000BF00BF012008E0E2
+:1006D000CB6A03F08073B3F1807F00D1012000E08A
+:1006E00000BF00BF704730B50468246824F480243C
+:1006F00005682C60046863608468402C04D1046839
+:10070000A2600468E16003E00468A1600468E2603C
+:1007100030BD704772B600BFFEE7000010B5002282
+:1007200001B909E0012901D10A0205E0022901D13C
+:100730000A0201E04FF440720E4B1B6823F4407331
+:100740000C4C236023461B681343236023461B681D
+:1007500023F0F803236023461B68022444EAC00404
+:100760002343044C236023461B6843F480332360F7
+:1007700010BD0000103C02401C48006800F40070EE
+:10078000B0B11A48006820F400701849086000BF32
+:100790000846006840F4006008600846006820F4DD
+:1007A0000060086000BF0846006840F40070086000
+:1007B0000E48006800F48060B0B10C48006820F476
+:1007C00080600A49086000BF0846006840F4805015
+:1007D00008600846006820F48050086000BF0846A2
+:1007E000006840F48060086070470000003C0240F0
+:1007F0000A4A126822F44072084B1A601A461268BC
+:1008000042F004021A601A4612684FF4803343EA39
+:1008100000231A43014B1A6070470000103C02404D
+:10082000074A126822F44072054B1A601A46126891
+:100830001A601A46126842F001021A60017070478D
+:10084000103C024010B50D49096821F440710B4C71
+:1008500021602146096841F4407121602146096800
+:1008600041F001012160026000BF00BF00BFBFF383
+:100870006F8F00BF00BF00BF436010BD103C02403F
+:10088000084A126822F44072064B1A601A4612682F
+:1008900042F480721A601A46126842F001021A602D
+:1008A00001807047103C0240084A126822F44072EE
+:1008B000064B1A601A46126842F400721A601A4611
+:1008C000126842F001021A6001607047103C024059
+:1008D0002348006800F0100040B12248C06940F091
+:1008E00010002049C86110201D4908601C4800689C
+:1008F00000F0200040B11B48C06940F008001949D1
+:10090000C8612020164908601548006800F04000C2
+:1009100040B11448C06940F004001249C861402049
+:100920000F4908600E48006800F0800040B10D4893
+:10093000C06940F002000B49C86180200849086086
+:100940000748006800F0020040B10648C06940F066
+:1009500020000449C8610220014908607047000076
+:100960000C3C02402806002070B5044600250020FB
+:100970001449C86100F058FC054609E0601C38B114
+:1009800024B100F051FC401BA04201D9032070BDEE
+:100990000D48006800F480300028EFD10A48006854
+:1009A00000F0010010B10120074908600648006806
+:1009B00000F0F20018B1FFF78BFF0120E7E70020FD
+:1009C000E5E70000280600200C3C024070B5044614
+:1009D000A56D00F029FC064694F83500022808D0E1
+:1009E0008020606500BF002084F8340000BF012033
+:1009F00070BD2068006820F016002168086020683B
+:100A0000406920F0800021684861206C08B9A06C22
+:100A100028B12068006820F008002168086020687C
+:100A2000006820F001002168086010E000F0FCFB85
+:100A3000801B05280BD920206065032084F8350031
+:100A400000BF002084F8340000BF0320D0E72068F6
+:100A5000006800F001000028E8D194F85C103F2005
+:100A60008840A860012084F8350000BF002084F889
+:100A7000340000BF00BFBBE7014691F835000228F3
+:100A800003D08020486501207047052081F835009B
+:100A90000868006820F001000A6810600020F3E791
+:100AA000F8B50446002000908C4800684FF41651B9
+:100AB000B0FBF1F7A56D2E6894F85C100820884013
+:100AC000304098B12068006800F0040070B12068E0
+:100AD000006820F004002168086094F85C10082089
+:100AE0008840A860606D40F00100606594F85C107B
+:100AF00001208840304068B12068406900F08000E3
+:100B000040B194F85C1001208840A860606D40F00E
+:100B10000200606594F85C1004208840304068B1A1
+:100B20002068006800F0020040B194F85C100420D6
+:100B30008840A860606D40F00400606594F85C1027
+:100B400010208840304078B32068006800F008002A
+:100B500050B394F85C1010208840A86020680068AA
+:100B600000F4802080B12068006800F4002028B9DB
+:100B7000206CC8B12046216C884715E0A06C98B164
+:100B80002046A16C88470FE02068006800F4807060
+:100B900028B92068006820F0080021680860206CEF
+:100BA00010B12046216C884794F85C1020208840C2
+:100BB0003040002865D02068006800F01000002850
+:100BC0005FD094F85C1020208840A86094F835002D
+:100BD000052828D12068006820F0160021680860E8
+:100BE0002068406920F0800021684861206C08B9C5
+:100BF000A06C28B12068006820F008002168086017
+:100C000094F85C103F208840A860012084F83500EB
+:100C100000BF002084F8340000BF206D10B12046D2
+:100C2000216D8847F8BD2068006800F4802080B1FD
+:100C30002068006800F4002028B9606C10B12046DC
+:100C4000616C88471DE0E06BD8B12046E16B8847B6
+:100C500017E02068006800F4807068B920680068B8
+:100C600020F0100021680860012084F8350000BFE2
+:100C7000002084F8340000BFE06B10B12046E16B27
+:100C80008847606D38B3606D00F00100F0B1052059
+:100C900084F835002068006820F0010021680860B1
+:100CA00000BF0098401C0090B84200D905E02068C1
+:100CB000006800F001000028F3D100BF012084F893
+:100CC000350000BF002084F8340000BFE06C10B194
+:100CD0002046E16C884700BFA4E700000C0000201C
+:100CE0002DE9F0410446002500F09EFA074614B9AC
+:100CF0000120BDE8F081606A00B100BF022084F8E5
+:100D0000350000BF002084F8340000BF2068006870
+:100D100020F00100216808600AE000F085FAC01B9D
+:100D2000052805D920206065032084F83500E0E718
+:100D30002068006800F001000028EED120680568F6
+:100D400021480540D4E901010843E16808432169CD
+:100D5000084361690843A1690843E1690843216ABE
+:100D600008430543606A042803D1D4E90B01084312
+:100D70000543206805602068456925F00705606A1D
+:100D80000543606A04280DD1A06A0543E06A48B1B2
+:100D90002046FFF753FC28B140206065012084F80D
+:100DA0003500A6E7206845612046FFF72DFC064682
+:100DB00094F85C103F208840B060002060650120FE
+:100DC00084F83500002094E73F8010F02DE9F047CB
+:100DD00004460D4616461F464FF00008D4F85890BA
+:100DE00000BF94F83400012802D10220BDE8F0874A
+:100DF000012084F8340000BF94F83500012825D183
+:100E0000022084F83500002060653B4632462946C2
+:100E10002046FFF768FC94F85C103F208840C9F832
+:100E200008002068006840F0160021680860206C07
+:100E300028B12068006840F0080021680860206838
+:100E4000006840F001002168086006E000BF002053
+:100E500084F8340000BF4FF002084046C6E70000A7
+:100E600070B5044600F0E0F906462546681C10B14E
+:100E700004480078054400BF00F0D6F9801BA84262
+:100E8000FAD370BD080000202DE9F04104460E465B
+:100E90000127002500BF2548007E012802D102203D
+:100EA000BDE8F08101202149087600BF4CF25030A6
+:100EB000FFF75AFD0746002F31D1401E30602068F1
+:100EC00001280FD1207C6168FFF792FC4CF2503072
+:100ED000FFF74AFD07461648006820F00400144951
+:100EE00008601AE0A56812E0217C2846FFF716FC8E
+:100EF0004CF25030FFF738FD07460D48006820F0EF
+:100F0000FA000B4908600FB1356005E06D1CD4E9AB
+:100F100002100844A842E7D800BFFFF72DFC00BF2D
+:100F200000200249087600BF3846B9E728060020AD
+:100F3000103C02400348006840F00040014908604E
+:100F400000207047103C02402DE9F04106460F4654
+:100F500014461D464FF0010800BF1F48007E0128BF
+:100F600002D10220BDE8F08101201B49087600BFB4
+:100F70004CF25030FFF7F8FC8046B8F1000F23D157
+:100F800026B9E1B23846FFF74BFC12E0012E04D13E
+:100F9000A1B23846FFF774FC0BE0022E04D12146C3
+:100FA0003846FFF781FC04E022462B463846FFF71F
+:100FB00049FC4CF25030FFF7D7FC804607480068E8
+:100FC00020F001000549086000BF002002490876B2
+:100FD00000BF4046C6E7000028060020103C024043
+:100FE00000200949096801F0004159B10749064A42
+:100FF0000C3A1160064911600349096801F000418B
+:1010000001B1012070470000103C024023016745F8
+:10101000AB89EFCDF8B502460B4600250024002031
+:101020000021D6E0012606FA01F51E6806EA05044D
+:10103000AC4274D11E7906F00306012E04D01E794D
+:1010400006F00306022E13D190684F000326BE401F
+:10105000B0434F00DE68BE403043906050680126C8
+:101060008E40B0431E79C6F300168E403043506068
+:101070001E7906F00306032E09D0D0684F00032620
+:10108000BE40B0434F009E68BE403043D0601E79E2
+:1010900006F00306022E13D1CF0802F1200656F8FF
+:1010A00027004E07F70E0F26BE40B0434F07FF0E36
+:1010B0001E69BE403043CF0802F1200646F82700E3
+:1010C00010684F000326BE40B0431E7906F00306A9
+:1010D0004F00BE40304310605E6806F44036002E7C
+:1010E00076D000BF002600963C4E366846F4804617
+:1010F0003A4F3E603E46366806F48046009600BF92
+:1011000000BF374E8F0856F827008E07370F0F267F
+:10111000BE40B043334EB24202D1002624E057E035
+:10112000314EB24201D101261EE0304EB24201D111
+:10113000022619E02E4EB24201D1032614E02D4EB4
+:10114000B24201D104260FE02B4EB24201D1052656
+:101150000AE02A4EB24201D1062605E0284EB242EC
+:1011600001D1072600E008268F073F0FBE4030431D
+:101170001B4E8F0846F82700224E3068A0435E6859
+:1011800006F4801606B120431E4E3060361D3068CE
+:10119000A0435E6806F4001606B12043194E361DC2
+:1011A0003060184E361F3068A0435E6806F4003683
+:1011B00006B12043134E361F3060361F3068A043FF
+:1011C0005E6806F4803606B120430E4E083E30605D
+:1011D000491C1029FFF426AFF8BD00004438024036
+:1011E00008380140000002400004024000080240AC
+:1011F000000C02400010024000140240001802409F
+:10120000001C0240083C014010B5426921EA02037B
+:1012100002EA010443EA0443836110BD0AB181611B
+:1012200001E00B04836170470148006870470000CB
+:101230000000002003480068034909780844014978
+:1012400008607047000000200800002010B50D481D
+:10125000006840F400700B4908600846006840F4DC
+:10126000806008600846006840F4807008600320D1
+:1012700000F0A6F8032000F007F800F02BF800209B
+:1012800010BD0000003C024070B504460E480078D6
+:101290004FF47A71B1FBF0F00C490968B1FBF0F53D
+:1012A000284600F02FFC08B1012070BD102C07D299
+:1012B00000222146501E00F045F80548046001E078
+:1012C0000120F2E70020F0E7080000200C000020D9
+:1012D0000400002008B500BF0020009010480068FE
+:1012E00040F480400E4908600846006800F48040E1
+:1012F000009000BF00BF00BF00200090081F0068E2
+:1013000040F08050091F08600846006800F08050D7
+:10131000009000BF00BF052000F052F808BD00009B
+:101320004438024001460846002809DB00F01F034C
+:1013300001229A4043099B0003F1E023C3F80021F6
+:1013400000BF70472DE9F05F80460D461646002726
+:1013500001F062FE074639462A46334601F007008F
+:10136000C0F1070ABAF1040F02D94FF0040A01E0F4
+:10137000C0F1070AD14600F1040ABAF1070F02D200
+:101380004FF0000A01E0A0F1030AD4464FF0010A31
+:101390000AFA09FAAAF1010A0AEA020A0AFA0CFA96
+:1013A0004FF0010B0BFA0CFBABF1010B0BEA030B3B
+:1013B0004AEA0B042146404601F036FEBDE8F09FA4
+:1013C00000BF00F00702064B19684FF6FF031940F3
+:1013D000044B0B4343EA0221014B196000BF7047E5
+:1013E0000CED00E00000FA0570B504460D460CB99E
+:1013F000012070BD5848006800F00700A84209D2DB
+:1014000055490D700846006800F00700A84201D059
+:101410000120EEE7207800F0020002281DD120789C
+:1014200000F00400042805D14C48006840F4E05066
+:101430004A490860207800F00800082805D147488C
+:10144000006840F46040454908604448006820F066
+:10145000F000A168084341490860207800F00100CD
+:10146000A8B36068012807D13C4808380068C0F379
+:101470004040B8B90120BCE76068022802D060682B
+:10148000032807D1354808380068C0F3406048B9E0
+:101490000120AEE7314808380068C0F3400008B9C1
+:1014A0000120A6E72D48006820F00300616808438A
+:1014B0002A490860FFF7B8FE064609E0FFF7B4FEC8
+:1014C000801B41F28831884202D9032091E707E06E
+:1014D0002248006800F00C006168B0EB810FEDD18C
+:1014E0001D48006800F00700A84209D91A490D708C
+:1014F0000846006800F00700A84201D0012078E704
+:10150000207800F00400042807D11448006820F473
+:10151000E050E168084311490860207800F00800B5
+:10152000082808D10D48006820F46040216940EA8D
+:10153000C1000A49086000F03FF808490968C1F392
+:101540000311074A515CC840064908600648006814
+:10155000FFF79AFE00204CE7003C024008380240AA
+:101560000A3900080C00002004000020014800682F
+:10157000704700000C00002000B5FFF7F7FF04499A
+:101580000968C1F38221034A515CC84000BD0000D4
+:10159000083802401A39000800B5FFF7E7FF044990
+:1015A0000968C1F34231034A515CC84000BD0000E4
+:1015B000083802401A3900082DE9F04700240025B8
+:1015C0000026A1462548006800F00C0020B1042840
+:1015D00005D008283AD105E0DFF8849039E0DFF83B
+:1015E000849036E01D48001F006800F03F041B484F
+:1015F000001F006800F4800078B11A481749091FDD
+:101600000968C1F38811A0FB01700146224600233E
+:101610003846FEF749FE05460EE011480F49091FFE
+:101620000968C1F38811A0FB01700146224600231E
+:101630003846FEF739FE05460848001F0068C0F32B
+:101640000140401C4600B5FBF6F902E0DFF81090BF
+:1016500000BF00BF4846BDE8F087000008380240E0
+:101660000024F40000127A00F8B504460CB90120F9
+:10167000F8BD207800F00100002874D0F948006817
+:1016800000F00C0004280DD0F648006800F00C00B3
+:10169000082813D1F348001F006800F48000B0F55B
+:1016A000800F0BD1EF4808380068C0F34040002895
+:1016B00059D06068002856D10120D9E700BF606882
+:1016C000B0F5803F08D1E7480838006840F4803022
+:1016D000E449083908601EE06068B0F5A02F0DD11C
+:1016E000E0480838006840F48020DE490839086086
+:1016F0000846006840F4803008600CE0D94808389B
+:10170000006820F48030D74908390860084600682E
+:1017100020F48020086000BF606890B1FFF784FD6E
+:10172000054606E0FFF780FD401B642801D9032031
+:101730009EE7CC4808380068C0F340400028F1D04C
+:1017400011E0FFF771FD054606E0FFF76DFD401B58
+:10175000642801D903208BE7C24808380068C0F329
+:1017600040400028F1D1207800F0020002285FD12B
+:10177000BC48006800F00C0058B1BA48006800F09E
+:101780000C0008281CD1B748001F006800F4800036
+:10179000B0B9B44808380068C0F3400020B1E06830
+:1017A000012801D0012063E7AE480838006820F026
+:1017B000F800216940EAC100AA490839086037E009
+:1017C000E06800B30120A8490860FFF72DFD054639
+:1017D00006E0FFF729FD401B022801D9032047E757
+:1017E000A04808380068C0F340000028F1D09D48A8
+:1017F0000838006820F0F800216940EAC1009949E2
+:101800000839086014E0002097490860FFF70CFDD4
+:10181000054606E0FFF708FD401B022801D903201A
+:1018200026E7904808380068C0F340000028F1D14E
+:10183000207800F0080008282CD16069A8B10120A8
+:101840008A490860FFF7F0FC054606E0FFF7ECFC6C
+:10185000401B022801D903200AE782486C30006847
+:10186000C0F340000028F1D014E000207F49086058
+:10187000FFF7DAFC054606E0FFF7D6FC401B02281E
+:1018800001D90320F4E677486C300068C0F34000CB
+:101890000028F1D1207800F00400042870D100273E
+:1018A00070483830006800F0805090B900BF0020C8
+:1018B00000906C483830006840F0805069493831F9
+:1018C00008600846006800F08050009000BF00BF2C
+:1018D00001276748006800F48070B0B96448006868
+:1018E00040F4807062490860FFF79EFC054606E000
+:1018F000FFF79AFC401B022801D90320B8E65C4898
+:10190000006800F480700028F2D000BFA0680128B1
+:1019100008D154486830006840F0010051496831EE
+:1019200008601DE0A06805280DD14E4868300068A9
+:1019300040F004004B49683108600846006840F0F8
+:10194000010008600CE047486830006820F00100A2
+:101950004449683108600846006820F004000860C7
+:1019600000BFA068A8B1FFF75FFC054609E0FFF7DC
+:101970005BFC401B41F28831884202D9032077E6A4
+:1019800026E0384868300068C0F340000028EED0F8
+:1019900013E0FFF749FC054608E0FFF745FC401B54
+:1019A00041F28831884201D9032061E62D48683030
+:1019B0000068C0F340000028EFD1012F07D129486B
+:1019C0003830006820F0805026493831086000BF68
+:1019D000A069002845D02348006800F00C000828C2
+:1019E0005DD0A069022845D100201F490866FFF795
+:1019F0001BFC054606E0FFF717FC401B022801D937
+:101A0000032035E6174808380068C0F34060002816
+:101A1000F1D1D4E907010843616A40EA811101224A
+:101A2000A06AC2EB500041EA00412C20005D41EA6F
+:101A300000600C49091F086001200B490866FFF788
+:101A4000F3FB054606E0FFF7EFFB401B022801D938
+:101A500003200DE6034808380068C0F34060002802
+:101A6000F1D049E00838024000004742800E47426A
+:101A700000700040002021490866FFF7D5FB0546AD
+:101A800006E0FFF7D1FB401B022801D90320EFE558
+:101A90001B480068C0F340600028F2D12CE0A06928
+:101AA000012800D1E4E51648001D0668A069012858
+:101AB00020D006F48001E06981421BD106F03F018D
+:101AC000206A814216D147F6C0703040616AB0EB9F
+:101AD000811F0FD106F440310122A06AC2EB5000F1
+:101AE000B1EB004F06D106F070612C20005DB1EB28
+:101AF000006F01D00120BBE50020B9E5000047429E
+:101B00000038024070B504462546681EB0F1807F5B
+:101B100001D301200FE0681E4FF0E02148610F2142
+:101B20004FF0FF3001F080FA00204FF0E021886193
+:101B300007200861002070BDF8B504460E46174620
+:101B400094F83E00202836D106B10FB90120F8BD27
+:101B500000BF94F83C00012801D10220F7E70120E2
+:101B600084F83C0000BF20633A463146204601F02D
+:101B7000A9F90546EDB9206B012819D100BF002055
+:101B8000009020680068009020684068009000BFC6
+:101B900000BF00BF00BF21680C3151E8001F41F0B9
+:101BA000100021680C3141E80002002AF3D100E066
+:101BB00001252846CBE70220C9E7000070B504469E
+:101BC0000D460C492068884203D10B4801F0E8FC1F
+:101BD0000EE00A492068884203D1094801F0E0FC80
+:101BE00006E008492068884202D1074801F0D8FC85
+:101BF00070BD000000100140F801002000440040CA
+:101C000048020020004C00409802002070B50446B5
+:101C1000002520684069C0F3C01594F83D002128D4
+:101C200017D1B5B100BF00BF2168143151E8001FC2
+:101C300021F080002168143141E80002002AF3D12C
+:101C400000BF606B10B1606BFEF7C0FE204600F075
+:101C500094FF20684069C0F3801594F83E00222864
+:101C600017D1B5B100BF00BF2168143151E8001F82
+:101C700021F040002168143141E80002002AF3D12C
+:101C800000BFA06B10B1A06BFEF7A0FE204600F0D5
+:101C90002EFF002070BD000038B5044600252B49FA
+:101CA0002068884201D12A4D0AE02A4920688842EA
+:101CB00001D1294D04E029492068884200D1284DEE
+:101CC000206C00F0020050B100BF0020009020689E
+:101CD0000068009020684068009000BF00BF206C42
+:101CE00000F0040050B100BF0020009020680068A0
+:101CF000009020684068009000BF00BF2068006826
+:101D0000C0F3C00050B100BF002000902068006800
+:101D1000009020684068009000BF00BF2068006805
+:101D2000C0F3400050B100BF002000902068006860
+:101D3000009020684068009000BF00BF25B1EA8B8A
+:101D4000A9696868FFF7F8FE38BD0000001001407F
+:101D5000F80100200044004048020020004C0040F0
+:101D6000980200202DE9F84F044620680568206895
+:101D7000C668206847694FF00009CA4605F00F0998
+:101D8000B9F1000F0AD105F0200038B106F02000AB
+:101D900020B1204600F004FFBDE8F88FB9F1000F34
+:101DA0007CD007F0010018B906F49070002875D0B7
+:101DB00005F0010030B106F4807018B1206C40F0DD
+:101DC0000100206405F0040030B107F0010018B1F3
+:101DD000206C40F00200206405F0020030B107F0F2
+:101DE000010018B1206C40F00400206405F00800E8
+:101DF00048B106F0200010B907F0010018B1206CBE
+:101E000040F008002064206C002846D005F0200037
+:101E100028B106F0200010B1204600F0C1FE206875
+:101E20004069C0F3801A206C00F0080010B9BAF1C4
+:101E3000000F2DD0204600F05AFE2068406900F0C7
+:101E40004000402820D100BF00BF2168143151E874
+:101E5000001F21F040002168143141E80002002AEF
+:101E6000F3D100BFA06B50B17548A16B0865A06BA2
+:101E7000FEF702FE88B1A06B016D88470DE0204699
+:101E8000FFF70AFF09E009E02046FFF705FF04E03D
+:101E90002046FFF701FF002020647DE7206B01282A
+:101EA00076D105F01000002872D006F0100000284E
+:101EB000FAD000BF002000902068006800902068E1
+:101EC0004068009000BF00BF2068406900F04000FB
+:101ED00040285ED1A06B006840681FFA80F8B8F116
+:101EE000000F54D0A08D404551DDA4F82E80A06B8A
+:101EF000C069B0F5807F43D000BF00BF21680C31BE
+:101F000051E8001F21F4807021680C3141E8000283
+:101F1000002AF3D100BF00BF00BF2168143151E88F
+:101F2000001F21F001002168143141E80002002A5D
+:101F3000F3D100BF00BF00BF2168143151E8001F7A
+:101F400021F040002168143141E80002002AF3D159
+:101F500000BF202084F83E000020206300BF00BFA7
+:101F600021680C3151E8001F21F0100021680C316C
+:101F700041E80002002AF3D100BFA06BFEF726FD66
+:101F8000A08DE28D801A81B22046FFF717FE03E78D
+:101F900040E0A08DE18D401A1FFA80F8E08DC0B3BB
+:101FA000B8F1000F35D000BF00BF21680C3151E8F7
+:101FB000001F21F4907021680C3141E80002002AD2
+:101FC000F3D100BF00BF00BF2168143151E8001FEA
+:101FD00021F001002168143141E80002002AF3D108
+:101FE00000BF202084F83E000020206300BF00BF17
+:101FF00021680C3151E8001F21F0100021680C31DC
+:1020000041E80002002AF3D100BF41462046FFF715
+:10201000D5FDC1E605F0800030B106F0800018B1B2
+:10202000204600F0B7FFB7E605F0400030B106F0FB
+:10203000400018B1204600F090FDADE600BFABE6D1
+:102040005529000810B504460CB9012010BDA0693F
+:1020500000B100E000BF94F83D0028B9002084F8EA
+:102060003C00204600F028F8242084F83D00206839
+:10207000C06820F400502168C860204600F00CFEC3
+:102080002068006920F49040216808612068406958
+:1020900020F02A00216848612068C06840F40050A0
+:1020A0002168C86000202064202084F83D0084F866
+:1020B0003E000020CAE7000010B586B00446142197
+:1020C00001A8FEF7D9F9C149206888427AD100BF3A
+:1020D00000200090BE48006840F40020BC49086021
+:1020E0000846006800F40020009000BF00BF00BF59
+:1020F00000200090B6481038006840F00100B44954
+:10210000103908600846006800F00100009000BF28
+:1021100000BF0320019002200290002003900320C2
+:1021200004900820059001A9AA48FEF773FFAA4869
+:10213000AA490860400548600021A8488160C16044
+:102140004FF480610161002141618161C1614FF4FF
+:102150004031016200214162FEF7C2FD08B1FEF785
+:10216000D9FA00BF9D48A063846300BF9A4830300D
+:102170009B4908604FF000604860402198488160AA
+:102180000021C1604FF480610161002141618161E2
+:10219000C1614FF40031016200214162FEF7A0FDF0
+:1021A00008B1FEF7B7FA00BF8D486063846300BFD3
+:1021B000002201213420FFF7C5F83420FFF7B2F8E0
+:1021C00002E1FFE78749206888427ED100BF0020F6
+:1021D00000907F48001D006840F010007C49091DF8
+:1021E00008600846006800F01000009000BF00BFC3
+:1021F00000BF0020009076481038006840F00100D1
+:102200007349103908600846006800F0010000902A
+:1022100000BF00BF4FF4C060019002200290002078
+:102220000390032004900720059001A96948FEF758
+:10223000F1FE6D486D4908604FF000604860002174
+:102240006A488160C1604FF4806101610021416191
+:102250008161C1614FF48031016200214162FEF76A
+:102260003FFD08B1FEF756FA00BF6048A0638463E3
+:1022700000BF5D4878305E4908604FF000604860FC
+:1022800040215B4881600021C1604FF480610161A1
+:10229000002141618161C1614FF4803101620021FF
+:1022A0004162FEF71DFD08B1FEF734FA00BF504849
+:1022B0006063846300BF002201212520FFF742F8FC
+:1022C0002520FFF72FF87FE0FFE74A492068884282
+:1022D0007AD100BF002000903D48006840F40030F3
+:1022E0003B4908600846006800F40030009000BFD9
+:1022F00000BF00BF0020009035481038006840F053
+:1023000008003349103908600846006800F00800EA
+:10231000009000BF00BF60200190022002900020CA
+:102320000390032004900720059001A93248FEF78E
+:1023300071FE29484830314908604FF0006048601C
+:1023400000212E488160C1604FF48061016100214D
+:1023500041618161C1614FF44031016200214162FC
+:10236000FEF7BEFC08B1FEF7D5F900BF2348A06315
+:10237000846300BF18486030214908604FF0006056
+:10238000486040211E4881600021C1604FF4806197
+:102390000161002141618161C1614FF4003101623D
+:1023A00000214162FEF79CFC08B1FEF7B3F900BFC3
+:1023B00013486063846300BF002201212620FEF7DA
+:1023C000C1FF2620FEF7AEFF06B010BD004C004056
+:1023D000403802400000024040600240E803002014
+:1023E000480400200010014040640240A80400207E
+:1023F0000805002000440040000C02406805002051
+:10240000C805002070477047F7B50446154694F894
+:102410003D00202846D1019800B10DB90120FEBD34
+:1024200000BF94F83C00012801D10220F7E7012009
+:1024300084F83C0000BF01982062A584E584002058
+:102440002064212084F83D001748616BC863174859
+:10245000616B08641648616BC8640020616B086595
+:1024600001AE23681A1D31682B46606BFEF7AEFC87
+:102470006FF040002168086000BF002084F83C0035
+:1024800000BF00BF00BF2168143151E8001F41F0B8
+:1024900080002168143141E80002002AF3D100BF16
+:1024A0000020BCE70220BAE7892A0008E12A0008D8
+:1024B0006929000810B504460B492068884203D1F9
+:1024C0000A4801F007F90EE009492068884203D163
+:1024D000084801F0FFF806E007492068884202D169
+:1024E000044801F0F7F810BD00100140F801002089
+:1024F0000044004048020020004C0040704700BFEC
+:10250000FEE7000008B500BF0020009026480068E4
+:1025100040F40010244908600846006800F40010E8
+:10252000009000BF00BF00BF002000900846006878
+:1025300040F4800008600846006800F480000090C5
+:1025400000BF00BF002211460D20FEF7FBFE0D204C
+:10255000FEF7E8FE002211460F20FEF7F3FE0F20E3
+:10256000FEF7E0FE002211461020FEF7EBFE1020E1
+:10257000FEF7D8FE002211461120FEF7E3FE1120DF
+:10258000FEF7D0FE002211463A20FEF7DBFE3A208D
+:10259000FEF7C8FE002211464620FEF7D3FE462075
+:1025A000FEF7C0FE08BD00003038024000B587B01D
+:1025B000142102A8FDF760FF00BF002001906E48C3
+:1025C000006840F010006C4908600846006800F0A0
+:1025D0001000019000BF00BF00BF0020019008461E
+:1025E000006840F0800008600846006800F0800045
+:1025F000019000BF00BF00BF0020019008460068A6
+:1026000040F0010008600846006800F001000190F9
+:1026100000BF00BF00BF002001900846006840F0E6
+:10262000020008600846006800F00200019000BF48
+:1026300000BF00BF002001900846006840F008007D
+:1026400008600846006800F00800019000BF00BF65
+:1026500000BF002001900846006840F004000860B8
+:102660000846006800F00400019000BF00BF00228F
+:102670007F214248FEF7D2FD012204214048FEF7A7
+:10268000CDFD01224FF4E0613C48FEF7C7FD012279
+:102690004FF470413B48FEF7C1FD01224FF47F41EA
+:1026A0003948FEF7BBFD01224FF470713748FEF741
+:1026B000B5FD002210213448FEF7B0FD00224FF492
+:1026C00040713048FEF7AAFD6F2002900120039070
+:1026D000002004900320059002A92848FEF79AFCE8
+:1026E0004FF4E260029001200390002004900590D6
+:1026F00002A92248FEF78EFC0420029001200390DC
+:10270000002004900320059002A91D48FEF782FCDA
+:102710004FF4704002900120039000200490059037
+:1027200002A91848FEF776FC4FF6107002900120BF
+:10273000039000200490059002A91348FEF76AFC5C
+:102740004FF47070029001200390002004900590D7
+:1027500002A90E48FEF75EFC4FF440700290012083
+:102760000390002004900320059002A90548FEF77D
+:1027700051FC07B000BD000030380240001002409C
+:102780000000024000040240000C02400008024029
+:1027900010B50B480B4908604FF4E1304860002148
+:1027A00008488160C16001610C21416100218161A3
+:1027B000C161FFF747FC08B1FDF7ACFF10BD000099
+:1027C000004C00401C03002010B50B480B4908606A
+:1027D0004FF4E1304860002108488160C160016128
+:1027E0000C21416100218161C161FFF72BFC08B11F
+:1027F000FDF790FF10BD00000010014060030020B5
+:1028000010B50B480B4908604FF416504860002182
+:1028100008488160C16001610C2141610021816132
+:10282000C161FFF70FFC08B1FDF774FF10BD000098
+:1028300000440040A403002000BFFEE700BFFEE705
+:102840007047704710B5094841690120884708481A
+:102850000121426C904707480121426C904706488D
+:102860000121426C9047FEF7E5FC10BD8C00002072
+:10287000F8010020480200209802002000B593B023
+:10288000302107A8FDF7F8FD142102A8FDF7F4FD9B
+:1028900000BF002001902448006840F08050224989
+:1028A00008600846006800F08050019000BF00BF3B
+:1028B00000BF002001901D48006840F480401B4983
+:1028C00008600846006800F48040019000BF00BF27
+:1028D000012007900004089002200D9041050E9100
+:1028E00004210F91A821109102211191042112912C
+:1028F00007A8FEF7B9FE08B1FDF70CFF0F20029004
+:1029000002200390002004904FF4A05005904FF453
+:1029100080500690052102A8FEF766FD08B1FDF77C
+:10292000F9FE13B000BD00004038024000700040C6
+:102930000348006840F470000149086070470000D7
+:1029400088ED00E010B50248FFF70CFA10BD00005A
+:102950001C03002070B50546AC6B0020E085E084C8
+:102960002046FFF799F970BD70B506460025B46B97
+:1029700020684069C0F3C01594F83D00212805D1B6
+:1029800025B10020E084204600F0F7F82068406977
+:10299000C0F3801594F83E00222805D125B100200F
+:1029A000E085204600F0A3F8206C40F01000206481
+:1029B0002046FFF771F970BD70B50546AC6B28680D
+:1029C000006800F48070002842D1E08500BF00BF9D
+:1029D00021680C3151E8001F21F4807021680C310E
+:1029E00041E80002002AF3D100BF00BF00BF216808
+:1029F000143151E8001F21F001002168143141E831
+:102A00000002002AF3D100BF00BF00BF21681431CB
+:102A100051E8001F21F040002168143141E8000214
+:102A2000002AF3D100BF202084F83E00206B01284B
+:102A30000ED100BF00BF21680C3151E8001F21F00A
+:102A4000100021680C3141E80002002AF3D100BFD8
+:102A5000206B012804D1A18D2046FFF7AFF802E0DA
+:102A60002046FFF7CFFC70BD70B50546AC6B206B00
+:102A7000012805D1A08D41082046FFF79FF802E00C
+:102A80002046FFF7C0FC70BD70B50546AC6B2868EA
+:102A9000006800F48070F8B90020E08400BF00BF37
+:102AA0002168143151E8001F21F0800021681431A1
+:102AB00041E80002002AF3D100BF00BF00BF216837
+:102AC0000C3151E8001F41F0400021680C3141E811
+:102AD0000002002AF3D102E02046FFF7EBFC70BDB4
+:102AE00070B50446A56B2846FFF708FD70BD00BF12
+:102AF00000BF02680C3252E8002F22F49071026885
+:102B00000C3242E80013002BF3D100BF00BF00BF1E
+:102B10000268143252E8002F22F0010102681432D8
+:102B200042E80013002BF3D100BF016B01290ED145
+:102B300000BF00BF02680C3252E8002F22F01001E3
+:102B400002680C3242E80013002BF3D100BF2021B1
+:102B500080F83E1000210163704710B504462068DC
+:102B6000C06820F040002168C860202084F83D0043
+:102B70002046FFF79FFC002010BD00BF00BF026889
+:102B80000C3252E8002F22F0C00102680C3242E8F9
+:102B90000013002BF3D100BF202180F83D107047B7
+:102BA000F8B5044694F83E00222873D1A068B0F529
+:102BB000805F0CD1206950B90025A66A2068406862
+:102BC000C0F308003080A06A801CA06215E0A56AEE
+:102BD0000026A068B0F5805F03D0A06828B92069FE
+:102BE00018B920684068287004E02068406800F048
+:102BF0007F002870A06A401CA062E08D401E80B259
+:102C0000E085002844D12068C06820F020002168B9
+:102C1000C8602068C06820F480702168C86020689F
+:102C2000406920F0010021684861202084F83E00BE
+:102C3000206B012826D10020206300BF00BF21683F
+:102C40000C3151E8001F21F0100021680C3141E8DF
+:102C50000002002AF3D100BF2068006800F01000D5
+:102C600010280AD100BF0020009020680068009062
+:102C700020684068009000BF00BFA18D2046FEF78D
+:102C80009DFF02E02046FFF7BDFB0020F8BD01E0FC
+:102C90000020FBE70220F9E72DE9F84F0446206801
+:102CA000006920F44050E168084321680861216907
+:102CB000A068084361690843E169084300902068FF
+:102CC000C06849F20C618843009908432168C860D4
+:102CD0002068406920F44070A16908432168486178
+:102CE00076492068884203D075492068884203D11C
+:102CF000FEF752FC814602E0FEF73EFC8146E069A9
+:102D0000B0F5004F6CD102206168A0FB0150034672
+:102D10001920A9FB007001462A463846FDF7C4FA7F
+:102D20006421B0FBF1F04FEA001A02206168A0FBB9
+:102D300001510B461920A9FB00712A463846FDF7C0
+:102D4000B3FA834602206168A0FB015003461920B4
+:102D5000A9FB00712A463846FDF7A6FA6421B0FBAC
+:102D6000F1F000EBC00101EB0010ABEB8000322171
+:102D700001EBC0006421B0FBF1F000F0F8000AEBB9
+:102D8000400A02206168A0FB015003461920A9FBFC
+:102D9000007001462A463846FDF786FA834602202F
+:102DA0006168A0FB015003461920A9FB00712A4667
+:102DB0003846FDF779FA6421B0FBF1F000EBC00171
+:102DC00001EB0010ABEB8000322101EBC00064216D
+:102DD000B0FBF1F000F007005044216888606AE021
+:102DE00004206168A0FB015003461920A9FB007074
+:102DF00001462A463846FDF757FA824604206168A4
+:102E0000A0FB015003461920A9FB007001462A4689
+:102E10003846FDF749FA6421B0FBF1F000EBC00140
+:102E200001EB0010AAEB8000322101EB00106421BD
+:102E3000B0FBF1F000F0F00A04206168A0FB017023
+:102E400003461920A9FB00513A462846FDF72CFA03
+:102E50006421B0FBF1F00AEB001A04206168A0FBCA
+:102E600001510B461920A9FB00712A463846FDF78F
+:102E70001BFA834604206168A0FB01500346192019
+:102E8000A9FB007001462A463846FDF70DFA642179
+:102E9000B0FBF1F000EBC00101EB0010ABEB8000E8
+:102EA000322101EB00106421B0FBF1F000F00F00C3
+:102EB000504421688860BDE8F88F00000010014090
+:102EC0000014014077B581B0044615460298A0620F
+:102ED000A58500202064222084F83E002A48A16BAA
+:102EE000C8632A48A16B08642948A16BC864002004
+:102EF000A16B086502AE32682368191D2B46A06BD2
+:102F0000FDF764FF00BF002000902068006800907B
+:102F100020684068009000BF00BF00BF002084F818
+:102F20003C0000BF206970B100BF00BF21680C31B8
+:102F300051E8001F41F4807021680C3141E8000223
+:102F4000002AF3D100BF00BF00BF2168143151E84F
+:102F5000001F41F001002168143141E80002002AFD
+:102F6000F3D100BF00BF00BF2168143151E8001F3A
+:102F700041F040002168143141E80002002AF3D1F9
+:102F800000BF002004B070BDB9290008692A0008FC
+:102F900069290008014691F83D00212828D1886858
+:102FA000B0F5805F0BD1086948B90A6A1088C0F390
+:102FB00008000B685860086A801C086205E00B6A0C
+:102FC000581C086218780B685860C88C401E80B284
+:102FD000C88458B90868C06820F080000B68D860C1
+:102FE0000868C06840F040000B68D8600020704757
+:102FF0000220FCE710B50248FEF7B4FE10BD000049
+:103000006003002010B50248FEF7ACFE10BD0000C2
+:10301000A403002000BFFEE702480068C0F30220BE
+:10302000704700000CED00E010B5002804DB0A0733
+:10303000130E054A135406E00A07140E034A00F063
+:103040000F031B1FD45410BD00E400E018ED00E096
+:1030500010B50D49086A80470C48416B88470C48F9
+:10306000416B88470B48416B88470B49086880478C
+:103070000A480B49C268082090470A4948688047B7
+:1030800009490868804710BD7C010020F801002034
+:103090004802002098020020700100208C000020CF
+:1030A0002C00002010030020A800002010B50349C8
+:1030B0000869804700F00EFC10BD00008C00002065
+:1030C000034A12689080024A1268916070470000BB
+:1030D000A400002010B51A480068806800B910BD2F
+:1030E000002425E016480068806804EB440110F8CD
+:1030F0002100D0B1002012490968896804EB44021C
+:1031000001F822000E480068806804EB440100EBDF
+:103110008100806800B909E009490968896804EB01
+:10312000440201EB82018868804700BF601C84B2C2
+:10313000034800688088A042D4DC00BFCFE70000CD
+:10314000A400002010B501462F4A12681288521CB4
+:103150002D4B1B681A802C4A12681288B2F57A7FB0
+:1031600006DB294A12685288521C274B1B685A807A
+:10317000254A1268926802B910BD00203CE0224A3C
+:103180001268926800EB400302EB830252888AB314
+:103190001D4A1268926800EB400302EB83025288DA
+:1031A000521E194B1B689B6800EB400403EB840321
+:1031B0005A80154A1268926800EB400302EB8302C2
+:1031C0005288BAB90122104B1B689B6800EB40047F
+:1031D00003F824200C4A1268926800EB400302EBCB
+:1031E00083029288084B1B689B6800EB400403EB4A
+:1031F00084035A80421C90B2034A12689288824229
+:10320000BDDC00BFB8E70000A40000200148007842
+:10321000704700006C01002010B5002007490870BD
+:10322000002210210648FDF7F9FF00221021054871
+:10323000FDF7F4FF002000F007F810BD6C0100203E
+:1032400000100240000C02402DE9F04180460025AC
+:10325000102D01DBBDE8F0812C4805702C48465D3F
+:103260002C48475D002431E046FA04F000F00100EC
+:1032700048B1294A32F81410284A52F82400012291
+:10328000FDF7CCFF08E0244A32F81410234A52F824
+:1032900024000022FDF7C2FF47FA04F000F001000D
+:1032A00048B11F4A32F814101E4A52F82400012275
+:1032B000FDF7B4FF08E01A4A32F81410194A52F820
+:1032C00024000022FDF7AAFF601CC4B2042CCBDB53
+:1032D000002416E0AC4209D1134A32F81410134A04
+:1032E00052F824000022FDF799FF08E00E4A32F858
+:1032F00014100E4A52F824000122FDF78FFF601CC3
+:10330000C4B2102CE6DB00BFA4E700006C01002073
+:103310004C0100205C010020CC000020BC000020FB
+:10332000E4000020D40000202C010020EC0000204C
+:1033300010B586B00446002001900B2003900120B8
+:1033400004900220059000200090694601A8FDF736
+:103350009BFD06B010BD000010B5064948688047C7
+:1033600010220549054800F055F802494868804791
+:1033700010BD0000B00000208C01002000000E08ED
+:1033800070B510220E49A1F11000FDF704F8A8B1A4
+:103390000C494868804772B6102209490A4800F073
+:1033A0005DF804462CB906481038054610352ECD78
+:1033B0002EC062B603494868804700BF70BD000058
+:1033C0008C010020B000002000000E0810B5FFF7AF
+:1033D000D7FF10BD10B5FFF7BFFF0C480068808B0A
+:1033E000B0F57A7F03DD282108480068818307480B
+:1033F0000068C08B102803DD102104480068C183D9
+:103400000348044610341ECC1EC010BDAC01002081
+:103410007C0100202DE9F84103460C4621461D465B
+:10342000960802F00307002005E055F820C0C1F817
+:1034300000C0091D401CB042F7D36FB155F82600FB
+:103440000090EC46002004E01CF8008001F80080A9
+:10345000401CB842F8D300BFBDE8F8812DE9FC5FFD
+:1034600007468846154600244646A808019005F000
+:103470000309BA46FDF7B4FD3846FFF759FF044685
+:1034800024B1FDF757FD2046BDE8FC9F4FF0000B2F
+:103490000FE0D6F800C06246002351460220FDF737
+:1034A00053FD044604B107E00AF1040A361D0BF18E
+:1034B000010B01988345ECD300BFB4B9B9F1000FFB
+:1034C00013D04FF0FF300090EB46002003E0315C5A
+:1034D0000BF80010401C4845F9D300235146022048
+:1034E000009AFDF731FD044600BFFDF723FD20469D
+:1034F000CAE770477047000010B5002409E0322089
+:1035000000F0EBF84FF480710348FDF77DFE601C7E
+:10351000C4B2142CF3DB10BD0010024010B54FF400
+:1035200080710248FDF770FE10BD000000100240DF
+:103530002DE9F0410446884617460020A074A08B70
+:10354000B84200DAA78B3A4641466069FCF74FFF64
+:103550003A4661696068FEF757FFFDF765FE05466C
+:1035600008E0FDF761FE0646701BC82802D901205D
+:10357000A07402E0A07C0028F3D000BFBDE8F08179
+:1035800010B5044660680068C06840F010006168CB
+:103590000968C860E28BA1696068FEF7CDFA10BDCA
+:1035A00070B504466068FEF731FBE08BE16809689E
+:1035B0004968401A86B206B970BD002506E0A269C6
+:1035C0005119206800F04BF9681C85B2B542F6DB52
+:1035D000204600F041F8E28BA1696068FEF7ACFA82
+:1035E00000BFE9E770B50446A08C618C884227DAF9
+:1035F000206880892084204600F034F8208CE18BFC
+:1036000088421DDC208CD8B1208C40F6B83188422D
+:1036100003D9206800F0D7F812E0002506E0094A37
+:103620005119206800F0D7F8681C85B2208CA84298
+:10363000F5DCA06C20B1218C22460248A36C98478F
+:1036400070BD0000C06F002090F82620012A02D132
+:10365000428C0A4442847047012180F826100021E0
+:1036600041847047002180F8261041847047000093
+:103670002DE9F04104460F4616461448844204D111
+:10368000012204211248FDF7C9FDA08B96FBF0F042
+:103690001FFA80F8002507E0A28B02FB0571204687
+:1036A000FFF746FF681C85B24545F5DBA08B00FBA4
+:1036B000156086B20EB9BDE8F081A08B00FB0571E4
+:1036C00032462046FFF734FF00BFF4E7980200209F
+:1036D0000000024001218174704710B50446204665
+:1036E000FDF7BEFB10BD2DE9F04704460D4691469F
+:1036F000052D01DABDE8F0872078AA2802D160788C
+:10370000552800D0F6E7681E215CA81E205C41EA1F
+:103710000028A81E81B2204600F037F80646301275
+:1037200040EA062086B2464500D0E3E7A778032F9B
+:1037300000D100BF00BFDDE701480249886470473F
+:10374000E7360008F8010020FDF780FDFFF796F846
+:10375000FEF72CFFFEF7D6FEFFF71AF8FFF734F856
+:10376000FFF74EF8FFF774FC01E0FFF79FFCFCE762
+:1037700070B503460C4603E014F8015B03F8015BE7
+:10378000151EA2F10102F7D170BD30B502464FF609
+:10379000FF7012E012F8014B6040002308E000F0D7
+:1037A000010424B14AF2010484EA600000E0401000
+:1037B0001C465D1CABB2082CF1DB0C1EA1F101050F
+:1037C000A9B2E7D130BD00B9704700214161016164
+:1037D000C16000BFF8E770B504460D460CB9002083
+:1037E00070BDE06808B90020FAE745B1D4E90006E9
+:1037F000236903FB060132462846FFF7B9FF20691B
+:10380000401CA16890FBF1F201FB12002061E0680E
+:10381000401EE0600120E3E770B504460D460CB998
+:10382000002070BDD4E90210884201D10020F8E7E1
+:1038300045B1D4E90016636903FB061032462946F8
+:10384000FFF796FF6069401CA16890FBF1F201FB55
+:1038500012006061E068401CE0600120E1E770B5A3
+:1038600004460D460CB9002070BDD4E90210884210
+:1038700004DA29462046FFF7CFFFF5E745B1D4E942
+:103880000016636903FB061032462946FFF770FFF6
+:103890006069401CA16890FBF1F201FB12006061BD
+:1038A0002069401CA16890FBF1F201FB120020612D
+:1038B0000120D9E770477047704770477047000094
+:1038C00010B502494868804710BD0000A8000020DC
+:1038D0007047000010B50548C16C88470448C16CAA
+:1038E00088470448C16C884710BD0000F8010020DB
+:1038F00048020020980200204FF04070E1EE100ACC
+:1039000070470006101600061016000000000000A8
+:10391000000001020304060708090000000001027C
+:103920000304000056312E300000000031313532E2
+:103930003030000031393230300000003537363059
+:1039400030000000393630300000000034383030AC
+:1039500000000000434F4D3100000000434F4D3246
+:1039600000000000434F4D3300000000434F4D3432
+:103970000000000094390008000000201C03000033
+:10398000C40100081C3B00081C030020BC88000088
+:103990002002000841321042011324F4132439009C
+:1039A0000A120856302E3030312E303A012813D505
+:1039B0003822081203320A3AB70C120732323AD1CF
+:1039C0000C120B32643AB50C120D32C83ABB0C1211
+:1039D000111AF43D3AC10C121323E8033AB90C1240
+:1039E0001723D0073ABD0CA113C1301B08D504130F
+:1039F000453123088C1420F93414081D351B08F5B3
+:103A0000081AF3041AB01411AC100240041A40133F
+:103A100012081A04D159144A04042A02B629051AB4
+:103A20000810A9040A1D0C04594079041944128095
+:103A300022402905197E396D29585910100E0D0E96
+:103A40000F0C0B0A090807040302011B06051016D8
+:103A500008090A0B0C1F010203040506E6211319CD
+:103A6000321B0849041A0D04012013D5331B0881A9
+:103A7000041A59041ACD04137C01142048061A2094
+:103A8000CE11F3B80B0A1412180B14B81D181AB083
+:103A90004C136003142008051C20A804BE19C7138A
+:103AA000702914202835FC20B80B5E511381351481
+:103AB0000871361B08D5041AA10C1A4908411AE5E9
+:103AC0000C1AC8501AA4501AC8501A680429501366
+:103AD000E0400C1020984C502B980220091C501AE2
+:103AE000E0501A1C501A489C1AE80829501B5058DC
+:103AF000B00A3464A01354391B085C041A64041A15
+:103B00006C041A4C041A44041A34041A3C041A2C87
+:0C3B100004811339371B081074000000FA
:040000050800018965
:00000001FF
diff --git a/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h b/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h
index 0255df2..4ce996b 100644
--- a/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h
+++ b/calib_board/MDK-ARM/RTE/_CalibBoard/RTE_Components.h
@@ -11,11 +11,5 @@
#define RTE_COMPONENTS_H
-/*
- * Define the Device Header File:
- */
-#define CMSIS_device_header "stm32f4xx.h"
-
-
#endif /* RTE_COMPONENTS_H */
diff --git a/calib_board/usr/app/app.c b/calib_board/usr/app/app.c
index dbda69d..753f0ce 100644
--- a/calib_board/usr/app/app.c
+++ b/calib_board/usr/app/app.c
@@ -1,5 +1,5 @@
#include "app.h"
-#include "os_timer.h"
+#include "app_timer.h"
#include "stdio.h"
#include "string.h"
@@ -8,21 +8,37 @@
#include "bsp_Led.h"
#include "bsp_74HC4067.h"
#include "bsp_Flash.h"
-#include "tjc_usart_hmi.h"
#include "proto_modbus_master_tdlas.h"
#include "proto_modbus_slave_ex.h"
+#include "gui_tjc_hmi.h"
+
const char *HwVersion = "V1.0";
char SwVersion[24] = "V0.001.0";
-void TASK_Idle(void);
-void Task_10ms(void);
-void Task_50ms(void);
-void Task_100ms(void);
-void Task_200ms(void);
-void Task_500ms(void);
-void Task_1s(void);
-void Task_2s(void);
+void task_idle(void);
+void task_10ms(void);
+void task_50ms(void);
+void task_100ms(void);
+void task_200ms(void);
+void task_500ms(void);
+void task_1s(void);
+void task_2s(void);
+
+#define APP_TIMER_TASK_NUM (sizeof(app_timer_task) / sizeof(app_timer_class_t))
+
+/**/
+app_timer_class_t app_timer_task[] =
+{
+ {0, 1, 1, task_idle }, /*һֱִ*/
+ {0, 3, 10, task_10ms },
+ {0, 7, 50, task_50ms },
+ {0, 11, 100, task_100ms },
+ {0, 13, 200, task_200ms },
+ {0, 17, 500, task_500ms },
+ {0, 19, 1000, task_1s },
+ {0, 23, 2000, task_2s },
+};
/******************************************
* : AppInit
@@ -31,114 +47,75 @@ void Task_2s(void);
* :
* :
******************************************/
-void App_Init(void)
+void app_init(void)
{
Usr_Flash.Init();
- COM_Uart1.Init(&COM_Uart1);
- COM_Uart2.Init(&COM_Uart2);
- COM_Uart4.Init(&COM_Uart4);
- Led.Init();
- UartCH_Config.init();
-
+ /*ڳʼ*/
+ com_uart1.init(&com_uart1);
+ com_uart2.init(&com_uart2);
+ com_uart4.init(&com_uart4);
+ UartCH_Config.init();
- tdlas.init();
- modbus_slave_ex.init();
- TJC_Init(&COM_Uart2);
- initRingBuffer();
- char init_msg[] = "ϵͳʼ...\r\n";
- HAL_UART_Transmit(COM_Uart2.Uart, (uint8_t*)init_msg, strlen(init_msg), 100);
+ app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); /*ʱãʱƬѯ*/
+ tjc_hmi.init();
+ led.init();
+
//Wdg.Init();
}
/******************************************
- * : App_Task
+ * : App_task
* : ʱ
* :
* :
* : ѭе
******************************************/
-void App_Task(void)
+void app_task(void)
{
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10))
- {
- OsTimeTick_10ms = osTime_MSecTick;
- Task_10ms();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_50ms, osTime_MSecTick, 50))
- {
- OsTimeTick_50ms = osTime_MSecTick;
- Task_50ms();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_100ms, osTime_MSecTick, 100))
- {
- OsTimeTick_100ms = osTime_MSecTick;
- Task_100ms();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_200ms, osTime_MSecTick, 200))
- {
- OsTimeTick_200ms = osTime_MSecTick;
- Task_200ms();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_500ms, osTime_MSecTick, 500))
- {
- OsTimeTick_500ms = osTime_MSecTick;
- Task_500ms();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_1s, osTime_MSecTick, 1000))
- {
- OsTimeTick_1s = osTime_MSecTick;
- Task_1s();
- }
- if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_2s, osTime_MSecTick, 2000))
- {
- OsTimeTick_2s = osTime_MSecTick;
- Task_2s();
- }
- TASK_Idle();
+ app_timer.task();
+ task_idle();
}
/*ִеĺ*/
-void TASK_Idle(void)
+void task_idle(void)
{
- COM_Uart1.Rx_Task(&COM_Uart1);
- COM_Uart2.Rx_Task(&COM_Uart2);
- COM_Uart4.Rx_Task(&COM_Uart4);
+ com_uart1.rx_task(&com_uart1);
+ com_uart2.rx_task(&com_uart2);
+ com_uart4.rx_task(&com_uart4);
}
-void Task_10ms(void)
+void task_10ms(void)
{
}
-void Task_50ms(void)
+void task_50ms(void)
{
-// tdlas.tx_task();
+
}
-void Task_100ms(void)
+void task_100ms(void)
{
-// tdlas.tx_task();
+
}
-void Task_200ms(void)
+void task_200ms(void)
{
}
-void Task_500ms(void)
+void task_500ms(void)
{
-// UartCH_Config.ch_set(ch);
-// tdlas.tx_task();
- Led.Flash();
+ led.task();
}
-void Task_1s(void)
+void task_1s(void)
{
}
-void Task_2s(void)
+void task_2s(void)
{
}
diff --git a/calib_board/usr/app/app.h b/calib_board/usr/app/app.h
index a6aa29b..d0c3b56 100644
--- a/calib_board/usr/app/app.h
+++ b/calib_board/usr/app/app.h
@@ -4,7 +4,12 @@
extern const char *HwVersion;
extern char SwVersion[24];
-void App_Init(void);
-void App_Task(void);
+
+
+void app_init(void);
+void app_task(void);
+
+
+
#endif
diff --git a/calib_board/usr/app/app_com.c b/calib_board/usr/app/app_com.c
new file mode 100644
index 0000000..7d28fd5
--- /dev/null
+++ b/calib_board/usr/app/app_com.c
@@ -0,0 +1,7 @@
+#include "app_com.h"
+
+
+
+
+
+
diff --git a/calib_board/usr/app/app_com.h b/calib_board/usr/app/app_com.h
new file mode 100644
index 0000000..770071a
--- /dev/null
+++ b/calib_board/usr/app/app_com.h
@@ -0,0 +1,28 @@
+#ifndef _APP_COM_H_
+#define _APP_COM_H_
+
+#include "main.h"
+#include "app_leakage.h"
+#include "bsp_uart.h"
+
+#define APP_COM_NUM (4)
+
+typedef struct
+{
+ u8 baudrate; /**/
+}app_com_flash_data_t;
+
+typedef struct
+{
+ app_com_flash_data_t flash_data; /*flash*/
+ u16 device_num; /*豸*/
+ u8 device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*豸*/
+ bsp_uart_t *uart; /*ĸ*/
+}app_com_class_t;
+
+typedef struct
+{
+ app_com_class_t com_class[APP_COM_NUM];
+}app_com_t;
+
+#endif
\ No newline at end of file
diff --git a/calib_board/usr/app/app_leakage.c b/calib_board/usr/app/app_leakage.c
new file mode 100644
index 0000000..f274e59
--- /dev/null
+++ b/calib_board/usr/app/app_leakage.c
@@ -0,0 +1,100 @@
+#include "app_leakage.h"
+
+#include
+
+
+
+app_leakage_t leakage =
+{
+
+};
+app_leakage_t *p_leakage = &leakage;
+
+/*࣬ͬһ豸ֵһ*/
+static void app_leakage_region_classify(void)
+{
+ u16 i,j;
+ u8 add_region_flag;
+
+ /**/
+ p_leakage->region_num = 0;
+ p_leakage->sub_device_num = 0;
+ memset(p_leakage->region_data,0,sizeof(p_leakage->region_data));
+
+ /*ϵͳ*/
+ for(i=0;isub_device_data[i].flash_data.state)
+ {
+ p_leakage->sub_device_num++;/*ϵͳ++*/
+ /**/
+ for(j=0;jregion_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*ͬ*/
+ {
+ /*豸*/
+ p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*豸*/
+ p_leakage->region_data[j].leakage_num++; /*ϵͳ++*/
+ add_region_flag = 0;/**/
+ break;
+ }
+ }
+
+ /*ûҵͬ*/
+ if(add_region_flag)/**/
+ {
+ /**/
+ memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN);
+ p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*豸*/
+ p_leakage->region_data[p_leakage->region_num].leakage_num++; /*ϵͳ++*/
+ p_leakage->region_num++; /*++*/
+ }
+ }
+ }
+}
+
+/*쳣״̬豸ͳ*/
+void app_leakage_task(void)
+{
+ u16 i,j,k,sub_device_index;
+ /*쳣豸*/
+ /**/
+ for(i=0;iregion_num;i++)
+ {
+ /*豸*/
+ p_leakage->region_data[i].leakage_num = 0;
+ p_leakage->region_data[i].open_num = 0;
+ p_leakage->region_data[i].time_out_num = 0;
+ /*豸*/
+ for(j=0;jregion_data[i].leakage_num;j++)
+ {
+ /*¼*/
+ sub_device_index = p_leakage->region_data[i].sub_device_index[j];
+
+ /*ͨ*/
+ for(k=0;ksub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
+ {
+ p_leakage->region_data[i].time_out_num++;
+ break;
+ }
+ /*ϴ*/
+ else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
+ {
+ p_leakage->region_data[i].open_num++;
+ break;
+ }
+ /*©Һ*/
+ else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
+ {
+ p_leakage->region_data[i].leakage_num++;
+ break;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/calib_board/usr/app/app_leakage.h b/calib_board/usr/app/app_leakage.h
new file mode 100644
index 0000000..334dde0
--- /dev/null
+++ b/calib_board/usr/app/app_leakage.h
@@ -0,0 +1,62 @@
+#ifndef _APP_LEAKAGE_H_
+#define _APP_LEAKAGE_H_
+
+#include "main.h"
+
+#define ENABLE (1)
+#define DISABLE (0)
+
+#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*©Һ״̬*/
+#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*ϴ״̬*/
+#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*ͨѶʱ*/
+
+#define APP_LEAKAGE_STRING_NANE_LEN (10)
+#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
+#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
+
+/*豸洢IJ*/
+typedef struct
+{
+ u8 state; /*״̬ ʹ ʹ*/
+ u8 com_port; /*˿*/
+ u8 modbus_id; /*modbus id*/
+ u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*豸*/
+ u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /**/
+}app_leakage_sub_device_flash_data_t;
+
+/*豸Ϣ*/
+typedef struct
+{
+ app_leakage_sub_device_flash_data_t flash_data; /*flash洢*/
+ struct
+ {
+ u16 state; /*״̬*/
+ u16 distance; /*©Һ*/
+ }ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*ͨ*/
+}app_leakage_sub_device_class_t;
+
+
+/*Ϣ*/
+typedef struct
+{
+ u8 leakage_num; /*©Һ*/
+ u8 open_num; /*ϴ*/
+ u8 time_out_num; /*ͨѶʱ*/
+ u8 sub_device_num; /*豸*/
+ u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /**/
+ u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*豸*/
+}app_leakage_region_data_class_t;
+
+typedef struct
+{
+ u8 region_num;
+ u8 sub_device_num;
+ app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
+ app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
+
+ void (*init)(void); /*ʼ*/
+ void (*task)(void); /*ִ*/
+}app_leakage_t;
+
+extern app_leakage_t leakage;
+#endif
\ No newline at end of file
diff --git a/calib_board/usr/app/app_timer.c b/calib_board/usr/app/app_timer.c
new file mode 100644
index 0000000..d441a4c
--- /dev/null
+++ b/calib_board/usr/app/app_timer.c
@@ -0,0 +1,195 @@
+#include "app_timer.h"
+#include "app.h"
+
+/* */
+static void app_timer_task(void);
+static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class);
+static void app_timer_task_increment_int(u16 ms_tick);
+
+/******************************************
+ * ṹ: app_timer
+ * : Ӧöʱʵ
+ * : ʱƽṹľʵ
+*******************************************/
+app_timer_t app_timer =
+{
+ .p_timer_class = NULL,
+ .init = app_timer_init,
+ .task = app_timer_task,
+ .increment_int = app_timer_task_increment_int,
+};
+
+/* ȫָ룬ָʱṹ */
+app_timer_t *p_app_timer = &app_timer;
+
+/******************************************
+ * : app_timer_init
+ * : ʱʼ
+ * : task_num -
+ * p_timer_class - ʱƬָ
+ * :
+ * : ʼʱ
+*******************************************/
+static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class)
+{
+ p_app_timer->task_num = task_num;
+ p_app_timer->p_timer_class = p_timer_class;
+}
+
+/******************************************
+ * : app_timer_task
+ * : ʱ
+ * :
+ * :
+ * : ִѵʱ
+*******************************************/
+static void app_timer_task(void)
+{
+ u16 i;
+
+ /* ǷЧ */
+ if(NULL == p_app_timer->p_timer_class)
+ {
+ return;
+ }
+
+ /* */
+ for (i = 0; i < p_app_timer->task_num; i++)
+ {
+ /* ǷҪִ */
+ if (p_app_timer->p_timer_class[i].run_flag)
+ {
+ p_app_timer->p_timer_class[i].run_flag = 0; /* ִб־ */
+
+ /* ǷЧ */
+ if (p_app_timer->p_timer_class[i].task == NULL)
+ {
+ continue;
+ }
+
+ /* ִ */
+ p_app_timer->p_timer_class[i].task();
+ }
+ }
+}
+
+/******************************************
+ * : app_timer_task_increment_int
+ * : жϵ
+ * : ms_tick -
+ * :
+ * : жеã¶ʱͼʱƬ
+*******************************************/
+static void app_timer_task_increment_int(u16 ms_tick)
+{
+ u16 i;
+
+ /* º뼶 */
+ p_app_timer->ms_tick++;
+
+ /* 뼶 */
+ if(p_app_timer->ms_tick >= 1000)
+ {
+ p_app_timer->s_tick++;
+ }
+
+ /* ǷЧ */
+ if(NULL == p_app_timer->p_timer_class)
+ {
+ return;
+ }
+
+ /* ʱƬ */
+ for (i = 0; i < p_app_timer->task_num; i++)
+ {
+ /* ǷЧ */
+ if (p_app_timer->p_timer_class[i].timer_count)
+ {
+ p_app_timer->p_timer_class[i].timer_count--;
+
+ /* Ƿִʱ */
+ if (p_app_timer->p_timer_class[i].timer_count == 0)
+ {
+ p_app_timer->p_timer_class[i].run_flag = 1;
+ p_app_timer->p_timer_class[i].timer_count = p_app_timer->p_timer_class[i].timer_reload;
+ }
+ }
+ }
+}
+
+/******************************************
+ * : app_timer_check_time_out
+ * : 鳬ʱ
+ * : time_start - ʱʼʱ
+ * time_now - ǰʱ
+ * time_out - ʱʱ
+ * : TIME_TRUE - ѳʱTIME_FALSE - δʱ
+ * : time_startʼtime_outʱǷʱ
+ * ˼
+*******************************************/
+u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out)
+{
+ u16 timer_activate_val;
+
+ /* 㴥ʱ */
+ timer_activate_val = time_out + time_start;
+
+ /* Ǽ */
+ if (timer_activate_val > time_start)
+ {
+ /* δ */
+ if ((time_now >= timer_activate_val) || (time_now < time_start))
+ {
+ return TIME_TRUE;
+ }
+ }
+ else if ((time_now >= timer_activate_val) && (time_now < time_start))
+ {
+ /* ҵǰʱ */
+ return TIME_TRUE;
+ }
+
+ return TIME_FALSE;
+}
+
+/******************************************
+ * : app_timer_check_run_time
+ * : ʣʱ
+ * : time_start - ʱʼʱ
+ * time_now - ǰʱ
+ * time_out - ʱʱ
+ * : ʣʱ䣨룩
+ * : app_timer_check_time_outʹã
+ * 볬ʱжʱ䣬˼
+*******************************************/
+u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out)
+{
+ u16 timer_activate_val;
+
+ /* 㴥ʱ */
+ timer_activate_val = time_out + time_start;
+
+ /* Ǽ */
+ if (timer_activate_val > time_start)
+ {
+ /* δֱӼʣʱ */
+ return (timer_activate_val - time_now);
+ }
+ else
+ {
+ /* ʣʱ */
+ return (65535U - time_now + timer_activate_val);
+ }
+}
+
+/******************************************
+ * : delay_ms
+ * : ʽʱ
+ * : delay - ʱʱ䣨룩
+ * :
+ * : ʹHALṩʱʵʽʱ
+*******************************************/
+void delay_ms(u16 delay)
+{
+ HAL_Delay(delay);
+}
\ No newline at end of file
diff --git a/calib_board/usr/app/app_timer.h b/calib_board/usr/app/app_timer.h
new file mode 100644
index 0000000..c153898
--- /dev/null
+++ b/calib_board/usr/app/app_timer.h
@@ -0,0 +1,48 @@
+#ifndef _APP_TIMER_H_
+#define _APP_TIMER_H_
+
+#include "main.h"
+
+/* ʱغ궨 */
+#define TIME_TRUE 1U /* ʱѵ */
+#define TIME_FALSE 0U /* ʱδ */
+
+/******************************************
+ * ṹ: app_timer_class_t
+ * : ʱƬṹ
+ * : 嵥ʱƬȲ
+*******************************************/
+typedef struct
+{
+ u8 run_flag; /* ȱ־1ȣ0 */
+ u16 timer_count; /* ʱƬֵ */
+ u16 timer_reload; /* ʱƬֵ */
+ void (*task)(void); /* ָ */
+} app_timer_class_t;
+
+/******************************************
+ * ṹ: app_timer_t
+ * : Ӧöʱṹ
+ * : Ķʱ
+*******************************************/
+typedef struct
+{
+ u16 ms_tick; /* δ뼶 */
+ u16 s_tick; /* δ뼶 */
+ u16 task_num; /* */
+ app_timer_class_t *p_timer_class; /* ʱƬָ */
+
+ void (*init)(u8, app_timer_class_t *); /* ʼָ */
+ void (*task)(void); /* ʱָ */
+ void (*increment_int)(u16); /* жϵָ */
+} app_timer_t;
+
+/* */
+u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out);
+u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out);
+void delay_ms(u16 delay);
+
+/* ⲿ */
+extern app_timer_t app_timer;
+
+#endif
\ No newline at end of file
diff --git a/calib_board/usr/app/os_timer.c b/calib_board/usr/app/os_timer.c
deleted file mode 100644
index bfa4fdf..0000000
--- a/calib_board/usr/app/os_timer.c
+++ /dev/null
@@ -1,121 +0,0 @@
-#include "os_timer.h"
-
-unsigned short osTime_MSecTick = 0; /*δʱ*/
-unsigned short osTime_SecTick = 0;
-unsigned short osTime_10SecTick = 0; /*10sһ Զʱ¼*/
-
-static unsigned short osTimer_MSec1 = 0;
-static unsigned short osTimer_MSec2 = 0;
-
-unsigned short OsTimeTick_10ms;
-unsigned short OsTimeTick_50ms;
-unsigned short OsTimeTick_100ms;
-unsigned short OsTimeTick_200ms;
-unsigned short OsTimeTick_500ms;
-unsigned short OsTimeTick_1s;
-unsigned short OsTimeTick_2s;
-
-/****************************************************************************
- * NAME: OsTimer_Init
- * CALLED BY: Application
- * PRECONDITIONS:
- * INPUT PARAMETERS: None
- * RETURN VALUES: None
- * DESCRIPTION: OsTimer initialization
- *
- ****************************************************************************/
-
-void OsTimer_Init(void)
-{
- osTimer_MSec1 = 0;
- osTimer_MSec2 = 0;
- osTime_SecTick = 0;
- osTime_MSecTick = 0;
-
- OsTimeTick_10ms = osTime_MSecTick;
- OsTimeTick_50ms = osTime_MSecTick;
- OsTimeTick_100ms = osTime_MSecTick;
- OsTimeTick_200ms = osTime_MSecTick;
- OsTimeTick_500ms = osTime_MSecTick;
- OsTimeTick_1s = osTime_MSecTick;
-}
-
-/****************************************************************************
- * NAME: OsTimer_Increment
- * CALLED BY: ISR
- * PRECONDITIONS:
- * INPUT PARAMETERS: msec - millisecond to increase
- * RETURN VALUES: None
- * DESCRIPTION: Increase the Timer
- *
- ****************************************************************************/
-void OsTimer_Increment(unsigned short msec)
-{
- osTime_MSecTick += msec;
- osTimer_MSec1 += msec;
- osTimer_MSec2 += msec;
- if (osTimer_MSec1 >= 1000U) /*1s*/
- {
- osTimer_MSec1 = 0U;
- osTime_SecTick++;
- }
- if (osTimer_MSec2 >= 10000U) /*10s*/
- {
- osTimer_MSec2 = 0U;
- osTime_10SecTick++;
- }
-}
-
-/****************************************************************************
- * NAME: OsTimer_CheckTimeOut
- * CALLED BY: Application
- * PRECONDITIONS:
- * INPUT PARAMETERS: timeStart - start tick
- * timeNow - current tick
- * timeOut - expired tick
- * RETURN VALUES: whether timer is expired
- * DESCRIPTION: check if specified time is expired
- *
- ****************************************************************************/
-unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
-{
- unsigned short timerActivateVal;
- timerActivateVal = timeOut + timeStart;
-
- if (timerActivateVal > timeStart)
- {
- if ((timeNow >= timerActivateVal) || (timeNow < timeStart))
- {
- return TIME_TRUE;
- }
- }
- else if ((timeNow >= timerActivateVal) && (timeNow < timeStart))
- {
- return TIME_TRUE;
- }
- return TIME_FALSE;
-}
-
-/*
-лжʱ OsTimer_CheckTimeOutʹ
-*/
-unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
-{
- unsigned short timerActivateVal;
- timerActivateVal = timeOut + timeStart;
-
- if (timerActivateVal > timeStart)
- {
- return (timerActivateVal - timeNow);
- }
- else
- {
- return (65535U - timeNow + timerActivateVal);
- }
-}
-
-/*ʽʱ*/
-void Delay_ms(unsigned short delay)
-{
- HAL_Delay(delay);
-}
diff --git a/calib_board/usr/app/os_timer.h b/calib_board/usr/app/os_timer.h
deleted file mode 100644
index 6ff9a4e..0000000
--- a/calib_board/usr/app/os_timer.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _OSTIMER_H_
-#define _OSTIMER_H_
-
-#include "main.h"
-
-#define TIME_TRUE 1U
-#define TIME_FALSE 0U
-
-
-extern unsigned short osTime_MSecTick;
-extern unsigned short osTime_SecTick;
-extern unsigned short osTime_10SecTick; // 10sһ Զʱ¼
-
-extern unsigned short OsTimeTick_10ms;
-extern unsigned short OsTimeTick_50ms;
-extern unsigned short OsTimeTick_100ms;
-extern unsigned short OsTimeTick_200ms;
-extern unsigned short OsTimeTick_500ms;
-extern unsigned short OsTimeTick_1s;
-extern unsigned short OsTimeTick_2s;
-
-void OsTimer_Init(void);
-void OsTimer_Increment(unsigned short msec);
-unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
-unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
-
-void Delay_ms(unsigned short delay);
-
-#endif
diff --git a/calib_board/usr/bsp/bsp_74HC4067.c b/calib_board/usr/bsp/bsp_74HC4067.c
index 0d903f0..9c7503b 100644
--- a/calib_board/usr/bsp/bsp_74HC4067.c
+++ b/calib_board/usr/bsp/bsp_74HC4067.c
@@ -1,5 +1,4 @@
#include "bsp_74HC4067.h"
-#include "os_timer.h"
/*Ƭ74HC4067һƬTX һƬRX ÿƬ16ͨ*/
diff --git a/calib_board/usr/bsp/bsp_Led.c b/calib_board/usr/bsp/bsp_Led.c
index 28974e8..4f1e5f7 100644
--- a/calib_board/usr/bsp/bsp_Led.c
+++ b/calib_board/usr/bsp/bsp_Led.c
@@ -1,5 +1,5 @@
#include "bsp_Led.h"
-#include "os_timer.h"
+#include "app_timer.h"
#define LED1_ON HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
#define LED1_OFF HAL_GPIO_WritePin (LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
@@ -14,25 +14,25 @@
#define LED3_TOGGLE HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin)
-static void bsp_Led_Init(void);
-static void bsp_Led_Flash(void);
+static void bsp_led_init(void);
+static void bsp_led_task(void);
-bsp_Led_t Led =
+bsp_led_t led =
{
- .Init = bsp_Led_Init,
- .Flash = bsp_Led_Flash,
+ .init = bsp_led_init,
+ .task = bsp_led_task,
};
/*ʼ˸ʾʼ*/
-static void bsp_Led_Init(void)
+static void bsp_led_init(void)
{
for(u8 i = 0;i < 20;i++)
{
- Delay_ms(50);
+ delay_ms(50);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}
}
-static void bsp_Led_Flash(void)
+static void bsp_led_task(void)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}
diff --git a/calib_board/usr/bsp/bsp_Led.h b/calib_board/usr/bsp/bsp_Led.h
index 4ec6d54..6316113 100644
--- a/calib_board/usr/bsp/bsp_Led.h
+++ b/calib_board/usr/bsp/bsp_Led.h
@@ -6,10 +6,10 @@
typedef struct
{
- void (*Init)(void);
- void (*Flash)(void);
-}bsp_Led_t;
+ void (*init)(void);
+ void (*task)(void);
+}bsp_led_t;
-extern bsp_Led_t Led;
+extern bsp_led_t led;
#endif
diff --git a/calib_board/usr/bsp/bsp_Uart.c b/calib_board/usr/bsp/bsp_Uart.c
deleted file mode 100644
index 3c47baa..0000000
--- a/calib_board/usr/bsp/bsp_Uart.c
+++ /dev/null
@@ -1,396 +0,0 @@
-#include "bsp_Uart.h"
-
-#include "string.h"
-
-//#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_RESET)
-#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
-#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
-
-/*շ*/
-#define RX_TEMP_BUFF_NUM (3000U)
-u8 Rx_Temp_Buff[RX_TEMP_BUFF_NUM];
-
-#define UART1_TX_LEN (3000U)
-#define UART1_RX_LEN (3000U)
-
-#define UART2_TX_LEN (3000U)
-#define UART2_RX_LEN (3000U)
-
-#define UART4_TX_LEN (3000U)
-#define UART4_RX_LEN (3000U)
-
-u8 Uart1_TX_Buff[UART1_TX_LEN];
-u8 Uart1_Rx_Buff[UART1_RX_LEN];
-
-u8 Uart2_TX_Buff[UART2_TX_LEN];
-u8 Uart2_Rx_Buff[UART2_RX_LEN];
-
-u8 Uart4_TX_Buff[UART4_TX_LEN];
-u8 Uart4_Rx_Buff[UART4_RX_LEN];
-
-static void bsp_Uart_Init(bsp_Uart_t *p_Uart);
-static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len);
-static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart);
-static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time);
-static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart);
-static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart);
-static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart);
-
-extern UART_HandleTypeDef huart1;
-extern UART_HandleTypeDef huart2;
-extern UART_HandleTypeDef huart4;
-
-extern DMA_HandleTypeDef hdma_usart1_rx;
-extern DMA_HandleTypeDef hdma_usart1_tx;
-extern DMA_HandleTypeDef hdma_usart2_rx;
-extern DMA_HandleTypeDef hdma_usart2_tx;
-extern DMA_HandleTypeDef hdma_uart4_rx;
-extern DMA_HandleTypeDef hdma_uart4_tx;
-
-bsp_Uart_t COM_Uart1 =
-{
- .RxQueue = queue(u8,UART1_RX_LEN),
- .Uart =&huart1,
-
- .Tx_DMA = &hdma_usart1_tx,
- .Rx_DMA = &hdma_usart1_rx,
-
- .Tx_DMA_Len = UART1_TX_LEN,
- .Rx_DMA_Len = UART1_RX_LEN,
-
- .Tx_Addr = &Uart1_TX_Buff[0],
- .Rx_Addr = &Uart1_Rx_Buff[0],
-
- .Tx_DMA_CompleteFlag = 1,
- .Rx_TimeOver = 0,
-
- .relay.uart = NULL,
-
- .Init = bsp_Uart_Init,
- .Send = bsp_Uart_Send,
-
- .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
- .Rx_IdleInt = bsp_Uart_Rx_IdleInt,
- .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
- .Rx_DataAnalysis = NULL,
- .Rx_Task = bsp_Uart_Rx_Task,
-};
-
-bsp_Uart_t COM_Uart2 =
-{
- .RxQueue = queue(u8,UART2_RX_LEN),
- .Uart =&huart2,
-
- .Tx_DMA = &hdma_usart2_tx,
- .Rx_DMA = &hdma_usart2_rx,
-
- .Tx_DMA_Len = UART2_TX_LEN,
- .Rx_DMA_Len = UART2_RX_LEN,
-
- .Tx_Addr = &Uart2_TX_Buff[0],
- .Rx_Addr = &Uart2_Rx_Buff[0],
-
- .Tx_DMA_CompleteFlag = 1,
- .Rx_TimeOver = 0,
-
- .relay.uart = &COM_Uart4,
-
- .Init = bsp_Uart_Init,
- .Send = bsp_Uart_Send,
- .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
- .Rx_IdleInt = bsp_Uart_Rx_IdleInt,
- .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
- .Rx_DataAnalysis = NULL,
- .Rx_Task = bsp_Uart_Rx_Task,
-};
-
-bsp_Uart_t COM_Uart4 =
-{
- .RxQueue = queue(u8,UART4_RX_LEN),
- .Uart =&huart4,
-
- .Tx_DMA = &hdma_uart4_tx,
- .Rx_DMA = &hdma_uart4_rx,
-
- .Tx_DMA_Len = UART4_TX_LEN,
- .Rx_DMA_Len = UART4_RX_LEN,
-
- .Tx_Addr = &Uart4_TX_Buff[0],
- .Rx_Addr = &Uart4_Rx_Buff[0],
-
- .Tx_DMA_CompleteFlag = 1,
- .Rx_TimeOver = 0,
-
- .relay.uart = NULL,
-
- .Init = bsp_Uart_Init,
- .Send = bsp_Uart_Send,
- .Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
- .Rx_IdleInt = bsp_Uart_Rx_IdleInt,
- .Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
- .Rx_DataAnalysis = NULL,
- .Rx_Task = bsp_Uart_Rx_Task,
-};
-
-
-/* ʼ */
-static void bsp_Uart_Init(bsp_Uart_t *p_Uart)
-{
- /*ݽ*/
- //p_Uart->Rx_DataAnalysis = NULL;
-
- /* ÿж */
- __HAL_UART_ENABLE_IT(p_Uart->Uart, UART_IT_IDLE);
-
- /* DMA */
- //HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
- /* */
- HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
-}
-
-
-static void bsp_Uart_DMASend(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
-{
- u32 tickstart,tick;
- p_Uart->Tx_DMA_CompleteFlag = 0;
- if(p_Uart->Tx_DMA_Len < Len)
- Len = p_Uart->Tx_DMA_Len;
- memcpy(p_Uart->Tx_Addr, pData, Len); /*ݵͻ*/
-
-// /*ʽͣʽͣᵼշʱлͨ*/
-// HAL_UART_Transmit(p_Uart->Uart,p_Uart->Tx_Addr,Len,500);
-
-
- HAL_UART_Transmit_DMA(p_Uart->Uart,p_Uart->Tx_Addr,Len);
- tickstart = HAL_GetTick();
- while( !p_Uart->Tx_DMA_CompleteFlag)
- {
- tick = HAL_GetTick();
- if((tick - tickstart) > 200) // 1000ms ʱ
- {
- p_Uart->Tx_DMA_CompleteFlag = 1;
- break;
- }
- }
-}
-
-/**/
-static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
-{
- u16 i,SendNum;
-
- if(p_Uart == &COM_Uart4)
- RS485_TX;
- SendNum = Len / p_Uart->Tx_DMA_Len;
- for(i=0;iTx_DMA_Len * i], p_Uart->Tx_DMA_Len);
- }
-
- /*ʣ*/
- Len -= p_Uart->Tx_DMA_Len * i;
- if(0 == Len)
- {
- return ;
- }
- else
- {
- bsp_Uart_DMASend(p_Uart,&pData[p_Uart->Tx_DMA_Len * i],Len);
- }
-}
-
-static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart)
-{
- p_Uart->Tx_DMA_CompleteFlag = 1;
-}
-
-/*нж*/
-static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart)
-{
- u16 Rx_Length, i;
- /*ֹͣ*/
- HAL_UART_DMAStop(p_Uart->Uart);
-
- /* յݳ */
- Rx_Length = p_Uart->Rx_DMA_Len - __HAL_DMA_GET_COUNTER(p_Uart->Rx_DMA);
-
- /* Ϊ0ֱӷ */
- if (Rx_Length == 0) {
- return;
- }
-
- /* */
- for (i = 0; i < Rx_Length; i++)
- {
- queue_push_back(p_Uart->RxQueue, (void *)&p_Uart->Rx_Addr[i]);
- }
- /* ʼ */
- bsp_Uart_Rx_TimeStart(p_Uart);
-// HAL_UART_Receive_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
- HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
-}
-
-
-
-
-/*жϼ*/
-static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time)
-{
- /*ʼ*/
- if(1 == p_Uart->Rx_StartFlag)
- {
- p_Uart->Rx_TimeCount += Time;
- }
-}
-
-/*ʼ*/
-static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart)
-{
- p_Uart->Rx_StartFlag = 1;
- p_Uart->Rx_TimeCount = 0;
-}
-
-/*ֹͣ*/
-static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart)
-{
- p_Uart->Rx_StartFlag = 0;
- p_Uart->Rx_TimeCount = 0;
-}
-
-static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart)
-{
- /*ʱɣյһ֡*/
- if(p_Uart->Rx_TimeOver < p_Uart->Rx_TimeCount)
- {
- p_Uart->Rx_Len = queue_size(p_Uart->RxQueue);
- /*ֹͣ*/
- bsp_Uart_Rx_TimeStop(p_Uart);
- if(p_Uart->Rx_Len <= p_Uart->Rx_DMA_Len && (0 != p_Uart->Rx_Len))
- {
- if(RX_TEMP_BUFF_NUM < p_Uart->Rx_Len)
- {
- queue_clear(p_Uart->RxQueue);
- }
- else
- {
- for(u16 i = 0;i < p_Uart->Rx_Len;i++)
- {
- queue_pop(p_Uart->RxQueue,&Rx_Temp_Buff[i]);
- }
- if(NULL != p_Uart->Rx_DataAnalysis)
- {
- p_Uart->Rx_DataAnalysis(Rx_Temp_Buff,p_Uart->Rx_Len,p_Uart); /**/
- }
- // p_Uart->Send(p_Uart,Rx_Temp_Buff,p_Uart->Rx_Len);
- }
- }
- }
-}
-
-
-
-// صдORE
-void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
-{
- bsp_Uart_t *p_Uart = NULL;
- if (huart->Instance == USART1)
- {
- p_Uart = &COM_Uart1;
- }
- else if (huart->Instance == USART2)
- {
- p_Uart = &COM_Uart2;
- }
- else if (huart->Instance == UART4)
- {
- p_Uart = &COM_Uart4;
- }
-
- //
- if(huart->ErrorCode & HAL_UART_ERROR_NE)
- {
- //
- __HAL_UART_CLEAR_NEFLAG(huart);
- }
- if(huart->ErrorCode & HAL_UART_ERROR_FE)
- {
- // ֡
- __HAL_UART_CLEAR_FEFLAG(huart);
- }
- // ...
- if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET)
- {
- __HAL_UART_CLEAR_OREFLAG(huart); // ORE־
- }
- if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET)
- {
- __HAL_UART_CLEAR_FEFLAG(huart); // ORE־
- }
-
-//
- if(p_Uart != NULL)
- {
-// HAL_UART_DeInit(huart);
-// HAL_UART_Init(huart);
-// HAL_UART_DMAStop(p_Uart->Uart);
- HAL_UARTEx_ReceiveToIdle_DMA(p_Uart->Uart, p_Uart->Rx_Addr, p_Uart->Rx_DMA_Len);
- }
-}
-
-// ʵֿжϻص
-void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
-{
- if (huart->Instance == USART1)
- {
- bsp_Uart_Rx_IdleInt(&COM_Uart1);
- }
- else if (huart->Instance == USART2)
- {
- bsp_Uart_Rx_IdleInt(&COM_Uart2);
- }
- else if (huart->Instance == UART4)
- {
- bsp_Uart_Rx_IdleInt(&COM_Uart4);
- }
-}
-
-/* ڽɻص - ж */
-void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
-{
-// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
-// {
-// __HAL_UART_CLEAR_IDLEFLAG(huart);
-
-// if (huart->Instance == USART1)
-// {
-// bsp_Uart_Rx_IdleInt(&COM_Uart1);
-// }
-// else if (huart->Instance == USART2)
-// {
-// bsp_Uart_Rx_IdleInt(&COM_Uart2);
-// }
-// else if (huart->Instance == UART4)
-// {
-// bsp_Uart_Rx_IdleInt(&COM_Uart4);
-// }
-// }
-}
-
-
-void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
-{
- if (huart->Instance == USART1)
- {
- COM_Uart1.Tx_DMA_TCInt(&COM_Uart1);
- }
- else if (huart->Instance == USART2)
- {
- COM_Uart2.Tx_DMA_TCInt(&COM_Uart2);
- }
- else if (huart->Instance == UART4)
- {
- RS485_RX;
- COM_Uart4.Tx_DMA_TCInt(&COM_Uart4);
- }
-}
-
diff --git a/calib_board/usr/bsp/bsp_Uart.h b/calib_board/usr/bsp/bsp_Uart.h
deleted file mode 100644
index 9fc4733..0000000
--- a/calib_board/usr/bsp/bsp_Uart.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef _BSP_UART_H_
-#define _BSP_UART_H_
-
-#include "main.h"
-#include "algo_Queue.h"
-
-typedef struct bsp_Uart_t bsp_Uart_t;
-
-
-#define usart_type UART_HandleTypeDef
-#define dma_type DMA_HandleTypeDef
-
-/*ת*/
-typedef struct
-{
- u8 flag; /*ת־λ*/
- bsp_Uart_t *uart; /*תȥĴ*/
- u16 time_out; /*תʱʱ*/
-}bsp_uart_relay_t;
-
-struct bsp_Uart_t
-{
- queue RxQueue; /*ݽն*/
- usart_type *Uart; /**/
-
- dma_type *Tx_DMA; /*DMA*/
- dma_type *Rx_DMA;
-
- u8 Tx_DMA_CH;
- u8 Rx_DMA_CH;
- vu8 Tx_DMA_CompleteFlag; /*DMAɱ־λ*/
-
- u8 *Tx_Addr; /*DMA˻*/
- u8 *Rx_Addr;
- u16 Tx_DMA_Len;
- u16 Rx_DMA_Len;
-
- u16 Rx_Len; /*յݳ*/
- u16 Rx_TimeCount; /*ʱ*/
- u16 Rx_TimeOver; /*ʱʱ*/
- u8 Rx_StartFlag; /*ʼʱ־λ*/
-
-
- bsp_uart_relay_t relay; /*ת*/
- void (*Init)(bsp_Uart_t *); /*ʼ*/
- void (*Send)(bsp_Uart_t *,u8 *,u16); /*ڷͺ*/
-
- void (*Tx_DMA_TCInt)(bsp_Uart_t *); /*DMAж*/
-
- void (*Rx_IdleInt)(bsp_Uart_t *); /*ж*/
- void (*Rx_TimeIncrementInt)(bsp_Uart_t *,u16); /*жϼ*/
- void (*Rx_DataAnalysis)(u8 *,u16,void *); /*ݽ*/
- void (*Rx_Task)(bsp_Uart_t *); /*ڽ*/
-};
-
-extern bsp_Uart_t COM_Uart1;
-extern bsp_Uart_t COM_Uart2;
-extern bsp_Uart_t COM_Uart4;
-#endif
diff --git a/calib_board/usr/bsp/bsp_uart.c b/calib_board/usr/bsp/bsp_uart.c
new file mode 100644
index 0000000..ed9b242
--- /dev/null
+++ b/calib_board/usr/bsp/bsp_uart.c
@@ -0,0 +1,489 @@
+#include "bsp_uart.h"
+#include "string.h"
+
+/* RS485ƺ궨 */
+#define RS485_RX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
+#define RS485_TX HAL_GPIO_WritePin(RS485_EN_GPIO_Port, RS485_EN_Pin, GPIO_PIN_SET)
+
+/* շС */
+#define RX_TEMP_BUFF_NUM (3000U)
+
+/* UARTС */
+#define UART1_TX_LEN (3000U)
+#define UART1_RX_LEN (3000U)
+
+#define UART2_TX_LEN (3000U)
+#define UART2_RX_LEN (3000U)
+
+#define UART4_TX_LEN (3000U)
+#define UART4_RX_LEN (3000U)
+
+/* ȫֻ */
+u8 uart1_tx_buff[UART1_TX_LEN];
+u8 uart1_rx_buff[UART1_RX_LEN];
+
+u8 uart2_tx_buff[UART2_TX_LEN];
+u8 uart2_rx_buff[UART2_RX_LEN];
+
+u8 uart4_tx_buff[UART4_TX_LEN];
+u8 uart4_rx_buff[UART4_RX_LEN];
+
+u8 rx_temp_buff[RX_TEMP_BUFF_NUM];
+
+/* */
+static void bsp_uart_init(bsp_uart_t *p_uart);
+static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
+static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart);
+static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time);
+static void bsp_uart_rx_task(bsp_uart_t *p_uart);
+static void bsp_uart_rx_time_start(bsp_uart_t *p_uart);
+static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart);
+static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
+
+/* ⲿHAL */
+extern UART_HandleTypeDef huart1;
+extern UART_HandleTypeDef huart2;
+extern UART_HandleTypeDef huart4;
+
+extern DMA_HandleTypeDef hdma_usart1_rx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern DMA_HandleTypeDef hdma_usart2_rx;
+extern DMA_HandleTypeDef hdma_usart2_tx;
+extern DMA_HandleTypeDef hdma_uart4_rx;
+extern DMA_HandleTypeDef hdma_uart4_tx;
+
+/******************************************
+ * ṹ: com_uart1
+ * : UART1ʵ
+ * : UART1Ӳͻص
+*******************************************/
+bsp_uart_t com_uart1 =
+{
+ .rx_queue = queue(u8, UART1_RX_LEN),
+ .uart = &huart1,
+
+ .tx_dma = &hdma_usart1_tx,
+ .rx_dma = &hdma_usart1_rx,
+
+ .tx_dma_len = UART1_TX_LEN,
+ .rx_dma_len = UART1_RX_LEN,
+
+ .tx_addr = &uart1_tx_buff[0],
+ .rx_addr = &uart1_rx_buff[0],
+
+ .tx_dma_complete_flag = 1,
+ .rx_time_over = 0,
+
+ .relay.uart = NULL,
+
+ .init = bsp_uart_init,
+ .send = bsp_uart_send,
+
+ .tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
+ .rx_idle_int = bsp_uart_rx_idle_int,
+ .rx_time_increment_int = bsp_uart_rx_time_increment,
+ .rx_data_analysis = NULL,
+ .rx_task = bsp_uart_rx_task,
+};
+
+/******************************************
+ * ṹ: com_uart2
+ * : UART2ʵ
+ * : UART2Ӳͻص
+*******************************************/
+bsp_uart_t com_uart2 =
+{
+ .rx_queue = queue(u8, UART2_RX_LEN),
+ .uart = &huart2,
+
+ .tx_dma = &hdma_usart2_tx,
+ .rx_dma = &hdma_usart2_rx,
+
+ .tx_dma_len = UART2_TX_LEN,
+ .rx_dma_len = UART2_RX_LEN,
+
+ .tx_addr = &uart2_tx_buff[0],
+ .rx_addr = &uart2_rx_buff[0],
+
+ .tx_dma_complete_flag = 1,
+ .rx_time_over = 0,
+
+ .relay.uart = &com_uart4,
+
+ .init = bsp_uart_init,
+ .send = bsp_uart_send,
+ .tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
+ .rx_idle_int = bsp_uart_rx_idle_int,
+ .rx_time_increment_int = bsp_uart_rx_time_increment,
+ .rx_data_analysis = NULL,
+ .rx_task = bsp_uart_rx_task,
+};
+
+/******************************************
+ * ṹ: com_uart4
+ * : UART4ʵ
+ * : UART4Ӳͻص
+*******************************************/
+bsp_uart_t com_uart4 =
+{
+ .rx_queue = queue(u8, UART4_RX_LEN),
+ .uart = &huart4,
+
+ .tx_dma = &hdma_uart4_tx,
+ .rx_dma = &hdma_uart4_rx,
+
+ .tx_dma_len = UART4_TX_LEN,
+ .rx_dma_len = UART4_RX_LEN,
+
+ .tx_addr = &uart4_tx_buff[0],
+ .rx_addr = &uart4_rx_buff[0],
+
+ .tx_dma_complete_flag = 1,
+ .rx_time_over = 0,
+
+ .relay.uart = NULL,
+
+ .init = bsp_uart_init,
+ .send = bsp_uart_send,
+ .tx_dma_tc_int = bsp_uart_tx_dma_tc_int,
+ .rx_idle_int = bsp_uart_rx_idle_int,
+ .rx_time_increment_int = bsp_uart_rx_time_increment,
+ .rx_data_analysis = NULL,
+ .rx_task = bsp_uart_rx_task,
+};
+
+/******************************************
+ * : bsp_uart_init
+ * : UARTʼ
+ * : p_uart - ָUARTṹָ
+ * :
+ * : ʼUARTʹܿжϺDMA
+*******************************************/
+static void bsp_uart_init(bsp_uart_t *p_uart)
+{
+ /* ÿж */
+ __HAL_UART_ENABLE_IT(p_uart->uart, UART_IT_IDLE);
+
+ /* գʹÿжģʽ */
+ HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
+}
+
+/******************************************
+ * : bsp_uart_dma_send
+ * : DMAͺ
+ * : p_uart - ָUARTṹָ
+ * p_data - Ҫ͵ָ
+ * len - Ҫ͵ݳ
+ * :
+ * : ʹDMAݣгʱ
+*******************************************/
+static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len)
+{
+ u32 tick_start, tick;
+
+ p_uart->tx_dma_complete_flag = 0;
+
+ /* ͵ijȴڻȣض */
+ if(p_uart->tx_dma_len < len)
+ len = p_uart->tx_dma_len;
+
+ /* ݵͻ */
+ memcpy(p_uart->tx_addr, p_data, len);
+
+ /* DMA */
+ HAL_UART_Transmit_DMA(p_uart->uart, p_uart->tx_addr, len);
+
+ /* ȴɣʱ */
+ tick_start = HAL_GetTick();
+ while(!p_uart->tx_dma_complete_flag)
+ {
+ tick = HAL_GetTick();
+ if((tick - tick_start) > 200) /* 200msʱ */
+ {
+ p_uart->tx_dma_complete_flag = 1;
+ break;
+ }
+ }
+}
+
+/******************************************
+ * : bsp_uart_send
+ * : UARTͺ
+ * : p_uart - ָUARTṹָ
+ * p_data - Ҫ͵ָ
+ * len - Ҫ͵ݳ
+ * :
+ * : ͺַֿ֧鷢
+*******************************************/
+static void bsp_uart_send(bsp_uart_t *p_uart, u8 *p_data, u16 len)
+{
+ u16 i, send_num;
+
+ /* RS485лģʽ */
+ if(p_uart == &com_uart4)
+ RS485_TX;
+
+ /* Ҫ͵Ĵ */
+ send_num = len / p_uart->tx_dma_len;
+
+ /* ֿ鷢 */
+ for(i = 0; i < send_num; i++)
+ {
+ bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], p_uart->tx_dma_len);
+ }
+
+ /* ʣ */
+ len -= p_uart->tx_dma_len * i;
+ if(0 == len)
+ {
+ return;
+ }
+ else
+ {
+ bsp_uart_dma_send(p_uart, &p_data[p_uart->tx_dma_len * i], len);
+ }
+}
+
+/******************************************
+ * : bsp_uart_tx_dma_tc_int
+ * : DMAжϴ
+ * : p_uart - ָUARTṹָ
+ * :
+ * : DMAжеã÷ɱ־
+*******************************************/
+static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart)
+{
+ p_uart->tx_dma_complete_flag = 1;
+}
+
+/******************************************
+ * : bsp_uart_rx_idle_int
+ * : жϴ
+ * : p_uart - ָUARTṹָ
+ * :
+ * : UARTжϣյݴ
+*******************************************/
+static void bsp_uart_rx_idle_int(bsp_uart_t *p_uart)
+{
+ u16 rx_length, i;
+
+ /* ֹͣ */
+ HAL_UART_DMAStop(p_uart->uart);
+
+ /* յݳ */
+ rx_length = p_uart->rx_dma_len - __HAL_DMA_GET_COUNTER(p_uart->rx_dma);
+
+ /* Ϊ0ֱӷ */
+ if (rx_length == 0)
+ {
+ return;
+ }
+
+ /* յݴ */
+ for (i = 0; i < rx_length; i++)
+ {
+ queue_push_back(p_uart->rx_queue, (void *)&p_uart->rx_addr[i]);
+ }
+
+ /* ʼճʱʱ */
+ bsp_uart_rx_time_start(p_uart);
+
+ /* */
+ HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
+}
+
+/******************************************
+ * : bsp_uart_rx_time_increment
+ * : ճʱʱ
+ * : p_uart - ָUARTṹָ
+ * time - ӵʱֵ
+ * :
+ * : жеãճʱ
+*******************************************/
+static void bsp_uart_rx_time_increment(bsp_uart_t *p_uart, u16 time)
+{
+ /* Ѿʼʱ */
+ if(1 == p_uart->rx_start_flag)
+ {
+ p_uart->rx_time_count += time;
+ }
+}
+
+/******************************************
+ * : bsp_uart_rx_time_start
+ * : ճʱʱ
+ * : p_uart - ָUARTṹָ
+ * :
+ * : ʼճʱ
+*******************************************/
+static void bsp_uart_rx_time_start(bsp_uart_t *p_uart)
+{
+ p_uart->rx_start_flag = 1;
+ p_uart->rx_time_count = 0;
+}
+
+/******************************************
+ * : bsp_uart_rx_time_stop
+ * : ֹͣճʱʱ
+ * : p_uart - ָUARTṹָ
+ * :
+ * : ֹͣճʱ
+*******************************************/
+static void bsp_uart_rx_time_stop(bsp_uart_t *p_uart)
+{
+ p_uart->rx_start_flag = 0;
+ p_uart->rx_time_count = 0;
+}
+
+/******************************************
+ * : bsp_uart_rx_task
+ * : UART
+ * : p_uart - ָUARTṹָ
+ * :
+ * : ճʱյ֡
+*******************************************/
+static void bsp_uart_rx_task(bsp_uart_t *p_uart)
+{
+ /* Ƿʱյһ֡ */
+ if(p_uart->rx_time_over < p_uart->rx_time_count)
+ {
+ /* ȡݳ */
+ p_uart->rx_len = queue_size(p_uart->rx_queue);
+
+ /* ֹͣʱ */
+ bsp_uart_rx_time_stop(p_uart);
+
+ /* ݳǷЧ */
+ if(p_uart->rx_len <= p_uart->rx_dma_len && (0 != p_uart->rx_len))
+ {
+ /* ݳȳʱСն */
+ if(RX_TEMP_BUFF_NUM < p_uart->rx_len)
+ {
+ queue_clear(p_uart->rx_queue);
+ }
+ else
+ {
+ /* Ӷȡݵʱ */
+ for(u16 i = 0; i < p_uart->rx_len; i++)
+ {
+ queue_pop(p_uart->rx_queue, &rx_temp_buff[i]);
+ }
+
+ /* ݽý */
+ if(NULL != p_uart->rx_data_analysis)
+ {
+ p_uart->rx_data_analysis(rx_temp_buff, p_uart->rx_len, p_uart);
+ }
+ }
+ }
+ }
+}
+
+
+
+
+
+// صдORE
+void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
+{
+ bsp_uart_t *p_uart = NULL;
+ if (huart->Instance == USART1)
+ {
+ p_uart = &com_uart1;
+ }
+ else if (huart->Instance == USART2)
+ {
+ p_uart = &com_uart2;
+ }
+ else if (huart->Instance == UART4)
+ {
+ p_uart = &com_uart4;
+ }
+
+ //
+ if(huart->ErrorCode & HAL_UART_ERROR_NE)
+ {
+ //
+ __HAL_UART_CLEAR_NEFLAG(huart);
+ }
+ if(huart->ErrorCode & HAL_UART_ERROR_FE)
+ {
+ // ֡
+ __HAL_UART_CLEAR_FEFLAG(huart);
+ }
+ // ...
+ if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET)
+ {
+ __HAL_UART_CLEAR_OREFLAG(huart); // ORE־
+ }
+ if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET)
+ {
+ __HAL_UART_CLEAR_FEFLAG(huart); // ORE־
+ }
+
+//
+ if(p_uart != NULL)
+ {
+// HAL_UART_DeInit(huart);
+// HAL_UART_Init(huart);
+// HAL_UART_DMAStop(p_Uart->Uart);
+ HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
+ }
+}
+
+// ʵֿжϻص
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
+{
+ if (huart->Instance == USART1)
+ {
+ bsp_uart_rx_idle_int(&com_uart1);
+ }
+ else if (huart->Instance == USART2)
+ {
+ bsp_uart_rx_idle_int(&com_uart2);
+ }
+ else if (huart->Instance == UART4)
+ {
+ bsp_uart_rx_idle_int(&com_uart4);
+ }
+}
+
+/* ڽɻص - ж */
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+// if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
+// {
+// __HAL_UART_CLEAR_IDLEFLAG(huart);
+
+// if (huart->Instance == USART1)
+// {
+// bsp_Uart_Rx_IdleInt(&COM_Uart1);
+// }
+// else if (huart->Instance == USART2)
+// {
+// bsp_Uart_Rx_IdleInt(&COM_Uart2);
+// }
+// else if (huart->Instance == UART4)
+// {
+// bsp_Uart_Rx_IdleInt(&COM_Uart4);
+// }
+// }
+}
+
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ if (huart->Instance == USART1)
+ {
+ bsp_uart_tx_dma_tc_int(&com_uart1);
+ }
+ else if (huart->Instance == USART2)
+ {
+ bsp_uart_tx_dma_tc_int(&com_uart2);
+ }
+ else if (huart->Instance == UART4)
+ {
+ bsp_uart_tx_dma_tc_int(&com_uart2);
+ }
+}
+
diff --git a/calib_board/usr/bsp/bsp_uart.h b/calib_board/usr/bsp/bsp_uart.h
new file mode 100644
index 0000000..4a30e28
--- /dev/null
+++ b/calib_board/usr/bsp/bsp_uart.h
@@ -0,0 +1,70 @@
+#ifndef _BSP_UART_H_
+#define _BSP_UART_H_
+
+#include "main.h"
+#include "algo_queue.h"
+
+/******************************************
+ * ṹ: bsp_uart_t
+ * : UARTƽṹ
+ * : UARTú״̬Ϣ
+*******************************************/
+typedef struct bsp_uart_t bsp_uart_t;
+
+/* ض */
+#define usart_type UART_HandleTypeDef
+#define dma_type DMA_HandleTypeDef
+
+/******************************************
+ * ṹ: bsp_uart_relay_t
+ * : UARTתṹ
+ * : UARTת
+*******************************************/
+typedef struct
+{
+ u8 flag; /* ת־λ */
+ bsp_uart_t *uart; /* תȥĴָ */
+ u16 time_out; /* תʱʱ */
+} bsp_uart_relay_t;
+
+struct bsp_uart_t
+{
+ queue rx_queue; /* ݽն */
+ usart_type *uart; /* ھָ */
+
+ dma_type *tx_dma; /* DMA */
+ dma_type *rx_dma; /* DMA */
+
+ u8 tx_dma_ch; /* DMAͨ */
+ u8 rx_dma_ch; /* DMAͨ */
+ vu8 tx_dma_complete_flag; /* DMAɱ־λ */
+
+ u8 *tx_addr; /* DMAͻַ */
+ u8 *rx_addr; /* DMAջַ */
+ u16 tx_dma_len; /* DMAͻ */
+ u16 rx_dma_len; /* DMAջ */
+
+ u16 rx_len; /* յݳ */
+ u16 rx_time_count; /* ʱ */
+ u16 rx_time_over; /* ʱʱ */
+ u8 rx_start_flag; /* ʼʱ־λ */
+
+ bsp_uart_relay_t relay; /* ת */
+
+ void (*init)(bsp_uart_t *); /* ʼָ */
+ void (*send)(bsp_uart_t *, u8 *, u16); /* ڷͺָ */
+
+ void (*tx_dma_tc_int)(bsp_uart_t *); /* DMAжϴָ */
+
+ void (*rx_idle_int)(bsp_uart_t *); /* жϴָ */
+ void (*rx_time_increment_int)(bsp_uart_t *, u16); /* жϼָ */
+ void (*rx_data_analysis)(u8 *, u16, void *); /* ݽָ */
+ void (*rx_task)(bsp_uart_t *); /* ڽָ */
+};
+
+/* ⲿ */
+extern bsp_uart_t com_uart1;
+extern bsp_uart_t com_uart2;
+extern bsp_uart_t com_uart4;
+
+#endif
diff --git a/calib_board/usr/bsp/tjc_usart_hmi.c b/calib_board/usr/bsp/tjc_usart_hmi.c
deleted file mode 100644
index 4d2000f..0000000
--- a/calib_board/usr/bsp/tjc_usart_hmi.c
+++ /dev/null
@@ -1,1320 +0,0 @@
-#include "tjc_usart_hmi.h"
-#include
-#include
-#include
-#include
-
-#include "bsp_Flash.h" // Flash
-
-#define STR_LENGTH 100
-
-// λṹ
-typedef struct {
- uint16_t Head;
- uint16_t Tail;
- uint16_t Length;
- uint8_t Ring_data[RINGBUFF_LEN];
-} RingBuff_t;
-
-static RingBuff_t ringBuff; // һλ
-
-// ָ
-static uint8_t command_buffer[MAX_COMMAND_LEN];
-static uint16_t cmd_index = 0;
-
-// COM_Uart2ָ룬ڷʴ
-static bsp_Uart_t *p_TJC_Uart = NULL;
-
-// 豸б32豸
-static DeviceInfo device_list[32];
-static uint8_t device_count = 0;
-
-static uint8_t alarm_history_count = 6;
-
-/********************************************************
- TJC_CleanBufferFromInvalidPatterns
-ܣ ӻλЧ04 FF FF FFģʽ
-ֵ ֽ
-**********************************************************/
-uint16_t TJC_CleanBufferFromInvalidPatterns(void) {
- uint16_t cleaned_bytes = 0;
- uint16_t buff_len = getRingBuffLength();
-
- // ϲҲɾ04 FF FF FFģʽ
- while (buff_len >= 4) {
- // 鿴ǰ4ֽ
- uint8_t pattern[4];
- for (uint8_t i = 0; i < 4; i++) {
- pattern[i] = read1BFromRingBuff(i);
- }
-
- // ǷΪ 04 FF FF FF ģʽ
- if (pattern[0] == 0x04 &&
- pattern[1] == 0xFF &&
- pattern[2] == 0xFF &&
- pattern[3] == 0xFF) {
-
- // ɾ4ֽ
- deleteRingBuff(4);
- cleaned_bytes += 4;
- buff_len = getRingBuffLength();
- } else {
- // 04 FF FF FFģʽֹͣ
- break;
- }
- }
-
- return cleaned_bytes;
-}
-
-
-/********************************************************
- TJC_Init
-ܣ ʼTJC
- pUart: ָbsp_Uart_tṹָ룬봮ͨ
-**********************************************************/
-void TJC_Init(bsp_Uart_t *pUart)
-{
- if (pUart == NULL) {
- return;
- }
-
- p_TJC_Uart = pUart;
- initRingBuffer();
-
- // ܴڵЧ
- TJC_CleanBufferFromInvalidPatterns();
-
- // ݽΪTJC
- p_TJC_Uart->Rx_DataAnalysis = TJC_ProcessSerialData;
-
- // ʼ豸б
- device_count = 0;
- memset(device_list, 0, sizeof(device_list));
-
- // ͳʼϢ
- TJCPrintf("t0.txt=\"TJCʼ\"");
-}
-
-/********************************************************
- TJC_SendData
-ܣ
- data: Ҫ͵ָ
- len: ݳ
-**********************************************************/
-void TJC_SendData(uint8_t *data, uint16_t len) {
- if (p_TJC_Uart == NULL || data == NULL || len == 0) {
- return;
- }
-
- // ʹbsp_Uartģķͺ
- p_TJC_Uart->Send(p_TJC_Uart, data, len);
-}
-
-/********************************************************
- TJCPrintf
-ܣ ʽַԶ0xFF
- ʽַͿɱ
-**********************************************************/
-void TJCPrintf(const char *str, ...) {
- if (p_TJC_Uart == NULL) {
- return;
- }
-
- char buffer[STR_LENGTH + 4]; // Ԥ30xFFλ
- uint8_t end_bytes[3] = {0xFF, 0xFF, 0xFF};
-
- va_list arg_ptr;
- va_start(arg_ptr, str);
- int len = vsnprintf(buffer, STR_LENGTH, str, arg_ptr);
- va_end(arg_ptr);
-
- if (len > 0) {
- // ʽַ
- p_TJC_Uart->Send(p_TJC_Uart, (uint8_t *)buffer, len);
- // ͽ
- p_TJC_Uart->Send(p_TJC_Uart, end_bytes, 3);
- }
-}
-
-/********************************************************
- TJC_SendResponse
-ܣ Ӧ
- response: Ӧַ
-**********************************************************/
-void TJC_SendResponse(const char *response) {
- TJCPrintf("%s", response);
-}
-
-/********************************************************
- TJC_CheckEndBytes
-ܣ ָ
- data: ָ
- len: ݳ
- end_pos: λָ
-ֵ 1: ҵ0: δҵ
-**********************************************************/
-uint8_t TJC_CheckEndBytes(uint8_t *data, uint16_t len, uint16_t *end_pos) {
- if (len < 3) return 0;
-
- // ӺǰҸЧ
- for (uint16_t i = 0; i <= len - 3; i++) {
- if (data[i] == 0xFF && data[i+1] == 0xFF && data[i+2] == 0xFF) {
- *end_pos = i;
- return 1;
- }
- }
- return 0;
-}
-
-/********************************************************
- CalculateCRC16
-ܣ MODBUS CRC16У
- data: ָ
- length: ݳ
-ֵ CRC16У
-**********************************************************/
-uint16_t CalculateCRC16(uint8_t *data, uint16_t length) {
- uint16_t crc = 0xFFFF;
- uint16_t i, j;
-
- for (i = 0; i < length; i++) {
- crc ^= data[i];
- for (j = 0; j < 8; j++) {
- if (crc & 0x0001) {
- crc >>= 1;
- crc ^= 0xA001;
- } else {
- crc >>= 1;
- }
- }
- }
- return crc;
-}
-
-/********************************************************
- TJC_AddDeviceToFlash
-ܣ 洢豸Ϣڴ飨Flash
- data: ָ
- len: ݳ
-ֵ 1: ɹ0: ʧ
-**********************************************************/
-uint8_t TJC_AddDeviceToFlash(uint8_t *data, uint16_t len) {
- if (len < 6) {
- //TJCPrintf("t0.txt=\"ָ̫\"");
- return 0;
- }
-
- DeviceInfo new_device;
- uint8_t temp_buffer[50];
- uint8_t temp_index = 0;
-
- // ָͷ AA 55
- uint16_t i = 2;
-
- // 1: ˿ںţCOM1
- temp_index = 0;
- while (i < len && data[i] != DATA_SEPARATOR) {
- if (temp_index < sizeof(temp_buffer) - 1) {
- temp_buffer[temp_index++] = data[i++];
- } else {
- i++;
- }
- }
- if (i >= len) {
- //TJCPrintf("t0.txt=\"˿ںʧ\"");
- return 0;
- }
- temp_buffer[temp_index] = '\0';
-
- // ˿ںţ֧COM1ֱ
- if (strncmp((char*)temp_buffer, "COM", 3) == 0) {
- new_device.port = atoi((char*)temp_buffer + 3);
- } else {
- new_device.port = atoi((char*)temp_buffer);
- }
-
- // ֤˿ںŷΧֻCOM1-COM4
- if (new_device.port < 1 || new_device.port > 4) {
- TJCPrintf("t0.txt=\"˿ںЧ:%d(ֻ֧COM1-COM4)\"", new_device.port);
- return 0;
- }
-
- i++; // ָAA
-
- // 2:
- temp_index = 0;
- while (i < len && data[i] != DATA_SEPARATOR) {
- if (temp_index < sizeof(temp_buffer) - 1) {
- temp_buffer[temp_index++] = data[i++];
- } else {
- i++;
- }
- }
- if (i >= len) {
- //TJCPrintf("t0.txt=\"ʧ\"");
- return 0;
- }
- temp_buffer[temp_index] = '\0';
- strncpy(new_device.region, (char*)temp_buffer, sizeof(new_device.region) - 1);
- new_device.region[sizeof(new_device.region) - 1] = '\0';
-
- i++; // ָAA
-
- // 3: 豸ID
- temp_index = 0;
- while (i < len && data[i] != DATA_SEPARATOR) {
- if (temp_index < sizeof(temp_buffer) - 1) {
- temp_buffer[temp_index++] = data[i++];
- } else {
- i++;
- }
- }
- if (i >= len) {
- //TJCPrintf("t0.txt=\"豸IDʧ\"");
- return 0;
- }
- temp_buffer[temp_index] = '\0';
- new_device.device_id = atoi((char*)temp_buffer);
-
- // ֤豸IDΧ
- if (new_device.device_id < 1 || new_device.device_id > 254) {
- //TJCPrintf("t0.txt=\"豸IDЧ:%d\"", new_device.device_id);
- return 0;
- }
-
- i++; // ָAA
-
- // 4: 豸
- temp_index = 0;
- while (i < len && data[i] != DATA_SEPARATOR) {
- if (temp_index < sizeof(temp_buffer) - 1) {
- temp_buffer[temp_index++] = data[i++];
- } else {
- i++;
- }
- }
- if (temp_index == 0) {
- //TJCPrintf("t0.txt=\"豸ʧ\"");
- return 0;
- }
- temp_buffer[temp_index] = '\0';
- strncpy(new_device.device_name, (char*)temp_buffer, sizeof(new_device.device_name) - 1);
- new_device.device_name[sizeof(new_device.device_name) - 1] = '\0';
-
- // ʼ豸״̬Ϊ
- new_device.leak_status = LEAK_NORMAL;
- new_device.break_status = BREAK_NORMAL;
- new_device.comm_status = COMM_STATUS_NORMAL;
-
- // ʾ
-// TJCPrintf("t0.txt=\"ɹ\"");
-// TJCPrintf("t1.txt=\"˿:%d :%s\"", new_device.port, new_device.region);
-// TJCPrintf("t2.txt=\"ID:%d :%s\"", new_device.device_id, new_device.device_name);
-
- // ǷѴͬID豸
- for (uint8_t j = 0; j < device_count; j++) {
- if (device_list[j].device_id == new_device.device_id) {
- // 豸
- device_list[j] = new_device;
- //TJCPrintf("t3.txt=\"豸%dѸ\"", new_device.device_id);
- return 1;
- }
- }
-
- // 豸ڴ
- if (device_count < 32) {
- device_list[device_count] = new_device;
- device_count++;
- //TJCPrintf("t3.txt=\"豸%dӳɹ\"", new_device.device_id);
- //TJCPrintf("t4.txt=\"豸:%d\"", device_count);
- return 1;
- } else {
- //TJCPrintf("t3.txt=\"豸б\"");
- return 0;
- }
-}
-
-
-/********************************************************
- TJC_SendDeviceList
-ܣ 豸б豸
-˵ 豸Ϣʾt1_1t8_4ı
- ÿ豸ռ4ıʽ£
- - tX_1:
- - tX_2: ˿ں
- - tX_3: 豸ID
- - tX_4: 豸
- X18ֱӦ18豸
- ʾ8豸
-**********************************************************/
-void TJC_SendDeviceList(void) {
- // ıt1_1t8_4
- for (int row = 1; row <= 8; row++) {
- for (int col = 1; col <= 4; col++) {
- TJCPrintf("t%d_%d.txt=\"\"", row, col);
-
- // ÿռıӳ
- if ((row * col) % 4 == 0) {
- HAL_Delay(5);
- }
- }
- }
-
- HAL_Delay(100);
-
- if (device_count == 0) {
- // û豸ʾʾϢ
- TJCPrintf("t1_1.txt=\"豸\"");
- TJCPrintf("t0.txt=\"豸бΪ\"");
- HAL_Delay(300);
- TJCPrintf("t0.txt=\"\"");
- return;
- }
-
- // Ҫʾ豸8
- uint8_t display_count = (device_count > 8) ? 8 : device_count;
-
- // ʾ豸Ϣ
- for (uint8_t i = 0; i < display_count; i++) {
- DeviceInfo *device = &device_list[i];
-
- // кţ1ʼ
- int row = i + 1;
-
- // tX_1:
- TJCPrintf("t%d_1.txt=\"%s\"", row, device->region);
- HAL_Delay(10);
-
- // tX_2: ˿ںţʾΪCOMxʽ
- TJCPrintf("t%d_2.txt=\"COM%d\"", row, device->port);
- HAL_Delay(10);
-
- // tX_3: 豸ID
- TJCPrintf("t%d_3.txt=\"%d\"", row, device->device_id);
- HAL_Delay(10);
-
- // tX_4: 豸
- TJCPrintf("t%d_4.txt=\"%s\"", row, device->device_name);
- HAL_Delay(10);
-
- // ÿʾһ豸ȴ
- HAL_Delay(20);
- }
-}
-
-/********************************************************
- TJC_SendRegionStats
-ܣ ͳϢ
-˵ ͳÿ豸ֱ
- t1_1ʾt1_2ʾ豸
- t1_3ʾ©Һt1_4ʾϴt1_5ʾͨѶ쳣
- ʾ4t1_1-t4_5
-**********************************************************/
-void TJC_SendRegionStats(void) {
- HAL_Delay(100);
-
- if (device_count == 0) {
- TJCPrintf("t1_1.txt=\"豸\"");
- return;
- }
-
- // ͳÿϢ
- RegionStats region_stats[10];
- uint8_t region_count = 0;
-
- // ʼͳ
- for (uint8_t i = 0; i < device_count; i++) {
- DeviceInfo *device = &device_list[i];
- uint8_t found = 0;
-
- // ǷѴڸͳϢ
- for (uint8_t j = 0; j < region_count; j++) {
- if (strcmp(region_stats[j].region_name, device->region) == 0) {
- found = 1;
- // ¸ͳϢ
- region_stats[j].total_devices++;
-
- if (device->leak_status == LEAK_ABNORMAL) {
- region_stats[j].leak_devices++;
- }
-
- if (device->break_status == BREAK_ABNORMAL) {
- region_stats[j].break_devices++;
- }
-
- if (device->comm_status == COMM_STATUS_ABNORMAL) {
- region_stats[j].comm_devices++;
- }
- break;
- }
- }
-
- // ڣµͳ
- if (!found && region_count < 10) {
- strncpy(region_stats[region_count].region_name, device->region, 19);
- region_stats[region_count].region_name[19] = '\0';
-
- region_stats[region_count].total_devices = 1;
-
- // ʼ
- region_stats[region_count].leak_devices = (device->leak_status == LEAK_ABNORMAL) ? 1 : 0;
- region_stats[region_count].break_devices = (device->break_status == BREAK_ABNORMAL) ? 1 : 0;
- region_stats[region_count].comm_devices = (device->comm_status == COMM_STATUS_ABNORMAL) ? 1 : 0;
-
- region_count++;
- }
- }
-
- // Ҫʾ4
- uint8_t display_count = (region_count > 4) ? 4 : region_count;
-
- // ʾͳϢ
- for (uint8_t i = 0; i < display_count; i++) {
- RegionStats *stats = ®ion_stats[i];
-
- // кţ1ʼ
- int row = i + 1;
-
- //
- TJCPrintf("t%d_1.txt=\"%s\"", row, stats->region_name);
- HAL_Delay(10);
-
- // 豸
- TJCPrintf("t%d_2.txt=\"%d\"", row, stats->total_devices);
- HAL_Delay(10);
-
- // ©Һ豸
- TJCPrintf("t%d_3.txt=\"%d\"", row, stats->leak_devices);
- HAL_Delay(10);
-
- // ϴ豸
- TJCPrintf("t%d_4.txt=\"%d\"", row, stats->break_devices);
- HAL_Delay(10);
-
- // ͨ쳣豸
- TJCPrintf("t%d_5.txt=\"%d\"", row, stats->comm_devices);
- HAL_Delay(10);
-
- // ÿʾһȴ
- HAL_Delay(30);
- }
-}
-
-/********************************************************
- TJC_SendRegionDeviceDetails
-ܣ ָ豸鵽
- region_index: 1-4Ӧͬ
-˵ ʾʽ
- ÿ豸ʾ15ı
- - tX_1: 豸ID
- - tX_2: 豸
- - tX_3: ͨ״̬/쳣
- - tX_4-tX_6: һͨ״̬©Һ/ϴ/©Һλã
- - tX_7-tX_9: ڶͨ״̬©Һ/ϴ/©Һλã
- - tX_10-tX_12: ͨ״̬©Һ/ϴ/©Һλã
- - tX_13-tX_15: ĸͨ״̬©Һ/ϴ/©Һλã
- һʾ4豸ֱʾڣ
- t1_1-t1_15: һ豸
- t2_1-t2_15: ڶ豸
- t3_1-t3_15: 豸
- t4_1-t4_15: ĸ豸
-**********************************************************/
-void TJC_SendRegionDeviceDetails(uint8_t region_index) {
- // ıt1_1t4_15
- for (int row = 1; row <= 4; row++) {
- for (int col = 1; col <= 15; col++) {
- TJCPrintf("t%d_%d.txt=\"\"", row, col);
- if ((row * col) % 4 == 0) {
- HAL_Delay(5);
- }
- }
- }
-
- HAL_Delay(100);
-
- // Ƿ豸
- if (device_count == 0) {
- TJCPrintf("t1_1.txt=\"豸\"");
- return;
- }
-
- // ȡвͬ
- char region_names[10][20];
- uint8_t region_count = 0;
-
- for (uint8_t i = 0; i < device_count && region_count < 10; i++) {
- DeviceInfo *device = &device_list[i];
- uint8_t found = 0;
-
- for (uint8_t j = 0; j < region_count; j++) {
- if (strcmp(region_names[j], device->region) == 0) {
- found = 1;
- break;
- }
- }
-
- if (!found) {
- strncpy(region_names[region_count], device->region, 19);
- region_names[region_count][19] = '\0';
- region_count++;
- }
- }
-
- // ǷЧ
- if (region_index < 1 || region_index > region_count) {
- TJCPrintf("t1_1.txt=\"Ч\"");
- return;
- }
-
- // ȡָ豸4
- uint8_t region_devices[4];
- uint8_t region_device_count = 0;
-
- for (uint8_t i = 0; i < device_count && region_device_count < 4; i++) {
- DeviceInfo *device = &device_list[i];
- if (strcmp(device->region, region_names[region_index-1]) == 0) {
- region_devices[region_device_count] = i;
- region_device_count++;
- }
- }
-
- // ʾ豸
- for (uint8_t i = 0; i < region_device_count; i++) {
- DeviceInfo *device = &device_list[region_devices[i]];
-
- // кţ1ʼ
- int row = i + 1;
-
- // 豸Ϣ
- TJCPrintf("t%d_1.txt=\"%d\"", row, device->device_id);
- HAL_Delay(10);
-
- TJCPrintf("t%d_2.txt=\"%s\"", row, device->device_name);
- HAL_Delay(10);
-
- // ͨ״̬
- const char *comm_status_str;
- switch (device->comm_status) {
- case COMM_STATUS_NORMAL:
- comm_status_str = "";
- break;
- case COMM_STATUS_ABNORMAL:
- comm_status_str = "쳣";
- break;
- default:
- comm_status_str = "δ֪";
- break;
- }
- TJCPrintf("t%d_3.txt=\"%s\"", row, comm_status_str);
- HAL_Delay(10);
-
- // 4ͨ״̬
- for (int channel = 0; channel < 4; channel++) {
- int base_col = 4 + channel * 3;
-
- // ©Һ״̬
- const char *leak_status_str;
- switch (device->channels[channel].leak_status) {
- case LEAK_NORMAL:
- leak_status_str = "";
- break;
- case LEAK_ABNORMAL:
- leak_status_str = "©Һ";
- break;
- default:
- leak_status_str = "-";
- break;
- }
- TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col, leak_status_str);
- HAL_Delay(5);
-
- // ϴ״̬
- const char *break_status_str;
- switch (device->channels[channel].break_status) {
- case BREAK_NORMAL:
- break_status_str = "";
- break;
- case BREAK_ABNORMAL:
- break_status_str = "ϴ";
- break;
- default:
- break_status_str = "-";
- break;
- }
- TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col + 1, break_status_str);
- HAL_Delay(5);
-
- // ©Һλ
- char leak_meter_str[10];
- if (device->channels[channel].leak_status == LEAK_ABNORMAL) {
- sprintf(leak_meter_str, "%d", device->channels[channel].leak_meter);
- } else {
- sprintf(leak_meter_str, "0");
- }
- TJCPrintf("t%d_%d.txt=\"%s\"", row, base_col + 2, leak_meter_str);
- HAL_Delay(5);
- }
-
- // ÿʾһ豸ȴ
- HAL_Delay(30);
- }
-}
-
-/********************************************************
- TJC_ProcessDeleteCommand
-ܣ ɾ豸ָ
- cmd: ָ
- len: ָ
-˵ ָʽAA 55 04 [8ѡб־ֽ] [CRCֽ] [CRCֽ]
- ÿѡб־ֽڣ00ʾδѡУ01ʾѡɾ
- һɾ8豸
-**********************************************************/
-void TJC_ProcessDeleteCommand(uint8_t *cmd, uint16_t len) {
- if (len != 13) {
- // ӵϢ
- char debug_msg[50];
- sprintf(debug_msg, "t0.txt=\"ɾָȴ:%d\"", len);
- TJCPrintf(debug_msg);
- HAL_Delay(300);
- TJCPrintf("t0.txt=\"\"");
- return;
- }
-
- // 鹦Ƿȷ
- if (cmd[2] != CMD_DELETE_DEVICE) {
- TJCPrintf("t0.txt=\"ɾ\"");
- HAL_Delay(300);
- TJCPrintf("t0.txt=\"\"");
- return;
- }
-
- // ȡ8ѡб־ֽڣӵ3ֽڿʼ
- uint8_t delete_flags[8];
- for (int i = 0; i < 8; i++) {
- delete_flags[i] = cmd[3 + i];
- }
-
- // ִɾ
- TJC_DeleteDevices(delete_flags, 8);
-}
-
-/********************************************************
- findDeviceCmdLength
-ܣ 豸ָij
-ֵ ָȣ0ʾȲ
-˵ ͨAAָȷָ
-**********************************************************/
-uint16_t findDeviceCmdLength(void) {
- uint16_t buff_len = getRingBuffLength();
-
- if (buff_len < 10) { // С
- return 0;
- }
-
- uint8_t aa_count = 0;
- uint16_t last_aa_pos = 0;
-
- // ӵֽڿʼAAָ
- for (uint16_t i = 2; i < buff_len; i++) {
- uint8_t byte = read1BFromRingBuff(i);
-
- if (byte == DATA_SEPARATOR) {
- aa_count++;
- last_aa_pos = i;
-
- // 豸ָҪ4AAָ
- if (aa_count >= 4) {
- // Ƿ㹻ĿռCRC2ֽڣ
- if (last_aa_pos + 3 <= buff_len) {
- return last_aa_pos + 3; // AACRC
- }
- }
- }
- }
-
- return 0; // ûҵָ
-}
-
-/********************************************************
- TJC_DeleteDevices
-ܣ ѡб־ɾ豸
- delete_flags: ѡб־
- flag_count: ־
-˵ ɾdevice_listе豸device_count
- ֧һɾ豸
-**********************************************************/
-void TJC_DeleteDevices(uint8_t *delete_flags, uint8_t flag_count) {
- if (device_count == 0) {
- //TJCPrintf("t0.txt=\"豸ɾ\"");
- return;
- }
-
- // ͳҪɾ豸
- uint8_t delete_count = 0;
- uint8_t to_delete[32] = {0}; // Ҫɾ豸
-
- // ־飬Ҫɾ豸
- // ע⣺flag_countͨΪ8Ӧǰʾ8豸
- for (uint8_t i = 0; i < flag_count && i < device_count; i++) {
- if (delete_flags[i] == 0x01) {
- to_delete[i] = 1;
- delete_count++;
- }
- }
-
- if (delete_count == 0) {
- //TJCPrintf("t0.txt=\"δѡ豸\"");
- return;
- }
-
- // Ӻǰɾ
- uint8_t new_device_count = 0;
- DeviceInfo temp_list[32];
-
- // δɾ豸ʱ
- for (uint8_t i = 0; i < device_count; i++) {
- // 鵱ǰ豸Ƿɾб
- uint8_t should_delete = 0;
-
- // ֻǰflag_count豸Ӧʾ豸
- if (i < flag_count && to_delete[i] == 1) {
- should_delete = 1;
- }
-
- if (!should_delete) {
- // 豸
- temp_list[new_device_count] = device_list[i];
- new_device_count++;
- }
- }
-
- // 豸б
- device_count = new_device_count;
- for (uint8_t i = 0; i < device_count; i++) {
- device_list[i] = temp_list[i];
- }
-
- // ʣλ
- for (uint8_t i = device_count; i < 32; i++) {
- memset(&device_list[i], 0, sizeof(DeviceInfo));
- }
-
-// // ʾɾ
-// char msg[50];
-// sprintf(msg, "t0.txt=\"ɾ%d豸\"", delete_count);
-// TJCPrintf(msg);
-// HAL_Delay(300);
-}
-
-/********************************************************
- TJC_ProcessCustomCommand
-ܣ Զָ
- cmd: ָ
- len: ָ
-**********************************************************/
-void TJC_ProcessCustomCommand(uint8_t *cmd, uint16_t len) {
- if (len < 6) {
- return; // ָȲ
- }
-
- // ָ֤ͷ
- if (cmd[0] != CUSTOM_CMD_HEADER_0 || cmd[1] != CUSTOM_CMD_HEADER_1) {
- return; // ָͷ
- }
-
- // ȡCRCֽڣ
- uint16_t received_crc = (cmd[len-1] << 8) | cmd[len-2];
-
- // CRCCRC
- uint16_t calculated_crc = CalculateCRC16(cmd, len-2);
-
- // УCRC
- if (received_crc != calculated_crc) {
- // CRCָ
- return;
- }
-
- // жָ
- uint8_t cmd_type = cmd[2]; // ֽΪ
-
- // 豸ָֽ'C' = 0x43
- if (cmd_type == ADD_DEVICE_CMD_BYTE) {
- // 豸ָ
- if (TJC_AddDeviceToFlash(cmd, len)) {
- TJCPrintf("b2.txt=\"add suc\"");
- }
- return;
- }
-
- // ɾ豸ָΪ0x04
- if (cmd_type == CMD_DELETE_DEVICE) {
- // ɾ豸ָ
- TJC_ProcessDeleteCommand(cmd, len);
- return;
- }
-
- // DZָ6ֽڳȣ
- if (len == 6) {
- uint8_t sub_cmd = cmd[3]; // ĸֽΪ
-
- // ݹ
- switch (cmd_type) {
- case CMD_DISPLAY_DATA: // 0x02 ʾ
- switch (sub_cmd) {
- case SUB_CMD_SHOW_DEVICES: // 0x01 ʾӵ豸
- TJC_SendDeviceList();
- break;
-
- case SUB_CMD_REGION_STATS: // 0x02 ʾ
- TJC_SendRegionStats();
- break;
-
- case SUB_CMD_REGION1_DEVICES: // 0x03 һ豸
- TJC_SendRegionDeviceDetails(1);
- break;
-
- case SUB_CMD_REGION2_DEVICES: // 0x04 ڶ豸
- TJC_SendRegionDeviceDetails(2);
- break;
-
- case SUB_CMD_REGION3_DEVICES: // 0x05 豸
- TJC_SendRegionDeviceDetails(3);
- break;
-
- case SUB_CMD_REGION4_DEVICES: // 0x06 ĸ豸
- TJC_SendRegionDeviceDetails(4);
- break;
-
- default:
- // δ֪
- break;
- }
- break;
-
- case CMD_ALARM: // 0x03
- switch (sub_cmd) {
- case SUB_CMD_HISTORY_ALARM: // 0x01 ʷ
- TJC_SendInitCommands();
- break;
-
- case SUB_CMD_REALTIME_ALARM: // 0x02 ʵʱ
- TJC_SendRealtimeAlarms();
- break;
-
- default:
- // δ֪
- break;
- }
- break;
-
- default:
- // δ֪룬ָ
- break;
- }
- } else {
- // 6ֽڵıָ
- }
-}
-
-
-/********************************************************
- TJC_ProcessCommand
-ܣ ָ
- cmd: ָ
- len: ָ
-**********************************************************/
-void TJC_ProcessCommand(uint8_t *cmd, uint16_t len) {
- // ָΪգֱӷ
- if (len == 0) return;
-
- // ȼǷΪԶָAA 55ͷ
- if (len >= 3 && cmd[0] == CUSTOM_CMD_HEADER_0 && cmd[1] == CUSTOM_CMD_HEADER_1) {
- TJC_ProcessCustomCommand(cmd, len);
- return;
- }
-}
-
-/********************************************************
- TJC_ProcessSerialData
-ܣ ڽյ
- data: յ
- len: ݳ
- p_arg: ָ
-**********************************************************/
-void TJC_ProcessSerialData(u8 *data, u16 len, void *p_arg) {
- // յд뻷λ
- for (uint16_t i = 0; i < len; i++) {
- writeRingBuff(data[i]);
- }
-
- // ѭе
- while (1) {
- uint16_t buff_len = getRingBuffLength();
-
- // ݲ3ֽڣAA 55 룩˳
- if (buff_len < 3) {
- break;
- }
-
- // ǰֽǷΪ AA 55
- uint8_t first_byte = read1BFromRingBuff(0);
- uint8_t second_byte = read1BFromRingBuff(1);
-
- // 1 AA 55ɾһֽڼ
- if (first_byte != CUSTOM_CMD_HEADER_0 || second_byte != CUSTOM_CMD_HEADER_1) {
- deleteRingBuff(1); // ɾһֽ
- continue; // һֽ
- }
-
- // ȡ루ֽڣ
- uint8_t cmd_type = read1BFromRingBuff(2);
-
- // ǷΪ֪
- uint8_t valid_cmd = 0;
- if (cmd_type == ADD_DEVICE_CMD_BYTE || // 豸
- cmd_type == CMD_DISPLAY_DATA || // ʾ
- cmd_type == CMD_ALARM || //
- cmd_type == CMD_DELETE_DEVICE) { // ɾ豸
- valid_cmd = 1;
- }
-
- // 2δ֪룬ɾ AA 55 ֽ
- if (!valid_cmd) {
- deleteRingBuff(2); // ɾ AA 55
- continue; //
- }
-
- // ȷָ
- uint16_t cmd_length = 0;
- if (cmd_type == ADD_DEVICE_CMD_BYTE) {
- // 豸ָɱ䳤ȣҪҽλ
- cmd_length = findDeviceCmdLength();
- if (cmd_length == 0) {
- // Ȳ㣬ȴ
- break;
- }
- } else if (cmd_type == CMD_DISPLAY_DATA || cmd_type == CMD_ALARM) {
- cmd_length = 6; // ̶6ֽ
- } else if (cmd_type == CMD_DELETE_DEVICE) {
- cmd_length = 13; // ̶13ֽ
- }
-
- // 鳤Ƿ㹻
- if (buff_len < cmd_length) {
- // ݲ㣬ȴ
- break;
- }
-
- // ȡָ
- uint8_t command_buffer[MAX_COMMAND_LEN];
- for (uint16_t i = 0; i < cmd_length; i++) {
- command_buffer[i] = read1BFromRingBuff(i);
- }
-
- // 3CRCУʧܣɾָ
- uint16_t received_crc = (command_buffer[cmd_length-1] << 8) |
- command_buffer[cmd_length-2];
- uint16_t calculated_crc = CalculateCRC16(command_buffer, cmd_length-2);
-
- if (received_crc != calculated_crc) {
- deleteRingBuff(cmd_length); // CRCɾָ
- continue; //
- }
-
- // мͨЧָ
- TJC_ProcessCommand(command_buffer, cmd_length);
-
- // ɾѴָ
- deleteRingBuff(cmd_length);
- }
-}
-
-/********************************************************
- initRingBuffer
-ܣ ʼλ
-**********************************************************/
-void initRingBuffer(void) {
- ringBuff.Head = 0;
- ringBuff.Tail = 0;
- ringBuff.Length = 0;
- memset(ringBuff.Ring_data, 0, RINGBUFF_LEN);
- cmd_index = 0;
-}
-
-/********************************************************
- writeRingBuff
-ܣ λд
- data: Ҫд
-**********************************************************/
-void writeRingBuff(uint8_t data) {
- if (ringBuff.Length >= RINGBUFF_LEN) {
- // ɵ
- ringBuff.Head = (ringBuff.Head + 1) % RINGBUFF_LEN;
- ringBuff.Length--;
- }
-
- ringBuff.Ring_data[ringBuff.Tail] = data;
- ringBuff.Tail = (ringBuff.Tail + 1) % RINGBUFF_LEN;
- ringBuff.Length++;
-}
-
-/********************************************************
- deleteRingBuff
-ܣ ɾλָȵ
- size: Ҫɾݳ
-**********************************************************/
-void deleteRingBuff(uint16_t size) {
- if (size >= ringBuff.Length) {
- initRingBuffer();
- return;
- }
-
- for (int i = 0; i < size; i++) {
- if (ringBuff.Length == 0) {
- break;
- }
- ringBuff.Head = (ringBuff.Head + 1) % RINGBUFF_LEN;
- ringBuff.Length--;
- }
-}
-
-/********************************************************
- read1BFromRingBuff
-ܣ ӻλȡָλõ
- position: ȡλãHeadƫƣ
-ֵ ȡ
-**********************************************************/
-uint8_t read1BFromRingBuff(uint16_t position) {
- if (position >= ringBuff.Length) {
- return 0;
- }
-
- uint16_t realPosition = (ringBuff.Head + position) % RINGBUFF_LEN;
- return ringBuff.Ring_data[realPosition];
-}
-
-/********************************************************
- getRingBuffLength
-ܣ ȡλеݳ
-ֵ еݳ
-**********************************************************/
-uint16_t getRingBuffLength(void) {
- return ringBuff.Length;
-}
-
-/********************************************************
- isRingBuffOverflow
-ܣ 黷λǷ
-ֵ 1: 0: δ
-**********************************************************/
-uint8_t isRingBuffOverflow(void) {
- return (ringBuff.Length >= RINGBUFF_LEN);
-}
-
-/*Էʷ*/
-void TJC_SendInitCommands(void)
-{
- HAL_Delay(100);
- for (int row = 1; row <= 15; row++) {
- char region[10];
- char fault_type[10];
- char start_time[20];
- char end_time[20];
- char device_id[10];
-
- // кɲͬ
- if (row <= 5) {
- strcpy(region, "LH");
- } else if (row <= 10) {
- strcpy(region, "SH");
- } else {
- strcpy(region, "BJ");
- }
-
- // ͽ
- if (row % 2 == 0) {
- strcpy(fault_type, "©Һ");
- } else {
- strcpy(fault_type, "ϴ");
- }
-
- // 豸IDλ㲹0
- sprintf(device_id, "%02d", row);
-
- // ڣ2026-01-19ʼ
- int day = 19 + (row - 1) % 30; // 1-31
- int month = 1 + (row - 1) / 30; // ·ݵ
-
- // ʼʱ
- int start_hour = 8 + (row - 1) / 6; // ÿ6Сʱ1
- int start_minute = (row * 3) % 60;
- if (start_hour >= 24) start_hour = 23; // ֹСʱ
-
- sprintf(start_time, "2026-%02d-%02d %02d:%02d",
- month, day, start_hour, start_minute);
-
- // ʱ䣨ʼʱ+2Сʱ
- int end_hour = start_hour + 2;
- int end_minute = start_minute + 15;
- if (end_minute >= 60) {
- end_minute -= 60;
- end_hour++;
- }
- if (end_hour >= 24) {
- end_hour = 23;
- end_minute = 59;
- }
-
- sprintf(end_time, "2026-%02d-%02d %02d:%02d",
- month, day, end_hour, end_minute);
-
- // ͵1У
- TJCPrintf("t%d_1.txt=\"%s\"", row, region);
- HAL_Delay(5);
-
- // ͵2УID
- TJCPrintf("t%d_2.txt=\"%s\"", row, device_id);
- HAL_Delay(5);
-
- // ͵3У豸
- TJCPrintf("t%d_3.txt=\"HK\"", row);
- HAL_Delay(5);
-
- // ͵4У
- TJCPrintf("t%d_4.txt=\"%s\"", row, fault_type);
- HAL_Delay(5);
-
- // ͵5Уʼʱ
- TJCPrintf("t%d_5.txt=\"%s\"", row, start_time);
- HAL_Delay(5);
-
- // ͵6Уʱ
- TJCPrintf("t%d_6.txt=\"%s\"", row, end_time);
- HAL_Delay(5);
-
- // ÿһУȴһ
- HAL_Delay(20);
- }
-
-}
-
-/********************************************************
- TJC_SendRealtimeAlarms
-ܣ ʵʱݵ
-˵ ¸ʽʾ
- t1_1: Ӣģ
- t1_2: 豸ID (1-254)
- t1_3: 豸ƣӢģ
- t1_4: ͨ״̬/쳣
- t1_5-t1_16: ÿ3Ϊһ飬4飬ÿʾ
- 1©Һ״̬/©Һ
- 2ϴ״̬/ϴ
- 3©Һ©Һʾʾ0ף
-**********************************************************/
-void TJC_SendRealtimeAlarms(void) {
- HAL_Delay(50);
-
- // ʾ豸ݣʵʹʱӦô豸блȡ
- DeviceInfo device_info = {
- .port = 1,
- .region = "SH",
- .device_id = 25,
- .device_name = "HK001"
- };
-
- CommStatus comm_status = COMM_STATUS_NORMAL;
-
- // ʾ4ͨ״̬
- ChannelStatus channel_status[4] = {
- {LEAK_NORMAL, BREAK_ABNORMAL, 0}, // CH1: , ϴ, 0
- {LEAK_ABNORMAL, BREAK_NORMAL, 3}, // CH2: ©Һ, , 3
- {LEAK_NORMAL, BREAK_NORMAL, 0}, // CH3: , , 0
- {LEAK_ABNORMAL, BREAK_NORMAL, 4} // CH4: ©Һ, , 4
- };
-
- // t1_1:
- TJCPrintf("t1_1.txt=\"%s\"", device_info.region);
- HAL_Delay(10);
-
- // t1_2: 豸ID
- TJCPrintf("t1_2.txt=\"%d\"", device_info.device_id);
- HAL_Delay(10);
-
- // t1_3: 豸
- TJCPrintf("t1_3.txt=\"%s\"", device_info.device_name);
- HAL_Delay(10);
-
- // t1_4: ͨ״̬
- const char *comm_status_str;
- switch (comm_status) {
- case COMM_STATUS_NORMAL:
- comm_status_str = "";
- break;
- case COMM_STATUS_ABNORMAL:
- comm_status_str = "쳣";
- break;
- default:
- comm_status_str = "δ֪";
- break;
- }
- TJCPrintf("t1_4.txt=\"%s\"", comm_status_str);
- HAL_Delay(10);
-
- // 2. 4ͨ״̬ (t1_5 t1_16)
- // ÿͨռ3ı
- for (int channel = 0; channel < 4; channel++) {
- ChannelStatus *ch = &channel_status[channel];
-
- // ıʼ
- int base_index = 5 + channel * 3;
-
- // һı©Һ״̬
- const char *leak_status_str;
- switch (ch->leak_status) {
- case LEAK_NORMAL:
- leak_status_str = "";
- break;
- case LEAK_ABNORMAL:
- leak_status_str = "©Һ";
- break;
- default:
- leak_status_str = "δ֪";
- break;
- }
- TJCPrintf("t1_%d.txt=\"%s\"", base_index, leak_status_str);
- HAL_Delay(5);
-
- // ڶıϴ״̬
- const char *break_status_str;
- switch (ch->break_status) {
- case BREAK_NORMAL:
- break_status_str = "";
- break;
- case BREAK_ABNORMAL:
- break_status_str = "ϴ";
- break;
- default:
- break_status_str = "δ֪";
- break;
- }
- TJCPrintf("t1_%d.txt=\"%s\"", base_index + 1, break_status_str);
- HAL_Delay(5);
-
- // ı©Һλ
- char leak_meter_str[10];
- if (ch->leak_status == LEAK_ABNORMAL) {
- sprintf(leak_meter_str, "%d", ch->leak_meter);
- } else {
- sprintf(leak_meter_str, "0");
- }
- TJCPrintf("t1_%d.txt=\"%s\"", base_index + 2, leak_meter_str);
- HAL_Delay(5);
- }
-}
-
-// ݾɴĺ궨
-#define usize getRingBuffLength()
-#define code_c() initRingBuffer()
-#define udelete(x) deleteRingBuff(x)
-#define u(x) read1BFromRingBuff(x)
diff --git a/calib_board/usr/bsp/tjc_usart_hmi.h b/calib_board/usr/bsp/tjc_usart_hmi.h
deleted file mode 100644
index b2abdc6..0000000
--- a/calib_board/usr/bsp/tjc_usart_hmi.h
+++ /dev/null
@@ -1,155 +0,0 @@
-#ifndef __TJCUSARTHMI_H_
-#define __TJCUSARTHMI_H_
-
-#include "stm32f4xx.h"
-#include "main.h" // HAL ͷļ
-#include "bsp_Uart.h"
-#include "bsp_Flash.h" // Flash֧
-
-// ʹõĴھmain.cжhuart2
-extern UART_HandleTypeDef huart2;
-
-// 崮ʹõĴ
-#define TJC_UART huart2
-
-// λ
-#define RINGBUFF_LEN (500)
-
-// ָTJCЭ飩
-#define TJC_END_BYTES 0xFF
-
-// ָ
-#define MAX_COMMAND_LEN 200 // ӳӦ豸Ϣ
-
-// Զָ
-#define CUSTOM_CMD_HEADER_0 0xAA
-#define CUSTOM_CMD_HEADER_1 0x55
-
-// ָ
-#define CMD_DISPLAY_DATA 0x02 // ʾ
-#define CMD_ALARM 0x03 //
-#define CMD_DELETE_DEVICE 0x04 // ɾ豸
-
-// ʾ
-#define SUB_CMD_SHOW_DEVICES 0x01 // ʾӵ豸
-#define SUB_CMD_REGION_STATS 0x02 // ʾ
-#define SUB_CMD_REGION1_DEVICES 0x03 // һ豸
-#define SUB_CMD_REGION2_DEVICES 0x04 // ڶ豸
-#define SUB_CMD_REGION3_DEVICES 0x05 // 豸
-#define SUB_CMD_REGION4_DEVICES 0x06 // ĸ豸
-
-//
-#define SUB_CMD_HISTORY_ALARM 0x01 // ʷ
-#define SUB_CMD_REALTIME_ALARM 0x02 // ʵʱ
-
-// 豸ָʶ
-#define ADD_DEVICE_CMD_BYTE 0x43 // 'C'ASCII
-
-// ָ
-#define DATA_SEPARATOR 0xAA
-
-// ͨ״̬ö
-typedef enum {
- COMM_STATUS_NORMAL = 0, //
- COMM_STATUS_ABNORMAL // 쳣
-} CommStatus;
-
-// ©Һ״̬ö
-typedef enum {
- LEAK_NORMAL = 0, //
- LEAK_ABNORMAL // ©Һ
-} LeakStatus;
-
-// ϴ״̬ö
-typedef enum {
- BREAK_NORMAL = 0, //
- BREAK_ABNORMAL // ϴ
-} BreakStatus;
-
-// ͨ״̬ṹ
-typedef struct {
- LeakStatus leak_status; // ©Һ״̬
- BreakStatus break_status; // ϴ״̬
- int leak_meter; // ©Һ©Һ״̬Ϊ©Һʾʾ0
-} ChannelStatus;
-
-// ö
-typedef enum {
- ALARM_LEAK = 0, // ©Һ
- ALARM_BREAK, // ϴ
- ALARM_COMM // ͨ쳣
-} AlarmType;
-
-// 豸Ϣṹ
-typedef struct {
- uint8_t port; // ˿ں
- char region[20]; // Ӣģ
- uint8_t device_id; // 豸ID (1-254)
- char device_name[20]; // 豸Ӣģ
- LeakStatus leak_status; // ©Һ״̬
- BreakStatus break_status; // ϴ״̬
- CommStatus comm_status; // ͨ״̬
- ChannelStatus channels[4]; // ĸͨ״̬
-} DeviceInfo;
-
-// Ϣṹ
-typedef struct {
- char region[20]; // 豸
- uint8_t device_id; // 豸ID
- char device_name[20]; // 豸
- AlarmType alarm_type; //
- char start_time[20]; // ʼʱ
- char end_time[20]; // ʱ
-} AlarmInfo;
-
-// ͳƽṹ
-typedef struct {
- char region_name[20]; //
- uint8_t total_devices; // 豸
- uint8_t leak_devices; // ©Һ豸
- uint8_t break_devices; // ϴ豸
- uint8_t comm_devices; // ͨ쳣豸
-} RegionStats;
-
-// ⲿɵú
-void TJC_Init(bsp_Uart_t *pUart);
-void TJC_SendData(uint8_t *data, uint16_t len);
-void TJCPrintf(const char *cmd, ...);
-
-// λغ
-uint16_t TJC_CleanBufferFromInvalidPatterns(void);
-void initRingBuffer(void);
-void writeRingBuff(uint8_t data);
-void deleteRingBuff(uint16_t size);
-uint16_t getRingBuffLength(void);
-uint8_t read1BFromRingBuff(uint16_t position);
-uint8_t isRingBuffOverflow(void);
-
-// ָغ
-void TJC_ProcessCommand(uint8_t *cmd, uint16_t len);
-uint8_t TJC_CheckEndBytes(uint8_t *data, uint16_t len, uint16_t *end_pos);
-void TJC_SendResponse(const char *response);
-void TJC_ProcessSerialData(u8 *data, u16 len, void *p_arg);
-void TJC_DeleteDevices(uint8_t *delete_flags, uint8_t flag_count);
-void TJC_ProcessDeleteCommand(uint8_t *cmd, uint16_t len);
-
-/*Էʷ*/
-void TJC_SendInitCommands(void);
-
-//
-uint16_t CalculateCRC16(uint8_t *data, uint16_t length);
-void TJC_ProcessCustomCommand(uint8_t *cmd, uint16_t len);
-void TJC_SendAlarmHistory(void);
-void TJC_SendRealtimeAlarms(void);
-void TJC_SendDeviceList(void);
-uint8_t TJC_AddDeviceToFlash(uint8_t *data, uint16_t len);
-void TJC_SendRegionStats(void); // ͳ
-void TJC_SendRegionDeviceDetails(uint8_t region_index);
-
-// 궨
-#define usize getRingBuffLength()
-#define code_c() initRingBuffer()
-#define udelete(x) deleteRingBuff(x)
-#define u(x) read1BFromRingBuff(x)
-
-#endif
diff --git a/calib_board/usr/gui/gui_tjc_hmi.c b/calib_board/usr/gui/gui_tjc_hmi.c
new file mode 100644
index 0000000..1ca4371
--- /dev/null
+++ b/calib_board/usr/gui/gui_tjc_hmi.c
@@ -0,0 +1,604 @@
+#include "GUI_tjc_hmi.h"
+#include
+#include
+#include
+#include
+
+#include "proto_modbus_lib.h"
+
+
+#include "bsp_Flash.h" // Flash
+#include "bsp_uart.h"
+
+#include "app_leakage.h"
+
+/*ڷͻ*/
+#define HMI_TX_BUFFER_NUM (2048)
+/*ַƴ */
+#define GUI_TJC_HMI_TEXT_BUFFER_NUM (256)
+
+/*֡ͷ*/
+#define HMI_PROTO_FRAME_HEADER1 (0xAA)
+#define HMI_PROTO_FRAME_HEADER2 (0x55)
+/**/
+#define HMI_PROTO_CMD_GET (0x03) /*ȡ*/
+#define HMI_PROTO_CMD_SET (0x10) /*Ϣ*/
+/**/
+#define HMI_PROTO_GUI_MAIN (0x10)/* */
+#define HMI_PROTO_GUI_CURR_ALARM (0x11)/*ʵʱ */
+#define HMI_PROTO_GUI_DETAIL_MAIN (0x12)/*_ϸϢ */
+#define HMI_PROTO_GUI_LOGIN (0x13)/*¼ */
+#define HMI_PROTO_GUI_HISTORY_ALARM (0x14)/*ʷ */
+#define HMI_PROTO_GUI_TCP_CONFIG (0x15)/*ý */
+#define HMI_PROTO_GUI_DEVICE_CONFIG (0x16)/*豸ý */
+#define HMI_PROTO_GUI_HELP (0x17)/* */
+
+#define HMI_PROTO_ASCII_RX_DELINITER (0xAA)/*շָ*/
+
+#define HMI_PROTO_ASCII_TX_DELINITER (0xFF)/*ͷָ*/
+#define HMI_PROTO_ASCII_TX_DELINITER_NUM (3)/*ͷָ*/
+
+
+static void gui_tjc_hmi_init(void);
+static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart);
+
+/*ڷͻ*/
+static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM];
+/*ַƴ */
+static char gui_tjc_hmi_text_buffer[GUI_TJC_HMI_TEXT_BUFFER_NUM];
+/*ַ ˿ں*/
+static char *hmi_proto_string_com[] =
+{
+ "COM1",
+ "COM2",
+ "COM3",
+ "COM4"
+};
+
+/*ַ */
+static char *hmi_proto_string_baudrate[] =
+{
+ "4800",
+ "9600",
+ "19200",
+ "57600",
+ "115200",
+};
+
+
+static bsp_uart_t * p_rx_uart = NULL;
+
+gui_tjc_hmi_t tjc_hmi =
+{
+ .init = gui_tjc_hmi_init,
+};
+
+gui_tjc_hmi_t *p_tjc_hmi = &tjc_hmi;
+
+
+
+/*ĻЭʼ*/
+static void gui_tjc_hmi_init(void)
+{
+ com_uart1.rx_data_analysis = gui_tjc_hmi_communication_data_analysis;
+}
+
+
+/*ͽӿ*/
+static void gui_tjc_hmi_data_send(u8 *p_data,u16 len)
+{
+ if(p_rx_uart != NULL)
+ {
+ p_rx_uart->send(p_rx_uart,p_data,len);
+ }
+}
+
+
+/*öӦĿؼ
+xڼ
+yڼ
+bufferдbuffer
+formatʽ
+...
+*/
+static u16 gui_tjc_hmi_tx_text_display(u16 x,u16 y,char *buffer,const char *format,...)
+{
+ u16 i,len;
+ s16 state;
+ va_list arg;
+
+ /*ջ*/
+ memset(gui_tjc_hmi_text_buffer,0,sizeof(gui_tjc_hmi_text_buffer));
+
+ va_start(arg,format);
+ /*ʽתַ*/
+ state = vsnprintf(gui_tjc_hmi_text_buffer,GUI_TJC_HMI_TEXT_BUFFER_NUM,format,arg);
+ if(-1 == state || state > GUI_TJC_HMI_TEXT_BUFFER_NUM)
+ {
+ va_end(arg);
+ printf("Length REEOR");
+ return 0;
+ }
+
+ /*ƴַ*/
+ sprintf(buffer,"t%d_%d.txt=\"%s\"",x,y,gui_tjc_hmi_text_buffer);
+ len = strlen(buffer);
+ for(i=0;i 0)
+ {
+ page_num++;
+ }
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:/*ȡϢ*/
+ {
+ if(p_tjc_hmi->page.main_index == page_num - 1 && remain_region_num >0)/*ʾʣ*/
+ {
+ for(j=0;jpage.main_index * MAIN_PAGE_SUB_DEVICE_NUM + j;
+ x = j;
+ /**/
+ y = 0;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name);
+ /*豸*/
+ y = 1;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num);
+ /*©Һ*/
+ y = 2;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num);
+ /*ϴ*/
+ y = 3;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num);
+ /*ͨѶ*/
+ y = 4;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num);
+ }
+ }
+ else
+ {
+ for(j=0;jpage.main_index*MAIN_PAGE_SUB_DEVICE_NUM + j;
+ x = j;
+ /**/
+ y = 0;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%s",leakage.region_data[index].name);
+ /*豸*/
+ y = 1;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].sub_device_num);
+ /*©Һ*/
+ y = 2;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].leakage_num);
+ /*ϴ*/
+ y = 3;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].open_num);
+ /*ͨѶ*/
+ y = 4;
+ len = gui_tjc_hmi_tx_text_display(x+1,y+1,(char *)&hmi_tx_buffer[len],"%d",leakage.region_data[index].time_out_num);
+ }
+ }
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x03:/*ҳ*/
+ {
+ if(0x01 == p_data[0])
+ {
+ if(page_num - 1 <= p_tjc_hmi->page.main_index)
+ {
+ p_tjc_hmi->page.main_index = 0;
+ }
+ else
+ {
+ p_tjc_hmi->page.main_index++;
+ }
+ }
+ else
+ {
+
+ if(0 == p_tjc_hmi->page.main_index)
+ {
+ p_tjc_hmi->page.main_index = page_num - 1;
+ }
+ else
+ {
+ p_tjc_hmi->page.main_index--;
+ }
+ }
+ }
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+
+/*ʵʱӦ*/
+static void gui_tjc_hmi_curr_alarm_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+/**/
+static void gui_tjc_hmi_detail_main_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+/*¼*/
+static void gui_tjc_hmi_login_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+
+/*ʷ*/
+static void gui_tjc_hmi_history_alarm_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+
+/*ý*/
+static void gui_tjc_hmi_tcp_config_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+
+/*豸ý */
+static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+/**/
+static void gui_tjc_hmi_help_send(u8 cmd,u8 opa,u8 *p_data)
+{
+ u16 len = 0,i;
+
+ if(HMI_PROTO_CMD_GET == cmd)/*ȡ*/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+ else if(HMI_PROTO_CMD_SET == cmd)/**/
+ {
+ switch(opa)
+ {
+ case 0x01:
+ {
+
+ }break;
+ case 0x02:
+ {
+
+ }break;
+ default:return;
+ }
+ len = strlen((char *)hmi_tx_buffer);
+ gui_tjc_hmi_data_send(hmi_tx_buffer,len);
+ }
+}
+/*Ļָ*/
+static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart)
+{
+ u8 cmd,data,gui_id,opa,*p_offset_data;
+ u16 i,modbus_crc16,check_crc16;
+ /*Ȳ*/
+ if(len < 5)
+ {
+ return ;
+ }
+ /*֡ͷ*/
+ if(p_data[0] != HMI_PROTO_FRAME_HEADER1 || p_data[1] != HMI_PROTO_FRAME_HEADER2)
+ {
+ return ;
+ }
+ /*Уλ*/
+ check_crc16 = p_data[len-2] << 8 | p_data[len-1];
+ modbus_crc16 = modbus_lib_crc16(p_data,len-2);
+ modbus_crc16 = (modbus_crc16 >> 8) | (modbus_crc16 << 8);
+ if(modbus_crc16 != check_crc16)
+ {
+ return ;
+ }
+
+ /*CMD*/
+ cmd = p_data[2];
+ if(cmd != HMI_PROTO_CMD_GET || HMI_PROTO_CMD_GET != HMI_PROTO_CMD_SET)
+ {
+ return ;
+ }
+ gui_id = p_data[3]; /*gui_id*/
+ opa = p_data[4]; /**/
+ p_offset_data = &p_data[5]; /**/
+ p_rx_uart = (bsp_uart_t *)rx_uart; /*ָ*/
+ switch(gui_id)
+ {
+ case HMI_PROTO_GUI_MAIN :
+ {
+ gui_tjc_hmi_main_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_CURR_ALARM :
+ {
+ gui_tjc_hmi_curr_alarm_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_DETAIL_MAIN :
+ {
+ gui_tjc_hmi_detail_main_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_LOGIN :
+ {
+ gui_tjc_hmi_main_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_HISTORY_ALARM :
+ {
+ gui_tjc_hmi_history_alarm_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_TCP_CONFIG :
+ {
+ gui_tjc_hmi_tcp_config_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_DEVICE_CONFIG :
+ {
+ gui_tjc_hmi_device_config_send(cmd,opa,p_offset_data);
+ }break;
+ case HMI_PROTO_GUI_HELP :
+ {
+ gui_tjc_hmi_help_send(cmd,opa,p_offset_data);
+ }break;
+ }
+}
diff --git a/calib_board/usr/gui/gui_tjc_hmi.h b/calib_board/usr/gui/gui_tjc_hmi.h
new file mode 100644
index 0000000..654c19b
--- /dev/null
+++ b/calib_board/usr/gui/gui_tjc_hmi.h
@@ -0,0 +1,22 @@
+#ifndef _GUI_TJC_HMI_H_
+#define _GUI_TJC_HMI_H_
+
+#include "main.h"
+
+/*ҳ*/
+typedef struct
+{
+ u8 main_index;
+ u8 deliniter_main_index;
+
+}gui_tjc_hmi_page_t;
+
+typedef struct
+{
+ gui_tjc_hmi_page_t page;
+ void (*init)(void);
+}gui_tjc_hmi_t;
+
+extern gui_tjc_hmi_t tjc_hmi;
+
+#endif
diff --git a/calib_board/usr/protocol/proto_modbus_master_tdlas.c b/calib_board/usr/protocol/proto_modbus_master_tdlas.c
index ef3026e..c3db81a 100644
--- a/calib_board/usr/protocol/proto_modbus_master_tdlas.c
+++ b/calib_board/usr/protocol/proto_modbus_master_tdlas.c
@@ -3,7 +3,7 @@
#include "stdio.h"
#include "app.h"
-#include "os_timer.h"
+#include "app_timer.h"
#include "bsp_Uart.h"
#include "bsp_74HC4067.h"
@@ -36,7 +36,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data);
static void proto_tdlas_control_fac_calib_data_get(u8 ch);
/*ĸڽյ*/
-static bsp_Uart_t *rx_uart = NULL;
+static bsp_uart_t *rx_uart = NULL;
proto_tdlas_t tdlas=
{
@@ -56,16 +56,16 @@ proto_tdlas_t tdlas=
};
proto_tdlas_t *p_sensor = &tdlas;
-bsp_Uart_t *p_use_uart = &COM_Uart4;
+bsp_uart_t *p_use_uart = &com_uart4;
static void proto_tdlas_init(void)
{
- COM_Uart4.Rx_DataAnalysis = p_sensor->rx_task;
+ com_uart4.rx_data_analysis = p_sensor->rx_task;
}
static void proto_tdlas_send(u8 *p_data,u16 len)
{
- COM_Uart4.Send(&COM_Uart4,p_data,len);
+ com_uart4.send(&com_uart4,p_data,len);
}
static void proto_sensor_switch(u8 ch)
@@ -324,7 +324,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
if( p_use_uart->relay.flag == 1)
{
- p_use_uart->relay.uart->Send(p_use_uart->relay.uart,p_data,len);
+ p_use_uart->relay.uart->send(p_use_uart->relay.uart,p_data,len);
}
if(p_sensor->modbus_id != p_data[0])
@@ -348,7 +348,7 @@ static void proto_tdlas_rx_task(u8 *p_data,u16 len,void *other_data)
{
p_rx_valid = &p_data[6];
}
- rx_uart = (bsp_Uart_t *)other_data;
+ rx_uart = (bsp_uart_t *)other_data;
p_sensor_sys->tx_time_out_count = 0;
p_sensor_sys->state_error_flag &= (~(0x00000001 << PROTO_TDLAS_ERROR_FLAG_TIME_OUT));
diff --git a/calib_board/usr/protocol/proto_modbus_slave_ex.c b/calib_board/usr/protocol/proto_modbus_slave_ex.c
index d8ab8fb..27dcdf3 100644
--- a/calib_board/usr/protocol/proto_modbus_slave_ex.c
+++ b/calib_board/usr/protocol/proto_modbus_slave_ex.c
@@ -4,7 +4,7 @@
#include "stdio.h"
#include "app.h"
-#include "os_timer.h"
+#include "app_timer.h"
#include "bsp_Uart.h"
#include "bsp_Flash.h"
@@ -33,26 +33,21 @@ proto_Modbus_t modbus_slave_ex=
};
static proto_Modbus_t *p_modbus = &modbus_slave_ex;
-static bsp_Uart_t * rx_uart;
+static bsp_uart_t * p_rx_uart;
-static void proto_modbus_communication_data_send(u8 *pData, u16 len)
+static void proto_modbus_communication_data_send(u8 *p_data, u16 len)
{
- if(&COM_Uart1 == rx_uart)
+ if(p_rx_uart != NULL)
{
- COM_Uart1.Send(&COM_Uart1,pData,len);
- }
- else if(&COM_Uart4 == rx_uart)
- {
- COM_Uart4.Send(&COM_Uart4,pData,len);
- }
-
+ p_rx_uart->send(p_rx_uart,p_data,len);
+ }
}
static void proto_modbus_init(void)
{
p_modbus->id = Usr_Flash.FlashData.modbus_id;
- COM_Uart1.Rx_DataAnalysis = proto_modbus_communication_data_analysis;
- COM_Uart4.Rx_DataAnalysis = proto_modbus_communication_data_analysis;
+ com_uart1.rx_data_analysis = proto_modbus_communication_data_analysis;
+ com_uart4.rx_data_analysis = proto_modbus_communication_data_analysis;
}
static void proto_modbus_task(void)
{
@@ -82,7 +77,7 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot
goto Error;
}
*/
- rx_uart = (bsp_Uart_t*)other_data;
+ p_rx_uart = (bsp_uart_t*)other_data;
switch (modbus_analysis_data.func)
{
case 0x03: