Browse Source

v1.0 待测试

master
zhangsan 5 years ago
commit
a5271f832f
  1. 33
      .gitignore
  2. 471
      docs/1-打印机运维系统通信协议-v2.0.4-20200424.docx
  3. 604
      docs/2-打印机运维系统用户手册-v1.6-20200722.docx
  4. 6
      docs/校准示意.docx
  5. BIN
      hex/Printer-1.8.3.1.exe
  6. 2302
      hex/Printer-433.hex
  7. BIN
      hex/Printer-M42-V0.9.exe
  8. BIN
      hex/Printer-M42-V1.0.exe
  9. BIN
      hex/Printer-M53-V1.1.exe
  10. BIN
      hex/Printer-v1.0-20200628(1)(1).exe
  11. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym
  12. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xab
  13. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xad
  14. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc
  15. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf
  16. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm
  17. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr
  18. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xsb
  19. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.sip_xsd
  20. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.siproj
  21. 22
      si4/soft_gsm_main.si4project/soft_gsm_main.siproj_settings.xml
  22. BIN
      si4/soft_gsm_main.si4project/soft_gsm_main.siwork
  23. 424
      source/app/app_common.c
  24. 208
      source/app/app_common.h
  25. 124
      source/app/app_drv.c
  26. 36
      source/app/app_drv.h
  27. 212
      source/app/app_paraid.c
  28. 63
      source/app/app_paraid.h
  29. 95
      source/app/app_task_485.c
  30. 28
      source/app/app_task_485.h
  31. 45
      source/app/app_task_485_control.c
  32. 20
      source/app/app_task_485_control.h
  33. 438
      source/app/app_task_gm35.c
  34. 106
      source/app/app_task_gm35.h
  35. 83
      source/app/app_task_relay.c
  36. 17
      source/app/app_task_relay.h
  37. 44
      source/app/app_task_report.c
  38. 31
      source/app/app_task_report.h
  39. 33
      source/app/app_task_wdt.c
  40. 20
      source/app/app_task_wdt.h
  41. BIN
      source/app/bak.zip
  42. 165
      source/app/main.c
  43. 92
      source/app/main.h
  44. BIN
      source/bsp/bak.zip
  45. 8
      source/bsp/bsp_485.c
  46. 12
      source/bsp/bsp_485.h
  47. 285
      source/bsp/bsp_config.c
  48. 376
      source/bsp/bsp_config.h
  49. 16
      source/bsp/bsp_gm35.c
  50. 17
      source/bsp/bsp_gm35.h
  51. 119
      source/bsp/bsp_paraid.c
  52. 17
      source/bsp/bsp_paraid.h
  53. 249
      source/bsp/bsp_relay.c
  54. 91
      source/bsp/bsp_relay.h
  55. 23
      source/bsp/bsp_wdt.c
  56. 7
      source/bsp/bsp_wdt.h
  57. 385
      source/clib/bit.h
  58. 1580
      source/clib/clib.c
  59. 110
      source/clib/clib.h
  60. 254
      source/clib/md5.c
  61. 53
      source/clib/md5.h
  62. 51
      source/clib/type.c
  63. 256
      source/clib/type.h
  64. 265
      source/clib/type.h.bak
  65. 198
      source/clib/uartlib.c
  66. 70
      source/clib/uartlib.h
  67. 198
      source/cpu/STARTUP777.A51
  68. 408
      source/cpu/STC_CC_8051.H
  69. 466
      source/cpu/STC_stc15w.H
  70. 514
      source/cpu/STC_stc8a8k.H
  71. 300
      source/cpu/c51_macro.H
  72. 44
      source/cpu/stc_mcu.c
  73. 14
      source/cpu/stc_mcu.h
  74. 236
      source/ctask/task.c
  75. 261
      source/ctask/task.h
  76. 92
      source/ctask/tick.c
  77. 147
      source/ctask/tick.h
  78. 7
      source/debug/cc_as_stc01_main.ini
  79. 6
      source/debug/cc_ls_03_debug.ini
  80. 123
      source/debug/debug.ini
  81. 45
      source/debug/debug2.ini
  82. 82
      source/debug/debug_M3sfy.ini
  83. 54
      source/debug/debug_M3sfy2.ini
  84. 130
      source/debug/debug_app.c
  85. 44
      source/debug/debug_app.h
  86. 48
      source/debug/debug_drv.c
  87. 85
      source/debug/debug_drv.h
  88. 37
      source/debug/debug_led.c
  89. 138
      source/debug/debug_led.h
  90. BIN
      source/debug/testiic.uvla
  91. 66
      source/debug/复制 2debug_M3sfy.ini
  92. 129
      source/debug/复制 debug_M3sfy.ini
  93. 287
      source/msp/UART0.C
  94. 288
      source/msp/UART0.C.bak
  95. 117
      source/msp/UART0.h
  96. 228
      source/msp/UART1.C
  97. 246
      source/msp/UART2.c
  98. 114
      source/msp/UART2.h
  99. 228
      source/msp/UART3.c
  100. 117
      source/msp/UART3.h

33
.gitignore

@ -0,0 +1,33 @@
### vim
*.swp
*.swo
*~
### Keil5
/keil/*
/keilp/*
!*.sct
!*.uvprojx
### Source Insight
*.IAB
*.IAD
*.IMB
*.IMD
*.PFI
*.PO
*.PR
*.PRI
*.PS
*.WK3
*.SearchResults
*.bookmarks.xml
*.snippets.xml
si/**/cache/
si/**/Backup/
si4/**/cache/
si4/**/Backup/
### Source file
source/bak/
/out/

471
docs/1-打印机运维系统通信协议-v2.0.4-20200424.docx

@ -0,0 +1,471 @@
共享打印机运维板通信协议
传控科技(北京)有限公司
版本
日期
作者
备注
参与人
1.0.0
zhangsan
Zhou
1.1.0
zhangsan
Zhou
1.2.0
zhangsan
Zhou
1.6.0
zhangsan
Zhou
1.7.0
zhangsan
Cao,li
1.8.2
zhangsan
Cao,li
1.8.3
20190321
zhangsan
li
2.0.1
20191914
zhangsan
2.0.2
20191106
zhangsan
目录
共享打印机运维板通信协议 1
一、通信协议 3
1.1 协议格式 3
1.2 地址定义(Addr) 3
1.3 命令定义(Oper) 3
1. 通用命令 3
1.4 CRC校验 4
二、上行数据 4
2.1 数据包 4
2.1.1 纸盒数据(3bytes) 5
2.1.2 纸盒2(红外调试) 6
2.1.3 红外数据(1bytes) 6
2.2 心跳包(无数据) 6
2.2 心跳包(携带版本信息) 6
2.3 登录认证包 7
2.4 查看参数(长度为2个字节) 7
三、下行数据 7
3.1 继电器控制 7
3.2 调试数据 9
3.3 设置参数 9
3.4 心跳响应包 10
四、不断电下载(远程升级) 10
数据发送时间间隔 11
程序运行现象 11
纸盒3位置添加了状态信息 11
数据发送时间间隔 12
一、通信协议
1.1 协议格式
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0xXX
0xXX
0xXX
0xXXXX
LSB
MSB
长度(字节)
说明
Filter1
1
固定为0xFF
Filter2
1
固定为0xFE
Length
1
后续字节的长度(addr - crc)
Addr
1
设备地址
Oper
1
操作代码
Data[]
不定
参数域。在实际命令中,可以不存在。
LSB-CRC16
1
CRC16低字节。
CRC是从Addr到Data[]的CRC16值
MSB-CRC16
1
CRC16高字节。
1.2 地址定义(Addr)
上位机:0x10
服务器:0x11
运维板:0x12
1.3 命令定义(Oper)
1. 通用命令
序号
命令
功能
1
0x93
上位机数据包
2
0x97
服务器数据包
3
0x95
继电器控制命令
4
0x99
调试命令
5
0x96
设置参数命令
6
0x98
读取参数命令
1.4 CRC校验
//crc生成函数,并将crc存储在用户给定的数组中
//调用方式crc16(指向数据的指针,需要校验的数据长度)
void crc16(unsigned char *CRC,unsigned char *ptr,unsigned int len)
{
unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1
unsigned char temp;//定义中间变量
int i=0,j=0;//定义计数
for(i=0;i<len;i++)//循环计算每个数据
{
temp=*ptr&0X00FF;//将八位数据与crc寄存器亦或
ptr++;//指针地址增加,指向下个数据
wcrc^=temp;//将数据存入crc寄存器
for(j=0;j<8;j++)//循环计算数据的
{
if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
{
wcrc>>=1;//先将数据右移一位
wcrc^=0XA001;//与上面的多项式进行异或
}
else//如果不是1,则直接移出
{
wcrc>>=1;//直接移出
}
}
}
temp=wcrc;//crc的值
CRC[0]=wcrc;//crc的低八位
CRC[1]=wcrc>>8;//crc的高八位
}
二、上行数据
注:为了和上位机某些协议兼容,与上位机开发人员协商,所有上行协议,长度由1个字节,修改为2个字节,之前为0E,修改为00 0E
2.1 数据包
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0x0E
-
0x93/0x97
-
LSB
MSB
Addr参数
0x10代表上位机
0x11代表服务器
Oper参数
0x93代表上位机操作
0x97代表服务器操作
Data参数如下
PaperBox0
PaperBox1
PaperBox2
IR
3byte
3byte
3bytes
1bytes
PaperBox0,1: 上纸盒,下纸盒,扩展纸盒
PaperBox2: 扩展纸盒,目前当作调试数据使用
IR: 红外数据,包括纸张红外和人体红外
数据包举例:
上位机:FF FE 00 0E 10 93 00 00 00 00 00 00 00 00 00 00 xx xx
服务器:FF FE 00 0E 11 97 00 00 00 00 00 00 00 00 00 00 xx xx
2.1.1 纸盒数据(3bytes)
byte1: 板卡版本号,上一个版本为0x00(tcp心跳包为0x08) 当前版本为0x09
byte2: 1bit电量正常位(bit7) + 1bit(工作正常位) + 4bit(纸盒编号) + 2bit(纸盒数据高2位)
byte3: 8bit(纸盒数据低8位)
清除无效数据:
byte1: 0x10 - 0xEE 0x10-0x50(在纸盒内,封闭环境下)
纸盒编号:xx
纸盒数据最高位:0(bit9)
清楚状态位:
1小时收不到有效数据,状态位置为(无效状态)
工作正常位:1不正常 0工作正常
电量正常位:1提醒需要充电,或者未连接电池 0正常
电量只要低于3.3v,电量正常位就会被置为1进行报警。
2.1.2 纸盒2(红外调试)
纸盒2暂时用作红外调试数据(3bytes)
byte1: 纸张红外阈值 (数据必须大于该值,才代表检测到有纸张)
byte2: 人体红外阈值max (数据必须大于该值,才代表检测到有人体)
byte3: paper当前值(4bit) + person当前值(4bit)
2.1.3 红外数据(1bytes)
0-3位:(监测点0-3)1代表有人 0代表无人
bit1: 是否有纸
bit0: 是否有人
4-7位:(0-3位有效位,0)0代表有效 1代表无效
2.2 心跳包(无数据)
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0x04
0x11
0x00
-
LSB
MSB
发送:FF FE 00 04 11 00 E0 0D
响应:FF FE 00 04 12 00 10 0D
2.2 心跳包(携带版本信息)
Filter1
Filter2
Length
Addr
Oper
Data
CRC-16
0xFF
0xFE
0x05
0x11
0x00
Version(1bytes)
LSB
MSB
Version: 1字节,高4bit代表主版本号,第四位次版本号
0x18 代表1.8版本
发送:FF FE 00 05 11 00 18 CF 21
响应:FF FE 04 12 00 10 0D //响应包无版本数据,响应包长度为1个字节
2.3 登录认证包
注:登录认证包没有CRC校验。
定长协议:2+2+20+1+21 = 44
FF FE 00 2A simno(20) , passwd(21)
密码算法:
Md5hex(simno) 取前16位 + simno取最后5位 == 21位密码
2.4 查看参数(长度为2个字节)
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0xXX
0x12
0x98
0xxxxx
LSB
MSB
Data参数
Type
Val
4bit
不定长
Type: 0x0 设置纸盒编号
Val: 纸盒0Id(4bit),纸盒1Id(4bit),纸盒2Id(4bit)
Type: 0x1 设置红外阈值
Val: 纸张红外阈值(6bit)
Val: 人体红外阈值(6bit)
发送:
FF FE 06 12 98 00 00 B3 84
FF FE 06 12 98 10 00 73 89
三、下行数据
注:下行数据遵循既定协议,数据长度为1个字节
3.1 继电器控制
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0x06
0x12
0x95
0xXXXX
LSB
MSB
Data参数如下
Relay Val
Relay Index
1byte
1byte
Relay Val : 该位为0代表闭合,1代表断开
Relay Index: 该位为1代表该为有效,0代表无效(不控制该继电器),FF代表控制所有继电器,00代表不控制任何继电器
程序应当先判断relayIndex,如果该位为1,再判断该位对应的值,0闭合 1断开
具体通讯协议如下:
FF FE 06 12 95 01 01 20 D5 //继电器0(打印机)断开
FF FE 06 12 95 02 02 D1 95 //继电器1(PC)关机
FF FE 06 12 95 04 04 73 16 //继电器2(灯箱)断开
FF FE 06 12 95 08 08 76 13 //继电器3(复印补光)断开
FF FE 06 12 95 10 10 7C 19 //继电器4(人像补光)断开
FF FE 06 12 95 20 20 68 0D //继电器5(保留)断开
FF FE 06 12 95 40 40 40 25 //继电器6(打印机开关1)断开
FF FE 06 12 95 80 80 10 75 //继电器7(磁保持)断开
FF FE 06 12 95 00 01 B0 D4 //继电器0(打印机)闭合
FF FE 06 12 95 00 02 B1 94 //继电器1(PC)开机
FF FE 06 12 95 00 04 B3 14 //继电器2(灯箱)闭合
FF FE 06 12 95 00 08 B6 14 //继电器3(复印补光)闭合
FF FE 06 12 95 00 10 BC 14 //继电器4(人像补光)闭合
FF FE 06 12 95 00 20 A8 14 //继电器5(保留)闭合
FF FE 06 12 95 00 40 80 14 //继电器6(打印机开关1)闭合
FF FE 06 12 95 00 80 D0 14 //继电器7(磁保持)闭合
FF FE 06 12 95 FF FF C0 14 //关闭所有电源
FF FE 06 12 95 00 FF 30 55 //打开所有电源(所有继电器恢复到初始状态)
3.2 调试数据
去掉
3.3 设置参数
去掉
3.4 心跳响应包
发送:FF FE 00 05 11 00 18 CF 21
响应1:FF FE 04 12 00 10 0D //响应包无版本数据,响应包长度为1个字节
响应2:FF FE 00 04 12 00 10 0D //响应包无版本数据,响应包长度为2个字节(兼容)
四、不断电下载(远程升级)
Filter1
Filter2
Length
Addr
Oper
Data[]
CRC-16
0xFF
0xFE
0x04
0x12
0x80
0x00
LSB
MSB
要求:
连发两次
两次协议中间不能有其他协议
两次协议间隔不能超过2s
FF FE 04 12 80 B0 0C AA AA AA AA AA AA AA AA AA AA AA FF FE 04 12 80 B0 0C
烧写程序最高波特率:115200,如果不成功中间可以多加几个0xAA
数据发送时间间隔
心跳改成了50s
程序运行现象
= 连接成功
Q 错误,连接断开
X 发送心跳
Y 发送数据
- 客户端主动断开(180s没收到服务器数据)
纸盒3位置添加了状态信息
Byte0 a9状态 0x6A== `j'代表连接上
Byte1 a9接收数据时间间隔
Byte2 看门狗状态 0正常 1饿
数据发送时间间隔
60s心跳
300s数据
180s心跳断开
240s看门狗重启
A9模块指示灯状态:

604
docs/2-打印机运维系统用户手册-v1.6-20200722.docx

@ -0,0 +1,604 @@
PK
‡Nâ@ docProps/PK‡Nâ@ jÚ¤jydocProps/app.xml�’Oo£0Åï•úw08ÚTGYº=­ÚH¡›cd™I°
¶e»UóíwhV,½îmÞñÓó<`óÙwÉú ­Y§e^¤ emÎëôµ~ÊîÓ$DiÙYƒëô‚!݈ÛØyëÐG�!!„ ë´�Ñ=0T‹½ 9­ mNÖ÷2’ôgfO'­ðѪ÷Md¼(– ?#š›Ì�ÀôJ|øˆÿ m¬ò…ßõÅQ`5ö®“Åó§Ë{`£ ;yÆ fÀ®¬o‚àœ»ŽPµÒKéR¢äwäO ø¥ }^À®ñ¼<{éZ‚ ÐQAm£ìjÝ£()À(`¯d‡…'ÙöÏðoáÕÕöqxÂßýws’ï c»wR ‰æ«oI'+Ø:×i%#/»}òòUα,sú òÕrÉ�OåÏ¿ûQe|¹ª²ùlÑdÛrÁ³bQ-æÅ}Qðj l
*w�êÝëxtŽ©¤;Œ‹?PK‡Nâ@”s�pµdocProps/core.xml}’_Oà ÅßMü ï ÚZב®‹ºø¤ÆÄÿ¼¸Nb¡  sß^ÚµuFããåžû»çÅêS×ÑX§³DñŒ¢Œh¤2›%º¯.qŽ"繑¼n ,ÑZ•ÇG…h™h,ÜÚ¦ë¸(�Œc¢]¢Wï[Fˆ¯ ¹›… Í—ÆjîCi7¤åâ�o€$”ž žKî9逸�ˆh@J1!Ûw[÷)Ô ÁxGâYL¾µ¬vô�¥V~׆LƒÝC¶ûæ¤þtjn·ÛÙ6ímÿ1y¼¾ºë£beº»€ÊBŠ~¸Û¯;éźºDeBãÓ9¦§ÍY6g”>dT ópÏjly³~êSÝ=FÍ�¿ïö¢@žïÊ3©•QÎ[î[�ß‚qæÖ*üu.˜žàdQÑ”eÙÞÅ07ЦTzØôo¬„bšã4®hÂÒ„e‡±F@Ùù°ð¡ºXÎYÞ›�NúêçG+¿PK‡Nâ@Ù6нþdocProps/custom.xml��Mo„ E÷Mú{i´£A'Ug6]´I§³7€3$ÐÖ4ýïe2ýØwùr_Nνlû®G°Hç•5L�4Ü
eN|=ìÑz#úÑYÁUz¸­ooس³“tAI"Âø
žC˜JŒ=?KÝû$Æ&&ƒuºñt'l‡AqÙY>ki¦„ä˜Ï>X�¦_¼òÊ%ü),¿Øùãa�¢n;á+tP¢‚]Öv]F2DwE‹R’6¨¸+îÙBÚÝ'Óå™B`z«?¾<E¬˜yhf5Š£t½„rœÞ|p5%EišÄ “"Ï)ÃÃ?
5÷ërõPK
‡Nâ@word/PK‡Nâ@Õ„´@�uword/styles.xmlÝ]KoǾÈì)9Pä>ø„V†D‰¡JaLÊ>ÏîörÇšÇffVu6b9ä ± $ÈÁñ%È!€“_ÑÖ¿Huu÷lïÌtÏv %Ù>‘;;U_wWÕWÕ==½·ß{…Þ3–fA;Ý[[�ÅãdÄÃΓó£�½Ž—å~<ñÃ$fÃÎË:ïÝùéOn_dùUÈ2ÄÙA4vfy>?ØÜÌÆ3ùÙ­dÎbørš¤‘ŸÃÇôb3òÓ§‹ùÆ8‰æ~Œ‚0ȯ6{[[;©&vi| UlDÁ8M²dšs‘ƒd: ÆLþQé:¸Bò~2^D,Îq3e!´!‰³Y0Ï”¶ˆª º8SJžÙ:ñ,
Õ}—ë€]&édž&c–e`“(��ü .ÔtEÅÀÝ‚�ÛÝßäª@¼»…ÿiíènÙZ,‡�K+È,¬ ÖX[Xñ$¥~*Ì ÀÛ�^ÄIê�Bp©Ëî süi’Œï³©¿óŒLOSùQ~Â?GIœgÞå�Ÿ�ƒà Dè:¾gA¾™ñj¿a~–ßÍ_ÿò�¼Æ%ÇY®)¼L‚Îæ�Û›Øõ·h\.5Ü œëLDhKq>ìôv ¤à^6ýõF°£.<‰gÁ„}8cñ“ŒM úä�g,
ŽƒÉ„ñˆ”מ<<Mƒ$…xvö÷åÅ“dü”MÎræZù…ÙäÁó1›sÏØß(LÔ³(bCÁR3^È4x¼û|”óÖ‡|DÚ¢`ó (3æsîñºëi-_Ggï èì¿�ŠNa$5|ÛíUì´W±Û^Å^{ûµ*t·%F0ˆ'ì¹Áýì2õîe—©w»L½{ØeêýÁ.Sïv™z‹ÛeêMl—i¶iAØ4OÆkX´,ÑlϲD³5ËͶ,K4[²,ÑlDzD³ËÍ6,K4[P�J‘|¼‡œqîÏÓ$Éã$g^Ξ»Iú1Èa‰h–-åW=!5e$–Ööƒ¨‘wÓ ÑI2c8¶¥¿ÍK]c«�Z &윗~^2õ¦ÁÅ"…9E]Yafñ3B½éù“ È…S–ÃTà ¸ð¥”MY
ó$æ$®9MAÄÌ‹ÑÈÑÒsÿ‚$Çâ †­µJÚ9ð
çðùŒ×¼�£ƒD>L�L“'¾g‹“+ž™©pïÞ" Aî±»é¯9“é\‹"Í©¬"2pqDiNf1v¡KR’Ð3)Iè ”$ôSØšÒO)Iè§”$ôSJÖ÷³”Òš&¡]Û,ô<ÈC7Ö= ¾râäœgÁEìCz¨G*õGKú8ËYQ.x§~ê_¤þ|æñ¥ §VÜK&WÞ¹kÙRHQª%ŒÊChh/ê;ocBOIRܶ�%8n!KpÝB¶ÞyMý}…O«Ç°`aHÇ%?iô{ôúÈÙb”;»þ™.D[ëw¥öi~¬³î}X]ª7�ÌÒ�‚²¡h¯WáèU�yÕÏÍãýKt·,³”ssᥜ*Ç~VÄÑCXE4ÓÌzNr|5g)”§Ok=e=GI&—l⤫)¨z=>Q1Už&†ÌPjr#Œ-g=ˆæ3? ²Ú±1E‘zXá=òçN‚§!¬±›íiÂ{°kó¡gÏ|&a9=ÿÙ‡lôs§ÆŸ?:ñîBµ_EAÂüGNRÉÄ� Q
� †9Lâ6×DÙ_²«QâÃs—ºéqÉE+ômpzT|
S:|‘³zå&K£ô™Í«0”;–¸„ùœ!_Z1?ðÓ€/�†B”dÒKÏ�jL Ð&îÙbô»Õq‘Åm�uH=ù®ˆºe£Q·” DCž9®³rZm±’¥4Yɶi³[(û›„I:]„$*aR�•0©ËI¸ˆâŒÚj”%6eÛ´™h&Äu+×…‰‘Ò@¡ e”P�2D(H$NóÂj°#bó3ƒ`󣃪 NSë›8\8
R숂;¢ ÅŽ(H±#
R숂;¢ ÅŽýû›N!ŸÒèK§ØT§X–/°hÛXÒ«ÚªÄîŠBvá;® '>M“)ß”Ćýv`¾”@-D„(e°aj@b^.GÅ«·jSÝ,ŠÅ{>ÌFa�qý­¤¦i†¸m{¸ÌNGÂíLõrM�{“ …“àb–{g3ËJ£~Û’–ÐϹƒØxÛÔ^(癉¨¼oY7xÄ&Á"RCcrëÆÁ¬aˆ€F|Lk°¯ì’·!—6ê‡�›ÆÕ]?µý»Íú±ú ¶v·6µõSÛo z9>¨¿ž©÷ëíÚ–�îÃf[�^»¶Ø-¦;­èa×ÁD‹.Ø‚¸Ðß‚$lÿBŸ°Æ5†�+dª°ÙbÉ£mQlæXj[›QÊÌÚË…bÛb­Íµv R]±î²Òxñ°‘˜ôÖ¦s{ykgm^o ´6Á·Z›é[­GùmAl|S§äþ¶X6Ö)°Ð½Û‘è®�x
LÇí€Ö¯ªÕÐQË ›™ªi�Šb3P5-PQlÖ1¥*%-P±œÓÈ™¼©@ÎäMr&o*�3y�ÜÈ›
bc…‚çJäMŲqC�¥“7ÈF�NÞD wò&ÎÝvlfª’7Åf *ySQlÖ1‘7‹BÞT,gò¦9“7È™¼©@ÎäMr&o"�ySAl¬Pð\‰¼©X6n(°tò¦Ùè¡ÒÉ›äNÞ†'s� Ÿ63UÉ›Šb3P•¼©(6ë˜È›ŠE!o*–3yS�œÉ›
äLÞT gò¦9“7È�¼© 6V(x®DÞT,7X:yS�lôPéäMr'oÃîˆ&o*ŠÍ@Uò¦¢Ø¬c"o*…¼©XÎäMr&o*�3yS�œÉ›
äLÞD 7ò¦‚PÈ›ŠeㆂSuò¦Ùè¡ÒÉ›äNÞ†j7LÞT›�ªäME±YÇDÞT,
yS±œÉ›
äLÞT gò¦9“7È™¼‰@näM¡�7ËÆ §êäM²ÑC¤“7ÁÉdúQdü¼.<ªv:åðΰ3W¯$óÍOp0?rMž4†7>ijȸß
÷<óá¼7ýü/¹GßJZn6Uwn‰ÝóÓ”ë¸ &É%ß+›&aéŽ�ÆêÂ(�ãó@´]ŠÁño\:]9ðmØ9"8sð1»ôÞO"Î’“¾Õ~£|v^}ý»ÿýçüîqV½ûñ”¥üÄ4ì«|v�½(.È fÙ‹C~úœ¸IÍs|8¯L^cñÆ“3³„~1Û8|Ì/�à@¹aÇO7ÎîÊ®b¡Ë8ê v*,ÓÃsÞtËȃ+Ôæ¢‘§Éýªè‹ly ï‘«VªÝrð¾fqInß¶[VÚ#Mô”±ùcP+‡�ÍOà|’ ?esÌ�qƒ^óÍÀéúÜ,åOáí/øÔÇOü@“ag{I�xÁO„s?äñÉ"ç—Ož­ºNÅMFˆ::èº)ÒJK[.¯,m)®�Z’IúF“HG"™¤'ãhu7 vô�YIžV(­$? + º˜l׳zXÅJ«Á¬Žaô?2�Þ¸ò�Š(]¬þôF.¦No\q�¥ô‹ _º�¸FuqŒe]dÊålšÈvþÝ›^qƒ·g‘mc`JV YD
¿U‹ìéôÙÛ×賿ë˜è‰‹|¯³'SÑJ®ÅkÍ�9žAm3æ/Cê1•6Uº¶Ö²Ü=�DâltE…†$ŸãÛÈ–Öv+>\}�¹má ;ì\>
EÙÿ²0|ä§¼,É“94Ž+F¯Eää¹/dB6å…|ÛÝÂ<^úJ»<‰Ìò)¾fbT6×#>òF†!]©o‹ºi§2ŽË“Mh4 Yý¦_VUp) U>¢"ÎáÃ!x6”®½m¸¶‚Þãý®£°[…ê‹Nõ£‰¿¨{²‚¼©®Ëb™œ»5 ®A‡I5Ú^¥ãú‘‰Í]îÊ#�ã_Å–4/Ä;o ÁÌ8‘àoÆš'`âAw[z–vF '5¼e¯G¦ /Pú²ØŸŸ'8”jeù¸œdqŸÒ}GŽdy’¥
¬7zª6o1¹ºycïWŒÍçHêØ‰5Œ-gìm�=¿7I9�ˆöæÇ‘ÁA`Ì1ñ_ÎwàcöbØ+Z0}‚y�JJ�²µæoËw$ŽÆ<?^ï�è¸ÑôBÞphJ³'õäzz[OÒWQDª®òÆ·¢ˆ}˜®©á:ÞÊ Ý=5ÒÜiåŽÞî@Ò°éŽþÎŽ¬…Mw ¶¡pµ¶c{°ßÐÒ�AWÎ�L(»}U4šîØë©i¿é°†–B6†RÛÚ™îÖþ~C[»Ý}¨“ìZzÐ܆[ú»° b×2ØÙÆæBÊ„NcÖqNúÒþ²‚~�¯¥É•5l‰¾î"·dyÑ£æô MäXTn`ýr<žó›<žíÄ”QÖ'öux%[  VõÞƒ_¹€_CYV½ÍŒ-¬Æ–½æa¤‚ÎÊö5²¹¢FZUÓ¤fðËvLm¹ÿ€&Î�tÃ/>Úëü•ÉÞÒ[ªË0†“åÊNsÃõ¼,j1Ç«1ÙÛÚÚR„¸P¥‡€/6G‡¡ÏÕ…ŽÒ)zï ¯ÐÕ­£#bíû:^d0�<ã¿®RyVQ�Ú½þâ_ß¾üÔ{õ�Ͼýêoõ!­­Ok$ØYCÕó7:gY1«­«Õùtõ»�ÿìÚU™�¾Ï]­ÎØ®?ÿäõ—òº®�•¹¡³ÂM¤YWWĪ�Œ ve:¬y"¥–ª‹ìwŸ;�0½«GÝêT Ÿ\–Þ$.Ó‡Œê•ÍØ�†1^}€$–:¦ü”Ø|4€g0Vŵè±îšÇºa0åŠBúVÏÕ·$�4ôÛâ[jº½ò°cåG¬V¾Q¾¥‹¹?Ñ+5ËJMÍ ôØuŸŒ¬m�ê²æõ§ÿ¾þç߯¿øíõ?¹~ù•«!äúLiIªÁ.ÒßzÐ[Ç¿ÍzÈÚã_­©eô]^ÎTFÚï†]ß�ÛWŸ=\ö×ë—qt9ýx{±–\ÙZáX [Ê&˜{ø~à:ðr=‡îí:q×þháÛæ{µv¢ó½¸vƒ¨™¡ð³Ÿ_ùñw_ÿ÷úóo^}ó{WSÀ:�CÍaàøåΠÊò†Jµå2N_òXfMµb³2ŠÈ�ÕQ„+8_ÍîüPK‡Nâ@N«§p(aword/settings.xmlµ½ÙŽfGv¥yß@¿C‚÷)žy DÎ`VR!³J(JÝ×Îg2:c‚‡3YÔÓ×g1$ÕÉo …j4 @L_aç·cdžm{¯½ößÿ§ÿñæõïþòøôáÕ»·ß~Õÿ]÷Õïß¾x÷òÕÛ?}ûÕ¿þKýýöÕï><?¼}ùðúÝÛÇo¿úåñÃWÿéþÏÿãïþæÃãó3ÿìÃïxÄÛß¼yñíW?>?¿ÿæë¯?¼øññÍÇ¿{÷þñ-àïžÞ<<ó?Ÿþôõ›‡§?ÿôþ÷/Þ½yÿðüêûW¯_=ÿòõÐuËWŸóîÛ¯~zzûÍçGüþÍ«Oï>¼ûá¹5ùæÝ?¼zñøùÿ}iñô¿ò»ŸZÞï^üôæñíóÇ_üúéñ5}x÷öÃ�¯Þøò´7ÿ»Oãüò�¿üG/ñ—7¯¿ü»Ÿûî?ú—Ÿ_÷çwO/ÿÚâ¥{­Áû§w/?|à½yýéuß<¼zû×ÇôÓoôסþ;†úëO¿ýu{ÍûîãýÚó¯Ó^¾ö§¯ø‡Wß?=<}úÌL€Ö‹7/¾ù§?½}÷ôðýk&ÕÏýôÕ?0£þíÝ»7¿ûù›÷�O/øHLÇ~øêë|O/˜£÷»ÿúîù»ŸžžÞýôöå?>>ð7þù_èKŸÿa}÷îù7ÿðåç™ðÏO€/Ú,àI�o™ª/Û ùö«îÓ_>þððÓëçyøþ»çwï¿üÜ4|�Ÿ~fŒÿóÓ«—ÿ×ãÓ󫯿{ÿð‚?}ù§ý¼|~Ò«ï_?üò�ïž^ýÛ»·Ï¯ï_Û–à/_Z|yô§ÿå±é_¢?><=¼àE?ÿüÅO<½{ýå™mÁ=1þù§·/žú8í?õêÓJlƒü�~?ÖwOÿú‡Ocþðúáí‹Çïx•×�ç/Ï�÷»ŸøZí¿þïW/Ÿüø�^¶/ò‡Ç‡¿<ž/þüáõÇ�¶Q|zý/O¯>ŽÇ§?|ü×å¼g;ùîÇW?<ÿ÷ÇgÖúÇûðòÿùéÃó^½}üÇÇWúñùŸÞ2â¯??çÃc-xøåÝOÏÿí§.÷iûáß>¼a}úëç-å�ï^>~ôÓÓ«ßÌÓ8Ï[ƒO“iú÷có·?ôŽoÅç~üØÁïžyÍ ½}þîÕ¿=o_þÞâ›Ô§þßïÁÔ�Ç·mhþ›ë¿üòþ±>>0ŠlËÿÿüØÇoV_¿zÿÇW¬»§zû’ÕñÿõǾþù›_çgÏËm¶ÿøï,Ö/Ÿ¡ëî»»Ký4 ýéºn]Ç„”ÏKî7m¶åó§ý R—ÏËîo‘~ØÂÓ†u }¶R¼oÃ}¤6e }Çáô§�ó¾d¿B¯ÇkºB›2‡ëú6uiD§~ ¿3�éËMS ï3]Û὞Êú6—#|Ó¹á+,Ãñù(ùÛy°Lëç­ö7È9ïÞ·¥v«#ëyû›öÝp$dì|ôݼyúný+ôÝ:úˆöÝ>Eä˜õ}ú¾«>:}? ©ÍæA?ôÅgb?¬½¯,–éFgœ®0 ÕßgºÃ¼î§ÒùÜéçn÷5×Ïýæó ŸÇãöÌÓ¾Â<§y0ÏkêÁöÄ~>_?ý²¯¾úužÃ]—=ÌÄuø­Ç�žvï©%ì.CwWïÁЕÕgHõ2ôãî£3ôÓžÖ>ª~Ó¡_G_ a?úcIO;vÑa˜&Ÿo‡™�è0®ƒ¯…aÜ6ÿ>ÃxÞ¾N‡±öáw¦.œYÃ4¯¾†i)aÜæþ
£3ßcèÛ\KèÛ²+`XJz°ò¹ýk¯C؆•�'´Ù¦0«Öí
£³Þ£¹±O�±ãqÚƒ‘Í7!wço:öwõ“vºmðßa¡ú‡áôy=óì_aîê;ß8öÁJÇåö�b�=¼)?߯© ¡óÖö8sørKvòq=GQÖìã6uçîß#íô©>§þÒÓ®°æ¦¾n>CÐÃÇmbë }˜Ù:«¦q v/Hø
Әιi¼ÓX�wñy0M}°-§i
wÌÞÎ×ö´Ì—ÏQ�pǘ–«÷•5­|·uèÂ7]·°¶çŽ�Ó§�Þë¹[gŸ½ ñ`V]þµç~Êܧ{Ö<`)z¯96}·œ‡q
½j˜!óxãÔüè¯ø›ûÂÌÙè«~æfÚLûí3džŽp3š§3Ø|�Á
˜ça o:/%ŒÛ²¤^/[XÛóra¬—8:L�0«ÖkôÝeéæÃßgéîpk[ú±xß–þëtÖË÷ª…Íß¿ö2v��(w¶p.,c ëta#õÕ¸L{Øý—éw³e:Çô´k#Ê ñÌV5¤65XÑË\O_õËšlŠeÅtÐ5·¬5ì;k×}ñ2ÿÍ:]»}ìõi+÷ÿ¦k?†]lí·ËG”M¹óÙ N^4XÞ+óÍ¿Â:ökèõ8,>në8…µ½ŽKX%븋xå<õîYëXÃ)³b¢ø Y§åöÓy�¶Õ×ö:¯©o܈.]Þg9ö0ÖËy‡Ä=q]¯à{Úº.x¿@R›~Yü,Ù0|&nCöªm¸ŠÏ� CÞGg§ê–ê6n·�õ6îaGÚ¦)x#¶i ¾€mº&ÿ> Ák¸M5ø‘¶yê}&nóÖϺ‡ló~‡,Gð~m+©?�)ÆzÝnïÁÞ퇯’O‰ï×{߇ÓlÇâ»åÎÙÏí½¿ƒ/mÇÂO–0¢û°†µ½w° wÎà0ãæó0Ø| ÁªÙ§nó¿OS8·÷i|VíSòœîóN™�»f˜xÃ÷YúÕgÕ¾lᎾ/w°ý÷u8üÜñ†¯½Á°¯w°]@nÚÑ áÌ:º1¬à£[OŸ!Gw«$ìbG?„7=úãô±>pO&$ÍøcH¾€cìƒÅuŒs°ޱ.þåŽé¯1ú¿±žŽi�ý,9˜×¾Ç7Ä÷ÄcÚÃÎw̸êuOd¾O¡\?|=¤„¹3ÁkxÌ5X�ÇrÍ~6‚¤§­cð`/>Ïnº|w9Ù•}'?‡£óU�w'Ø;'û¨�è9Ô°÷žì°>wΩ gð9õ·�[C|†œó²†Ñ™Ó
>—å 9ãofïÉ•6Œèr†/wñ¢Þƒ«FŸ£WW‚ïöêj°ˆ/BPáwz—º.Üä!ôà3þ¸0øÓ†< ×x„ûÂ5žÁ»r�×î³êbßñ¯pM}ˆÓ^¾`ï5Q?O¯éHc=šˆÏÑk¾ÂI{-\Û¼o8›âC ½^î¾)'mè»KxÚzßíµ–ðµïþ' H¸ß�É|ƒ„øHðÇßÃvòWš�õ�gÎÇàÆIì#zOSzÓi·Ý{înŸ×7ÎA?Ñïy ÷ú;ž27÷ßãïå7ä{Ý&Ÿ× Á[t¯gð~2¾‡†À÷�ÑÁG§H÷¯P¸¹ú*Á¿VIC|-”ñª¾�²'‡›^Á—Þtîúð;óîÁe.k�¹O}™kˆ*–å8È.W°ãËÚ?Hð݈#áwÖ9øÉËÊUBw¾²î½Û!µ›B,´vóì3¤vÇšžvæUí®%­ý8ù×®ýÔû‰^û%ø„@ÂŽv±ŠGÆ÷ª: û{¯}ï­ì–aÜÆ­c=îÁoY¡ü„6ÓX •À™ï‰xnà +-ÜÚê|T·â 3@þJÕý[ƒ ³ï; Á
‚/Ëf<Èué¬jˆÇÚú®쌆¸­Üw#ÑïÁX&Ýùúnê|&‚à¦ö§M£Ç�¡¥ î Á‰ïOÃZד‰6×®':$7†ÁŸk/µÙýÔ„G ÖŸ¶îμ¢ +mÓø|>Ö}wx¤¸‘éœÙÃÂ^ý¾Ð�g5Äï —Çø¹ÔïÎç¹=ÖÖ÷ãæ7W|2>:ãá§&mngÆ�ÔE÷^¨†£ßøA8¼˲ø×f»ö{pÏví'Hq›��°¦¾­Å¹+=\÷4‚àMÓ÷ºÞ‡Àwè,·3< z ¯¬¡^øC‡Ÿ´�Ö9ù<†2„˜ÑåoŠãÔwŠ7yèõT<¾ÝC-ÚBîú^5,Kzb9j©B` ^�Fm=}^ëVð°ÞUíª~ì[é¸�Ýâ÷mÚ¬n�‚„¨H_ÌíцÑ‘{cDüÊÓNç÷‚Üa'ûö�šòï3BõðsÀ#)X‰[X%ãt8Ûž6§ûì@n�p€pŸòo:•Ùgü¸ïqáÓ£å I_a ŒiÚ”оM0r'Gàïè� ëúc=õ—ßÍà™/ åXè‚ý†9ê÷¹¶V8ÍàÖ:7œ6Åýþ 5¬Ói>œ¡ÒOP:¸-iWž–#Xƒ„ÄSßÖ!X¼hXÛÓº‹ {ËoÜêGç¿�L«¯ÆË[ï%´9ý6r/¾‚ç®zL‚þÒù “̹áý<\—Ÿ™0SBBž1Òõ
=¯`Ã$sÎiOäÃý “{'{ÀùÖuÊm;Øór§¾-Å}ª¬ù9Ì·y½Ò×^kX%K×+m�ˆéïƒ/Âù!íî~úŽ÷+XÄKbxãCvTC‚-¶`Œ¹¥
“,ܳ–¡zŒ²_ÆÀ� ¬ �Ãý! W°–¹ w™…‰íVÚB¬Í-”eœÛŠIÎJÕ9ŠïQlÚÅO¦;>ômžõßY‡4Öëöx‚I·ïo+{¢ïk‡ÓN{°ÂÝ÷=qíÎ0CÖîÞýM×~òH
a¡Å#« ›Çr@î°�‚¯]áFÉGû¦K˜;˜.5Œõ°„{=,7ç[rÛ^ÂÜ�åæ\Úìî9í¹†sãéð[Î:ß›[v+>âðMçN¦uéÂì%ÞyøŒßplûž¸uC¸Il0À}ïݺə#ýÖ-áÖ¶õ«û-û ÛßÏz"á<…U³¸¯fÃ
½Šg÷©¾#áÿ Þ/¸l½ÏÑ æ¯S�pÒ’W7…÷kx�¡×ónÈÛ|¥q#¹ÐϬ­m¾º‹mKàôÛR‚§q[êé;ßF–[OÛº¦/3Î÷Þ�ì\Gv"ù>C@‚gïŽàÅ�M—žÖÎêwRI} @<ªH›d�îì‰á}ȧõ™¸{°ÖAÂŒßIj½BT±ß‡«÷µ½³~"¬§f‚¯’}
¬‰~ŸN�ñ÷ûX- }°¢‰‡SÖžs‚yÚîšû¢Ø=9ŒÁKk/xNñÏ^¾NrËý\8º%Œˆ³Ž m„Ìa�+ø �¾8ã/÷CÝ]È(vž*m.ÏÅîY¥[xÚÔ9Wª?à0ùÙâ96­M¸\Í|‹ü7ž¶Oã1Æm®`Ýóè "øs°P`zû€¼û°„œÇÕ¿ ³÷$%Ò¿ÏÙmÎéÏî
^]v�àù9ÙGý4;±)2‡ÛÇIB•Ûñç8zlŽK˜‰'70·A‚·õ$}ÍmË“ä¨Ð·e ñ¹“Üå0ëê,Ñþ„ÅëöÎÕ›ïÊÌÐàѼؗ}÷¿†ÞÕ0Çp7»8}D¯a�O«á”�ÿökkaáîL Îjéa¬…[y Á}áÅñõsÍAí¢'-ìopÙÂM+Ñ3üû‹ ªÏÄkÝCŒåÂô÷=ñ&æ6ÅÝÎêçvzËáî`$éYB‹y¸SŽt÷{¸íÞ=#翃 ž[�ðßB¼þf^—ð´#DaÆ å÷F”{‰¯S´‚g¡qæül¼‘Îc0…Œ�þž!”û›è
_n zBý�[Êï?7ÙÓá+p}£³ÂYÓ¾Hn=•Ž<íÐf ,¢?ž ×3w�qø° ñwØù|¿.þiAœÁÇ­ _ås§ ,âçܼpòýkÃi ñŸBâ{ø�¹„ón^ðÕ”…ã̿їðMq#…]»à§@A¥ø¬‚/öÑÊ è¿S‡-0 *šd¾눹¡oZ †ú›Ö1èüôœ™á†\aùÜ�I,È:!þSQAò}§Î—gõE0ŸU•t3ßaë2y Œ}<hÜ€Ìnu‚ ´`cÝ÷˜�ÔØ8’ái�»/{r¯;Èíþ�¡k’Fþ;ãè¬ñ¡cÕë÷it÷d 
Zºæ@Fϱ!ö2xÞ!È1†,�
7ÓÁßtÅŠMˆ3rɦåØÔ6p¿|G …ù™‚Ê�?�d/�×´9¬êˆƒþ´aóó§Q‹<7‰hÖì7=´îúï�-z0m®ÁÓ.·ž@‚º×@¨Ø-HRѼo¨„/7¯©×˜ñ>{Ù[œo9Šô�$x©âv�ÝOg�ó ÛÊöÓ d _� Á7ˆûÖA.Ï*#UH¿È#Ò´!óÐÛ �Ã4 C ³w™>þ4xi�—æ3d@:ÉçÚg/A“fwÅîïÞ79õÌàe{.Èé¶Èí¾Û�Tl�"€\n#5å&÷,€„¼ê†¸}@†Zð‚6$Ìk>éá» ¬°Ñç
¬a&ŽCñH$ª 
rºz!:C�ÓyR¿6ì3· iSÜ+Å?zld ûõ8}Xâi�kŽ€laÆ“iåqg>Al¤Ö‘Ïø© ¾´¡2þM9d:_%襹×�§^'K»sÎÈíÌ�ök8ˆƒí 2ªï!Xä~£„›Öi3¸ü n:f¾J&¤Çrx$=Êãp;Î\81@ÂI sŽRl£5œš­Óa0GÃ,d¤ëšce»'x€fï„�~g-îqæiAA˜ÈG¸Ë4Äs‡~†¯ŸÆ­o
â1×a�Ìñ6&~’ÊV !ž�;ÌãNÀ¶‰ùˆ’‡l
øoÎOÄ}±8ï j8nSDÖ|^Ãqsî
O;=p˜¡k¹ÏH»šßq ïŸ5 w貓aÍ-­¼opæ<2Dä#dý5Äà-ZlKZ8÷«=ËùU %Øo(©¹WŠZ‚õ´@¯õƒ4#�x’"0„“jDØa‰«ºgX¸b„�æó¦nø¦MáÌg/—]ÏÛ%}áö˜H û(ˆ3HyÀ s%5g&Ðf·P�`¥�8´é‰‡5·b`ûŒ‡0í±©z|ð9€8+Œ6AOuhŠm¾¿¡UæÑ>ÚÜa÷_§âʾÈãgó¯�´Æ‡uÞÂZXãmw�ëäçŠ2‚Ïë•›0Côó‡8¤gëS±a½ÂÓ OKZô¦úà³#:ùÞ‹yn® Î5Äs _X¿ÏÖmµ¢Í¬Á G–�õÖãÒôßÁ­ì£ƒfœG<xÎÌf�U´†ïëÊ#j´9�7lÓà¼�Ó3B €à—ò1˜»‰6{ð¥5•7ŸoT" ÞV8:á\ØÖ ™0l+LHïõz{g#ïÐû†2œó¢¡{ö>è {�×¾�„3 Û)xWPy 7‰�t3ßÅÐe û(L‚p6bí„/_,X\M±ÍO *j„Ý-7ç ;9]á}æÛ§PýºÃ)³/!Oœô½-¬í�ôŸU Á×Éîæ¼Xƒ\Ò}@ôvÛeGþsÒ6ÌêðMQy ÷,xiáwŽîQ„7¬ÏÞƒ„gßã�Ä]A¤d 7=<ÄÁWC¬"ýõ|Üh㪜ô½%QôT�€ Á:p¤6sXÛðÅ‚GæXHíö,»³í‘$¹ÛÛ0w|ýh†q[‰ÿëÓNB]~žœ�~bœýá5\μ8h
zÎVb¨#²H@¶0:'já}¦ +5À$ 1½sžœSBÜ>¢,F·Cà¼Kè\�”ð§‘#í{ï¹VgÜà"8�[ó¸VŸ©÷þ;‘Œ€ ]ž–”waÓ7½Æ;Ü©ìVã…´¼�õ5¯Á—†va°¯¥w†HâÞë”…5 MN�I¹ÖÓ9´< FŸ÷Žó¬«Á_“,øP`……èKã‹ù…/n`7‡ŒÏ�…»{˜\þ>Î΀,á ¾I–ôqC³;ì! áŽ~#Êé3í3WIÄMÒ9wýŸE¸¹††6ƒþ}
D_%ð¸N·]
Ù>ãA‚]Uº¬4ØZ!JZêò-x.ÃûpK÷1(ÔË ïƒÏÁg ¯sÔ¯@>g…¡ê”IA6W¬I7½B9#Ÿ£°TC´]„`�Í
>Õ‚®{Qv¾ð–1X5…D×0n Ùp>¢XÞéwîà''ެšŠEì7=4ÖÏ¡’Ãá»eíj¸kVÈ+Þk¸lÁZozi¾W5U4Ÿ½•Ü Ÿ°¸ÂR¹‡úW¨äH‡ß!°é»rkˆk’‹üäƒ8ü‘Õð>> £³‚Ò¹SW´¾ A‰ww?9Èá>Ud؉œùÓy% ‹ÇiyÚíw™óÚ= ·¯,�â_’ÑwïätݯÇnÚ�o rûìEd¦·ÿÎ|»w-’³ê ͪŸ?�XΠúb¡ˆ’ù2öÝí쌦èžF�Å÷*d~˜>Þ7î%:¯i¬š&ä–*í!kvÄcçöNC<BÂ]Ü{=‘�Û#‘<­¸ ;6Ž™¯(Lé¢Íá7–†Ü¡oܪÕv¡MP3¥2ÞäL�Õã´ �¡�ÝÀTôq[)Z�ÝOg
âÂÖ6H�¯LÈá¡Íæg#d ‚Þ¦?]3›6—g>B Ú=×äôÈñ@Þ˜ó¾~`¶ºMÁÓŠ× j1#´÷áƒawñÌò–ôMg"þ¦Ä5nm#šdá”ñ3˜‘žÜî ük¾Áæ±Ð†¸ r…ó‡ò˜+'Öâ¶%Hð˜qÈ¡ª#:¢óã«Ľ+<m§3|1穎” {o3žÔêäE!ï{¯Ñw ﳜi¬ "ûNÁMÓo»#)PÎ>Y<×
$�?”}ñš|Ò õMh
ç„Z˜�Éa¯B),¬ÏÉçζù�©ÝæÂ>
­ÆoüðÈÖêó Â�{Ù˜ˆƒû¯A(íãFÍ:߯ᘹ�uh�þ42ÃÓÈ¢w+{ؽá#kWør�Æ«÷ÿµÏ^†À³äà•îÁ¶œŽ…ù†\MèÛXˆ\�!Ò^“±ê<â‘õ;…6CfՌ؅÷ É„pÒ’¿v—XEs„ûæ(t¯L*+ƒeý›r†Û&Ÿ3- Ý†xHˆHƒ\žùr{ž8›rÈÛm$^Ï©÷©cÐjeú:åV?¹=ºûð9
÷+œ� aVA™sþ("?—{æ8~z�I€O ÈV0õ5ãÓö0㩯n¡Ët…] F‰³FÔ×<VÝgƒŒÎ?AVÝ¿öÌñ�-¬
û€²±ßjž¸å3.ܬ߯© Îz4ÖÂnI¢º³ÂF~ÆsÔ@ºêèÀ1 Ö>= ÖÛÕ¨>*M€`xz°^|D1‘<)yd¨ïé~eÚ\ao9ç?Åà"}Í{½V Èîè¸Å‚å€Ûß½º°C¨üâ¿Cí¿Q®k¨ü<¯
·¶ ­d_?0¯œ‡Oìå =ؘUþMQæž½×ÔW ¾AtÌœWC>/Ì 4É‚°±'º@}MÏ­h±$÷ƒT÷R�ÛLùxïû[BBµ'žV®¼q—ñ³$œLð¸ÂÊڸ˄¾-W¸k¢}Îz´Ï­�:žáÌñl¢¦¬fHcxù¹MíO�ð4ö>ý> áÆ'9ø ©Î9,1�Ï�0¼<öB1mï¾4ßwv2È}ï�žîOkÇY@‚ÆÍ¿*Ì7øUÁKW*½éz»Ý/�¾°æW^ùDú>G—n”Ô 3äHÜp~‡x’ÿ.ÿ>Gâ â2dHýiì´#z©‚<¡~øÎ‡êV¸;¤Åø~ âñàñ ­Íw˜lÁ÷tÌ%Dl¨a|x¢ƒM[Ëyªh ‘Ãçc�í7=*bß HØÅŽ¥{훈 %í}#ñÄ¿)Ü/WQ v≯ßO*ø>z¶”^íH¸cœNÕÐæ
~¾“Pñ6¸¢ý¦wrwöyM]Ç`ÝžÓü!'9Patæ3½éœn»°ÂÂ.’¾»²ŸèçR‚_ì$äÆ�Äß]®”}CV¹‚úX ^ ’6KذœYÚ²ç<ÛkD_3ø)®Ôó¾áßñrFïÓÎçÎÅ€Žþ;¨Ò„­×W0ûkð ¢^åÜ/þŒb�÷`eÕ¤8‰Ê’“³7AÖàï%žl—› ë­=€ûÎ2û\ùr¼©øëoŠ’Að+ß(øW¸§9ìU÷„­ê½¦æ‰¹{Âùs#˜z ÁËOÍ;Þ×)
úÁZ¿
¤{¯—ÝÅI9§ô˜·Y{ç©brrÍÑ6…riþ¦…³$!Wà�ÕæüÞŽYèu�îó­ ™àž…BöKèY)¾'–�ªÝ>Pœ}A#>¬’‚Ðwk®‚Ó2ŃQ ^CWzàiw o:¦;-:fáY¸›•i 3žý(̓ywg*‰a&¶Òþ}íúÊ*Ë,.g׎TM3~�‚ÍWÖøåVÞH{] åø|«y1¡Mȯ¹•û­r÷Ñ�1—ú†ýÚ@«ñY….[ˆQ‚„YUMð\§ Ä>Öy ÑÿJ­Ùз•ÚŽ>¢”.< á†ÞûM„ÿ m ®ätÛ…G]n äÖÍáwp+ë)ÓÚ¸­ ‚Z²÷�؇~ÅaŽ‚„HP�ÁVõ aúFaÝÉ‘PÙýÜnˆçØ€y o qO ü”ÀrkˆóÅ@ˆêùFðÑ�3çYXÈ»pç×§õF½A‹cqõŸUÔœ- (Na“ÞTÏFr½pF{›5Ô‘¦ 7GmÓ¤}V5a6ÿ˜Wn#AsX<dó“i‚Eå»2Èì¼4��!ÂßtÄ&v„’Ð ç6u’—dw+$(æP�‚Þ·@ � Èfê^~s¥·çŠ4Ù"Ï Ù]I€²}¤]hß�9–6¤„6WØ+ÌÇmìw�Má½=’OÉV$Ò½èøZá úùÓI Áí¿3©YÒÞ†:¡oða}^CŽè}C+Ìýb­V´çµ!D2ƒ@‚†$È™Þt½ÝiqoÈíY͈a…ºŠ —ûž@йֱ†dpø—›†`ÇSŽ2x‹Hðß™‚r,mJØA<î Ÿ0T{j=ÞB¢ž÷mAÄ8 l  ùL Òp¡Íæ¶2ªû�3
AfÏ;¡8‘þÎÜí~Ç Í}�Þ¦çäH¨¾ÃG D¡·¿½7ú›³^§V’Æm*H:?d‚â7~�ÀÚ YçL’áü}–Ñ}„N�I€”`�"ÎÎS¾µß�™¼·ç£O t·-)·öëeß-á0yTqBãö�¢Yðïiðo
ï)ÌxÂ2îß¡mP©¹ƒ ëÈ™JP'ƒ¦,“GçÁ‚dœÏx\øae-d)¤§…ü¶�â ˆ‰’ÝáÎÄe7œèèd¹—š§×Y@¥º£ŽˆG¾qÜî~㟨jè3�˳§§•�ÔíÄ…ZßùpÕ¸�§]”CÎí†ø~ÀÞNZŠ …=…&�xr˜"LícÍ¥ÀW<!÷óñ´âõª'*!†ótëC>ÆÔ_õè˸÷˜4NÊSèû€œ>«¸K…{ý†‡ÉGM¥0C¶h‡lSP+›àüx„�tnJoú¥¦¡{‚©vX<CueJ/ëïì¸ð}ßÙûËu=°®»3´A¯Ù߇\Ö°ûS³Î9sScµ Þë êU@ð»;BôÅGtçpô¹³£Oî¶ <”`#í+輘‰aÜk†¾ÁÀ #ºÖp;<د}^”&òìä>CÒ1ü”9ð÷†§¡Pž6\a§8†â‘r§Ôkâ<nyˆìácßã[e:·É©2nüGŠö‘tHy1�5¡}öè©ú<8–-¬úc9ÃýĹû$&�wžŽu§æ�o#|S¶^_§ÇZÃ-$ØägG17*á}NR¡ý›RO/¬à³;ÂXÃj 'ÓÙÕ`ÇSO/=�}Ô¿éÙ×p;D)X'üg_ÛÔÆ ¾[çÐN''·ïo¨ …›Œ�Š 6¸‡ó&¨ëNçŠIê_›š¶¾ïœëéì žVn_s¡ßGá”1™——÷í¢Žš¯…«#j¤ïsQòÞϘ+am_D}C¯Ç-ì£('yæ ̼Päòlc�Àæ²°œa¬™!áM}ôuЦ’ç°£öD ÇG“"=­8¿j¢:Ÿçp€„z® LRïºÔ¾¶Qh
÷¹»ßŠ? F}ˆ¤ÜC¨Óˆ
MÚ·­Ï�{\Â�åC½‚éÆâò±FÑ(XBÔ[ô|3t“–à«AQ)ܳn¶�\wr £S`’ùìEÑȳoPj™ K¸šøY_(|æ#ZŒ1ý¦¨ ÿ ×]Áz¤P%Øg"l“`€o\�po,Swø)SšcÙßtªÁ{ŒÖQñ%Qgú¡1Šœ�ÿáS?eJ“|÷6hÏ„6ä*ú­¨6ø:%®¬[ô„‚}]‰7úûTrøüÌñ 剚u©×¨)„ß™–p;¬TjñYUÉpñû çp;¬¤À†§ÁvLO›‚?¤Îé¬o,ŸUÔÓ çH°ùêR]»vª§ðYUqKùNQ×â,7œû¬lŽ‚ÌÎWžÉ«óÝŸtg6yÙzÓ† “и#„<u•P�gMhCÂL@XtŽP%Xס�Þ½º„>â Ñú¶îó$í3~çòyÐϱAc'hx� r&‘Ó-!R`µ×ð=] Š6kÑž¼êô´Ëí�M?·A&çÂ�)¸zuÒ纟f3u�<:BE ïÉQ¾aºv&+4}´&|V‘‚ëžzTÝ)dã}#èš6«Ð&°¹aâ6ò63ÙŠŠÀžñýíc°O÷øR˜[ 6þ;þ¥ÂÜFjÊîYÜg×�°‚AÂ.Ç£/<-p~@ö°¿18îç y>:-È’»BŒ„¸' _kàz€Îlˆ{@‚Š?å™Ôzßàû~=PX8¼)ÌžêOcsñÕØúüüStl©"ãßg$Ð{€¤Rø
M®ÌÏ`˜=~kÃæÐÒ7q»Š6!£w&#ß=? q¯HÈÛ%\Oò˜÷ ®GDÂ~@ðßïL­¦®s¡ìù9oßw 8·ˆº8ó$ÍÄ&Þ~§¯~æi5ÌD¨~CFF&(4µbn“ƒln_ƒìîKã¼8Óˆ’›ä§f µù¾3QÕÃ×AygÂ⚃2÷Õó  àfÓ™ÈÆãœ”t(Ôåm7†§¡ùë+˜� +xžvç'bÖ‘ê=h>ZG°¬Bf(ò¡MP<œç%xd° âO£’AèÛz¸ÎO»œ”8@Š{[gê¹HàÕ€¿o3½3n@F× aƒÑÑAÕÃk¯Ñ¦¸ÇyF¦Þùþ èûï 5Ø;•n?³`ܸ¯fÆn¡?pÿê;·ké …´¯öQN÷†3ÝW›¹\— A¨` 5Á{0PF3 ({äòØ;…‹çQ’8% ”ôßI瓯F˜†ÁZ öAc›øìÅ�îñS
;R‘Ò{M£+ W8à¡„ Wãñm†:÷W�„| hhißОñømªsuNŸÃìE•Æýäܲ Óyæêl†­Ïú¹�37oH4ù÷¡—gÐ&x‚QÑ$^®½¦þ·kÜ�{†» U²‚°[°°OÂí$ÜÍöáð(Ñúâ‘ïF}Øýaµ83ŽÀû²øŒßÑæö3xÇÓç;ÒÞÌkÊDúNß%ÜŒPêw:–…æüwج|Žîe¥6¡.¿SFƒ—¦�Á�¿Ê×)L˜0C¨…f<|�ÜÍ•Ø}çC‘Å}ø´Ù½ÈíÜVjN†\ª‘èW8Ÿº­LþD°¼�)äÍn?ÍNÇ0I>ßÐ] 7–c¡Îœ¿eN}îël$�à=I óý Õ׃$™iš}DQ¿v®!m�M�°ôMñŸ»º"A›„{�?�{½Ÿõ'@Ÿ;0Ð=j…úu[ýwF¸WŽÀä
} =HÊò3`”ûï fêûèIîeørsñxÖ|"­ú¶\aç;—;ì½TätF;u3�Âõ÷!á Œ5
¨Þ¶I¸é](ÔúʺZµsíÁ5-²\ƒ.5ö ?m õÞiC¬ËÛP‚ÏwòkÚÂܹÏ-<í§ó…Áw1òÂ׃;h¸7¢»îY7‡÷ í3_%œÀž¹5_„ç|Í¡Õâ‘HnYK²
ÂZ RX°¢Qq ³Šzæa'G•-Üôî¡s®î|So×WýM:^B°u¬oNMÿÚü=x¶Éˆô:wóÝü_þ;ØÄ¾‚aІy€¾‹s[QóFÜg�§�VÉÍ­ÍWÉ ÏÁ÷Ñ›jƒŽ4åkx5®7È{¢�­½nZ-þMÑj ûöIƒ†„^£gê_ •å¡NW°ã nÝ0ÁS<%áM§2ŽÞ†„Dß- JŸ!›<ô g^èT)? ʱŽÀj þ^˜®Aæ u'õMk»È|5¾²`‡ó´[ø>TÉrî1>ê)¬Æ:’vá}#xé'mS#IH ÷Ó:wηœaÏìϦ Å–¼×óf|EV=ôz%@çOCgÁmŠJÎC7¤*µ Õ
Ï—AÍÚz²»Ï$°ÓÑÁ]‹¾)#P<–C²$é<ÞƒqKmPÑ�Þ.™Fþ4˜·úå–[5ŒAKIô§cÑ�*jqk7ùè»?^Òþôw`Žø¬¢Íá܈†¸FÈíþ�à9Å;Ÿ¨ÞýÊ �Sß÷=áܹIËè)CåÏ�m Âç#Jο\?í~ó4NÚª’àÖÚœ®zBÖ;ôgoyÆg|¿’ÀÚgxSâ?z.TÉr«�Ê‚êïÃ= (µçI4ÝX¿±€Œ~ƒ„ ˦òã‘|B9Ìñ^£ðì;|
¿oãb£°•?­E´²zŒ’§á±
mNg’Áö§Œ¦·A0'¼Ï‚¯>´)î¡E¦+>¨û¡­|• ÈâJ] ZÍÎ%öBN{Mr‡«ì´TùpÎá�ñ³žüñ…¡ìŠ÷€‹„�›˜ßK‚]nˆÛU —³DâzB ·«]PD熿)þ>C`;Ÿ‚§÷R£ÔnF $_jHY cÝD¼ü+€8—€Ì—âñ„\)’è=@ŒÊGgj\h*›æÚÜAw8<�ÊË©ÎÀ[�r{d
ç �|s?¦Dº÷ÅŸñÈÅxÍžî´ ³{™‡÷Æ`Ù‚½3-Õ™„Ñû°#MÈ„™¸nÎ�äiÕïšDƒClä»2Vgà¡W�öDŠ®xŒ…6‡{œAN÷'.3Ûgü<T¿›aÆ"¬:w Œ… ‡³ÇXx1µð´=XB�²üN‹|¼07¾óÍH… ¡ j¯©îAGiœÂ†Þ(<�tôÉÛ4òŠ#M&D‘VpÑ“"œÎíÀð�¯™ªáwúËYãÈö÷¿-˜iÓáÐð÷ñ
Èv$sÜïB„Ÿ�ó§µD9¬j*;þ}–±¸¯siåvÃû �Æ •𸱸íÏÒrÿÎÒj{USÊV$är–5O»ƒ�l¾e!ê=@2ÇW#Úú^Ó‰
;é~ÊÜõü…®”³t@ kßVD`}çÈž…µ ±:Í¡å¿Ó£3„ oC}>Ÿ!+µ›ü›Nm0Ÿü–³ÎÐg¼3®¬€œá¤…æl$
°¦1à@÷ý­%ćÑY÷p“ Úa°ß6܉þ4�ÙW=¼R›žÊc::×?™ÈÞž9´‚Í· 鮹 §s�¹5Þ^g�yåÙŸËFΪí�¬b·{©’åYr aq–5mp øˆ"ìÆ:eOó´ YŠ®Sħ‘ r­xÚî€;Ø>ßvÔ;ü}öò±ö ±Â|VQS*Üv´ýË¡ºîsè1ÅàãÚ™o>wv2|mÃóœ.ê¯†Š �Û
²:/ $èâÀ·9�±ìðx}ì0ÉÂû,PôËÔr ¶V85AÂ>JÍ­%ýÊE¡Çì–uº\ÏaiuºÉ}¾~Ð}ÌŸ×Tã
7䣕[÷´J¸)ÁWsàùñozL»ó« 8‡ŠóX;ÿÞü;áwð™…1hÆ¥?m)Î4_`xy
õMTf·-Ér-’'Uõi ñµn`({$ÄÀÈY
3 ¢`ó�Ô3ò³$œÛg{V §OPºCo*¨«€$ŸÝÉìõ¯pâØc�R½¯à“J¯~–PÛË3zQWNvU¿œóÓ*„¸>BBe�PË”J™iÆŸ 2¬>ßVègŠ\|Q´ŽÂ~pu›sA©X—¢/ áöA5ä°á¥9Ëz¹pøny!áûÁEñÞÛÇ ?ÃI{A�ô¹sá$ð -Ÿ`AÂX Z<Þ!ê [,D à²¹ÚÕC=ñ†?õqÃ9G9Dp‰§yFÈr
ó «/Ì7ÄDÈ’Ÿ•Ú ôPƒÜ� *!‚쮲§³ê†»â½†å<(4…{=
MžÛG:ïè¬ )½oã¶ø�öƒ" O»gáF®Æ÷�{ª!^rÃÈõuzã
öuJM´à'¿q͹µ~±ñ=$ÄÚî50Éڳ½±4š�Ž5Ì<çy/¥?=¯ñ
ùÓ¨è§s¡Æuè‚F¾[’ä9ÒŒÍ¢ŠøòÂjÄÓ|v Á�T ¹­\HgõYUP“ £C–Zïã†X³Ï²rÂ
q¶ãR–Íõž@ÒݹÀ‘q›�ª_áæZV>„¾5#\7oÁÇæ<o�Ù¿ wðSÔ~>´§�›·Tr|¾¡âììÍ…š“Á€¦m8+ÉÆþM+šâ¾Jê2zÙ’«óð©©‹`´2PýÌ‚3â§•:Pá›.C°¢aÐû­ÂÄÔ1À©[ªö §.{RcG�ö}Dô†ÜÒi={ävma�âw™†ø*A‹‘R¯ÞëqðS†6ð Bœë –O õOÉ�ÝÝ¿!ƒ¬®²ù|9œ) r¹µ�ÇQ?SØZ:׎û¶î½�Cp:øÓV~@v��Q-Í)mÓsÛõÙ ;Ðm$žv¹²¾“¯S�`ï€ìΡ ìt�â9„Ô£½¿):õ¾‚û!Ø.„í uøÓà�†q›€¼ Jþ娰æùf-¯Îï ·ÇøâŠS$ÞCGõ¾ƒÒ½—6!ψ`œÅÂÓðâøNÑrõ9Ê®ã™Ý$7Vç+#€x“ö biø¦¤±¸N=£GâwMXÞƒáöûm‚þNCÂîBšk8Kš¶–ÏxRÝ‚\[Áÿrõß|'§‚rêԑЃ¹†óg ÿÔgÈÀž¾)\÷ð;$x¨yU$‰òö[5HõŒQêÉÛä»%¢4ž‹�Š8·Î�’ðï3Â{òïÃ4«&¿3ô
3ðÌ¡õ{ß°ðõL›Éý; ¡
:{K¨O ·®ö€¨Îš  ‰”¡Íι aCß‘5ÜÇ€R•îÅ�Vº9;¤x%äCB%DtIÑmð÷™BÝ
Ž?d”½ ¹paDçsò=žz=IA˜»¸‡„[†÷·¿ŸLTgò¸óŠaÎú‰¬L?�ÑVqv'ÖlX�›Ñfwf6ÈV '£{WVäžœ‚蕎ˆs©iÓ.´Y2 Hìm¸ø¾C:“{œWΘ°ïÀÀó¸m.çÌ� }ÔjÈ‹ñ^³J"Î`îaÕ#¡åÌ„Á'çA6$¬9Ÿn·-‘r¡ØÉo® ¡*q8�õôŒÚ8º÷áiÕó$(#º¹O$hí�÷05ij–pI%B�;ؽYî? X?y¼ejƒ…x°ï°­¤ [5ËxºúÚº�“ŸÚày = 'Ñ‘iòh´'”÷½M#Þ„lyG°ü,iTL?OA½±Õà #º¶ýºÐ(ýÎÎ,X{®ç@e/Šþ¦)›6·G—‰nÏÎ� `\`?ƒŒá†ÌUÏc‡´¹<:†Dç�Á™#M*,ܦ¶à]!ÄïÑ
äÅv÷'‚\kƒÈª¥�laÆS<$=�»«Ï^îôS³•™uPƒÏ3”W�p¢ƒk}ë6�Æ®[w…“iCMÛ÷ø ¿‹ÏÞ­õÑ£€–¾)kÎ̦ Ž¡Íî‘!ÜK‡³xANçï€8•°B&õWQö¾±õ¹½ƒ¶døÚÄUÃׯ›vØ_šŸšØ'áV½#ï;ߎoÃǺ!þ¦;¹I>¯w"ù~3Úû;Ü�wdWÂï HhéX£ØæŽŶpo„�¬A*:ßrݹ!‡÷AvÅWýNÍ€À¦ó³d_=ø›.Aa¥¡sdâÊ/ %øPŽžªÃÚTÑÂ<8 ó]¬!¾êABßî§þµ�!¨G­°é‚ •ÔXq—sAWôÒÂŽtP¿éAÊ¿)Ä` ±æhãÙù|#ß Xvdc„3ë Ï4|S*k…ï“b¡XþWñ7…ÿìkèa¬O
JøÜ�—æYHý!‹©s¾´GËi“¼'ÁØð>- ×u<?OÆ¡‰S˜d®Oy5Òõ½,m·¢OÒ1Âû4?›? ¿‡ï;äu‡ÛÕùBüç\aðèï uîª÷kc’ùm|1÷J]T€ð÷AÍÁó>0i¶°û_¨¸ø¬º¨�äßå±`�^\ª}D¯éö¬ 4ºàƒâÙàMaðL¥½ô;Ëf/l±`‡4Äw¾ ã?¼)Ö¿Û‰TÍ kû&ˆìßô¦`΢³
îW°ˆax…Hñ�â”Ï·{HÞÖn„Ïx\®9²¶|áw(k•žvÓ=á ð1˜j¸cÀÉrúŠŽYØÉ™¡åößA !·+d¬äF…¨™ÿé}¢§³p;¼±„|¾Ýëålî³°‚Éþ qÀÒÁ ÕÑAá,ìUTôëÝ3âü7n€ˆ!úï ½ò¾‹ÁÖruÖ•XlXYð¸Â]ƶgÀr;…úë½^Bp®yãÚ¬GðºÃN Þ¢
—Àï2TÚ öNíCÚµÓóuZ‡.x÷©¦ü|u:2(;">£ã†z•롬µß]¸i¦7�;çꮕø\·V€ÁûF�kÿrTÂ
ÞÏ�Em0Å+J?¾ïÔ–¹ë}[Î4¢xxüÔl5øô}6„ÙÜN¤è2­o <Ðf•ZO[‡ËA÷�Ý#]åëòßwÿ
´9<²
RÝ‚ˆP½ÿÖÓ�Ýw
ž¶ûª¹Ý×¹Aïõ3dwÏ)Èé~
�Ûwò�êœS’ýMSõÚ„™Øgg€ì¾¶A.�@mp²ü^„AV÷ï€�Ë©oÚcÇëNA›Û-Õ IYÏÆÃ‰êQ‚ÜΙÛPvô›Èè<!�ÝãL$¤Ô†8gkn1µÒ@‚Æ' ×pÖ|D—=ÌkRÜ÷„ë¶óûHð“ãèìÜ *ñ A_„{µ¾Ï€wRÏ,Ú Øém Oƒ_¥;ù3üÒÓ ßŸ]BBìƒâ!�ŸÎ8‘yóßYCM€­%Öùù3B:õsa쨌 ¿C²Çr6h·ád‚uä±¶�oÎšØÆ)pNA¦0G·(¼)¡‚ð¦¸G}•Àö\ì 1÷‹�PšÎÇ��9HTák·²Ë~Îqt�BĸÏ)5ïvš÷ “s9]AÑý*à¥6=¢ Þ®®Ÿ ­žÛ.S»Ç ‚f`!‚Œ»ï
ÝCK›Íý! ¡BÔ61åÃè í;>œ ð«<×w›È¤ñ=qšBžÄÖhëa¬ÏŽ6ᆠ‚b€SìøðµI° =X�¾ô§aw‰»®ë9l·CßãÉôu¶#m�V€m:B¾¡v.H¨4B+}Sx\Á&‡­¾6
aý œî7qÊðÞÎ\l¥£ÂN#|XTÁ
€ÂV*LÉßcø½d+vSØãa7… ½6gÏlðž<.‚L•9Ø8¾»PSÐY-HÂplêÓXq~C¦Íyø¼fïˆ3¯Hîd“ž 70BÕîýÚ@Ü?ºÁhtÈáÊ$;ŸÎžI·’‰¾@öð=„&a•PÌnô%õ$ØH a¿FÂË}·”Që�[²Ë®9ÐCßFRzuVÊq³ ¢Ÿ{Ý7êÛxnãznÈ µ³ÂhC®­÷m Ѿme�÷Û!„(W¾Ü`Ï[ �¬à àêìŒ� Bx™0ߨ)èñFžv{ä1Uhã::\?ÂLq�3Oƒå GƵthÙÏ{Cß÷7*XzÇÖŽ?Ñ7hë~7cƒs–ÛÆ–öQ6žÔ7T1}-lÔùvÛÆ�³k�®å£ëÇ-o¸8ÁŽG +œ%(Ó� \œ`áïèEû›Â«ñHñ†N–çØlèWO•ÛÃýg‡˜àc€•3ý8bzgÏ€„Š¿ ›óP@àgè÷ÙS´‚R�°4½ ¹åA:¼)ŒÏЃ¤vÉîpæ/H¨u�xïîQ�;ÌkØ3ÎÚÛÈ·]gbn~1·ý�1Tv¤Í}ùþv“ðqƒWãìô�j¡ÁD÷Å ˜8!–”ÿA‚.HàÌmDo?³Êxúí�ª†®�Á¥‘�£Al¿gÁž ·Pêj«“:„γÛΡwÖÈì�“òè¾ûŸcuÖU¨Æµ�¤w¸ývÎ0àttÎ9äínÔBñ\+j¹ùÓ–;XÞ°Z\±šRBAío»°)|Æ_†•öM¥pß vÈ…‰¿ÏE„0üì&_Û—]Ÿ‰p@<Z¾ÁžFŸq Zx#Ár€qã|± M¥0Ñ7 7W¸8Áß â<~‡º†þ>\jÃ7�)£ìm–=ø`Ï„óçB›Ç×ÂEÅžÛ‡;­ïÛ[xTâÝOqÁž oŠï6ÒM�&Ÿ(4…8H°ð©]èLY¨Z$êàó±Ã޳Ïx´›‚•F< |m´›œÿ¶5µ%·¢Q[r�›�š‚ÁósOWØù/.ÂnyßèžøÜ�#ã <JW-®>²:Oµ!a¡¢_¸¹RÑÏÙ@ÊIá\¸åø7-(˜øW€ÿ�z ÅÌgU!üâ«.N¸¹ø¾‚ Ú3¾+ƒk½Ì[°É©è”z=2´ ñí2×0{K�×ùVšÜyB‚7=qWWÙJÓyó§­�yµ•u ±P4•BßPN
V@íRß`yæÉVÉ_ðݲÕ.ô]¹gð‚Ö± žSrfC|Äš¶Jñk_ © Žß)PWwªk†ý:ê0‘¬‰€•~m4•‚¥
È™JÚÆÁ+UWÒ‰üwHEóy]× I¶�8³§‰\»âHà‚‚Å)�Õ+é€_Y Õ½ ;ž'�°ƒ„Ýäò|&L
¤Ûˆ‚kä¸ôkƒœÎÎ`sC·+º®9Úð�B›ÓWrz½ f|Bîôµ§Û-$Í;�M�Ì~û VtC<ß$TÈ9ÝV õ>â÷S�êùs¤â…Jn ‡sÌ@N·Hk;ü¾�Ã,x¥@(û¥ß”»®ëFì}ºo°!/©¾[rÌï\sï·jݯI¹#‹ÃÛ :¢§ÌÞ“‹�Ú�Ÿ’À7ù¹Â¦è= "üÎj:áÐÜ]¯f‡uä6H¨«4@B<¤z¶
ÅFWÙÃ:EEƹXªï–” rÅê¸g1‚àÄЯâömv÷FPâ ä—€P3Û‡<#ßÉ÷=áVæF§OÃáìl“V0ÁU�pE‡Û!¥�üwˆ}ø*Aɽl¤…BQô§�A TMõ6ÜÚBßfrSCìAG’rºWG}¨úEш�ëÛÊI„?®§[Ñ;’GÔâ¹< ‡ßªAn÷¿�„Œ^�êB è¸QÐuóhSœÅ RÝS¿ODûôf²ø}dó\EÂ%!޲zfÈîñúÖQú>ÉŽßá¹ÿ „Ò>¢ìH>G'ˆn¿Mp÷}ßáò¬„ǼN1W‚PK„€’÷zÝ‹¯Fx=aÍÁ
ç6l `m ÷ä·ê}(‚¤}£êXØÉAÂèÌdÀú›ÎCðÇïè# ¿Õ!ôï33C*ÓA<^=GmŸ×Þ3@‚ÎÈnFl½a…‹ãÌÅ�«f¸MÄ'm+Úíc½ ËæûI™îÝß©ëz;‚®á›’Øv$�`‡ 4ú|C5(ìU�u/ÛNy³°#1ßÝëÁ¥1ø@Ð'Òµ°@öó”ìÏnG¨evÈ‚§~ñßYBnO»Ü³@a¢ë¼ýid4¹‚�s˜;¤—x”gG(Øù G8Kà=yþmŠ3v¤pO߯¡âxv!m é¬Ä¦|-¬Ãn`hÉy¤xo"’þå@Â�®T°n„ VZ+‰Æ`:Ã|CH-ÜBÕ0ŒÊŠ�Ft>«ß(×¹¸ÊR ˜Iþ}8ÃÅæóÕHîZø�–"æ{"Ì+÷Ù!R߇UOšOð#‘²ìQ¬ª0ãA<&±“ªá>|�d9P¡ÐUz ýH öDbÏÝ7x>C¶9ý¦P1'ß‘`̹¢ÄNåÀ0©è™¶;”Â` ¶¬¸Raçkî¼¢ïƒÓ.X�\Òƒ?d'pžFþ�ï!\CÚ#S1µ!�Áïhѯ.FŸgß� 0:¶”�¢u¾¶÷¹xôeÇà –ÇYz¨†aDQ§ó�bG®Æ÷ê†Un,GQÇ€‚Ç>öcà¾ÚÌž/CøÜ¡ a„€�T� ±ÆïÜ®yµÃÉ
'úAæ‰Ïü© —ÍÔf ±4ˆÂZ€Eåñíý˜C¦-©ÕUŒ‚—ú ¸ìûÛA¸ÞçÛ‰sÝçè½ä;ûy? òøÜ¡_ØùΞª‚:Z¥=ŸdhCÕðð¦|ReŸíÔ¥ ÷…�ûnQ™ :6Áæ;œð>¥@| ¦î?'×j_?xž\�u?á»%„åN �°ïè@OýÉ…!Ì*¼§¿)ú…a¬‰p¸Å…rÒéïƒ>RðÔ_0a|\D½o¥;²ïõÕŸÁÃtõ%D†à¥ÛÞÕé_ö™«Œ"ïªmì(4yÆ5H¨hRƒ ‹“gììÔi þxô=�65¶ º+;JÉÁ³�nRØ«à~û 1¼ü ¾Ö<Y0¯‚Ÿ$XøTÚsfÜ'ËU� êx é¼)Ùà»ËMÁWˆsIü'“EWðM’©ÏÑ{ Ù…; ¯õ½S5HÚPŸÜ{€…ïëôžQÛ m.ç˜í7î/Ÿ÷²8ß…6»×¼©®µç
³›< ?1Ða
Þ¯Ò�a·,] ó�Š~áö¼Ô0ÖÂ^U’VËN@×)Á B©D¿O¡¨‡Ó¡é»CöçNŒ'XB­Òžßr
R?1PfpfiuÉKЪæ…oІŠÏQÚxžÞNm±°óÁÖ
vH¸± ÷<Î(4Ïv(Ϊ_®(v[¬"§àûN±ÂÓnçîTä ö5
í®ÓH›ãö¹<ÁD³‚} '+ذðJÃì­¸A}ÆW‚V>Cêêt¨-ù® B*´�(Èå÷mä1Fÿr {ÕïÃ%4pêA‚çè¨~­o
têAȬö÷A´AÏÚîÙá;øÓˆU‡ß™‡¢;ÒÑÍ£³AB•F�Ýý° §ßÑAcà€[äü�ÛóAª[b΢ ÕP@ðôéˆöø«t?@–”
mªïUuîœý BF“?�zï¡V…·I¥ 4�€ž÷ÑSâÀW#ˆWæ¦ÍìvHà`4ÄmD[Qéð^³¿…Ñ™Ñyó6èûû*é!äúچꞿ…È�†UßÊû÷i&…¿’q‡�\)Ïl@Æ&¨
‚gYCÒâ!=JG´9æBßRdgÞv$8YM¨)ˆM#ïÛx¾óQLÕïÁ<­ºMÎ%«OO›PôĽw`‡Mm‚]uPñĽ_84CÕ<ÎûFeÇД<õ¬?Ú' _›�ZDÜ«ËÓNÏnA�T{ /Í£ö
A6¿}€ì΂ Qž†8küûoÙ�YJaˆPAd÷<0�+õ`œ]i‡3A#Ñ1í½ãX®Œ"˜{²H)>ý–jŒ‚Ï•!óÃ{�G=Y`zSD·ü\ ¸ì¾Á}±`‡@[wï$mHÌñ^|÷•Eó2)qÀ�AŸÏ=sÈ–“îëm�pô=‘ÿ`Õ�òí <Bg°ÉA&?1@<ã�ò>Œˆûßhª4‚à÷1`» #Šs2ôz(a…Ïç·Ãíiç¥�ìîõÀlZG 9|î Ýöƒ‰8 Û;póÂ:EAÅc9xU÷�‡0ßÖÝ92 ¼0¯ç–$ _Žd<÷hò4</¡MðÐ6‰�0{A<ªH›Á}\ ÕoȘ÷P³½o,`¿} á˜vþ´1Ý·IðHa@¸óþ4H¾S�"¬[¨_ΪäwŠÇDë?™°ªB’vž)ç�{|´‚ n¡À¦ –7É’®†EÑ•P©òàXp>Èà^�ùôÙ ’ÚP,Ó¿l:×nBÒâtVåqÄ=š �- Â(èÜYÖ-Ø–ÐÂùC¨Í}v”EE8U‡oàÞ¼cE:ÝG.›ó«hÃeÜŠß·ñ"…û,·`óQÚ½î”ÝD¤Ã{€H¯Ï^äœ1� ¢qþ4¾ïP;øžÈFwFÒ&q¬©xå;9Š=áDG£7œ ðÒÿ¦Ä‰Ã A÷+ì×p…�LÑ1Jþê¸5Éj7$ž=oЧQe'< Í‚„ûÆÚè#J”ÉkGCR›PGúØH”ð�¸£kõÛB+Ÿe öΆ,�Ÿ2^¡×¤Ó†qK±÷u¯°Sl©ZÓcp­JD$õMIVtžÝA
Ÿ3@Žà³Û‡Ý#éQ^E$ÝB÷ñ >»}
yïHiò7¥¢¸¯’FGõ]lGß¿é¾nžétà�þQ\Á^S�6—ëJ5$X(°ÏÂ�åèçÇ“šË™¡£Ó\>:T³ wÀc ¼uŠ^¢”å¿3^^‰ê þœçx6$x%|5bð8[˜©[œ«{pœ¥7eŠúNÁaây‡<m-a #ñ9
Ç,ì䭚ݤ#J2|¹“ë\j³‡“éD Êw
k^‡ð j^¸MÁK ~Ë“SÆGô$÷ßï€hø;“ì8 …6$y†÷‡0O<´¡oãìªÁh_?'×’€Àœ߇"š>wN ßð¦ÔQs«ó\‡4:T¯ºtV]Q£€� �%ÜÍ.Ô|üM/jwøXÃ
kîBj¯zzh:™Âm÷B–Ú­Nöäà @¯ ø«®~“÷€’ ¡oh@ø.†ÿ/ì‰Ôà ¶? ¯à-¢Ÿs4�‹°LøÚÈu†±nÕÛýM×+ìרnë馋ï‰TŸs4óP7„
MÚ7ôÉNÞV¸ÿ4¶–Ÿ†ø:¥_ðüÜã<øšƒû¢¤p¿Îô;Õ5G¸_ÁBA#Äsºhƒ§ÏÇ�TÛ0¢SÈtB8ãð,�fâÍR¿³lžzÜËíùÁ Å™æÐSö`9ÜëéÚ@:]ž™
ÂÁ­ãVðø¼FE,Ä5Ëp†XAS¬NVðA–±„˜Qᛆ^·ThŸ‰>8’r±t¿Òè,AGæ@�+ø)*Ɔ{qˆ½„oŠÚF˜ñ­:ŸÏøÚÕ0‰½8§‘BKÞêèP5/øÅ¨š8¨_‡(vE"üÎx…H$½Á" ñŸÊ7õRg„©ýMÑŒKÈæ(qâàO¬+aÿ�•Bs9�­…M™FkîÎ Aïd÷ïs6†—Úb ¡þÈá{•ó:Ox\n=5Ä™0 Û §”wÏöâŠCÄÇ wxÑåª:wN¸R~ )~GtøO£`‚Ï�³O&RlBUw�˳ZZޝmBa•€ J©ãÉO3®8“{Ì2ù—ƒ�ä1dÚ`zÈa×=ä¤bœ3G@‚ ÏTÆößÁÝêó` çÎÛÀ ræâ ³Õ­h„¤q¼h†žJ6¹Ü§zÃâ&�Ûyƒ ¨úïóõÇcÈç0!úëOãÜãFfw멆ï3PSðöß¡ºòå¢ ¡oKñ{Òà¨gøÓVäÜ}% %ìäðj<«ŒD´VcC|DG¶
rä<ft.q‹ë„ ãŒi�v—qœ��›"°Ï(oCaE·q"ëÛ¤_|¬¡»gûÄu>9Èæˆg�Ó†;Kè[q/Î ™Ác Á ²»Îƪ÷`)~$‰1d¦6Äs@ÎÓçd{÷“ŸÇ<ë„BÚë ½uõ9ІjÍÞ'¨Ÿ20[ýxNãN͉�úFŽÐ„Âè� ç;9Q•?‘”u pìhƒ™ÜG–)œšs×OÛÀÁpV?©¤³ÇÄAV¿}´ôÓÐkâÑáÜfi»Gó¤’›Gá@J7¸aîpj»÷øœYóYEÖ»g{Ñ&T>)ád‚ëáL˜sžoç‚‚çS€T÷lC üžñÐúÜá2æ(Õß\ÂéíÄ]®p²%†/�,œ ¨Ðº” ä
_›R$Î § 9;ºL>½oŸ|kW¬¦ø\P¹œKR\=—´ê!œÎ –·Û;K+éïƒ�™Ÿ§K⻜ îaÙêGìÜ•ŠIèº<¾Ý�p3"ÁÒ¹+´ :Î-ðà<�>œõKª �ì2‡–Ž(Äž`ó‘ãîL¨G9o�ß©áV¯ÆóÍL]áÜæu¬"Ü=è'%v.?ðö:óêD2Î}ø »s0 m~ÈU|ŽRç.øZ�;_§õÂû@’ñ�
xE8Aœ1r¹7äöÈÝ {&|9X-î‹>·þvU+îgÖ†H¢Û‰øV‚…² !»�‚A\èt-PxÙc'¥’Ã>ºa ø�U§ðµ©šæÛÆ|ó�|£üB@¸é¹]µ­GXÁpWˆRß3ìñ¬„`=!°ìüøµÛpGGr×yÈo#x«ß)Ï0ãQG
·)„'ÃÂvaÙÙü+ìܪýÌ‚‡¼y ÁÿvÇð=$ÜŒ*Zø¼†Õ¬Îƒê–~.�Æè•O�V€¬î )Î¥&øCʵ~m�ô;Õ2C›-Xv~ÿð¦ÃN3šœÁzr'³
–N8ë[Ú…{‹*!†¾MÉÚ8¦Ë¹ç1_Î{I^)˜=Áº%~lXT�ÂÝÛÉyg«€ç;9ü¯swâŒ^˜0a?€ 㬰ó„®ìó ‡bX§gK“Óùâq™\¸oã.
gðI)Æð;ä|ûÙƒ)ì áÌÂáo¸IB~ðÉ%0xh¹9Cåäbn9\ Âj<—PåôÄPt•x�P­$('�$^·ž.òK|ï¥ÂŽë‡œ°Z‚MŽrRú�þ
¶Ë5a'G9)Üð„y€úhDB½Ãó¢h«{'A‚?‘{k°a©ÛçÙ¬”FÚ‚Us¡$à'í…ÿÀ÷�àW†qã±÷óîV�ÆB
€7¡«u¢€UãÜ"DJ°’ÂÓ˜óŽ (ä"Rr9±u.�Þ’­üdºqã¤6{Ø«nXT~ã¿— ÞÎ]R–dÀP ^�`[Þ0¯|‡…¡â¼Î³twˆp '¼Rxœ#s¶jv>¯ÑrnøY«$èÂÌÁkXpïûÜ)”oô=¾‹s²ÎÒJ&è¬*(=ø¬q]êÝ"WËÙ—+hޏ�ÖOA.ÚïsKŸ½e *'~ÓÙgU!¯ !¡ÖÒY1ɽo°t— ¢åæ¿S±«ü}àâßöc¸±P 8xA+ž?iA‚¥Z!÷½·¢(á3±’GFsǽ+°�‚WŠj,á^RÇ ®½IJ�ñÔÆ»|eµÚxáû$=ÕooXÁu>�AtVœÑá+P66Œl{_Á•,¬Ðk<Lú.8?ž²8c$üNC|¬Aªç±@²†¶gß•BG’.$-oCާŽÅ¢CÖ©Ðái›ï°˜¾Ý…¾ù—©n4ÄÅ1ˆ÷ds/"›þ>äxêLÄCðCÛô„�ýûP{Íï2W?/èÕCÃ×Õ©&ð@¸ò{ß`ޤ§®mÂu�$Éåa (lâ³$ç»ð;húï¤{ÖÕ£†~¿²îʤB §ÿÛµ3 .DÛ½mð Èá$Huþõ5 ¢â«ÄãδÙÜW8L
@ž 2ú® Æ «k‰‚„J ñØî5ÂõYE\Èïs´)a&¢4fü°„º}¤pp¥Ô™8ã÷µ@5W·�Ê< ·ßK®V³nÐ�´tûèŒíôä"TøâÌ+®è4ò¦õ³„à¿ßƒ¡žÍÎçAŒ#üÎåYeW».ÜÞ&ÝÞq,PãÓÛpo #JýÓ„�•žv§6¨vûŽÔ�Â×^2Q¾×¿Z>Î º¨Yç¹ò¸Cv¿c\�Aä½ «dB(ßÏìaŽ"Ïç÷`Ä×1 10� 4Էɯ EdŸ‰Qµãi“¾6­³M.·¢AG¤„ƒ1ç¡ 5")•é<#„*b:¯©LçÑ
Ú„JˆÈ“…t�ÀÕmˆÇ
.Qžñr{& Hõlã‹’÷a¿†¶á7þ‹*ž~G§lF¨î2:G憎5²î‡%øÓûý§!γkHzÓTÑœ6—óÒ.ØMžÉ ²;ÞS°)f¨Ô>ߨšç÷Æ‹r8`D¹ß…ÄRÄt¬¹‡¯s@‚FT½÷hH`ׂ Ûã¿ÓŸî‹&)sr?¡&Úp  p“€ÎØMa¬©§çÞÊrc.{ß(zÍäq‹‹º›îãºÈC «¾%Bû¹½¬Gõ¾­¡Ž'ÅôÐþ×6+Õü6EP>Ür!Êg<‚”ÁzB| œè+ÉDn *åÜýk¥NJè5'`B‚/ �¢ê>:Tœ÷¿bV…ßY‚®á…ÿ/ÜÍ`*y¼žBHÔzßÖÙ}�´!`®mšf�¿éF†²ï!hé/^åpÛmHø®`þ>W Ÿñ[ª ~ÁGr=!�Û™#$^.Á‹³q6†^“ezúˆ²½õ!¬çÈLç‚�#XÞat‰»e‡f�s /XĵA5Î{ãÆ×ŠÌ®sÊÓîÐë½ÛÂìÝ{2?´;\6?AœÑqt_4¾,ÿREükSÕ×}ø< †•?�J¡×ã<�¨…Ó$½)ÎVŸ;û˜vô„ÂKe:ÏC¾àq9s¤„3‹R¢aGÚgîÚÙÅ|‡…ÇåùYl­`ûƒ„sáèC™ ~U8e¨ëL%ÚÜÎô)žàJ¹&Hк�µ­¾áJ¿?Œ(g´_ȳzÔ÷Bk©^:¯a*9¯æBº/Ì<5®¤F²ËõwZZ³÷ %Ôú:…©b��äö)–áNK²bð”À:
'š=éiSûNA¢‘s˜."â± jT>nS¨åsµ”ß‘È,wfm— 29þ}凉ýdâ¶ö^(íÁËë(ì|°Ž<{à"ÌîÎ(ó`ðÌQãÍk)\-øá3$ÄÚâþ7�ps%Xnâ ñÝÿ¶`ÃRÁ%ìH×P]kïÂq™z0’s ó\°Åp>9è‚Ãä ¢ §Ã~g>�EuqÙt5
Jx¯×1ý%¦}¡þwØw¨äæYX×Ý]ÎÛ¸Ð@
½¾û=ذ¨‚/FTÑ›¯í³ ç¡\7îVŸoì ž�D¼ƒ:Öä®9纹;û÷¡"�s÷¯±×Ð7¢å>w
§Œ�AÓÅñ§¡Í깤Wáò>è›–.¨„Pc ³Sˆ–‚9¾“£²bï Á—Vp‹ù¼†ó¬§‚Má»Ü¢E(Ä1ÜòñLè«�–¾°a fü+àÊ
Ok)|¡ e0r„[5:?á”)¸=|-”•”3ÿ�5ä^èü‹ ÎxˆÏ‘ûÎF€œ3wÕ~k�JnÎÖºà õnïPãÍ3�V!?WÇÄó\i³¸î$Hȱ¹ÈƒQßÊïVM%;×÷XGÁ�u¼†¨…›8ãBT¤²è}ýP�ÌYG¸Â©,ï#šò™n8?®htSó¸ê*AUÖ~ç&%Òc` ˆ xŽ…„ìn©6>÷dQölóÛÇÝQ@÷�ÑÏFôÞYã Ôšð÷YöK}´¡œ\hSÜ{ •š{›¶A,æÖ½
“¢ósätÿÛ�"Yè5÷¼Ó¿áÏ€½Ñr?Hà€T·Åp/¯!‡�äì<¡„„º<”<æfâO£Z�îñ�_ÀMaÔô¦Èû ¡ÐѨg0OCÚûF�ÇçhOQjÿXG~3ºQ4r„ŒgíEAÝŒ³
÷qhlKÚP¢0´ IÚ÷ÕÜÔDó“©J³—Êg~?¥Mà†ƒœ®ïrãrpkdto+Èì÷F\ûT�òÑ¡|‰ÏøHîwiIn‹�@\÷ßY&·Éisßák¯«Gcï±;=�… Ëæ~1�ÛmK�âŠ7t×L!¬¨o:³s4ix g8³É×^r¿½#Îz„Y… íb÷HQ)?¡=¹ê0R¯µ>óá$mª31¡?„¬L�Ýy Å= $’.nûƒìÎÍ!'Q߇KŽÇX¸£TâmðûŽD¢F9¼ %$žÚL~Ïâ"˜ “{NAî`4Ú­[vþÄê}›CÕð{ZBE%âpþ4”—Ãï¬!úOª}G½Ûþ7zBaoˆ+ó€ìa&¢AäZœ;½o#ùíŽL¤e&ĵ’o>œG"AΰNq²…¥¡°~f,b?K¯ÆW|(÷ Ýèéù-$TP ú×÷BÊ�[5ðjÜ·Ax:Ö0Ì\½�çÙµ H¹Â9‡ËÁ=?´AÕÂ{0lÁR%µÏ=-éÏã ¨Îûï Ïz@¥#Ÿ‰ËÄŸ†PVx²û¾»P´ÈcÈ7zBž[r{Ž'é�§«ž€„¬¿Z´{JöÞ•¥ïþÄݳpK
» …*Ã®ÌØ8›ûFâÆãÁ ›{êoê6y´
«~S®%›"Å!to3mœ×[¸å€x5.Ú\®™ðñ¼RÉç(a¦°‹�„uJç,Ü(…[(
@ÁÚØpùZØ:¤4uDáï8Kç =@'ì°p~œ‡ro\Î|…‹n`è@…=q÷`_SÓ0Ür6œ_¾²@œ!y£Ö)ºa 7– Ò^èJCnmlËÖuºÂ �]˜ñðwÜß‹¼Ìè,k� U 2üo*k9Ÿï†_nï Á»²÷ÉÙê8ë¼Þ‡Í5nîÉ×ÈåvâŽ4�ŸsûX½ž*CÎÀ»›
’ï. Îm¥Í¾éÞJoú ˆF'©¢A”
*| P¦ýw ú…ÑYë÷6ä*¦6A#ꦺX¸76U'ßùà ¥]‹Ç�o<ª^gš�¾™¾®ˆ|·BÒ~ӣج«ßÜ› s$xu)Î<?”øôXä7‚üþ>ìáM©díöbý^QöF^?ìb'y9¾'¢øëÒR÷à¯:qº»�xŽùú¦'E[}ÕO §æ¹Ôà„Qâê…÷ÅíÝ}i¤j/Ôù`ÃÂLÖHð0AO±�F\÷ѹØý}öBKŽÊl:Ö×z9çç¾VBÚ†ÐÐáÖ � gÓ‘„|Ï!�äß8×CÔ
wx8n”|Ünê£ûÊ‚iáºî¸3sþÆqöøæÊ
ã6–pkÃùÎàÆÎO›˜þ}8ÍR› Ú�aYƒí�÷À9š7u“<&ªÝ’œ)Ø{�¤kè5µLÛ’qÚ¤Z¦÷ÍÐ×Ï sÑgz5Îýº ¡ÃЦ´ôMѸñ¸3níPdw�+DcËHÉCïš0>h„oJu¤°J
êD~þdqÜB)KÐ$Cª9íbèÈ¿KAÖW=ŒŒ ‡ŽNíng�Ühµ¸’Ú ç5ÜŒ*±ÏQ4T\7�§Á3ÕU(;C(Å߇r`þ}*9>GáF„ûO%!0¼ÏŒ©÷`.žíuWÒƒ}ŽÖµ¸Ÿ‚Wï RëACný„…�¼ ¼ÎÔ†b$¡Íá¾h~'𢹮ìÎ(�¹î¿+L¿)$·Õ­'¶dd”ýi¼#GpÑ&dóUeÙùð´Ûµ@hª˜•ŽÄÃÐë…ЪÿÎRÝN¤^qbé!•øXƒøÊ¢Íá\)޾ƒö ¯‹ûaiCÎAhCi«„¸¥ZȉñqŠÎm>�5|9ä«|'§MPŠ)~G/ܲÒè /¦'¤Ê~ c°p÷ÑY¥Í)G�o/!�Ém1ŽúÓï´ Åïš q›$Üôèc¹\y¬PkÃÙÏ “[5 ŒÖ1)¾S È]„6D±ý˱æýf„‰TÝG\†™Eç}£(¨ÏÒ\ÃŒ9ª>mD>Êg'½{N!äÿhCœûr8ÿ$(A�Tg ”Bö•E‹çtÑR»�Hï€+¢sÚlq‹‹§‘>æO£¦`ø
ãêÖÒŽqñ§M“3T}„Pîm¨òã³wœ§þ mBv!¿ƒ[hS݃Žìdðï€öfCœû‚0š÷` úÊ…$ưêǵ¸Ï¢9{ý&�éÑnBhƒT@gà!°¹{gBhÈ¿Ü4ôam7é3Ÿñ(ÌûmÀñ^£ªîû(qogÜ” ^´¯m(fΧM©nA’¼æ~Ë‚ݽ \€ü}`äú® ÅýU”>è=‹¾p§ö»3 Ô9ÕPñÊ«mÐ&Ôj.3Æ‹Ÿß“¿OT~á O'ƒã1 Ú”É÷*�Æ’´‹éc9ÝmKYœAD©šÝ= „ýw–ø–‰,pJ‚‚2j8ëÑ�r.8ÆÚ7ØÊÁZñÈ*O ì3L»ð;[دê7ú÷�mâQl%8Æüwú ÞNŠ·!¼à»%œ’°»À)qN}YFþýwØÈ}�'åÁµö Roaƒ8ã“6d†zPüHH:™ízDº€xfCC<ËdtÅ�Ù3FA÷#áKV ë*ìH¤þ;ß² =ã^]� >Pš€‰ï!0Ã��J›=¼¯<’B› CËg ul@ØÌuà"·)'Œi‡ÁÃ{Æó([X8³Öiuÿ5ò×{°TWh�á}ˆDú¼ÆSîL aG"önÕ ÁWC¡dϤ)ë’ü0nÂKù’°�òà¬Ê²áÀpkp#Èw¤­K§ Õ¸‚ÕÉ~ä–ôà äFiîÐ’!N�£°¸Â�Šów
ü�¤€,a†lÜÑý,�ÙübqtŸ‰èï8›¡PÌ9¥ñwܪÙÐ` £3‘†ëãFy3?Ͷùrf6å˜;ׯ9‚ŵ-g¸±ÀÅ Þ¢m]ù½ÁN÷³q§˜ÏëV˜¹ñg?ëaé8cšÅ¼TQ ·Ps\—  Öé&�3X�(Ù{´ñwükﺆÑ!^¿è ¡ŠY�¹¿ÿŽ ëVH8Kàâ¤](Fï}[_¹pwvŒ�½Ó&h…TvÂ~{&œf¨ì¸Ê(OKvâ�,µÏ룧Œ™ŽªÔa•à 'Ó1”}9È.ôy€Âgð÷¢øüb‰4¾»Èe†7MÑòÈÕ A°ú|tfÊ®$äó´=x ©Uî?70¿ÓphÃ,§sœ 'V°„¨oî§ðžB´ïH|—rÄõÓ?e޵ Ñ•úŠ PèúH˜hˆÿ‡65D8ÈL
1JÔ‰Â>
Ÿ¶y͆Âü£'¬–Ðëá
3¤Õw1�ô>ˆ€ûW ’Ûž6†¨r&Æg¡*Û~÷—Ÿ%è09[˜§%µ†„L±sg’•Ö„ï|T V%¦]¡¶`…xFÈîš'ì÷SÀ™sÖxi¥…ý¤<E°ˆÑa
žzôB¤$xu¯.ÔÜ*h7…så WŽåz|[$ÜKZ½6ßšdõ¥«fQ¸Ó‚xVfAªØsòA‚îq¹–9Ì� !5ßß.:��À9-77q?™�1=ÒèÃ7…�lXÒ´Ãm—Äê…ƒ›ì*ì†0¯I cMÖGˆÿP-Dº@\Y‘¢]ðáÃç {HˆÜµËðÐ=vûàžŽài¼™‰>¯[¡ïÊ7vˆŸ÷¼9“ŒD„Ë3i
±P²ÀÂŽkÏ3, ¤gQ�ý�3ø É¡T<§¸€N äˆàA‡Æ�ðzÚ�î§eÜ�ûEÁÇPKáÝßÊ”n‡Ä*‚]Eý¹°‚Ë|>Hðü”¹{§9þ}ö6Dz۰8U]i¨àP ží‚CÑ×.ÀàçÃ1ø!ÜAÃÜ¡f]°Ökòç <Ô/‡Þ“óìhs
Èâ«N£kÎæ°‹Õ©¿|Üê¼Ë•,Ï8(Ôk ûuMYÍ´¡>Ÿ�A· ë²»2\¡’[¸g±¹ÕÉ'�ÜŠÙíg õšÒ…«kxU
ö¸Å‚´¢?mØÝÞ¡Íå1q’(ÂÓB^5mª{*))~j6ijþ@(7ë=o�þ×n:R´àÃÓH;ãF)=O) y¸�’«gÉ5ij@v?iAP§Ó1€¹è9wÈNCÁƒž¶�z›¢ f¹·A¼ÉÇ Ñ 0Ö•Ü>`{[�ÓXQ®õø)”mŠjxßÈËÑý­öÔ@òy@È5¬`Šm¸]…þ"ïÁJelE†¶Uäð»3!+ÊÖ…6ÕÏÓ:°ä¼oÐGÝM›°_ƒ�^î= h峊Zrn¿qÈn»�¦QÈg†‰nZŽ ƒzMµ _YT>sRˆ}XYH°†y@PÑo‡µ'÷[V¸l ñF�Íí�à§ ¹È4öÕ¿ÂHŸU î»åi�3×�4:ä¹ú—éUk·Üàwt�´‡LÜvÕ>À¨™<§ „`�Î7²�=?«Â1s®nCÜzYS†P›ˆ6Ü2¼oCuWEƒÈ#ì PýiLÿ
0É‚åÀú ç6•Ïœ%Z!oz|’7âMÞ7hª~nãô!O;ÂúÁŸé<.RlzÏÒ!ÙÊû†¸É�ý_<-0ã�FåºëOCAË{@Ž�GÔ@ ,�PѼB«qÖ8Qí…ÂÂ7Eè!Øbó¼†u†2í«í&Ïì¦MÐs@êw„÷qÑT£Š§QhΟOÈíÄþœ“EzVЯ9�u~ö[Èæ±Ð†x%Èéœ,�Zü žñ8û;SÀO™–Äèóš¿ß+oam·ôïÛÒE–ʵÑyB ½çò€,ákS»*œ îÙæi¡:ÞÀsYÃLÚp;\Æ+Ü1Јr¯.âÆ¡2*HìuªaYqy‡UÏ.�5™©a†à‚ôY…sÒù.µI}Õ#Öì~rdœK°Gá̹* ÒÓTîÓý¾Çë)M~÷Þ7²ƒíÒYn Bál 
’ÚÀò…ÿæYu�B¶dEÊÚÙ »+[UÊ…ºª*>¢Kð†Óæv¦E¥îfø� 5Ñ Ý/ßÉAÜ·^·>dù€`^êûÀ
óŒ
ž„\ߺQ×Ê÷^ê�„ûˆçV´›Â‰ü;œ$ÁA½×Õ;*7�.ƒþ–„}Ü %‡/—ÀnLY­;•&|ïd™ú—C/'XiTX ñÞíÎÉ¢§G¤+UÙÂY�ÞSð9ì” ½&òàvYm^ï£î”ïõ+ìSˆÑmo3_ÎÅ©('¹z!HZÛ­ò™¯rõƒ…V Ñ’ÉmŠ£Ã Ð÷AëÈU+™I®oYáW9³$Ô:)žõW� ÷�»¦Ÿ§ÜJœK]Q[òˆ uAýw¸úYrpÑJm¨Mž*¹A'D ÜÛÌIŽ,½Gÿ+Š¥aï…Ýv>˜J®[TϾ÷XNC‚ßåìÏÓÏ9n§›¯Ó3)¶‘�ÏŽ­cìx© HèÁTø*ºËa-œ©®"m;°žÑŸ‰Ã1!Õg ¢àç;“úM  ª²…å‰=yßZ²H@Žà-‚³ç<¡zudåëÓȰqŽ&mvÏn9\]ä g=ʵ®&‡èdPÙƒµ~Å;ÓEj·ÏDª˜<Eï�X¯¤˜’NJ€{ä»â¿g=º_o¤ @þåÐÚóýíBÇíÑVÆ×ÂMhÈ÷ÄV:#µ)á}àü8K‘ŸÍ³‰üÊ7Ù’þM©‰ÎFÊ„û6^ž�[A—»Ç-ÜÑoL¾0n¨(ûî'ܪ#{¦6i_ßßð 佦^Mˆ± eãÙ*µtÄØu&’—ìøÒ—`Õ4A÷¥¡ ä|òŠNV¸"%àú|�¬ðµËª9TÒ�9B4ÇÇש¯tƒÕYæ+!KçJ)¸Øúp …ïî¤ý…[z9Î>ãwJ˜£�Õâg Áê`¡Ôn÷¼�Jp7Ü5aµn©"t¦leV‡Õˆ¶J°¸*¤dÿrTóz9wx°-+éànEãrN½& í³
öLX�¨ºË·¡suk].ÏEÁ]£ó—LˆÂUä¸l÷”·ñØ;μè!¿Ã�“í.T)¦Ø“!W¹àæY¯Ëžt K¡šªÅ³z‚#sþ·}÷C!øC¾Mï*‰ðÿì¥oHABÍÓ§5Á+­ €|‡�œèä× Hiv6qª[D2û…|•œLÂã‰Zð¿ƒ!·…ÄA¨¤ŠRfü@­hfˆŒExÙ(nYÛ”�FqÑn®|r—��Ä5�Ì¿ƒÏòZÙÊÛkôÌÛ÷‘7%Vßa�J߯ã"Úg3
ÂØfï �‹jƒy‚Gt)O!ómäT èŠXvÜpȈ·ì ["S¦çMI4ìl$äKæ°Ýš�oèì+pU åÎ"ßÓzà3Æ4¿~›’y½u³jØw©ÿcÖíc(æqÙW�¨±|g¸å›¶ÊH(WÈiÉüb«’Ù‹l{’ù¸æ ÍË¡ÎjÑ–;soE jþím¶A¯äˆI�"m:s *øH2¯ò¶¦Óæ(>ò ŠóòÛ4Íðg§ Ûq̨ BÆMÑõ"/U3FQDãDÿáøúçož>¼zùáþþÍ7ožüç§/ÿUß½}þÝ›oþòðúÛ¯®‡7ß?½zøÝù­o¾ùþéÏç«·_ðïx÷ôøï‘ï~úþ øûß>¼yxýº>=¼ø| Ó¾ùæå«ïïÇ>>öõžþôës?ÿ‹'ýëËÇþË_ŸõâñíóãÓ~z÷ÓûO¿öóÓÃûzû’?ù¹þsùÉ7ß¼zûü‡Wo¾üýÃOß÷¥ÕÛ‡§_þôÓÛ—ÿí/Oí�_ÿ:<?óüãã›Ç6>xxû§ßýüiŒßþþ_¿ûŠÿõøðáùøðêáÛ¯þíÇß_ÿµµþù›¯Ÿ¾{ÑšýñáýûW[}ÿ§þÛ¯^¿úÓ�Ï}köÌÿzùðôç�ÿãû? Ÿ±á#ÆÿjØÇÿñð¢½,ÿúó´ðé?ùWŸÿã׿�_þ6þú·éËߦ_ÿ6ùÛüëß–/[Úß~üåýãÓëWoÿüíWýÏö÷Þ½~ýîçÇ—ÿø+þ›?}Ÿ¿ùðøüÌËø‡ÿ PK‡Nâ@x™óÔm
word/header1.xmlµVMoã6½è t—%ÙNl qYÅ ‹`³½åBS´ÅF" ’¶ ´‡¢h-zî¥=í¥@¯=íŸÙdÿF‡Ô‡íj‘ÍnÐCä15óæÍ çÅÏnŠ­©ÒLð©õBQNDÊørê}ñêÄ{HÌSœ N§Þ-ÕÞ³ÃÏ?;(ã,U¢¹ŽKI¦^fŒŒƒ@“ŒX÷
F”ÐbazD�X,¡A)TôÃ(t–T‚P­!U‚ùk¯†+ºhBR¹BØèžPË Àêz%}@—ذ9Ë™¹ìp¿�So¥x\ò[B6$®ÕM„êTñž¼Uä± «‚rã2ŠæÀAp�1¹)ãSѠĬ¡´~¨ˆu‘7~¥Œ†�|mÉ�™Á±Â%ŒbØ�{O3Ò*¨È«>Øùn¦ú_Ä(|¨˜z"¢åð
»9&f¼…ù´Öl57Úë0y°·}w¿·$lÓSäT‰•lë‘ìihgüºÅ²KýÌÂýNiú£:»™aI[:R'+mDqŒ nq˲ì•R÷¯…dkû¢A¯6A*H|¶äBáyµ•ѕѲ â‚lI÷¸PîãÒÜæ•ñçSoâ‡xT/�G}ÁÁYÆŒçŒS”2m^M=PJk=o­óÖzi-Bo ˆ"7 ­“qòä!r;õƒþhÚ|€K J̬ràcÜôì¹}Vž© 
±Ð"q\@�w¿üýîûï�=H©&3‹¯’äröâò*ôßþõëý�oÞ½ùùþ‡¯ý»o¿ûéÏ·ÿüvÿÍWçb)üù—= ;_¡“ëS…eÆÈ‰hÛ/·NιֵHo¦Ó(þ‡å¡ZJ.’ ó%=ÒʆRª¶Ëø¡üOͺUнZh¥º;ôá$#f¥(̬þjZ`µ—õñíØEãë Ó­ ¡ÿ× !«ít� Û*ª¹vç‚Ú#¥D™QœÂ®WãÚE ì×�æ9“',Ïmß­�TL‹9…›«ÎÒˆcØ�smj«ÈWýñQNúÏýd/Lüa8šùG“áÈ…3Ø—á8J¢äµ�ކñJS ŽócÉšÛñX¡¯·ºú)RÝJ§nÏG ”`CL[„åªy ×6l£¨!™5Pk}Îí טM/l›´“ß,Ta#áÿy€E]p\ÞZ3&ƒ~ÔhÆp¼?p˲‰–J›S*
d h.PsÍÅkè-�2�‹MÆ…Š#Ÿó�p´'ŽpEÑ™ÀØ�Ô2`wgû;Ø­0Z;nõl¸ËVMÝ~,þ PK‡Nâ@½´Z×word/footer1.xmlÕ–Moâ0†ï+í°|\‰„°mUE Šz [zÛ‹q É6þ�mⲿ~í|AD)å²bÏ3ï;“±rsûJ3�©RÎ"x]Ã<NÙ*‚Ïó»Î5J#£Œ3Á Qð¶ÿýÛ� —ZÍThŽ`¢µ}_á„P¤<šbÉ_jsêóå2ÅÄ7\Æ~¯t‹•�¥lª!b9R°ÂÑ6� Âl®%—iåq¹ò)’/kѱt�tºH³To,»{Ucx×’…• N#È…„¥ êQGÈ–‹=yËÈÇkJ˜.2ú’dVg*IÅÖÆ©4k1©%å‡Lä4«Ï\´ò5–�éÁH"c[±¶p{Š—A4+ëàú»íê{bÐ=d¦êˆC4Ž‘ð6g­„¢”5˜ÓJ³SÜಥä`m{Åû½vš¾2 É×¢ñ#Ò¯ÑîÙKÃrCý eÝ«–5õ)@kög ¤‘#Ôp­4§#¤QÃ5ÆxF(³ê"Ù™¾à§oÿÚA@qx¿b\¢Ef½™à˜à¸�}{m‰âçQ�™Þd˜0GY¯¡ï6ÿàzÛ'Òíú6® )âd¹^çCUž¨v—Y<L�´�j5ß+dAVö•¬Nº<“R¦´œ“Wí.ÆP „-GH¢ˆÌ ì?&c~ÿë5ÅÅr:~šŒï~=Ms'º!ÊŒEî ("�DšãÁ„b«ºŽ“Îð¡+3ë~àôé3è",®ÙïËú‘ˆýu>8—¶ó7ýáyêú>ûß;Wqß4ÞMhñ2ÙÏ’þ?PK
‡Nâ@ word/theme/PK‡Nâ@Ô_ãË •word/theme/theme1.xmlíYMoG¾Wêíb'vˆ#;6i!ņŠãx=Þ2»³š'ø†àˆT©*­8©ê¥‡ª-H­TúgJE©Ä_è;3»ë�xÝ$QÔE‰wö™÷û}æÃç/ÜŠÚ#BR7½êÙŠ‡Hìó!�ƒ¦w­ß=³â!©p<ČǤéMˆô.¬}øÁy¼ªBóc¹Š›^¨T²º° }Æò,OH ïF\DXÁ£†ïƒÜˆ-,V*Ë ¦±‡b�Ø«£õ zöó//¾yðÛí{ðë­e:: ÅJꟉžÖ@œ‰;Ü­j„œÈ6h³¦ê†|¿On)1,¼hzóã-¬�_À«é$¦æÌ-Ì뚟t^:a¸»htŠ`�+­vk�s¹|`j×étÚ�j.ϰ֖¢ÌZw¥ÚÊd@öã¬ìv¥^©¹ø‚ü¥›­V«ÞHm±B È~¬ÍàW*˵õEo@_ŸÁ×Zëíö²ƒ7 ‹_žÁwÏ5–k.Þ€BFãÝ´Nh·›JÏ!#Î6Ká+_©¤ð)
ª!¯.­bÄc5¯Ö"|“‹.4�aEc¤& aй�£� X+À«ÞØ!_Î i]Hú‚&ªé}œ`hŒ©¼WO¿õô1:¸óäàÎOwïÜùÑ
rfmâ8(Îzùíg=¼�þ|üõËû_”ãeÿû÷žýúy9ÚgjÎó/ýñäÑóŸ¾øî~ |]àAÞ§‘è
ÙG;<ÇLT\ËÉ@œlF?Ä´8c=$ޱÖR"¿£B}e‚YšÇŽq#x]}”/Žo:÷B1V´Dó¥0r€[œ³¥Q¸¤uÂÜÇA¹r1.âv0Þ+ÓÝÆ±“ßÎ8ÞÌÊÒq¼ÇÌm†c……ô;¾KH‰w7(uâºE}Á%)tƒ¢¦¥!éÓ�SMÓI›4‚¼LÊ|†|;±ÙºŽZœ•y½Aö\$tf%Æ÷ sÂx�ŽÊDöqÄŠ¿ŒUXfdo"ü"®#d: Œ£Î�HY6çª I¿„�±JÓ¾Å&‘‹Šî–ɼŒ9/"7øn;ÄQR†íÑ8,b?’»P¢msUßân‡ègÈŽç¦û:%Nº�fƒk4pLšˆ~3%¹¼H¸S¿½ ab¨HÝáêˆÆÿDÜŒs[ §GÜ@•Ï¿zXb÷»JÙë°z•õÌæ!¢ž‡;LÏm.†ôÝgç <Ž· 4Äìõžœß“³÷Ÿ'çyý|ú”<ea h½±m³íŽæîºG”±žš0rYš�·„µgØ…A=Ï<I~
KBø¨;8¸@`3 ®>¡*ì…8�M{ÕÓB™Š$J¸„â.•­ñ°ñWö¨YׇË«->´ÃKz8;käbŒU�9ÐfŠ–´€ã*[:—
ß^GYUulmUcš!EG[î²±9”CÈs×`0�&ljl… ÊËpôתᰃê¸Ûei1Y8ÍÉIš#í÷lŽª&IY­Ì8¢ý°Å ŽGD­ ­¡Å¾�¶ã$©¨®6G]–½7ÉRVÁÓ,�´ÃíÈâbs²í7½F}±î!'Moçdø%�u©÷‘˜pçä+aËþÈf6]>Íf#sÌm‚*\}ظÏ8ìð@"¤ÚÀ2´¥a^¥%Àb­ÉÚ¿X‡°ž–%lt<+–V þ5+ ŽnjÉhD|ULvaDÇÎ>¦TÊÇŠˆ^8ÜG6;Ò¯KüR ׆ôÜÍéh›W.9§MW¼38;ŽYâ”nu‹f�lá†�rÌSÁ<ð­ÔvãÜÉ]1-J®ËøæŠ^Oàöai¨3àà ±ÀHwJÓãB…X( ©ß°q0ÜÕ÷»ðŠ
î©ÍAöôÛsV†ik8Dª Aa=R¡ dhÉTߪéÚeE²T�©¨‚¹2±fÈa}Í�Ëzm÷P¥nØ$¥ƒ;\îsÚAƒ@orŠýæ0Y¾öÚxÛ;ÛÌà”ËÃfC“Å?71ßLWU;ßLÏÖÞ¢#úÅt›U˺”–‚FÚö¯i —ZËX3/Ö3ã ‹³Ã`¾!Jà é?°þQá3bÊX/¨}¾ÜŠàË - ʪúŒÝx M�vp';h‹I‹²¡M·N:jÙb}Ê;Ý\ï¡`kËŽ“ï;ßœ¹êœ^<Í`§vbmÇæ†2{¸Eah”dLbÌ·eÅo²øà&$z¾33%­lZûPK‡Nâ@Æ*:ˆ
/Økword/document.xmlí}ÝsÛF¶çûVíÿ€âÃÖ>ÜXà—>xGº%QRƵ¾)—�ÌÝyJ�%ñ†"¸ dÙy’“8–lËòÄŽ�ÄNbÏØ‰7eKžÇv$9ú_6(=å_ØÓ݈&Ah(uÆc“ €>}ú|õïœîþÓ¿]\ªJJ½,WÇÉSbB(U‹ò\¹º0žøàýÙwFB]•ªsRE®–Æ—JõÄ¿Mü÷ÿö§•Üœ\\^*UU^Q­çVjÅñÄ¢ªÖrCCõâbiIªŸZ*¹.Ï«§ŠòÒ�<?_.–†Vden(%&Eü©¦ÈÅR½íå¥ê©ž0^·Ôù6¹VªB[ó²²$©õS²²0´$)-×Þ�·×$µ\(WÊê%x·8l¾FO,+ÕœAÐ;Aè‘!ÈøÇ|Béè…C»äÉiƒ¸Å!¥Täj}±\kuƒõmÐÅE“¤ n�¸°T1ï[©%3íY]ö2ÓŠ´CÑzaÇë˜1GZª> ñm�jû½¼�~ƒùÞ%©\µcë¨�UIÑ�©†d BZMf;hwåm
Ë·­É¨TyW‘—k9µr°·�®~d½ i¶ÊÄᎮÕ}½ C÷Ï/Jµ’EN­ž_®«òÒ´¤JÖ{WVVN­Ôê§ŠUÃ�Ø´/™‚ŸZ%„¥bîôBUV¤Bú¶’Ì+ɬ€$1¶« Ï]BÿÖð_güÏyõR¥$¬ä.H•ñD*1„.ªR¡nükþR)Í« øR“¡ÓṴ̀ˆîjÝúŸEêNòc µ7‘m­¶î.‚--)ÆËºÞ_s¢2ò—¬ä0‹Â)eV®ªuèåb¹ªŽ'JR]�¬—%ƒtã&uB_¿­m¼Ðììßjî¾Ä<ÂL ïÂl�hþ¼ÛÜýÞé7�5ï<Õ×^;½r]ûüõ5˜i2T6êú~É_Ÿ{õ›?Rý2J�hþø7ýÚê{kÚ�{��gì­;Ýç¯=ýÁúá×·œÞ£NhWži›o¨ß(c�^Éù•T~?1a™ÎÏàüT l»
bá;e”“¦ï(TþŒäÊx¢jð—jàŠ¤eUF†¾*§«s7Ì]Ćÿ>ñÄæøn¹·bׄ‚å
xË•\Q®È¯âwÂ×úÇ㉠º^¯IEh {¦•rX¬Ïd1ëÓJya‘¹érµ^ž+ý™µmòø_ØGî¼P±³¿P9#]’—QoZ9_V­±Ì—*•—ˆ+ÁcE�»5¬ÆhÀ¯I&Wæë¬ß-ŽwyÞäi—Ê-bÈWKNßUÊsHšàß¼\�ÖÑkFÄ éF°ËYç—àË„³y•° )ÐÌECìÌæ²îOÃC—uK~@<ã'̘̆�¦òç’ÝÎd“ØÜ.ž[F¡¿¤žAñ)M$ƒæ3E,uEC1І�ƚЩ’&+å…*\Çæ—ŠÓUãö‰„ÑF[ùúÇæs)¬d@þþ5B"oJ\"k˜´¸¾:7Ñ\_Ó<sÂP×�.ËŽë÷žèèYb0óãÜñÆÛ«WØF<ëà}FÔµÇWõŸŸžÄŽo~Òxs³±³Ó½ïHÛ‰‡å~–…ãS²ŸM�%‘ ÍÏbEÜ ö¦ý"<f:õ‰$¥rJ<%R¿ð !P ¹�11“�I/JÕ…ºTe#©Ó‘„À%ýÞÃ(¨1â@ˆ �ÜJ:ÜJ:ÎÍ‘À*–É&_­¬i„Úf#d%ië Ýc�Ÿgìó"¢e)2³™dœL1·{H¤-¦!/ŽÂpÆÄMbe÷Z>Ý.õïîÑ‘7:¼¾õ�Ç4<¦IXé¶t�;ÂeLãMp–‹äaŒžrÝæ™BÆü(Ϟز´\·Íœ¨WŸëƒx}÷ÛÝŠ81X÷ÛF²Ñ@°[ü0týC
‡jð›Q Šcõ‚b¥œkÒBɘrÁOðÉ+ãû�S¥FF¥Quy‰üZ®\@E8OmTÿÀo§Q•¾–4^n<€ Ms÷Çæ�_´¯éÄš¤—KŽÞgÂ`úí HN:@¸f§œú“6è³Så¯Y«ÚÚ½ƒGt?L~】<{l/àÂlÂãeŒeG:CN|ƒU•L¦ò©ÐƱ­Í £áj«&J¡¢órRq¸<š6Ä”.=Êf ɦ.§ÆD�ÅDH c4põ+ÀƼË–XS@µx‚k«@ç©þ×-cX¬”$ñË(£ñèÂ|¹KDqDÌ›VTþE"†Ûg‰ÄJyN^ÉCÁ¼"W°Z8•àZvÓ2®R½X†ÍçëÍ�},“Pi¿`–ÝÛ¯aI‚¶u½ñö6ѵn±�¯ãq?¡{ØÌâÿÈm•«¼Éè°­nÉPÅúÇyTó�Nák¦¹GvÕæFzlxÇ uägBÛÙÔ6éÅÄ—`éÂ.ĆL¥³Ž~#�¬–+ƘUÉ.f†ÍÔ Šªµ­b0ù<öÊgEt±d/ýÃQ (¶y `³¤²žë_ŽÑÕqý‹­gGÎ�Läš{wÙ\ Šð¹&blr Œµ6ÿ¹«}w�Åý¡y4W>®|ÆD�ÏýZ rzNl‘û;Üýê`ëqóÚ+}õ2ƒ
bÌŠ« WA®‚Ö‚d?ØRÁƒí—úW7»+šv­zd(8 sÁv°,±ð[“×�\+îx2—Ê„·µ¿Úo|7ª�›Âx Dƒ¿ƒ‰ñFÕdVX
Ñ}ºŽze]´–ú3�OfeÃÃqU¼µ–Ö~墒/àðQ¤D¢êR—s3g&ÿúáÙs§ß{æ\wg ·:çB|b±––Ø]’u‘«Vo¹Dîkr^’¥Q*‹¯ñ‡œZªÁõŲ½1KHD%`ÇÐÙh{«Ú•ŸY¼Œ?È“k�Q†g+1äZã°·%LÃéZ‰Ê M{óæðÞs­ñ‰Rr­ñ¥5|Z°Œ-J�±v©…Âg}çl¨ª­½êå~К#Ž„ææiqÄHL{¢Ÿ#Žh;íÁ©*�ÒÖ°ì°ÁGc¿ÜH zîšcìš Ä1ÏÐr°1J­im�Ú¹p�ƒ�G6²¸6’Õ‘x®/öEJ‹,+™¢ Ëôë‡w¶X¼ ¹Ö Ã‚zVGˆþÍ€I´†ƒ�QÆf|FãÍÙ¼�2öð8_´vU9¾út_µÎñEŽ/’l”:‘bñÆþ–¨óÔOý¡Z�A/ÐlU4ž™™fP0FÄrÀ$Ö€ ‹Ÿá#‡JN,T«í;ñÙŒ±›¯Ïê¶¥¯fÄ1iµ†Œ1›—·›[ÿ䥌iðÅÓæÆ–&Dèx>8‚šãhfø0ÖSÀ4fÂK£ÄL¸_ޱ_&¥Œ5~8ûÁ_O¿Ç <pŒRy¸·9vÞ†Žp䀣Š��•Z¨ ÿmnÏA¶-7RÇf‘E’W4r­9±ZÃ+ãˆð‰MŒ'6Úã mãÅÁ£'Ú•u;rØíW‰×jŒ'8ì¼8Ê�§Žá¢ƒ rÂaÇ(‘î�cì�[°ã¹™÷þ÷éÉ÷ÞeÐŽ<F©?yŒ5òÈâp8òÈ1”‹¡ðRÇ8b(ÜËÄÚËÀÆ�|-µ¬Ì•”:JKÄ¥@˜Ïmb<·iììhŸnräQ” ï<È 9òh;0œ#�hy™‰<ü­FÈ2 'yŒ9áÞ9ÆÞ™ �ÉÔ_><7sþ/ ºÃQÇ(u‡Ïc=dq6uä¨#Gy½cŒðîebíeÞaËøæ�Q†e|Jã) Lfûß6¿üº»Úð}ù¾�<ýGâð¨vì>†U�ÃÝ-
Z�ï¸R‡c‹ÜŸÌ�Ç…‹K•\½&K㉚Rª—” ¥}<õ‡I�A¥8ä¥JñÉ`¬'ƒ,>ˆCŽrä�#‡9ä(+fßÓ‘ïéˆAÔfkwŒ1îèrBµËIŠäP$‡"9ù±˜ô>¤•9Ž0à&ŠŒ7á¾9ƾ™”9æ§øÕq[»ÃáÆXÃ�,~†Ã�näp#‡9ÜÈáFo³ýÞÃ?öÖÞnÃëÃ{ÏÿØ[g™ÞŒ‰Y„è©—j�qž»(+L�š Ê5sžÅOÈä'd—2›ÿ¸ %�ú�ËÍÝawGíë§ÿblò¸º hW~î®O‰þ)TC`ûaøËŽóê¥JÉT™4Ò(u]äãRuB¿½Ñxû@¿qµ±ûØ�$£qعçÉ¥./Ö¶Õvî‹Kò\a¹~¸úÍÁÖ¶¶±y°µõÇÞ�ƒí~¼üû굃ý[ÍÝ—ú·ûö¶_ê_ÝÔï^Õýã÷ÕëÎ$BÓ4—z²j#5ó´+¯ooÛÉÕ~ø¤ñæú{ß8ŠÙˆþR'fg…ÙA’)a,+ˆIô'%
Óô&`;¾_*D·^ápibhˆjØxÚ;;e–È:½J�Á18ý⯠›×¢ß}‡ã R味³æZeHL�ó€öxÈi@R‚˜¦“hpЬœ5võ45¶“àž,7ë¡ Iæ¡ñDåY—a÷@ õxMO¤��MÕìP$"Y@ú‚ÿ"zÔ¡wAÌ#i!9h˜Mñë9špØ8ó(Q�àË<hO—~�
â¨0æ'ݯ~§¡ßö]�©¡ò,v0÷>)
ðg$/$Çœ¨PL«Ã¥~XÛ 0;a‹¹þ,/3ÓÀ9ÁŸaúÜocèbÄ´,bZ犓¨dÌͼ²K$œsVÎŒ(�?©¸áØ2+ ¡1¸1Ÿ1�2+WÕ:øØÅrUO˜;¸ѱS\Ѐ�ŠüAV!><îZ3‰LiÅÀÎ2%Š(Àœ‚“Þ™ÓE{�ëŃCvãÝ÷0p íº"E´S%‰föhÚTØ{ŒÖ÷ð¤„)3‡Åó{;ÝS?eö€ž‚:W ñܽ‰“ï­²DÅ •a
¢bG©Œ‘«9˜îe#ºÛÖQa
‚鸳+’œ™iàm§ �;Ó"‰Á™™1øähü™r Þ‹]´ó!„x bpÆ]<#‹Á�‚çÀðéXñ¼=wcJ{ î@·E€èë¬�G�èÅ—.¡9sàe�À1ƒÞèë!GPQè‚KpŽ~A·Ó¢�=òùš~B˜dãÌ»Œ¯fúF¿üw„]­½ÐÖ¾Õ~¼Þ¼öJ_½ S²ž«…œ°Ñ®¼jìÞ%i‘î�ã8Å‘= F-;RVú͵µWÍoWõÕ]’½j~ó™¢CÞ¦SzHIðìàåÓÆ›kP}ØØ}ÝØ�ì Â÷­‰¬ÖÃK:YO^‚~êx�@t¯óEÎ|ˆF}1ÕÙXŒqVwç‡�‘°'Œºá”Ö’pÕù…mïgê#Ìð)޲àfÎm†Òs ÔÑKP=7âZûR¤¡º¼DæøåÊ…Š™˜­ßNÏ™×’€d<€°Áv¾$a¢¹;Õ?lì=Ô?û¾—ö:�s½+¹By®lÒgÐÜ›�•\Eª.˜�•ªï|pf˜8ÙxâãÅwòï¹ÀeQ4�Œá¤ÇOOlýÖ|»¥m^Ó>Ò®~îšC5‡Á ý›+ÍKË•ŒgLû­m~r°ú©‘|þäð§Ç�7;ÐeíÁSmãËÆ›Ÿ,ÆèŸ^Ñ>ÿ’Êû÷�Õ]ƒÚ•'„KúÓGÚÞ&XK“Èp~ùBߨ2¹ùõmíõ–þËõƒí/á×ÃÕUíêŽýéßW?¡Ô½·e,]ñ¦GXïൖâ/!î�žü´8ÑËa·³.
MômØüÛ¤ìD0{ßèß|¢ß{¥]~ ?ÿ;
úµ' ˜�Ý'�ßö!\0ýÖÍæîsSŠï“rå†i›ÁƒaTþæÅj²³æ?‹¦ ñ¼¶a.Ç’Ìâÿ�3š/W Fyz ý/ζÛ9²!Ñ¥÷žÃ¦60U´Ìβ±ÔÌ™>€sY‰óëB‘ª'S¬­Qy—¼˜3Ó¸†t±´TÊËY�óq‹h�ŠÌy¥n%™É©¥‹ê,ˆ¤|à[]®”çl_‹¸‰Š" ñÁ ¶††ÚžÀß[ï jæ.ügæ>Å�Võ“v�¬ÈL\ŸIT*ß^w€¼V{òŽÝ¶yñ«.Ý5Ïl&V æϫxšÄàŠ) h<&ÀN´ûv¬ j‡_îk;?ü±wŸ25\*ˆç ¤" Ý˜ÈŠ�}HEÆ šó‰P\ÃÝ|x$×…Î
×cñÂŒ?�Ý”eé“ù‰†yÕáO7¸Èt)s™°\=ödw^µÛ—~80j6Û©óÕô›(ÄÇå.P�¡pâLºRý8ˆSßhÌ<
¬¯\E;ÂÆ"šÝ¡�ùEI©ßçËJ]=S®Â²Aü»õݺ ×Î1;%G}ˆ¿ý6�䎀Ý�hÞÿâô4\9 ‰‡ŽR�V�xÏ“®š™kLXÈHHZ;ÙWXxIX(Ý£3¬>œ)K“h)×þUk!šöÅ €'o7 „NÛüÛáêeC„’Œáéi‚â‚I–ƒéwÕ߀ó­—éÏÿ�N+~ýÖÛi·nj/>oCúIãúæÚæ?ô›O ×l= T`èQgQ¤¯Ým¼ù/¸¹¹ûµu'!Ó.^„dù ym@*sývhDâ�BhookëÍõ5”öÅ™ S9´ÍŸ>}{øÅZEØ–Á�/ÂŽßlh›ÛÀÒÆH¤´’'Ú­43�iæp¡�¯D©[KÉÆ¯×a\ôëwô›ëÚç0ð”¶ùCãͪý�dð u)ò‚ö Š)íª¶Ë¦NÕËÕ…J‰œÐ~
!$–­ÚÖ�”ÅZÃ�Ÿ�sÍû/�I¤ÇIò«•€"ým¼ÝoÞ�Lùüp+0Ê`‚u+HäáÕ íÖ6,âÔ6ë¬"V>{ƒgÝFÞhf¬(ãçX¿ÝÎ0a¿M3ØZ¿M`åÚô”ðàeü¶î©ƒ�6ôÏÖ4B»,Z`ë]Æ(Zº*çbya±ÿ·Ž�®ÊUvu¦?ë±§È.ààœ0þ—ê„(Žˆù>Y¤7ÎtUWšüŠQ×AfY&òY!534D̨a%ÉÝüRõªWù
²zYÇÂÝŒ\èÒ¥ûHÌQ
ìWF»3%Ÿ†K¦Y±e¢ãä~).PÆÔó†ë|É.=ë…í°•«+ Id%cŸ�€¥�HÅü[æˆAÐ�³¦G(B¢@nÈ´æö½³Î#Ùbã5””yô¡kŽ$,½3†}¢t²ßa§æ)»ìפx\ZÌü6�4P÷ï;Kyô ÔBWßÂÔaî˜:ó<Æ+Ç;K{ÉVÙ³P?S‡ÍÑm °IüS“1ÒlÔ) …¼½ìg&ÝÚT?ÓùlÝ!&º¼`dXL‹ÆÞ\Æ p½���J¹Š)©¥JiÁÜ0Y#7Y´w¯1òeÚ£eAÌ
£³ôüËIí�J¶Ù”÷DŠR»õöá^¼ª(H†!°¿Îz4÷îj›¯ÃóæVx–›q<Z,z'.â’�!ÝÈÁà¸;¸‹Àv¼II’@V„d9>8?õÿVïdF³ö´Šþí€è;-¤øô´õmë»æúÿÕîÿ›~ýYc÷|†ÀÃxgZƒ4MÀò4wŸ£­7¯ŒúðÓ·�6€jtø
O,tš´¹ñ³�d¯Ý%ÏÁލ˜m¾Ñ jlÉ£ïJÿV–”Îz¶ª° ²ºˆü†¥\.KýÐÁJfJ!…6¡+­D�yͯF3DRтđHS»=srKA‡ÅÊH�'†ÓŽ9j"ÈØðñ*K+̺Æ�’„v*¢<ƒ�Dá(H3K飓º1‘•ØÈhrN)©”�N ™ ,º†‡…§Ã̪j²´+¨žP•ØTµÔÁß"’>lœìZ—ÑÄ7²Š^ŸÙ‰¬ól  w´ûß‘�,£z…­>I2ØÿauÎ1ù¾iìoALGFÜC¾Œ[²å³—ùK¼F»T‚ÑÖ~Ý׿x®=x¡}»Ê5[�¬;? Þ%^c-"Í6€|>ÌÇw˜m ¿÷aÞÚDÃ@6[‹ÿ½6Ì$Ø×â™0F]*BjQ_½ÌG�ì‹DïSh ªY͘©yçŸb’„Q0–bÄé6︃‹lÆ‹°pI”ˆ°Áœ"­@-àdµ\¹
™—’0W®«ïãÅèÓ”õéÌx"™Ì èßrÎúІåã°ð\(^„Ë#p×oT¼4žH¥F‡ ´§–+ÍÏ—Šê ¹v4€W‘e°r},›‚G
FºÈ™“‹g¡  TB¨JK°à`ÍæúU�,o¯åŠï]xW‘j‹å⬿£Y¹”ƒü–uåŒ\ü¨Ž‚ðj=8Ë¢ªÖrCCu´š]ªŸ’k¥*ü6/+K’
_•…!ƒK•¡”(-Iå*´-ÈX](MÖk@=ô�ä£ÜÛÚª­+Ó’* ËJ™¡µrQ]VJ�ŒƒO9ø¿A|
ü¶ê…³e!òj
·ÁB­£[È¢„Œ�3oéÛ‡ÐWªµB¥\#»H9ôYPr¥¥Ê*§ç†ÑðH¹ºª”Ôâ"úˆžŸƒ¡CiDÛø½­W¡Vêx‹)wq^YBOÊóóH4È)ˆ2öÖR$ÝMÌ¡óé¬Ôy·$/ èÐ$ÀHH9é$] 1æ-èrUF}ÂÄWªÔx'º‚ &$â�@1î‘!òHNìßá³¥ÕèsÎRvø ãfþEЬ#Àǻœ€Þ@½|?MVvLÓd ·™,,”0Üdõ²¹ Ôý6YŽƒ…ÌA¿LÖH¿L–³˜ŽÉBQ2\ä¯èaxžEDn
aµcÕV”‘¤]^“ÃÉ1� °£ž"IR’û[ÁäH›eƺÇ-³‡hø,³ã`õÓ2�…enIúàXæ“Ô¼7\Âñº²\±R’´]†âaºeUF_ƒîù…ñ:íIµÐ´G8º­t¼ é1¦Kxþt”S§~£:Ùá”öT'9*ŽÁt©·/†ûÒqtÄ£mŽ›Zîˆã鈫ŸŽï{jo"CuœÅüX:b¿õŒnxÍ@6!Û£±6{DvÚå�Mo˜ü&ŽƒÕO{”4ÐàèaæA7H®7K:œZ´3¨ÙpÛë´d.Rð%•A ¹p/Œ€T†Îãâ!_<C¾.ÃÕW#‹S­}‰úe�G}8MØe!æu ¶O*@´¯´eœêVÜïÄçh2™5Œ|JËÂg¯³zóζžn3ðä\&BÇ2„v¬¾Zw\ÇÓëî(äƒcÝyí´uy,Bÿ˜í#OÐ8:uuÐwO¦«aýˆ#>s~›@Ùãø:¼ýk„¹‘n•°^2b~»Õ'ΑUñ¤.ÖÛkŸ g ’]s¡ÚN¨„5y‡W7›ŸüŠ–Öæ±¿Ý†Ú~B‡·½x ·‘_Éãúw°.ÿ–¶º¯mì{°}Y»º©½Øln݃ý�É)„è�?|êBCðÎÆ››úî#ø€^»ûîÜ�fímá-ŽÑ޾ö‹@:‡öõZ�ÿøG81êuÑþÆx³_Ò4Ü;këë_5ïÕ|ú³¶õ ÚryoŽî%;زEép§óöš­õÆ^ ì-Gfg2ð
p�=g€Ú¶�oÜw¯M§¦RSÔ BÞ½ÆØ’oùlWec_æŽ}žÉ†ÁæY€ÆnÏm[=Ã¡ÈÆnÏÆñ¡7ÐÖÆWÖÈS°“3 k‡g늵ñÚyûñKkçg8r“<bÝÐNÆÎhÓé+kp'¼^@¨¼J ˜ «NÉqCïØ˜C
ÁôÛ½>YC‡5¨e¤ßÑVß ®qžÒ‡züaÀ-ŠG)ðQ³ãWH»‡ÅìÇöa¿¡îd³2ŽZš:“΋“¨.Fí8³Š��Ëç¥9Xì2eœsÙŸnOd}l_,ŸÉ^¥3ìx"™ÉOãºÆxBœžIÓ/9ž™7`ñÊT›Ûu6€ô؇ѡtgv6�²Q8Àd mâ1mÝ„°‡«9cà|ÈBábÃ>°n8+¤gûÈ©‰¡!cïüæ³gäh4¡³Í=½ì þ&!<"«ã] ˆÎQV)𡱈ȱÐ<º1VÉ„lñ¼Ú\Ýøˆ-¼2uP¢›öè”AµÁ0F°û³À¾ç Cƒ!ëz£›±1aræÈ¢›€*:ÙÑM °ë$Ú/ÜDQA©bÀØÆY3ÄQÁE[hÊÒ¡g1wœYŸõ³s,ëObâÃñ2ñ4Ì„"€Òõ~¢+¡i5«YicC lÅYïD8B›Yõú¤ûGœ ÜHjQæ¬gíG x<àáÜCgý<þñ€¯äN4bÈjž½úz¸‚ñÔ6Ÿ(±ã¬Óì·�¶(âQ°êCãHLö9ýa‹âPE M�y³§@�N¿‡Ö6„âhû–®f…¦Ä«­¶Mi&È9‡_îk;?Ä)»E ¯ßŽÅC J�ëæŽ1¤ŽNÄí'¼9ðÒ{ÂB(%õjN'±ã@ØôSÝH29*1¶ªGùæ ƒ°†ÖöÑ ï³gÚÕ‡$GôÇÞš(Âîîv˜6}'Ì8Œ­xµf`|´M[ VËþë³µÄ&N,ÄeI—)’·>�3,:9üéÄf'z�ýZdƒ=ž˜Î^ÿw<ëü�1ËãÓÖý$ahµ§|i�ù=ñ¥
p)JË8Cgb˜u(vˆ<;“ŸÍàªhÆRüQX›Aúµ^n)~n³2ºà¶ÔÒÿ2¡“7ƒ^*æ",v!l¾6&�Í�L£šëˆr"%
ù «þ6Ä'�á![@†Ê™‚LZ£2(n?ª¥®ÑCÏ�Z@! )2´EVÞµˆj›R¢€q•óØâhÆOà×�>«jÎè͸ÏG\EBûÐ$Ÿz×T� 9�G1lSÿ`Ðoð%÷m2ÚE‡µ›ZJJXt)l)€ÅçTŒ’’ðŒDRÆè2×ãí£žû÷q³Ãæn‹I]Ít<ébs`CyÞÉ…<Sc3‰ ï{r˶þ—ìþtðã¼BBV`�Œ :9Vä‡4GÎ@ÅÓcŽ%5¿¶¶A«áŽÀܘI¹¸˜›°C‡ø˜Ý­ª÷`Ž6ª.Ñ×F8‚·§6v’ƃÅå…­"]ÂÿÂë °Ä(3­#÷ìÝ]ɱ°2ÖÛÓ¹¤ðÃ*sD30+Šú@” z·iÔ”•‚XœŠ-nïbmŬ�YE\øçLöIX¢”b:.9ÊQb•,º^­aüv¬6³£t—ó¶9vœ":ÛVIvѾ°k×&³ÂL޻ɠç2.t†å ‘/:Ø¿£ÝÿŽ@pFɲ¹Ÿ›¶ym "À>0ËS4s$Cˆ3�¬b·xæ(8èl`|44ÙSc¼RʹãÙ”ÛJwœ‡ ™œœr«¬
ÛS~ÁY2˜åÂ…è°�., NMÇ›¹àtÓçÒÊNY¹ Sa×ZÛ¸ê%ÛçüC\W»Œo\½˜'Ù¡&Z”èĵ[H,³>à†9ÔÅzçâRœ�øuÚ´dyE)L”Ó¿zòÒk)²F9œÅYÀ<ùUd ãº^œ6}0¼þ­† QaO0¢Bõ¦3€ðºp3Tßÿu¶}à„'aï»
"{ùj^'tRQ|\¦ßDÁ¸8c3íë]ü€xT'¨ùQ�i=!Tîê¢éÃw妤‹¢™bK�“8w¥ ×Û³’GG~±,#v~7þ5‹!.ŠDñv‘a[~  /Èr™#•˜QÍR3N¸ß¨tÄØTÚìúQì]ä3¸,»ñáa¢ã”3Õ|ÙÍ*ÙtŒ—f�e$ 3(GÆ!�ì§X6§aGyÀs˜ÀHÛ*¾F
â(O¬+ …|VøÁg¼Æï¨vd
â]L�á=™>¼(çÕѯ߯�W/UJæºÔL¯hñ¼_
Ý.Öz Pž+›/3yny°î�_)Í«ùEI©ßçËJ]=S®Â¡ñøwë»u&jp·÷›8ØÞÖ^oé¿\?Øþ²ç4ɹŸ’ä×f3A~›@€žöà©¶uC_»Õxsí`ÿl•©]ý\»uó�½úõ}íõ5¿å-‡W7›ß|fø�;¿iWž�ä–þí�^}ûNcï¡þÙ÷Ú×Oá=úµ'­›ñ³3¿ÚÖný€ZÜÜÖo>Ñ6ïÜøT»ÿRûüÊ﫟g&oþ­Ý¼ ámŸl;K=ó;ÆžÄ(� vE6ã~,$ó²,¿cЕC¾J’©A¢îX=¥)½vÝðƒêahLö�|PÐq•WržÈ‡@ã»DÊÿ 9yÞxJÂæÚb¯Ø0ìduÎö®¶y×¾:G{{[[ßp›“yw”û¥Ð“¯掺šB¿Î‚&ƒ2‡,€�}�Dw5Y4~Þ•‚/Ï@Añ⸸º‹áñÙ»s¢)àÎÁcÉ�ŸjšÅG?ÈýóO³°Ê…yi)§ð:QËíÜ ³¹0=Q°Á4]‘wÏG·GÁ Á$ÄÕ P^7´¦Á;L°û¢PÉhŸ½ºrƒ %
µöðËúÆ–÷Cý¼Ìµ)ÆÕ“иv ÖÇÜ‘º�9ÔÅP¬Û�·<žãE«¼z«6“ö¯Ç<õƒŠ¬a>—Õn›¸ €å"1­÷㽯>D3þ � Q€£õ�z�Ùû¬–À…ÊPÃX?KhI`éø¬_ܼóª=ÀBÚå-ïFMêú@p¨z¢L:cç­å)#ø »4kš…
Õí3õ>°ϰ}ý  Ï™û¡0Û^Ô7fû:ç/>üf34×�“%áJ(ÕÕÉzYO|¼øNþ=£DÊp°Á•ðH¼¸>{LE>Þ…·ï¤û÷ƒ”ôÆßªõ�£ÐdÏ0÷†èk �£WÊä{�~ƒÈà·yšý~›@¼<\]Õ®î�R9ýé#mo“bçJ® Ë-IÊGçUIQ¡z²<g”IV¥%¨˜üð]yJ*~„ŒLëÞ™êœu')Ðd‰Sýv§Oó¸uº³H0O= $u]£4#FÎøËæS´t5m‹å…Å
ü‰.]¯ÊÕ‘(¿2€D:+µ‰°‚dÓy<(ëÒ¦¦„Ñ>ãt*2*{½üwíñÙÒ�³¶ÃH¤æ�~Yå_rã(-´öö‹Âöi¿�„¥ßaBêcí*æET¬ÂûråBÅT_£ð~;�ü9qÊC­œõ‘æ°_ò=IY°&0‡¼A1VWCâM [å‰5�Zèå:`· ð¢��2`ó½g tÜ–&a€åæà·Û(ÖÂÙýƒí—úW7)GåÝaO¢¬ ²0ƒdaÌÔF“T g¾Žÿm³ÅyQ4Œ�_‚ô;écWš¨62€
v2º„øL:Jn|øоÌìhrj­ˆRKK¥¼\‘•ñ„T,–ªjÒ_øÕ™ß®Ë•²q¤ú±^ÄMØ×'ÚÂGðÙžè~$_¦°ò#þBtŒ)À@Mk–ËH#E ÇÙÙÌØÈ¤³–g¬Ëç¥9˜ÍOÍÕûÖ"U¤ö õ3u¦ø#^š\“ñ²Kr­cÍrð"él~duÛ�…ºõÁ"¤R®bJêE©RÂ`†u7ó)„dã+ø›uYÜ473)ˆÃ¿R­Æ*Œˆ:¢4£ˆdÒë)¢(—h\Ù†„
WÏLQÁÐXWñ0ÛZNk³$35)äǼSG[_ò&X¥2_<Ŷ�Z@b+aÜ’?ﬥšSüºIóv‹,Ãîg‘D¿9Á8F,lpÔÁ̤0MG@Þ�5Å+¿qµ¨×¤"85¥T/)J‰ Aô3÷ Ä}d2R>l/ÕX ÄQ«ÅpF˜ž¡ˆð®Áü”'½ ›p™ˆÌÎîà×€D:; ”g__Ó<Ó6_þ+ÐQ•÷a¡DØ/u £¦–øÝG•–¿�EÆ�T7h°íÞaÿ?Eñ_ÄdãÍŽþüp®ˆ)Èçˆi¸tðò{|i}PT†œAœ­O‚.%B¿÷P°®¹Fc/Ù˜˜`ã.&’£m°H04o×Vc•Ío>ÑüÔx»ß¼óÌü�ÖU=½®íl6¯½ÒW/ë_ýÖ|¼ãEfé$ÞÐ˶ŸW¯ÔÆ©Á_X¹6‡ Àb¢,¬¶|qcÿ‘~y»§Á§™idÌŽK Œ¡yçØÕK_¿­m¼ðË!KPzINÜØ%«µ�œ}_¸¶XeN‘VÊÕ€7k¹r”»$Ì•ëêû¸f
}š²>�O$“™4dˆð-笯øáÒEÒ0Bñ"\N‹i1·/�'Rbv$C’Jµ\i~¾TTgÈ­üfÿ yœ‘aôHÁø€’dµÜœ\<«¨‚+™Hý–vÿ·æúU�ä{j¹â{ÞU¤Úb¹8«@}×Y(�‘Щ¡Ö•3rñ£:Š«õT˜.ªj-74„Ó;Rý”\+Uá·yYY’Tøª, Yª ¥DqxhI*W¡mxX](MÖkÐDÆ`ÝÛÚª­+Ó’* ËJ™¡µrQ]V`ù'ø”ƒÿdÁ§Ào«^8[†"¯†¡p,Ô:º…< !JÈØ8ó–¾}}¥Z+TʵÙr¥‚˜„> J®´T@ø¸rz.‰-‰”««JI-.¢{æáÞs0vhÜl?à·Þ…š©×ˆ]œW–Гòü¼R  âŒ%YÊ�´»‰:´`>]ƒ½ß-ÉKúÄ 0RNº?!Ƽ]®Ê¨Sp]ÊUªÔx'º‚ &$â�@1î‘!óHPìßá³¥ÙèsÎRxø ‡Ì¨šñê8|¦¶¸<–FÙ^Ù`YäžÞj€sLuÖ÷g›.¢°Q5!:ŠƒH+[ÕR.Ô=dÚfÀñ�â+QF^Óz6‰îA»Ð©º‘aðJX˜­"Í´ArcÐX=2•NM;ÕâD(á¨}˜ÜY�““Ù(“š}G<œÁ'A3WhNcü�åJÙiÁËTb€í‰våUãÍóA“ìø‘µ\,ó5 Ø=ÖŸ=²œ ÌŽmT¹½êX47k_rľÅ3›÷GÁ%
&Qxiþëf@Êñšû~ýY{1¼SÀöß`>ü3+WUˆ®r‹å*L>ÂË‚ES\Pn–vþtö<:ØzÔܺ×οH[Ÿ¯Ì!¬f|zÿR ’°…Ò€xÆ�æL‘’P®Â¤õ}4¿\æ¢íYà?ÿõì̹3§ßû_Âÿø?˲ú¯ ±²²rª\K§O奡¢R<µ¨.UÈ8%f½ëdÔ�èÂÇz©&)’Š—J¡!ï`%5ñL‡+„*ÄHÂÜXµïkIz•ªs-Is2ÎAc(ùKïÍY–TÅü<žÐ¶®7ÞÞFäá—Á�x-M©úÎçQéfëÖŽ•Þ¨m?`±°`
½ŽKfSÃc£ÃY‚KfD1=<’Åĺ“é$܆€ÉL&cÞß&á'L
0é8X4Ò10‰mš Œ
˜ì&냇LÖ1%†a±5ßʹÒ|I)U‹%@|QfàÞ4. Ç®š²ƒó²¬:>@êÈ;¨-œÿÌÔ
JmŒ‰Ã赋ðyx4=J¬Zmáßqx Ê5¸ž�ÄÜ¢ ¥Àðu¥FТrU•—Z?£ã{Z¿’NŒ'F³�Ò€8“8žK¡¯ Ë*PlÀÌ+9(D@Ñ›dR ¿8u¯#ô€zW)£E‹*î JàÔÑMèÃÙ2`ßã‰t¿º�ÍyN˜©"“µ`{ òÜ%‚ËÅå%ÈäLüPK
‡Nâ@
customXml/PK‡Nâ@Ü>Ï•customXml/item1.xml�ŽÁ
Â0Dï‚ÿön·Õ‹”$=´xÔiª…vSº©Ñ¿·PÅ›×™yÓţïÄÝ�ÜzR�%)GÖ×-]\·ÍCµé<9OÇPèõJrn'¾¯L0b>!Vp aÈcŒI8±„¾iZë*o§ÞQÀmšíp®Ê7
›ÿIk¹Xœœ ÇÑü –ø3ÀOuýPK‡Nâ@cC{EåGcustomXml/itemProps1.xmle�Qkƒ0…ßûrß5FëÔb,´NèëØ`¯!^Û€IÄÄÚ1öß7t}ºœ{¸ß9·Ú]Õ\p²Òh4Š!@-L'õ‰ÁÛkXÇuÇ£‘ÁZØÕ�Ug·wÜ:3áÑ¡
üBúyl|îi™çmÞ„IœíÃM\а¤é!L‹fCŸó,kËä Ÿ­=Æ28;7n ±âŒŠÛÈŒ¨½Ù›Iqçåt"¦ï¥ÀƈY¡v$‰ã'"f¯ÞÕõÚç÷ú{{+×jó$ÿR–e‰–ÑFBßSiJ¼uø7þ? uEþ±W}ó{ý PK‡Nâ@ÜEJ#Ž#word/numbering.xml­WKnÛ0Ýè Ytëç_Œ8YÄI‘"(Š6=#Ó6~’²›]»kï”Ûô¹B‡¤¤X•ê�’�e‘óyóf†�žg´³ÂRÁ'^Ø ¼托¾˜x_o¯ŽG^GiÄgˆ
Ž'ÞVÞùÙÛ7§ë1ÏØ– Ø\�×i2ñ–Z§cßWÉ3¤ºŒ$R(1×ÝD0_Ìç$ÁþZÈ™a`ÿ¥R$X)°s�ø
)/7ÇêÖDŠ9øš É�V]!>Cò>K�ÁzŠ4¹#”è°
3bâe’�s@Ç% £2v€òG¡!kQ4øušS‘d sm=úSÀ ¸Z’ô9Œ¶Ö Äeiµ-ˆ£…Ü: {5eÈûä`*ÑRñl°f®�Œ™SbÔñ`òûœÕ-†Á¶`òŒ%†} T}H"¼4ÓŽšMr¡%^Rßï¥ÈÒNJ^fíšß—¶Lg€,ØÎÛ Md Öº_–(Å^‡%ãëÝQ@´{S‘ÞœèNi‰ý1c�ÊÛõlâV„+2ƒ½¢ï*š†az¾QfÕä¯0½}Hq!cÎ Ší²Ó,¥ÅfÕ]™ ã þjèZhÖÀtÎá�“ºPÎÝ wÅÊÅNCÔ¹K·ø{¹wvËõIa†â¹vËé'iâÐÀBþ¬ÈÀK* qy¿�„?VžàÐnlð¸“Ö°FkÐ?™î¢Õ’M Ùû&«Uý×`õJÇ
_ˆŒksòØ„×èýóãg¹³…`ÂMÞ'Þ � /KÄ`×½;rólH—y%¸VF’pP›á9‚rËó`e
úm@ÐÕQØ²Ž¨XcyƒµÆ² ©RKÑ»r}ÏPG=[Ôe¨½(ÈñWʧŠß²Ó¢,þÏ‚!^¬À�›ZA’Å²Ú ›©
£A‹â– ØÚȽ&ôµF®€ŒZ€ïµ¿³zúWO-è¿$€-å3hJÀöò‰úPï›­¾WýÈøú÷À° ýÖò‰NÚ4ï°%ø�å3:¸|â¸MóÂwE+öw�>'M Ø^>ñp¿†kà�Û7ªÝ¾q4ƽËKwn¶jª¼~íha?Ûþ7Ô¨l>‡¬ØŒ ÷aóuüôøë(|zü]žÿõkª¸2ëœÁP>à× ~nBÙ`õÚÜ߀�Á@$Í SQsÔ6ª_“Zl3Ò¨VÌ]VÍyu·gPK‡Nâ@ÀÌÇað word/fontTable.xml½VÑnÓ0}G⪼oqÒ´I«uS‰`ˆg7u[‹8Žìt¥Àâ ñÈ70ÞAƒŸaû ®í¦kפ4R™£ªÉ�}eŸœsî=9{Ç’Æ%’ò´g9ÇÈj�4æ#šNzÖë‹è(°2Çé'<%=kA¤uvúôÉɼ;æi.°>•]÷¬ižg]Û–ñ”0,�yFRx9æ‚áÅÄfX¼�eG1gÎé�&4_Ø.Bmk™Fì“…�Ç4&Ïx<c$Íõz[�2òTNi&‹ló}²Í¹e‚ÇDJ83KL>†iºJãx[‰�—|œÃal³#[¥‚åÒw,±,î>Ÿ¤\àaØÍÏ:]טwSÌ xA‘�dÞxÉNõ„ §\æ\â¤g!®6j¢òàçÂ�gÙ*S<ÅB’|5™ð3š,ЍÐyõüŒæñ´ˆ_bAÕÆÌI'ðb&‡¨gÁ'A~?ð-qzV5–6eÐC¯j®"zN¬óè)N©9�<ËUzŸ¶¡Ð"7W_®Â àW)A» <˹‰oà0"c<Kòm–›mÞÃàA¤¢[0ƒwÂàÁ"§ o€ŽJ†²‰Örsk¥H ÷€Hç^ÿ�æÜ÷„(æ”b�Fû¢<MJQpÑøài�(‘¸UÂpÊP�s*¥y±!Îm÷Üð”0„ñƒÖ`‹�]„Pl@ºˆ`¨ ÚM•.î~|Ú­‹`ñºÐ_ÑhYšAùaÔƒótò™ D(ˬà„þÐÑlPféÕâã#"ÒC�Â+|ã^ÿ�¯lÈËÅÑ‚Záò�.<ùæ\«F©ETU�¹e¡ÿGöˆ't(h#"]6µ?7*]¢´|Öw �÷¶K¸ž_Ó%TÞt Pc—K„˜¸Õ?˜>Bõõ€¨Íe—¨½n—œÉõV¥ }ÊUE-­ˆNÍ6âöë‡Ûï¿*pxÌ6¢¯`8œ]Ö„áæçÕŸëow_ÞCù¨c IaÔQ]CÓS™Ú±ÞZºý0j†­Â7Vn¹Oípj‚q�§Ð W Z £ÕRÔé±ë¶–çN™G´Ñv'áî, ¨øë6|@�ñ†G,[
yúPK
‡Nâ@ word/media/PK‡Nâ@(—iVöõ\word/media/image10.pngìýl\KÓ6Š:dÇ1ÅÌvÌÌ̉=fŠ™™™™â8fæ˜cffffŠ™™™íñ]“÷ý®Î‘®tñHÿ•þ–öÎxfÍZÝÕÕUÕO=Õü]FáÎ'(((q1�<Ô{Y(¨w"ßïø™r@ÿ¼sWüøñãÒ†ì:ð'¬­˜šŠ#ä¿7«Æ„®PP_ ÄAß]S�W|T î¼î‘Ò“H"E{"f*{Ðo•%PÍ4B½Ê�<¬¾P…TSŽýl„»àÏ!wÝ4�CÃÜoÅi¬Ö¹ƒv4øC•Ím“öuNøä}]Ý|ÃÔÖ[»ÄXþÐe勃<‘àpî:E”­Ã)ãWÎÇ—�ì$–³9�¿ûs\¢=W÷ž¼ÛØ–––5.ejãƒ@3lÕSù¥—«@ס–µ7/îǽo« Ü÷O›Ïøí·Åj]`Ö¿â•Ý"B.øŠ.FŠ’+ïöp¹srrb1W¦äá…Øc•ê|¨Ho›=ÄŒ­†>ÖnO0êì*Ü�wŠKÊUo _†Š³W©uù÷
jýë—“¯~p® \9{?Ng({`þ{ç«%£ Ì¿W=°ñ–ÿ^|‘ãùß/þ·€•ôÿB,n},ÆÍ”Õ?RÅe¥·ÞËÈ›Ú:A˜Ö’ñ8µšU„g}”¬‹MkTM�mò88G·U;ib„W«‘ YÚ{8åzl70•wá<ĦWÔwE±V–?‚‚‚ ‹¯m,XqJKù&tV¯Ç<†ãÛ;ûâÜ…@aÞºStOÈ}c)ù\ÄÄifUåÈ>IëÆßß@}¦h7˜·D*\„¦m hNweR E#5ÚÉ_uIh˜ã7t~$¶à±ñ„àáÙþÛ¤nm¹2AÝk[c¬MAIVªøzÊa”c�ÕÞÂmÆò
9:ËbwS;²�»Ë¢Z™FÔ¡™<1|w7ºâ0��§löt/é×;~âúò‚HœU–Ï_j«³ÌcÄÎÀd•PYý8uÀÖÂo´2™F•ÁvIÚn¤¦Q¦¹Ìcáðþ'(«ÐðJcøöáë� 4­wÜ ü†à(g¨ueŒH‘‡ëöß‹‹†<ùÖÑ^CÕ;5K~ 4[’w›ã’xð„°Ð$¼È„Ÿ,-‚‘x;±.2¿2&¸u9nŒ‡⟉ߎÛZÏFr '84 ;QšÖó¤�ÃsXýò
:Tõ‹àÅ»8= 3p È­H`&ôòô²^¤X†ÿà‡<µºünSo¬¶>þ,‚OüzYr¾+a z @´L‰Œ2‹"·ÜÎÚŠFšž š¡í€ ¥Î¢Y6oŸÎg¥½Å*à�iƒék‚ôŒxä$f†³_Àðú<ƒ`vrÒØØüÉ…7ªa¶§;%½Ö¿·—�þó ¡�!ux›#V²½C Üø|jïª|ÑŒšÓ wšLkódð}Â\kúæ/vþëA½Ê�#þ#b�Yâ™öƒµë^€er6S8;ß7¸fKöˆ  =:¾p”¬ÒÙà5Ê [ç�BÅÂ�©Ñà–[ŠÑ|ßZÍdÆœ{‹›ç,—z%ß&cƒ@çü~Ì;5®tàXé{Á{%B
!Im)nê«æ–õv’¼þÇÕe·�öKôOƒàý«{üiÉÂ5™1c«"S1ªS¼Zú`èxe#½ß–Ô5¤ðùšÇJî7-ƒ‚‚ÌØj3BÜñ‘EA•ª›¨ñÍã:qi¸uô0÷óÉ'×Óe«•§?u¤µ]Å'&mŒÉMœYºªyÀ�rÍŸÏ�¤‡æûúD&M>Íþ¶;³Ü„#±0×}K–.[s4Äýƒ¢J(«¿«#Æìˆ(ü#ßóžþèçËPñ¨Dÿø>¤�öóùçI^d¦"e¡^ûlïüöÖmšhDýÎõ‰º:ÅÝ÷vãu©Ý/ÎH²=5‘ãh‘Ü5;5ŸöÖà-*?îpE‡çÖnÊò‹äÉQF£bgq;eË‹TõdoÌ:U£·¤é­÷žâ[Ö¤ô=?—ù)|˜<�H›½êiUÈ�E·„·häìX’$ü3›ee¹ø$& ‚ 7†Tc¬syäÂô1QšÚ(Dà7i®Œ(�l”Käâu|Ü„ø ~ëJq~ !~ •õ­+£ÝC+U±9åöaÙÝÂM™³~îúö¸¬¢BÆçVXz«1srçK/ïôn~«f†ÅØCn9K˜´uòÓÞ;Þ ß0x1I<ûq]`²Á…:É)ˆ÷ªûåŠ,}D�^zàmu°ï—¬ %ömúj_-¥¿oÐükÞAո蹚.V_!âo¾;=³%fMÿ¤K´õºùãRDœš- ç,}ËŽ±vG—?šë4…•b¥/OL3ÇQ€�­˜)/)ì*Bn4”ÙKœ[eä®$ö×öÒÐ÷j÷·�Û *ñ‡¥Õ¢ 7?n£`…SóP�ñ”'–¬±_m¦–S Û)Þµi3¥"á^Ü=u)ªÂ Ò íË
ûo2^3ɈcCÒsl¸¬º‘òZ]Z+3]~¹Þí›nõJ|º?„Ç=:�‹@â~,E€áà™•ßøCÜ>óÚ3¥Íï‘DÒM»h~fVüg ø7÷Ëõɹn?ÍRÜßEñcr· šþ§ã]=5a�_­bèÖä ÁŸ…ú~Ì–zf$Šík¹ý�ÎËè|û�ú¥ ¡˜x#!"Á¥€–tw†yä$ÿ½EôÓΗˑýe�ùc|Ïž®aN"Q�ÓgWˆà.™�͸òˆ^I²|²þ‡ãf‡Å¨0«#&,Gî\Ú›vS~ø{å´Ðaì3ï/ÏÝì„ÈÑ—9½ŠÏðÜZ*½5aÛ„c¬Þeûç±.ÊÖÔ>FJÔ
…Š>yÔ[9 ù N Å9Ï])‡U\�JFŠ1±¼ãoh^ÄI~p•xu÷¦=RF�›ó}Öù#èuB~“¦ø8O2U_¢Æ Óx¿f™”ŸÑ†7ƒVήÁ€ Ž=‰I^¸‡Åä$ƒŒà‹Ù\ Š!ŽfgÊéF OÂV3)©—#&šÃ4q~ï6fîpHÍ5›p$*¢Ì¸Â{F€oEÿbáʳ¨^÷Žçø«lð0
zôŒ‹TKŽê5OxJ²Æk+a�Цõ"õfæ ¾îú‚:G\Ó¾}¦,MæýîfÔ‚(ä´RpiÅ1¥ –²¹ÕÏmãÆáEè ±üMXš•H�¯d"fëv¸=Üéâu°F/¢ÓÞ¢êš[àÎ <FtÞ'¸p}·äü!VxÆë#²&*w¶ü݇¹ý<ÕÉ9Û¬"óœ
´ì¡]€$Þf”b”ckR­^Ú¢½dÊ)49êD/Èy§ï0I®AÙ-1r.-›¨â,­ŽXÆ–ØòpšKî„Ý:z©/ŒN))Ii,çXÑLÙ¨Ÿó´�’Èàm¬£êé`7c)éi„=;˜ŠŒ\gcŸŠYõÝÖlÿ`¢Ã¿2âÑ g“J­B„ö1îÃÚhY†U`ÌÔ?ü#ÃÜ,&!Ê«óÑgdñrIˆ ƒ«¥©h
eŠ­NñuW”#\Ǹ[‡Fîe´”‰ÇÒÉéØÛ*ÞU�ˆ.ÜKÄf5)7ÊS�,Q=þê‹0&ά|OÌtãÔH¨’FÄ–'†¶Ösð•üs^¹S‰ï…C ¶&¯ä·1÷GZ‡ Í¿†%ajVI‰fÛá|"­v~wç'¼# ÿÉC0…¥˜ècM‰ï„nf¿¬êœÕ�#³TúÊ÷×<<6vc†ÎÛ,š… �{<¤L�%+¢ÊʰEW•¸¨Ôfæ,Ó47nÿÐ2ëE)¶0_Œç¯xFÈròfÛM믴¢E{X*À»L¢ÑÇq ŽII<î†.õDqï±cD¬°'–Ç™}½‰¯:ªEv–Å[Yù­�{m»À¤Îg>mv?92‹cTb{6î`Ò?äèn:Ö,¢ÆeBØ:°f…#… cí·k•€ð Z”΃.1'¸¿oWËf¾ «ä[fîÚOàò ‚¿â°~AßïaHØÙëùe”sÎ�;z"ueŒ ·#gé 5iôç}á °ß¯rrZæUÙW²�æ& Ì·�&Š~¾Ñ§ÛRÓ áîîÆá5Úqco*àÒWáø±"¸øæ‡¹„Ë-±Ñœ!™ä̉?hizzK \»‹ ï°úä8Ë~(#‚ÀWP8ô�˜çÿ"÷Û=äfqè7}†œr<Ãæ�%¥¡0<©{�¿'.®ððåm¦–|œÃ§iRëê
Ô5ÇÅ€ÒÂ�á)¦†º�‘ÿ¦�iöŠ�Ò' ›áÞ>Ë{±¾ïá´"3©Ÿ#EÈš w%Dps‰�nñÄ·is™ï~59&Ë„Ó+òjh¯X›§á;«, [¿æP�ŠM[,Ïm>Œ×5¸8/n r-;KŸ�Ö«ÇàåQ^åw]¾ÉÁ¼Ý„K–ðŸÑå2gM~»6Æ“Â\ÃÄEKä‚‚ ¦åOué­p°ÌpÕ5hKXqÂ�[¤¦YøÕÚñôRªÎ0µY¼§êT×––HCE¶ê…ÊÝ´ˆN ¾ÞäÈ ìΘ';Õ��L­Ã¥Nõ·VO–(0s.“^„ƒh4¦°4àLüöû~5êü’?5€çyNÿ^*}WŽîe{v“•zu‹»0x�E4{#á’È•‰¹«)…€Àó–Wn„ÅêÔC㸶lTpÍk;T˜ˆr�¿;]-•IïX“‰ ‘~ÿaÁÌÑÇ\G*LBDtwcGƒ¡ené|W׌KÄÈð»øô
Å%Ëc¹†¢¬Ú…i¯;馦 mÊ ³33šÛƒœEÄ"÷¾ñÝ:Aò&n:Vïqj}¸fü®À"æÞ— ¾“¥Ix� ž?fiMrT±Ô¡¯SxŠ3DÄâ^ýóð£ó,£NŠ%~U�MG'Âkq)Cì¼0ó¨@˜Z�<séÊ98i¯ü™)¯ô8YË%zéivF7‰´N\FGZ&ÄáT�ñðË<·ë]Xk,?òÍ8ŸÁÊ1£“©MilåJÕÌ Šs–÷^Íl‚õ¨Š^kî×Õù»Ma«ªZBBÕºtg†š›]°jÕpY×X§ °Ýàžv vèØž}[¿bdj•ß^d÷ÚµpJrŸTE¿í•Æ_°L¦Ã|:t8ð�[z»�þ¼;ß
oOHöiÈKƼNH¯>0è'œøô1åÒJŒ ý¤Ð—çïÊv)÷MZXhÊŽ9¡ó›GÕu=ÔÙKóвmúg_fkë-r.¡ã©¨�ÐE[’H#Xê{mh¿"B¤‚!Pÿ{ =¯•Õ|%Ú°ý�'ž•‚XºÜ®!þ–¾U(ã«¢ËMÝøè_iã8$a•=ãw\tk9ªÉ‹Få˶`¹þU¥yޞᣨ¢cAQ�✡±Nqúv) ‡\çÝ(7ˆtºö0«ØaOÅ¥
6)B ú/Š/…% ÃÛIÞjúO9ÖC 63¾‡’í¯‚öXƒ›<zª¼‡†.< ûÞlèfy9?¾ýJ‹2ÔFSM"têþ–ôßS¬`mËËÙaïpð¢’E8¿¸ %Œº™î+šúö³ÈMg†D>Æ'ba•³6ðh°Í¼U0,Ï»<G7MjM¦“V>õ`ÃâJñÞá˜-Ö0©Â8&ä»}*\QŽP&˜º¾¦\*öÁãÇ»_€wUŠÁv^¼NN‰§aç+S,”ÑûuV`†ï oyƒû!×%Èêo<go"k²ö”‘&ŒŒ–±±º’>µ¢çð\.ÉWû.Ù±°Œ0eªB2|6÷p`]OÉÐë`&ãÝÐ�•Z£»;3-F°,HÛÀ± ÚÐJÉ.­`]p–Çü­sI;~V£UûuŽÇø|œ¼Za¤Þ�…AzxþV[!’¿ºŽn¶Û7ˆ²î`[¿4 %Cï�B*yuõ-]ê´VÓÏðÆãO­ WDzƒE™Kz©dY*.�ìc=‰CrzfY�9}P‹M[»CamG×ïŸîáÚß|'¤Cxôé˜Æºjnö­à´ûmõ¿ÿ¾˜ŸgYjCFžæÖ7�û,—¶±�:÷7ÁbHùëd\²€D=M¾"|–ÑKº¼Ð*ÕÞ»†@ûêôË·pfr¦ I\Ïd˜ËJVZÅÛ‘+Á]AOt²¤Ð{>³Cd³Ee¶„Ê«*Ú­‹ànL†ó™_Ìa Øå·O4*ßþá Ÿ¤´ ñÚõE> tÊæÅÊ(÷º_ñÕ·Ò±9¿‚qp$ÝÜz¡½JÝ+»¾å—½õçÓÄLÜîLµîT'ÇÉ’±Q^d‘è’e…¥óy™ŒM·¾x�ˆ±/¹fÄxŠÃÜXSO®cu&1.ö¤—ÄW{ÅÈМ¥—PäDØÙ§�íÆÒ˯U�Â0Éã»…®Þ¤cÕÍ)>K©•šÛ–3å«0R$Ü>Óœ7’fâÿ±_oD‰1rÆÑ‰x�°¨}y%k<ú"_§å&Ÿé5¦Ø’:^oëmÒ�Ú¨�ø~XV7ØùýáÏ|°÷W·Sxd²jŒ�Û’ÛmÞøþ(Ñ&¢æÍ÷ø®[Ê[ŒÛhG‰Ã[TÇ>wP1ç”ÒÄ’<ÓQ¶îÅ´/!õWŽ®U?™lÅ/÷JÝ~�\$«4oÝŽ‡šÏ{(ßD9µdg[v®2ðÔ‰©k¯©$A—Ð[=H‹/2ÍV‹ýö…%ØJHˆå™"àìêJœx¶´›¥±Ä¾'‹HÜXË �£™JÒ•f�YLåG±€ì_æsîjÜÄÍ“ñ8ÌÝöÖåÉ4Öøìv{C”Ë3/Rä‡cüHˆ#9°8ð˜™@qñN¬ïžÄ¿g™YÆ>¼e&.”Ï—cUþð†#«W¹T÷¯ÑFûryO¢¨?¾9iJ‹ð³eêu]Ç™ô®Ã8fZÀ{Ûâ¯@øPÔ¯�ËcÔ«N|&ã�¸#6±“ª%£-‹Ydÿ‰¶ ;4Ó8nÐZ[tY“ȇøs…¹Q.ƒÛ�rz�#:*=;; år,]µ NÑQR*kÁ'ÚkÙrdd¶ç|ÙN,agL¦×>.£þ�”%¤ÒÅÇRëôvÞÜ"C³!bÇw˜}ê’ E¼BPš^Ç&Ž¶Íˆ™³rÅ®ôií?å†Óêµzç-™ýÍr»#’¡'µ¹|å²t~Ïu4á¶ãÏ¢+çÙÍHù„*sjkþ#X¿zN»P²U¯Ž}5iÛRé=å9 %·AÊÄá`ÊTw­ä �2g �Ý${áª0¬`ÃR蚌ºTÀó{²ZÊš§Œƒ¿8ôj½.'îÒ¬¤Ç‰?7nØe�üU)?‚ž{I!Ê À‚‡&>€û\j =Ž®±ÎáWgc”[Þc<=kÛœáû‚Ûî={ 'jôî;T3d¯¡�ŠàõYÂYÍX±×
µ—ݦôõ$—Úp¤„’ê”/C³CÌ䘳!À>†ÛJ¨Ï�*¶ÄHÎ'$� ð¿¨Ùófç‹Âr‡tÐF.èuÚI@ßú Zô×èU¾êa© þ&¢cc"ÒIÓ#¶ùÙËkq¥ÎJáÎY XBŽQ´¨r´3eä´©åÐÙWpË DÙ⦠ãSG‹€ yRYi)RÒ°üA±à£Nd#™ B‘^pãG gî™ùûI.0h›+îI$ÓØ¿AÁØÐ‰STÁ¯©¤’.ú3’-9è9z;…Fÿ|Y³&¾}÷˱0+NèEðÙnÕìqv‰®ÂwF¢"ð,VÖTûEüÇÀÛ;y̯Däo›ÿ�ýæ6yçN=Ü 5wOiÛ%’†ô´–Â|¾@3ÿä—„r#¥ã¬+泤³žrkUÿ¼¦dRu>B^4ýØñGù&Ö/³¬Ž’'¡¬@!QÑcÉe
ñí´ ’ˆŸc :] Ñ´ê×+IC÷OÑΠÏw´ˆ‰C2í¬Ö°üV;A?#2ú¡q-‚å�¤éø’xvw*Ó¼§”wc|<‡Ï.@h}|ˆqŒSÛuÑò^l hlé“’F<Áºu« Ò†¬é0�¥œÛTŒîÚå£`f×;vP—yÕ®ž!u®|á´é,µ¿T¦ü€sûŸcï-ƒÆÐ€S©œ‰,¨'x3¨"ÌÅ;![+ç²oÙ… •P»'øÇQW ›?‘#[q¢ $|YÙøØï-NG:\“¼8 Ú8Œ5¹þ¶ÉU<[HÕHžg*¬U}û¹–ãè·Ø™úô@Žöä-ïÝ8FP§:9ñ‹±N˜éØÉ%« ESÝïFépq­î½NC‡0Æîþ±EêKñ£½&2 oAŸbÇ/ÿ^ÈxÕ­•Z19ÖëhHcVtœi ·£?µŠ§|β¯F”ë18«O8ÜW¡œWlEð¦ú�ÅÜA±ViFÁð|¿d“Ú;Œ‹Š5+YÚ$”+©”Q á½ÊC§Â´PV½D¥Ùæj¡#LJ >•�/�ÁÆ®"Jé } Ë8 >ª9\“¶¸[›:Ãć{V±Vkr¬Ñ&•z½HV[[°#§© Á¿Ó¤‡ÐtÈN²ÚQ2‘‹Ä}o„´Vä ê(Y›VÙ~×3+š«‘ËŠúM<º“á3”Kz=^nÒaÚçq
sh�~˜û©ñ׃ª1Ópo?j¸ÞLÑ$òôžÏ‚—p#Á2d—ÝKiI&\Jyñæ³ÿ2gPsàÓÚøç5Ü='>rÜ1ÆÏâö¡ŒvΑˆL€gGNœmB#ΪóÅGÃ’Y²—¡£ëŤ/Â)”Ï�Ÿþ'öÐÅ÷£²;Œ*t|= dÿ©—ýø,@]Œ`b¢x =‘Y²×mæ/'![Žâæì¾ÓÐwÈÈeÐe±Tá9³UlúÖÏ="˜´wî‘®ߨ¥!�r’„<½hæT�8ZئS´4/ý9Tq±�cÏɨéÁX¼þ6¼llš*I&„6V¾˜=õÅ[Ÿ]NËÂ%ÖÊ1ü>waç´/5øüÀ(|Ê¢Ab{<¤^s
¾ÁRÒTsx`%Õƒ_[L#뫤Ó�Í•ÈQ¥ìá`x—Bã *º0›kÇ™P�ñ=kïýÅàæ¤ýtgUŽ…x<]^I jd€‘ö$“ÃdAœ¸C=^¸™)¨æ“âUo«‚�²hT/Y¢yiûp¨ª𵛋’ Ô:¢R¾b®LaƒÒš¶DûplA¸{%ß*Ÿ¹] _n²ôêö
Á«ïé48؆vþÜüPÙ SvSGî_ÃYùÓgB~J‹òp+Ôº`üýA\¿�,öˆß¿v¾=í»ÙxÚà¶¥õ;?ëôª)q®Zé>úÈÑ6îìOpiÖ'W§ëž˜˜ý5ï›fªÜõà së²Í-OdÍ÷”x‡Ë£1Ö©PHoie°åån–¤rÜÏ{!ñwv©óž]3to\6Õk7)Ÿiê²'6-?5ºÉݪµåë@‘¹2÷n —‘‹Ý«¦Ï¦ÖÖ8Þ³TRÄH(†[m‹Å 7¤-­µ(Ù~ŒŽžÓã�µxÌX»rµ?n'£“%ø6R…6« TcSËQ˜1^SâÝ~´À>›–èÊ%§Ú–�’¯8)-b¦øN4Þâ!*i$ø#Jéÿb·ÛÄ‘QX&ê8ý
[1â:`
ßÀÐm|èÅ`ÝÆ‰¸õoÕqÙ:E–ÀÇ«Ít œR6§zåtRu¤£
{.�}E{b#YÑWµ¯¼éæ— æ:Ç)¦Vá­§Õ¬p6T“¬uS1)­È®e�DN¤üsˆÝ2îà(Á:›½ËÉŽ&Ñ nx l�%MÑÕ÷#}vÌ%äþ‰é‡R„O´–qòåSLhëÁ=ÁmÛi¼ÕÉ9Ò$[ÍgãÞß�ëÕÄÞ‡vu
k‰:zÿúd$æûÈâv!<o¥Ž ì»•ÃÔFù=YŠ–ÎŸ9;¾¥ÌÌž·k—:e§G±"�<»è¦Á�%2e;øÔ^b.
r ¯ñ¤K¾jYžá¿ t0
~ß´V
a—ÐËí‰'oUeÊ`Ýúõj�†wÒ®“AñΫ)®¬æ#@ý?\ê=ÑSVmë".†’ëÆ›cÚ«a ™1»«o›‰ù)þ-±2dGÐ,½Ý)¾?Æë›5·ÞùJT-—kPŸÒæ†.˜+…sÛ{T��sð…¾Ñ[z”ufÞ,r\CͰkô-Î$ iÅæbr¬0ûÇè"d+Ê:âXùå�ê�Œ„P¹–ã˜P©O3$ÿ®¡t«Ó§N¯ý,åäû� ð½ßé ‡ù¬ªíŠx�êšÆLÝ‹¸ÏÆ‚ˆK%ÚªeL
ZÅ•NêXoˆ‡ÔºÀy±C1$L¾ʃþ˜G<ät$Xá¤2”wÈ=Ùß2úwËÈàÎ
�®Ã¤¦{rªeœHÓ}é]ÚIåVa¡Q–ŒkѯK—Šæ¬Ùh`Èéð?¨XajgìÚÓÀ‹p†4ÍTÊÒ¸/¹p'PNÞ^×ñ$¸ ¬Å¤P<5Ô¢•ãJm§ÜÜ(E\mÇSc¨Â+Ï�Lá$¢»*†º4t¢óOcoÍ›ÒÙ06‡]yy†•À‘6 �Nç…ÌPã*n#’f‡7}Ë•?ý“¯^šMÆ!œô½åhyb¿ê|‰Ô
§‘-QÏI®�²»)h†nÂxò‡›Ds¼¾6!?ôãå)´9âkÔÅØE†Ù+EôZU¼_4V0ÀªŽ2ÜÞu�Ü&8(þêdšô·÷Bj®LhhÐ&—f i”·ÓEZCo{Ùʾ²�‰ôÕÝ`qÏ“×ÒÚ‚k¸*“=}OsÅp¤Þ�H
IòÊMèÑ¡I(ÈWƒG‹ø ÏSS’%èâR‘kÒ¼Ò5kó~í÷)È|¥)�Ó"³wÝ>•¾…)¡.\}1�ôÔ<Ïß6ÞšÔq5YmÔ*8Æïž³YçÉ73¦«3¶€GšÆ†Ç¡BÇŠ=Jfëy¨ÚŒ�ïE¡CþÀþs2âqq$_¨w«&¥s;KžzŒ8 Š6æ)Ñ�I*<¤Íà«øÇ_�ÂKp©<Q¿gøù¹~kú;[¬`ËÕ™錓[pºÅ[) áç6#(VýT)bù67"Ù¶EZ-¬˜_"cáÙÀ‘5znb<)ñ¦×ít>Ik€ýÜhvÊÑ·<¹æÐé×ëZ[âO‹V¡Ò{p%‡ðï0TÌlÝî+²”ÅôÎÜA ªd¯C9!ÕÅ.Ô8—ľÄ{$4­ŽúLž¦NftGî%Š 3ÆÇ§ºl7—ÛËÑ…Û‚ùn+…Ô_ÌXÃk葚ÝDzÙ)CÚ8O�È»"Ë,Ê ø«ø­jeY˜§·‘Âò“VÂâµ¶Z�²‘gÙ‹HñgâP5ðºS¯ããžYÐÞ a-[%dzÞÊ8»�D|‘“€7Jôˆ�!èvDÄ1Ô)ê<É)NÜáUôl‘erð�ŒŸ ¦±·á>Ó•?ºãâ’‚HåØ*jzró®îçvß‚@!B½L$8Ëbž±É5C!HµOB Å~Öí+䇿Ë]|Sy©L�M³¼†ñæ‹¢}Ðp>‘—¿8vE9à1‡�£ðO-¯’XF±_eæHN¥J벿÷[ýð‚dò”È&oÃ5~Z~ë4:2»,4µ4—ßÓî
äxG`­§÷÷$Ôi´ä˜üÄ0U ùÁrZ†½\¹tŒ‘ý@ ^¯çi÷‰'ÑQ«•;ÿªÐ+ÄúƒÁÞO¯àÐ}ÚDœ»úÒoEñB¦$Oô+�zè+üñŸÑ©8ÓŊ̬ÎöYÙ¶ÃAsù�(Ø üÌ
‚Vå¹Òälè°0 PÍNº4<üéŸX59äöÀ  “Oµ<ûÆ#W¾P{(/º‚Éfg&*H:P máùNX¤#p%Kl›qQ¬" g™R9EÉÕ,`4]„ÃöѸ•NëÕ:05wY{Û[p°,'P�•FKOFGñi‹ãrúÐð-{Âlø*ç,³woÕVÍ965¼#)(­¦0Ÿ6…R°_õYtâ@B�¿úT˜QPnxòýsûæÓ®—(/�W{gK³�yMÃKR×hi¿ÑFÝjpúx×®+Ôà›±þAÌ‚@c³Ê&¿rBg‚ïx¸ÏðIw m
¦¡.:PlÇ•è³�;T¢6
 X­�„y0‰þÒ'T‚/Ïw9‡ÛÊÅÑAÞÛì
XÑJ_�ÿxRˆÎ|÷>+¦)V±º’Õ¨ºwª„J[Na‰ÓÕ.G;!Ï€R¼L@ÜÅŠË*˜L2Iy ‘; =Ú!On׸+̺/ìp;"¿u÷ɘ~&2ÙÊ‚‰xÕ„Cà¤V“³>rº³Ns/@dåÀG4!0Ñ_„˜8¸INçù¥‘!Q}®‡ÑZ)¶Rƒ"ÓNëßÁo0°U&óè&"ÆD—¯:"OÍE²”¤šá—$Aæ‹Ð/
â¿ö…ßÝ´\ ¬çOïáò÷±Æ{2¥7`²¿Ó ‘uÓÍ5êÙgáDxFËKãÓtÁ¨ìí 3„m9Œ«¬vTÞÇ6'G;ë(~Ý Ïý³¨“Ý\òåL­Cô­o×”F¸þc[ì“Oÿò\» êÅlé>â±(‚dÍŸO|ÜJeÖ$¬9�íB-4"´Rß�R(~/UÖ9Õ¯l©´Ù%#DÚGc¯.“š^ªN�eàŠ±:²'­×4‘ͧ™Ølòd…gœ.rÑX›™ó€-eË›åè˵;¸Ï$·|ï0U_øíA'ÖàÑiÃÜÓóAv¯ÊÙ3·/³:èp.ò¿1Åa«P_gá·&$̮ѿª‹i§D¬±ñX9ä€ûữxåø¹ûwG¨áQ|®Þ¹AóSp‹;åUF¿ÍMâé¡L‘M§ýùe6W{Ú]^ÅŠ ÖÁ.3füoB’ÔÇ
ÈÛ"jw¬Í”Ñ-ÍÁÁaØB¸ß+)¯°4»9ÛÉÅÈ’*éäS}»€`ÍМ¤ WW;X´emqÊ)X¸ˆºXÞ6+;×°œ’¥ìm³óPn¦’¡;[»FmÿÉ’qÜòô©’�`}—�æCùÀþ.ø^9~ì×Åh/�)¢çÓòd�~çO”Þótñê:�LW.wm<°«Qe3G�^È^�ëšNÇBîå½�qiÍ}µ‰ô†¹ŒÉÖä9ˆÆÐÒøl?,ƒ/Ñjj2 ¢•TD›f^üÇâöÙ8ÉéÇar¸¥á"÷ðCü­D<wÂ,Ç‘“%·Óön*ˆþ †>ƒß
åÃI¶B2À^¹F¢�ÃrP`£tðI¾PµoŽ�͈Ñfšöé KHUÛH¥%Së/J'°ì<)üJó-ðû‰óØB|SG)¨Œí:�åZŽñƒŸš "€~+„Ö9ÌÞ––ÄÑzM¦?€‡’$ÒÕ4Öæ_4 ê¿'¢|4Úa,Ô‡á3v�šX)V«zòœ†Ãµòãш£<ÕJ•ü…Ï—âó·[�G£ä©:ƒC|&…;‰‚Ølz@,WMT=ÃÔvÎ2†ýIx2|»?gš0u®|\B ¡ºÊ‹˜«.3q%�çUù5&;9gkSW.1¯ �Õ*^Æof©Ô|³i½´ ü/ê%Zƒwî°È³æÍùÚS@Øÿ¹—7br±8ÌŠãÆQejÌÂÁЉiˆ,V„ƒ#¾Ì8´”�4/€*©£Oä¯A˜ ‚kqÊiO(šV_^
NMÉ1qÖçzÅÛBK/—”° CŸ_?# sÌ%š˜˜¬´]g ˆÌšžœ`Ø‹»ûj‰¶'ɺ^y,׺(6ê<4Ø8q=ˆÌ²ëR­��ýÒAÍ ¨¬ÒM”z7O¡F¡‹›ïܨ?ðkV­ÉÆ,r; ¡Z.¹/æû“)¯¸ñmKÀæï^`ÂóÔ'.;<ãÓ e}7E1ëw~,6)”êËa צhÑsurge94t$Š´qóËQ *,�ÿÜÛ Þ98¹e‹È¹ƒrÊŽGrfh¯y¿ï'+ñp†[—1Œ/žœ†ý”‰ÊW¶â|ÒWpá¾üL¸�§<¦gd˜œW—¾ÊÒu•}w^w8Þµ‡ Ë�™—è߈V
À*¶u>&|Oÿ¨4 .žÝ‡)O/=õùÏK-f¡›xXz+ÉRÓ3æ¦ì–2]DÄ!6n+pÕ·dôGÔ¬6ÇÒY|,Ö°YzJÙ,õæ&„ÃùÍ-UÖºR¦ü?´§iµtI6�íèaÂ=õì ÇÓƒ $ÝêÔmçP¶±€Q„Z>$ çÃpv‹Ûäàk^Lè/ª áŠÌH†—ö—ñF³ô(.’J’)"owßè:/ÓØ&ÁþÜÊñDfÇŒdÊÕtì„R ³K Ù.w÷´“å�n– ¬°�Ò>þ›’ôçè@£ñe ÜGzͨ;�z÷>ü¹`›ÒE«ºTÔ�©¹3‹Ù€j†º[Ãôh”‹è¯%ü³ªMÊ}WWDÄÉã^µS†–ed6Â<õpvgÇ5¶?ËX“në9ì?lÇ·ºP OZº9å‚àæbœù�f€äm6pº!Ipn�Å& €xäfÑã_•Oâ%œõ�ëÓ%©'™J¶' IÓÁo™R>Ou�Ê"+#‹|«Ñï7CÚ Õp3xóîݘ‚rÁz1íœùðcd&›ÁU¢dæ.•j-¶ôÐLT~ÍØRKu ÝE';›}L3j!o9}ÙMO>7â„1y—†È¼¶ï*qqËÍ?ä@XÇ�±(6¶5~öRl¦ïŠáTwŽÌé“¥—s’Òƒâ£ÂÊxë<ߺËèb~bÃÇJ É>µBÁB¢!-¾„èJÀ˜[³!›A¨KÕ~+´Aƒ¯âøÁ³¿ã(è´ž–jZÝ%Êëb'-€ý�-¾˜º„%ÕC<I­VÔcê.úÉSHÌ÷Åvû–y¥ä*(òî×DŒ™üb/,³ÐíÈèðüPaaW×ûqwwü8Š‹ßzÈÕ³ØÊýÔïbŽ;ÖâZéM4ç@_¨HM¬–d‡¯7Mt{7d¥C½ôŽ žôlc/Nh¸/ÝMÀg)[a¥2Ã'øè~ðß5T|$WRûn:ßgÜí[S(&�+*56]ÍT·2cÀjêâ,£Qü÷NzÿiSC£²iDå/»†¶·Û—§F©]&ID]yõeïzCüé�2õå“€’�mñ€ Ã¸§5®JA§_q5©¼a ±’ u«;À=ÁXu%v^SÀæ£øÖú0Ù«Óô6âw=Ù" I^íô­®þ·�–Ú:(ëoüì*@5/-ó�•¸ U$„ºYdý êÉ–Óc)/õ»x
z w&ÞßbFö“Õ¿`"Ÿ’þ“Uté�o8#ò,›³ Þ=¯á�ô5G®T0%ò쑼y*Ó»Þð�³n×T¼øö:”í ýi_Sÿ÷‹ÿ+„€¨�ëì€ú„»5œpïëIQÑH‚R€0íý|±Õ_ܪót Ã)õƒGtôöÖ¹öî ”µ‡õ²ëÕ(ÇÖEƒ9�óñ|¥A]=¤uoœ¯¸¬½ ÊzWååå->5¨¸t1EËf�Lb.‡µ-žËëËÝÜììŽÀãÏÙ¯î QB¯ë:Äwÿ½ÐRÎ0tès“$å tŸ÷¼ãÝÝŠKÆÜ‘4ŸÀ1ž¥¶cÀÕjÁþ»Ùúiƒ‘õŒ'}IÉa̽ç§
ܤŒ ºg3@“–Ù!÷‘€õT)Ó|˜Õy™-V)‡ ¯¿õa7åõyüÕsÍëŽïr€$|�¼ŒÖ¦íÁ˜Mžmvume€·OœÊ=ÌÛš)G‘Ú¯:WË!æÝš �óo§J¹³'ðÚ¨H�®ß±ö<ºVRZ
{çsÞ ãó2çãõòx³»kLü8ßÏ Œr9ÏŒâ
K’Ò1ì"¼w!ªÈ¥¤›ËRC•…mß⮆¾»'$³Ã
rc|Ū7_©Úï{N÷Òq-7Øm��OÏì ¼ŽJëFð=nžž·f{ïõüCA§.òÇxë+zåå¸WaîN¨Â*§ÑêEîÕÏ­Ê.SÂ÷u¬-‚9”ò ‹d5¿€¿Ëj‘»cü±œm&ccV¿ª 4\é_çå��ŠvÈLÅEò?î§{œ"[¿nb¶¸]_î w…ôGh5ÚQØà9§y=ÖŒæ3ª“SPЉO¬¾^ÿqý‡{Âs• êQ‡ùXÏ(&‹Œ™"ÈЃèÛ_ÜD¡âVe›esªØNqȧ8ø»»à… "Š­{rö_-u;xžM>Éê0}ý0êØÖMí¯UxPPið@qË÷q£ýNÈghþÛÊÈ�÷éOgí: •­­^€z˜ðvAÂ>ÿÕ(2â¬û¾'é� O> yʺ¿À’oé€[ꇀ\×oo?jYOÇž6W¾è—ì*r&Ô$å¶Á¶‡S�<"5¹¡UÃäj—£;6íØùx@k‚à! P»÷µ4q˜šŒõÉ=ÝçvŠÀ"Ë eç�ÃÜ:w˜Ì•`ì=�¹t¡‡(‰0u¼µ� œøz½÷Q½ü•óûŒûŠ_¸€Rl+ìHÊù[e¥]|\C"çFž�Spb-Stx¸Ø¡ž¶Èó”¹nÅ7ɸžéìqÊ·ßþ^Ê‹¾¼ÁÓ�‡ôÔ#LÃ"Ï ZUon[:€GúŽ:jÖb€‰£¹àØlú¯xÐa³ŽgnJPPËÑ0ï´µ©T¤â¬KªO®_ÐG#  {Op@Nég £Ï´èÈJ»Ûýƒ÷EhäðȰÁù™1XÐd(ƒï�xÿÀ»R­“e�µ¿ž·Þ<,"O¶ú¶¿¦Y™·U–6%¼äqÔùð¾Ž�D¿JTµ‡<�ñ\M–�™°;ýýl6ß]ÔB"¦¥ü¥Ið"QSêBõÎ'MàRƵ¢ý¡¦Ð€–è
+˜òòNzI”ðið9:Öå\'V”Õ‡ûyUë1›¸‰¼Æ<&@¸zµ�°«Ýë—ñ¼mÃ÷\qL9)ŠDÛjÀXÚ/þà \qèÛ¯u¦×û{`«Q˜Wù“—ÏÅ8Y¸ ›ËÅÚs¶…Îþ€'í1ÞqMÌÎÔ¯oéN¸À—œa´>A}âõž™øUàeMúú$i¼oˆñš4ྒ½¡³V¶+®ì�D³y‘M‡À¶qW}VZ86¤üw�êéÅ¥õÆ—Þ…6O{™b6Qw$®+:”áï3qkúHøbäJ�Ïý£Ï©CpÿV¥êqv$ÿ¦x±Ö"‰Ðkw2[¾P1†ïu;»éµ\Éœ!�Ï�Üê[£ïKî=ä!U`ãÞ´>
x]Ù¼29*^ùGômîwû<·»¦½Ž28>§l•µ×ƒ1}xçÛŸºl–=*2¾æö¼ÆZœÖºxwëzJÙQîÑé¿Þ'•·ç?‡]0¹[mÔN´"YÔêÄËïÙ€WÖ`8ÚÏã«oUОÝFô¢öú<Zù„½Rñ™Ì'syè¶Cè]Zm×›™§±^׋kÆ2Ùí¡ûÖéåÁýIs¿HmïÏõ‚Aö˜Ýš£ÞHi>—¯ÑÏI¾�©°z{ïõ‰`˜+Üm�âks;®ÚïºñÒ—|ôô‰•WÖU æeI•úÔ׋ƒÞõÄׂæòo®{Oé/Žûƒ™åÏ¡»¹z™Wß
ϱê1ÆŸ;™ÂÍŸÍ�N=@H¯›ƒjOª+I� ¥²€n5´‡Ÿ÷ °Zùpš1”£z�|\ï^§ä®¶Ú¥=©£qù|.c*ßT‰P·„MhP_ß^µ#8?Ú>%¾â?•;$5 ÷©Š"¾f`þââ�C8¹xeV8á\ÜgŠ‘¥7?~á¶ÛûØ+‹�:Ý®)»Ù€NDNúåO>y?¬éJËêà÷€«ÄÉd;m&2—a©€GAÕã¦Ò>Sü_ö"¿{vØz¶.l9[“y²Xk~Š•êúúÒ´}øÿוŒçœd ë+¨"?àØËŸ‡ÊáN¼8 I޾vðQ;øyOÀg݆|IÈíX°ØLíâó¼U¸Døzß ~,W±3ó~®\§Ýùdqww·üe±|0Ò³«i/¾€r�^d¼› <Ÿg
þ*PÚIZÓ >¿=©ÓÓ@4 ›h¤ò¿»í÷…ょHè}Ÿ>È8<:êeêòƒÜ¦åüD!“%FˆˆßtD?r½DȆ�±­å²âDJò tBq’Áçaøh®<ƒÓN�óMÁíéñ»Î{(žæ“ÿæùFw÷¥ƒgI^^£&àÿê„ggf–�îžµ=Y×Þù@°tª¹2­X1Ò®.óyÄ�üªPP €sÎÎË!ŽÊc@hØqr±Š'ø@ôñÃ�¬í(…RúÍæžk
$ C(Ó¯�Ñÿ¾8Pˆuwþ6aSàc5«¾´D¾µ—-Lí«v—jüF•«ž¹ö[ô•aí3¯NÎÇÃÙ’æ�—ìÊqØñ5ï§Ú³¶ó•¹•2‚ƽžlŠö‹ã=neGÙUðÜøøëý
�Jär±Û1͸÷Ë �çg —Öˆë{]ëš×ér1áj’‹6xãüÌkïä‰àá¹zÜüì©ãɯ±×¡}ïõ°>æ ùÒŽËj›�›`ÊÅz0L$ÙÚÁò¹Ë*ÿÅÃ�€·å“¨Àýª‹÷Z3×åsõ¢ ï^é™÷’v£ü+äó±–—Ë.šØö×Sgó2Â÷€à–°9âA�«L¼=ŸãG‹ï®Ö®®l¼µ\‚Äò=_žÏ¤<mÒŸF8TÉϬVož
ÁÃãüO†Þ—óàI¸µ B7}Ãc5:!PS-’÷ÖÝîžÏ ßmã“}ÆS§ÅU¹§ëæv}_†{TÁ_ÑËíÜ8Y½Úå7`ø ¥z«ˆPÇgwÞwË4g«w¦¯ ÅÕ®OZ“Ù‘GS[ ý5‘‡û‡„žß×­èÛ¯Ø')¨9.Ç–ÎV=žY2þæ¡ zõG¢"_<Ȯ܂DÇŠdxò<6Yî4_.pÁöH€­è8A0 Q àS÷JÓôÄðz_ò$p1S¿—>ä}ÈãÍý¨šùXí²¶Jz³µ$à Æ]óxY)^pðä×{¾…ëÛF}@Zu?ñ?k³½Ì
²üX½}â¿ÒÝ%A2s¼Ò°Ñ!?ñÈ%1® xà°n3ni €‘˜¸é¹û¬Õ}gÀ@–WýËIËU]ä~«ÿÙÊÕÃifµ(ýë>ÌšGn᜞W|Ð~ÏÞ«m΀aJ±¢Ï¦ë.þH¥(å¬Me÷ÄVýXÂ¥^€úcοžNŽxM§ã×0 �]…yŽöÈà|ÕÛ2ql긻¹8ð {^{Øšc.^­‹ä›ò¹=ž“áW]¥ñ9¿ÁlYz8«n•îÁ£j�û¯*àA*úy<O�P˧ ü¶ü—
�³Ÿ†à ù]�/(ø~y¦×3“ïáyyiæ?�(m­ñºmv«ôc®ydôÝ/{ÃÆó~&·ž èoÃCƒçË]û–ÀÅDª–Úpµ(œßrßðÝÏ£Þ8ö¾Þî<F�ÿ�¹?±’À¨ˆÿÏÚ€ìûmcµÀ“÷c­CG�ílàxY4-„¸�§.L dßk!·x^Ks_NøÝMÔ‡{õÞk*KãjµºûQ–Sž…쟸0+L,ñ#M
!­êìþÓºVî>Zsâ¥çzÙÝ3p%™Œz(JÀ#( íI‡¢ooºç^¹êɯÝ¥¹F•=zŸ/ò`Ÿ= ŸM÷׸ji1ð:tT¸gí¡íu2ÝO0çñoIÛìa=ǤÜxû#¾Ï/í Ÿ�›°'Y^çËÁåx�ËáCBŸ=žvŽëÓj‘•èa�ÇÎ;°ûÕ*…H“À7Ðuði&…7+÷ë“ЙçCaÿYû¡—ÛF<GYA;÷í¶_Ü^[SÆoIþD·§•Õ†"ð¡x&›à `×ë L=Žq�òö["äÖ»¾ârc�?eg’< ;ëc�;Ÿ»Èö—C ÿˆ-²X{2!�à=ù}»°×®öÚuuµ–ò|T ÞMYÿ.€è)WæÃó²AæŽsPРûikrÿã¸7[�âqÚ¬¥ÍÞ�Ň<“ÑUø·>ÈÖ:/�¯î7.0Aûƒ$‘¼öû™ÉÉÉE§i žG“W¯\vO¸¯éÞgŠN6€¶LAv^€ÓáXuÝRÈxTÜ¡î*¢¢Â<×<ó><fSóÄK®[¾ººz^Ko}Ük™NŒ·Ä*˧դå‘`Ë…M½ðEø‚Ùµ‡5�¡ÍHªâô��uQK q§ö&¬½_ïæa�zšåîÕå-m¥›¯ËÐñâÀá¥üYyú³ÔxºDûºC'® Z¬« ™ÕÂ5§1í¼38¿™Y…u£Æ3¹CƒÁEÈÓ8¡Äx¢„† Óö2¦3¢sÓµ0IÈ?å@õpKͽ¶*m™ &&{ŽÎïF½=Ý|ÉÒ�ùÝ¿&cåë2Œ«8~CCR “Ðø ;šãT'ÃUɃ~1½–œzgªØ~tàžêñ,‰ªÄYŒ{›ª­¹1[”(f-
t»ÚÿN;ð<»šDرíBá×(¬¼A¾wç¿!áfh8Ÿ=õ èâš?8ôhu)š–H�ôR'>‘R uc4Q%w`¤rGdØn>®§Í4s&˜à m{.²ªøïå ñ5œ˜¢šcý“l3;X.†Çl•”pxd�a/óæhŸ(9‡’¦æø(?˜Ù3/c.E²HÚÕ™\‚œõSU_Ð;"Žï²gw$¨¬î3{R6ÎSç†)¼v•Ÿç:Ò¥Kü”³ó�Á!”Ä)ªï ™žÎÚë|¢SÃ* —|ùÈ´Ò®* ÑPºå¹PŸ.djsró¶Óü
yî8Ñu–ê«€Æ<-Ü£N_ZRBš->Ïõ{Uø_kZT†ËáŠ�\°^ÚG†œ:�d-áún‰¦Šl%gÜ|s|¼$FBP�ùÅPóí26$Çø{¹8*ƒ$·Ê´D¢]žs¾§ÝÄ>+â|0«Òƒp×<¢¡¸²%¶½ñ¦!ßï�n“z½M)÷/"û亓äwy¢I\R¨ˆÐÁ3Á¸%Úi‡5Ôp}À •¯èèXgüëF€4K”‹ù„Ùþ QÌ3ÅÐ…Î*Z;D‡P!¬1ñ‘›Aïò’g%d«µ¡! &„‚ârÜþ†ñöNd¨B»9éÏöõÇY¥ÀiSv\AAµªqÁ·«TÕ$ÍÉug1FÕI!¬¹¼J“俺ÂMC‰Äà`DVcYã>{·Ÿ¬v�]ˆ!Ãå η´ÀÌæ ~B<Ökt(F9-^È Í”¨2˜ps¦øM3óïgH'*TÄx¾‹É$ÖÎPÊ:\^kb=çR­vTf`.§™ŸíåþÙs;zÃÅÐ8‚H<dÞ³ e˜ûWß;"QÄ2²øà :Bô†å6 wbâÆºq}XçÝk[ɳvFTÊÙÜuu®­ž_©-ÞUŸÂËBM¶òÔ5%ù¸’&€õK^“ĉP nQÎ_ºe€ÚU}ºDrø¤xµ`ã‰{=†üãGŸoÜIÄ@‹ü’¶±´‰Êqt»\åDI)šˆút °p¦;]ÐB"Q��I5„àN§Œ¬|‹ueÙ³ ³�–[b—‡·s¾Ý  ¢÷ßh±âÂÇ*§OÒmmm=óÑ .VL“Å­@Ôákü—“¯ÄÙ¤¹s#€Znßáo…Ü“ëÓ1j}kþ6¸½XÓ:Œ.Èb¯@mfØ®NÁ6´VÛø•Çch°ÈKy“bæ?ý½�Æuo*Ù](yàYÈd0ФäòÌý^�
‡Gã4jÈžÕlX ؕ ÉkÈlüxXóΈl¨6$­ÞD¹½LuJèï"ûj!Æ”NŒøkÌ_S=ÿIŒ¡CÕ¨Ê0ÈNj(7jvýÔq�JÎAbKÓ³ÌÃþÐ(î„Qš<•]Æè;´&Ô&7%³æø†�†óâyµaj‚DýEt�£%ÓTóMB�'WèÒWÙ°¯´Ýu¤þÈ3ŠH,1¶>îÉÞ/^#huÀ4Pø½ä¤êGÙüe bxGI«”€Eéêmþ]´�tŒ�Xh@©&®ì  åï‘�NÃ�Õ‡\¬bN©ÍAÉ`$Þ@20 6’[€Q ÏÅûœƒOIoP2Ïœ¿°GK—ì:;²Ì3£Ñ›°Ö¾€¢*SD±i±4ï£iz+ÔhåјÙ�Y…¢6Ëú®O[R‰Ý–'–vjôÒXóФô< Fmïö6›ÜɃìrº–$Eºbh²€PªcL×InžÃ¾15†Æ�<aÍVÙbçÈØ=_ý×îx"í7‡à, 73·°Å±C¨44^Ûöß½9ô(^ì5!¦É~PðïXB‚ Mb|Kר·j¿ZÕ¦=ú–_f¿ìš—‚‹Bú§ëË5 W½—ß”éPgá<&ŠÅ»zþµ…±îݵA²D‘7 `¡Ñò±[ÄZ8oõn¥Bk'Ð{³ÜÎ��ǸU‡s�M0O¿¦Õ»%ú©Jîjp©TåŒG›F%ûNÄL�1î¹T`|Zk2Ž G¿ÄX!Êq
´Nºq6ïJT¨Gzi/V)n ÉÚ{ñ€€5Ž~«`³ÿv"ÊY÷¬ŠDF»VíPq•gvjAŸŽ“G 6y/„ý5ðf’pý@‰}…f_*pv¬=bšiRZ²!`�Õ
\a—©$â¥c#+ÁÓÀÕ{_´/\È•ñgQ�!¾  wY�…Æ]eSh?¹Ò¶úoYÒuô²È•3b®õÊΫè`uŸŽ·¼1NëQ-Œùiç9£wxRô¨<ÿ¬Ñ¹Ô²iþbÿß ICmÜ)GZ´ˆg´¢uhœM¶2u#{¡ú Í«àƒ•€„íß~ÈŸ2l¡ÚœÒÁ+Ó³«°ÀbúཚíÞ/á«÷3ùüJÀ®ˆ9£úž÷^_Î]NfWCyįl¦ï^³y€µE^Uãwˆ%¶õúâÓr›kRÔŠéÿ²·ßœD¨Nü•3Ô8�gM3¾Ë®úà}Ž '„ìÞ ஜo%÷W@?ǽ|e2
oW�¯A‚îí¦Õ祹�†—SYoûçhQsDü¢ÂÂÂSmˆÉ9F+›ƒh&ÔNHrô™¯ã«+0N«OY¯ØKö?¥u5>šÆTÇa'U50wþ‰
ý‚»ÅÇ<òg÷‡Ë&·ÄÏLámË�ôwé5.tõ_œåZˆØ¤¨ÇÑŽ¬õœýL=w${$e1Ò*›í­£(:‰|
Bø«Úw®¼[ûEG·gøüœ;ª&íW×á¿Ò€J‚`ƒ�ÆŒ
Ò Éÿ‹é H“ iQIÿMg}aù¯ü¾ÔuÈG?F t&Hû_ïF �““Ó�u—$¨‡4E•¹©©˜Se^ãÿŽ,VKDÿ¿Cù½ÍÌvøù?Bè0ÄÀqúŸsª˜�S´[±ˆ‘RP˜˜šR®”·ûÑÏ =ƒ�ƒ348(®ÓL�ÂÄH|lm£‚DDD¦V0€‹\-õEðÁ[`ù—5Ù"È(ñõõu¬EN_>wdߨíu3[ò¯9r@¦¢orà_óïù``b½ÿéȱÇ©Õ"…†�aÐiãµYm1Iw#çààXfá‡+ëõ €ˆ).ýJN†•Q7^`ξp•Ïy\펄A"Èi¦nÏHoooyuœ­øCàMÈô)AŽAÌÂÿiŽ qÂÓZØö¨nTš«&̪òEÞ(Êí]ª² ŽmVšgÕ52Ú&ÿV‰k0Ókæ„�¼›r-I. äàçò.ÊÕ0È×]¨²eû,]í£"À}µ5´e�L‚)ÌPèˆ×͘:¶ý}fxóø„±Âœyq« I@¿8)®/ÈŠ/5œ$WŽ(¬²5oH Õû8ÊÈš¢ v²Y_¨¿WkÔ”ÎÝ?*ˆ—8xªÄX¡5N”#¶iè ÁN!¯²t¼ŒeÍœh»JdZ`µ]˜æ{…Òn�Ò�+CôÒ`ï³0`°( Æ*ui0º�œ™Õµ„?ŸuñHXYZ©X)72Z$h€$Æ»V�¤²g¡£_OwöÙŠ%ߨënüÙªº;gK01 Ì FÄ$¾Ï|’¥3»¡£t@ˆÔq~„”�–„†bFÌ §`tõú�úðD_¿Í? ~6'|~|z¥­½×1ï.Aå;¥–Z}© QR_†¤rùlSQL»ùÆèŽ%•…!¨Ò]2iþä-²í§Ü(ªãÛG4ÔÒþb”ÐîqBÏ5¿ÍüBœãúÚã5ŸÔPwµnö�‡P]C³—�¤…Êõg•‚:+…xX!•ää»z¯ú–Ê¿Y°ãÌ’$öÉÞ×ÎpW {.¨Ž÷Eþuíqß �Á yjDM‚;62U�º†RKúÇÌïyb¨.~Ÿ3ÓÞ"¾+ÞM™0�hxÚ‘#Ô¤,©?¢²õa(®_zIá²Ü�r¾ú=šböê­#‘̆JU»8£ À\tê‰c;D ”Ö}gÜRKõ¿µrà5ÜG‹Ü$çH´µóKi¨l3¬­þ¶®8m­’>›g
×*q­äØnûžo©âèúfH}]J¶©3ß¿”»Y‘$nvݪ�æc×%»\–6qÇG«ÑËfÑ½Ô”Ž²S—Gæ_/“r{´zj‡#P–èÏÏI|˃¢7¡7_Õ+…žârJ“Ù†¨0œp³²({²ð¬ö|¶ºÓ¥áuRú$4÷Ž#ކ&h„R‡êGÄÞDwçA�¥X�äö~Nsû™þÑÛïÿë—·ŒÙLÿ){žFC»I Fë<FrŒ uGqq·÷µ*[ÏÁÏÁ/oI"[ÐZÓ<JÒCÄüæšF›Ò=ähš¤GSÅÌXO•†1â?ε®LM–ÎÄí|3TùŒ<»tr�L\”ßÇñ1J‡°˜p¯R†ñÏ󟺆òèÛŒ·DÒ˜é�.{Ý+ÓtÜeßÍ–ûÛËŒBszÏÚf—ÝEr¯NBŸ"@öɸ£ô" ÙŸQäÔÔütonw7µ°_OÑ©ï°�8ŠKJKtZ[fZyÏosÿf�L°Or/ææV¦\S{ˆíÃoÈÞC PBVh»´¤»£h¾ý^¤�T+>%ìÛ¦#7 KQËÖ&�óæ2
ÌæNES̨þ"&Ô|GÔö/«3$>[Ýw×þ_„–ù¢·Ž<Ÿï."n4F~ÆÄ7s$:YÂzÕžÚã÷·Z$
¶%$D,*]àüŽë? K?gÕæý«Ìò�[„0ôQ¬ñ" ¯ž�«ÖåH2ÔŸz˜ÄÍW¤ŸSRôYíµ6c$„Ï�èhÑ�W® 1Îðƒ›D\|¾m …tØXho ^^ÂØßÜ|*Ы¤ÑªJ�h^¹ "ž’é ã¦dÚO®Õ{J
É#>(aÂ@1ºAv”g)ŸzßYqZ÷Ê`¥æ �ÔyŽŠÊw‘€ÅÅ5¤c­´Qq-ÁñS%¬ÄDmPÚ�ýØÍˆ—_¬o•™ÝDŒ˜�CH®Î(óŒ¼ X>‡k>×{^4"…zÙbjT÷|=�Ʀæ É�3§ú#uõf÷3™ù�"Å3{å® Ê,ýIá[LêÙ¼îõ•­ID8ÉŒÝ imâÂ[Ê/KkJO>XלÍêêMïGdÈÏ©û<D‰a�ïOb:d­ÓHÑXÙD¸D!&¿±‘U ´9;<"ŠÁ xñê…¢¤Õ$ŠÌ•ŒŽž²=9'¢;&¡hãAulC’!Á&�<ÀqrÊ6õªlD.“zw[ˆ~‹%¬}!‚mEæâG¿ª£¹Æ(¹t¦&Õ�áó ‰KsûÔ”r‰$ç�Ã9ÄW3ô¶œíÃHÁïÓ
¢-‘ʼn”½ƒâ.»œùR’+X¯Û5iž Ø4¾§©?YVq)¯¯m4~<MkŸö÷ìÃYyF×sÅ åŠ}›ÖûÙkhº¦sl�ÑÖji¬_&�3cö&]3Õ8�M›jŠt� tïõÝ„û5Þß,àÍ¡¶Æf!Y¬Q!2ÜS„Õ œÍ)¹ùŽKzÉé49ò¦ª¥ŸÇj½:À~Ø5ùµBõäΊ]4 §ku Ú
{îíúEÌ•-9ÑjQÒ, ú¯îÎÊe¯? e_3*•×e­ ß ”aJ ¿¢D ÑJ5š-HcÃ3»·H|`4˜Ýã9|Þ%#vÑɼ½k;Ø72ÊÍÒ:Âu*]AGFèz
ÑW¦rÝ&6ÎÞ¨¬»—å`0ÔVÒmøÃÓgM�Édï#r½ÆFr�K`=Ѱ7²Z[»¼]Jßo|¦º
¡¹;)vö™Ô3·Põ¡Q~ófóñ„[&‡Õ:"µ:Ö=4&ƒìÂpI}ÊÑ·¨>Ñpþ É‹$ÒZK ãÁ²¤Ž«T8P 'W¿ÞƒBYš8Äk7^Î�b"cƒP¡ÏÇ0üWýŸ™íEöc±˜,ú ¿XVÎÁáCGÇ%¢ÑÞJéË«TÊø ó•͘2”—|\�ú´o�Óá3™OúÓ7=œTéS¦ÿµ,Óâ×ðSÑç�ðfæ{™sã‘Ä«x�ší³�`‚1Œ©$T¯¾ÞšÍ*á^�‘Ñ¥üB³ G2ºh?Ö{ãá„ò¬*áááëâú£Û%êÛ!wÛ25—–R…†<3�Þøañ±˜í¯COõx˜VO¤Þ ·P¿Kòršß@1f¢»7¯X×/…Kè×`4¯h�ŽV­¢Å}I�û}¯¯ÇÖ¶dŸ$1lËkPC\›Ñݽ´a�:\UÒ7twý±WŸy ¯­Sùy´¶»£Š½q¥ G7E�üMî€Þ”Ý3#{f‰¶Í$³1›ÅÇ:ºøÌŸ‚ÈÈè+㟂6Gd).É~åœl¯‘6 ß¿šÕ›ZPé«yUŒu/ˆ+  ©Ó9j.$A )}ÆE}ôk×Ï«Š[^ñŠäm¢±‰öD˜Äe[=ï®MÙm6E
ü¥•x±G©£|¤Dš™›õ^>Úq<zy…Q<à\{E¿bBA‘Óá+Ö»ÜIBߘKU'îˆÉ¢·.‚þÊÃ÷g¢¾kã»_Ör�*£ o<qŸïnÀ캤ÊHŠE0íqé‹ë#¯4I1b•PÝ󊈳>~³B¤ûA®¸O—i%I/KJEdß(ˆÄç:.©(¯ùÙ#’"å³<©âþÃY¦ �¢|G­uÅí¨HÕ¯[Oâs(AôÞuYmùYÅ
‚ÖîÍ* ¿dD@ö‹hñߤÔÌPèVmbßׯs2gr6fWô‡K”ZüY;­‡NÂ=!1NG½šaDÆV®w×ëév6®ïÁ˜cRHT¬äù–Ñ–5¤ _çïd@¸*u�úÔA_”Ëut¬ß½ü@gZ!•*÷×¼)f¼~Ç-�—N¢¸©iUÿ†ÖŒñ§Q9+ÉÌâ‚ß…q(&Ì\Ð/’eNµ„Ñšêx`'Ïš__÷O¶Ø)ZÞ1 £Êr*œ¬ÇcÉ#>O7;;D¢Åvt¬¹‹v vŒ£@ •8mÔàiûØòͱ´ø…V™žš(ë[ žG·¸<ŽÀj%éÅ~%0.ÏE$V�ºZ©Â …LGC;J°åHõÞ× pÆbûhºñÔ.îʦì*Cj.�pK™ƒb¤Â6Í>à3£LÖI¡k
gg!©ÿHO€M ôæ,TáúBCÓÎÆåË%–*)õ6³…Ô’€éÍ-a¥~ǵ,Ä€sÂè�<N9â·TóÅÂË@ %VåÞÌwëæ¹³¼9;ºÖ ˜QO"wª¨>;zø-"ËòðÂÏK çÈ~ɱ¯aQÏ£+œf6qD8ôp*Šy{g6ííÙŽâ;]ÂÒ\`ظîx$š/äœÜ
ým[‰Wµ¡¡“ ~—8Sa{ &å«Ö�ïÏ
bµ óõmÜÙ {Ÿ
¹¾  ¡¹7ÿăN`Èí0¥#êßÚJP>šêõ(+8ÎqÖ÷i=j¨_AŒ� I‘ ”J/oÉÒÑ•–†kœÂ~ÊE_
[¢~¹Z~¡R0±§<ÜÑÇ*u¾ï9aÐXgHÞÕ!€—oƒ“ü.Íé„É3#rþ*²�.©¤€.¿HT…Axõ1z(vW ¡†µžÕ†ÃãƒÿTH“—ô¬‘Á`p5úãZ¨Ôè(äYr¾ ú;c‘Û1¼ÄööøôćGæGpkþTeeaîè¨õ”`µ¾‹)`]"ëÒÕ’—3ú7%)is•{(ûq:‡ö‡Ã�é_ñwÄÄm˜¶/r}r?»(£Óœ¹–”¶Uleb!xÕzšK*AÀ€ ©Ý£×/&Y ·ÞËG¾ËÑÁ÷
¾K—+Êî^Ÿ`ÂÔI?é|^”Ã\•Ûv¶Ïd;é6˜U< ü¿×â¸6ÁdêÚoÖ‰
ao×õž"Ýx¦I?�Š~’Þ ×o#‘Ã�/¼}–A¯UÍâ6�ÔæÞÅèåÞGBãÕ§†„KTÀ´u¨6”àÔF�6Uoߊ5{vh@¯`*úoÌu³7
õµs¥¯R5}©0CÞ=zAw—Pë#!ò�êü´ž®šß$±B¸F[Ê5‚ZMÎÖ4lvmTaˆàãϬiµõ1°X¹]CyÜ`¼„[« iIýÒغDœBP­d§ðîõ:¥RêĬ… Ön¼ûR‹ö¨›3@ÎM0Í" ìJõp°°Ä\€ÌsiVûÀÁÏ–í{œÏàr?¬;½‚~Hµ¤%Á¢üÃ=þÏ»dÈGÿß#!Câ.ï t³ÌlR¦F£×“¢³’¬¯ Å+]v·2ܽrº‰KL<­û5øßY9]õº Ÿ«²~UiZ‚ôL6›6 ™8«„jU|äÇA3½’þ%ÌðÝïkh˜ %Å/‡À%ªá÷¯Oß+^Z�#^iJÃaýÚð ZÙž«ÕÑÙ¸t%xµ„Ü‹Ùn/êÆ«ÿõÅì#©á $;ržm„²ÇjöDBtðÀÔä‹4€«W@zq›¤ –¨umû;(HÄéÙÝÖF29Eìb—ãV_9ÎÏ¢±ý×ÒYì!hSX'Ë«×Îsƽ�ÉÊeN=Ó›ßõï ÷÷`^_äa³þ]3Ú­bR{n§�ñRÉÁÿ!n•cšðФð—ñJ=Y2/²¥ÑfãŒÏx= I[Ãa¨ä÷rUõ‹ÏoJžÑpÈP\Kþ—�°¸¬�)ý`9|ã~0Hÿ�а0¹¸¸„……ßú~Y±r³„8«`€Ã^²i÷?콞ž�éyxxþöáå}^ïôƒÁ˜Ú®I&éâ.{!fhk{0`Úîõ��Ù �€dßÔ
%D#2dêêzß‹©ó¼›bÊ’9¯¥Ñíj7•Ëáòò²ªº:_ªSJÐj©[€r´±±Áå°{Îu`=fð²Xn÷Ñ!EÙÙÞþ§Q†-ÇÇÇ„ R»‡³ÅÖÃ[ÿ6
¼®ç_" [˜,�‡'Y [ 28D�Äš(jÞÖ²CXùÈ“7ª�0^©ÇX &n4%*ðÿ$ù� 8À¦
­Ž+J:£‡º8-ºzÖ˜’äØp€[A1ãQ¢%(ΓU'é~Ýg¬`olÕÆ¨Œï u÷gÜeŽJðê[Æ¡¿åÎ�Ô–…V–îÛ¿…èNÇ6° �ÃV¶RÈ� •2f9š
 À�3Š>*‚×÷hµñURÈEÅ¥εý6¥ 5> ¨9؆¿ÂäN^;ü`R»|b }»Ò¼ÈÒ¾ 6ó•\"bnŒßT_ݹ72Zú3Ì ÿb·O`�MŒY/OE²àÕtê…ÛAšÐlÙ«¦Åc²íªßì › 7éVýÜ©§Hr§3I1þ³)ìt)‰gGœ e•,ö‰û£®ïejSøù––|L‚(]Ü+“Š”•¸ir•=ÿžÇŽ'‚Ýïpõ4ÖN™^vmMÎfŸ„öh—+j�º&÷ÆV�Ã(ðÑ)‡õ½ºZÙʲÈg¯}$D®`åc^u\O˜²T>çûùB] Ìre¥@í(Ÿú�£²åV¢” ´—Ç7„îqaה͖�ØñßÞ£?¶ÖÿŠ,âÜ&¬€K6ú‘Û?£iáçñ"áñö¾žqh5m¾Ü±çÞúHÍ3é· BA¡âL!þº À÷Øß+*YµNÄU­- q
XΆó”ß?ùt¹‡�yFAÌü¹_©²)ê�ðÚÆðáÉ­ûšÛ»–ˆ‹Ãâ {î´RV泞ÍmîeýÊùÙŨJï|Vyv~{'ñ)§ek4nÈo¶aÉOY·‰èyËÇa¶;ÕZ„‡¹IpÊ–®åŽÊàŽ›tü4~Þ¹™ù´XÇîˆÚ«Ÿ+mއӷãHžó˜0£wtxû\÷z
{ÔôåeJ£)�63•{~
4Χ¥ñdmH­öEfsD{Q†fóSGlÏÛ¹ØpʳÖ1;ÚÇ™Hø*Bcb«é{&ô%éÂŽÝõÛË�éw¿ƒZ÷®‚4q\]U¶‚½“u{ûjÛŽø'ÝÖ»ÇnÑ—|Ô4pç¹à”ž~Ý=ö¦¯Ž#±¥?yvŸâ[�–
qdùÒ,? `R ¿‹ðÓÀå9Û–I¤×ì܆‰p8�ái_e >Óï¿o¾ „Æ t99h¢!VŸ:Ë)ŒÉ Ýóö7™ �Õ-µì³êgRèOÏà\ÃÖ² ~ùôJÊQŒçóçý`Æ@§ª_LÅj>ˆ°G DŸ’åpN¨ÃáŒS¾ª„-u@#–�nŸ½wÓoIµ~53ž‹1ƒ­Ç9>5uJ´\Õ2³2µPP!�\n‰ÓsoÜoتÀ§(¬É©çpÌTÕ¾:�mé 6ý³Ç�èž_6_Éáê§Ót^krg½âR°qÞ²Þº¥)nff:DG§¥Lov¿>Œºðö#¨Ì§ÉDvÏj°OçL›�£a2¤6��Ðùx�æEº{“³Þ¿žÁÛÙv-úŠ#€Xŵ±Žd¬�Æ<…/�9>¼v]½Ž<à¶áyÚ¥¾ŠÛ‰ô§ñeðì�$9ÜÎvČ߲¦7pÛt3¡Hlr1à/MOÔåëí–ß•!àÅZXt··´_šuŠ.:׋{+Рö¬Ü>æ#â</Wšy®!hr9U\�]W˜ªJªð[ÝF“X-W틯Ëysô x´æ—€|f¨‚ËtšÄj*_§D¹…æ€þ.çòx?ð¿
èš®)øtoý[9„Eh_|Ϭ‡ÁŠå°.v«Õ„ÉoC úÁQYn¹'›û��ËD8[.”P°—`D©J”RwUÉ¢”¡ruË:4ŒŽÛ#µ:‰~äüâ�Ç;ÊClÊZõ¾¥ÙyÏGë®Qh`å7:ÂfGM%Ý–YÈi|ܾdûÙ‘®Xi*í7“6ÚÁⶺ·™ü¤"ƒ~Ï(-u?1Ó®Ö˜u*væJª œðYè¹1M†/Õµhj¤ÄæÔ.©Œ#,Qú¤›o%)ØÜiãyÅËååxâaÉ�Ú§’l3ôÚ÷*m/`È‚#àúÓèšãýþdTspØÎÔ¦§ÍÕ�u¦Ãž{÷eYªÀF\‰:º¾vÙIP,FK½—UOGþ³›E}{ý—;ó§�êzTÍûåÙ%‹\Çü«ùÎ9¨zw”ç2â�àúv¶$åæÊ0¿Œ¿Ã:3íaÆ*ên®É«Ùl½’ç‡h3ÿS}í§èãÊðG„£¿øðO’ŽOÇÖ³MNZH.lñtǃ‹Y0¬*™< h‘µZgdQSIç¶9±œï{ò[gÅklí^<Tùç²n?­QOúŸ‡nµÖOöÍõ ”Ü27T%�[ÑH“nFØÐÖÏ&ÊÕm ü3Öa í×ünŒFvc¤HàÓàŸ[[‚ýõÂ#KL9îiú½ì¥V­e•jÖÁkíwRýv(³L(ÉZªƒ¬GRZcJÛøâ…Y"†ˆG+ØÇµi9lO…l³¥0TÆ2$X8J‚˜nMúªº‡cŽO[·�)Ô£2dAPà©äNyHñv`ìÔ{Ï2¼VXêe ÝF¢_,ÙŠ)v9ÖòÄ——×MA¯‰’>e›{÷üâ¯Ç‘ë�„>%ÓåîRví¨_B�†+ÖÑVW¦ŠU\nÖ·Y;Œ¨¹Ï»ƒ¥Ú žoÆÞ)BºN?²›Úü­sµÖvPYÍêÕËlö.’Y…8W¦ìÊ2×Òn€’üMõÍþä$Þ®³O÷_t\ž»::¾3þÉÞniŠS)�8ŸŒ’gë6»“>T.Çíuµ<½ ø&¯[ú‰ŸtK/$ýödÅΖ ŠÜG�&Ä·-Þ;(;c˜š|ËçzùWü¹üJ”“Tsà¾vÏ#˜hR�Zl1;"(×!˵¶Öv�ãbõBÅ&àwsXÙö`�ßåÈ
Âæ€dRàRô·+p>lï‡ô‡cˆ[ [0ª“²OáÔ²×NK"BvÓ¤G�!¾ïŠPMÆ.ÿŒœ—±†úþyØÀŠ-v
Ë¡!p�²7&£<é,Y«JA‚"cQe~E@¼.úE�Z˜ŽÈ®ÓÙð­JÏ…¾Žæ=ZÞÄœÀÕrƒ½ŸéAKã`}Øf«×ÅL§ße½§°?òJ›��*³Íµ_�1ÝRÛnÈ’
=²Ö�©çëíÌeøÙÉo¶nWbK‰n§þ\8åÁ®1®lǤ8Á­†ã‘¬ŽÀ�\• Ò)W«45ÞÈ‚ú;:FhiFƒ>Ŭâ¹rÔ «KMLíBÝGyi…RKÅòþ0£3+®µ
›5˜=D)À )·U8¶I1Ûˆˆ 颰[ku²¥sÚZöj›™Ló8°?s3z^"{s $Ýô%„g¼nOøvkäe®á5|ÝI.õÕK¨’nÞj9[•óÆ90Uoªtö¸‰Úš¾E äw¼¦ÈˆM8ŽÓ+óqιò¶~ñ§ÊMk(ÿ Åk¥\®íµÞá;AvÖz§Ý„sÕ�“~l��*MÙ”” íßV]ññ‚@NE—3iGݪ-†Hq`ážDÛÂ�Ò¿h®LoÌ‚ 8º< Â˜Ô‹ç¹½Ø1uª@–�£ód;h;¸^<Æ¥,í`]¬)|ƒ%¬BPî[8“ú¯þ´Ní¥Á.œì0J擞2yÆà4€Kô¾‘Ê
ωC6Ž'ÿ¹UK#É“8 Wå)˜´ŸZX›8ë‰ÃØòyn¥Ø9>!aléìÛðfÏ-ß0“t³Œ‘øTóà …Zkx$kýo[©Ý8�Å)oÖ@´œñ,R°œÒ'w�9›öv£»ÛÞìBzF‹‹[¿*IYü£ãc.»}M䙸’ù&#xá¦tŒ¶–é¶½—BŽS1öSíÁG™Ëfd9²qìû•ø–«òæµßè aWÛ£›Eéb%j°mFsÚç5�VÝ|ÍMwDÞmn Çh$íšË¾ŸSà½Ïƒy]®ãÐÒòj€Ä×þ½Tã;ð‡úÚ§Zg¹°Ñx¶Ö>þÚ`>[¤VÍüújŸƒÿñS$·çx¸@å5Æ”beòWú —‚{ΫJÑ‚‰£¿Ám s'71rGÀ‹Í�ëõu/pI#$�nMž‰êGg<èÚ¤IõÍ;ÿ_ˆ=
8± ï?ó ¥jåiÇX?y§÷ Ðì�\¨Ö~ÜÓ�<qÕÛéGÉ*(äˆm“x㣑±9óUºn)BvIVó<¡­Þb¸ªÑ×:0©%krT^|ô§ÒðOŸSZ -ïõ®F8}CÖ ‡ÃŸ†fV3�ßT—íÁ=JfNðŸÄyXŒÇ¤û ë‹lÔŠã‘yŒ§–û£œÞv}`aêV¤§—Ù`u³©ÉˆÏn$[ù2’#rV-.Q ë®®òJæ¢O«XÔ.Ú·ÃXLåÞ¸Ò•!íe™‹$
´7rÓŽY½:_uq„éù góŠ@­:ëQ¸VàÚG f›^jñþÌ«VöÑ ¦zÏÞ7€³´2é¶á\a«ñÇX£Jár9?Á"ùmš0•æG(Ã¥bå¤Qcâdn's€KÑ”rE
9 QŽ×Ì>µµºDækqØ­iÀnF5mÊ´<Ñ_ö6˜\CÃIyôÔ­f U “Ú ¸-ª8àìlK›'™ܽsÿ¢*¶º€W×5èÔ¼<z´°[±c²Ø\6HcHÌ“•>Ý/OØÿJì#Ÿ¢FKtØêè/‘Ý.ÓnoùTVíÀaµvx”òñ¯! �–ª»­Å–/nk'ϹšÃÞŽ|þUL¢±0BË¥½‡�çöíâI­˜tûèÌPGvü7S업ȼ•VÙ� qEíþ8Lë»Q [ž{üÇ¿´oñ`'W%W9²–$@*À4‰ç^mÖ‡A[ëf-»9lÕûœV)ÁEód‚ð„•D�PF’Uûžrà ç"‘ðl[.
"�’¬9ñï‚ Ú¯žãgö—Ä/›™\ì¬Nô�ªðBîxÚqè!22‚æa+t7ža—7S�Ú œy”Êa�:_z›ÑmWqÕ•›;[+×¾ +3ˆiÓÎg2Ëàl•L¨;ôß•ƒ�á\T\|¥�Úr'$Íþ§ÃàÛ‰sc8»)éoH#sÁ{F³ŠÐ–[¦DÏÐo`ñé„Ó娦¿FþˆÍÕ}à˜¬ÌBµÓfgGŸXEž•!T0±ôÒ=`¾Ñ,m7Uîïd,s*˜­¿Qa°§”Î÷Í™ð¸Ñ4ØV4gÏJO!4ßù/Ôi~mÍ+Û—EÉ“Ÿ19idŸwxl(ˆù6l•P≸Âù×�É}6þ*ÿñlù7ËîŠg[‰óŠ=�9çþ¹
Y,­êoÉ=™ÔÐ2#ö ‡Óç\Vƒ>ÊþFØÝ±qÇ S;š³¨É‘$– (žñŸúíÒÇ"‘(~ðÜHp•Æ‘3LÜ…+1<ìp Ù_xÄt‹¿Î-‹íh·YˆU?î¢ýgÙN<šÌä@>Ù+)gÒb_˜Xà:&EÜäežh¾òÔŸ5¼>ú›Ã†ÚÈÞøy—äŲ±BÏrû±Ùº<,†¯5¤í¸ƒ¶0wiÙ—w«4ùOˆöG´^Kô´¶Ÿvä¢s8s“l.dÝ^,§ÿò¥­Nѵ[
ç†b\If³8˜Êà ´[ÆE#ý3Ûù߆ßÜb_2¦Upñ–H[OÒüÄ=àÔßîÔ· Çï7­íê�³ˆã®M2¨QW[ç½Ñ£ˆp7FB†7ßzòz–%
Ÿ¿“Kÿvx´ffFDäŸ_˜¥^›Ck9¡®ö-¼°˜ìï6>¬•y¥s’äDuìÀ²îÐÒ5E2bÂ)� ŸíÁ¼ïmqcŒ‹r¯—|¶ †àÞj�=8“åm^“ûXc�Ÿt†„s FfÛ(>¯«µécÈá%võûæÈ6䳕êõ¶³©u$'ø½àh¾9ž±É¥©Æ¶Å饭‘惉N‡–T Ë úVr]v˸TÇœƒóe­AƒÑŽ\�Û4ÜäêLgµ¬”]š vüã܃be2÷/C7
ôŸéÎo�GãéS%(—ÆèÓR½Ÿ,Ÿ*qY[åÙCƒŒÅ0ÆrHN`"âøêâ¬3øìùÅÉ ¨È/XìK
O¯•Ú¿Ó¥´ŸOfÔ²ák4p,§ýjÇ¿è4èL�ÆP8]¸zºÅ§}­/|t1Ú›ˆ–•åT¾—åšp8žGˆÖiIC>ž-žå¼Kº¼+”ÔÛá:�:Kµ&�‹m Pø®zD=dL®_#BÞÐ(šÃL=j®…n1­~ýi³8OXVnã¹v!Ëß+ÐW©+u.Œ¯+,„áì>pk…oÚ.õ½EM–¦XBqÝè3pl1›TnAnn®Š"&Çqƒe)á�¨Õ—¥¶æÖBŒûÂÚÇím–Z-3Þʽ~>8eEzš´xŸ§©BÙ¥ñ$i�JÑ®`bˆظBŠp<åÛæq˜;�ßF±MQ¤°3[œ8šÂdÛº§(ºç�Kê¶7—]"Ó—Ò\âÜ[Ù7ÆG¨­£Ôª.—çGñ˜_>¯Æ' |rÀYb�ˆŽ©>hèË ý¾é‹HSqaK7}¾p[sBÒ<ãrʺêRJnÔí¹õWúÁŒ?€OZO9×<nÀß˶ÓVRvûÚÑ¥u”N2jXÚÝŸBªÃÓžVÏÌéãFQÎãáOáwÆ4+Ó2> ;¨œ¹î-Ë"Öz©Nók5E%¥Èú†“žµ$2úðµÞ—Tëï<ôÌeóÏþ–_?oF6ÿ‹; ›‚DãbŽ9þ%«·WÖÓ–2¾•sçWyß�Åé±×ÕİV½{+ãRâiuŒ‡ÕáMšüy2õ¡XhZ¶îÍ�’Xé²�"Ï@Ë×+
k‡ÿPŸ‚ÓÒŸ²4úª2Û¨ÁlÁh˜2Í߃h·*¨­Jóã×__þžÿz;nÙ»k…oÃv‡‚¬ud. ”Õ44°hl'UTX9Ò+í\v�Çù6¶ɰúvw#ê…†‚ÄI;3뀟¥¥_ëŽg6ºOL"�y€3ÞyZUÕ³•ã[>ΗÌj°§?­‹­ëQ±B¶‚éoÓ�0ã+€;*d!Û9³Z«¡õ�é±N-q>c DJ‘Á›ŸŽæqŠpì+µ0z¨´� L’k’’hm…KèMñMðQ˜n/åô8>¯Tè<Ò®5zZì•»j/×ÞoÁ¹'‚@…³æJNÛlþV=íAE˜L:ÊÍwsS�‘i‡/-WoÛGY·V>­íf˜sx¹¯ºµU»ã¡ÔàÔ{ø zêz™�ûŸ“Ù\öûŒr’¥sí*¯%_ÙaŠB•Ïw.$Á¾éÝ0câìÖ°R\[­ÞSÎëçÌ OÁGèÛÃæwàªûõÕº:¯½@ûü±håSWt.{Ç|Oò×|â&»L–¬ÍÌœ{¶Gw¨/ÓFð9ÌqXä‰QŸÞåô
£¿w§næ‚/a¸w�%ü…¡ýLW1€.ßô¥/VUbÕü|ðenwyí9äõnâIÿQW£ZÇûaçç8¯®ªJw=0àuq\lll‚6Û�.šòæ"üØUÅœ�Î_¾`Ñ`•öZËòç µ ýÙêòffò[%—|NŠ" ÒâzÜ`¥j¹XKÏ'šp9- Qºb0[A+ö7Köe#OC½ޱ‰{ àÕ±‹ÂÛ¢RßÏî´¡ë¬_ ™^%Æ%�qo KüËAýú¶èËÂ4´7�4
A¨¡°8\�BPHûÿ€½¼½½ �€�ÛŒ|ÿòrgÛpÀÏ’}ˆ~~~îìüFŒƒ�-îÉòèz^Bj¯½¼½½›–.]ÿ%d—FŸ'Àöº1XØØv�šÀ;Ö[ÑDZŠPŒ2ïßvÂ1´œ'¶?­¶¸�ó^IY[[7iõ³P[ú¦¦û9öÈEôèW~ý"ö?9 bYZ �vo/]] Ës`ý/ššš
tjss3,˜BÆ+üüñ½Ã p;(H*#ïÚ•÷ît—€ð´º-†&&˜hhhèèFS*î vð_öÇËÎpâÕÕU¾lFz||üén‡+0Ï�‰v<ˆQ¥õÞM2™ZÁƒp}¡ )l<<ÇFM…<©Á±1râ÷éa=‰�§`||OŸhŒnHÂÿ'IÒâæðx}$sxx<†ÐfJÆm�*u<oà°ëÕ–à$u€\ý�3y}gçzûÙZ¤¶#ãwEŸØX¿l ×&FF°ï¦pØäAØ»ç5ØäCÄ8DCCM/:ÖáHS�ŒÜN#Á½Ëí+?Zmçù¹­µ5½€;‚Á<óêÀ€˜²²2ð÷��Ç0•~˜úÖ#áIZüšÂZ߇d£3ŒølrUÜ¢>ÛýJžÝÒÒÑÅÅaƒÁ{·G¥ðÙ‰<8::¨­{XZ³gÙ¡Zdw˜¯ùüZõúÜ.”˜SΦW =µ %–B•Øæ-Òùؼaäÿ
Éë0r¯ú,Üé†3¯”~!îúêùCüd£%‘ÀòÑîž„\€Õ¼aïüô�„}öz¯ƒä}y`ýøÄðç†Ñeç»Àé•HŠ8ëxúUö´síó$�{$h#†£Ý£ùÈGouŒ”‰Òì÷ÆÒˆ�S  ~̾Ü,Æ�%A¬Ï�C™¯`™¦ThÈ >\3ôê3éüæ\±ò¥Ð344tu�ß±o½¢ù—líÈîcw­ø@BIÖ”èÔï‘(çõÁ˜Âøüépö†óf%l¼­ijÈG ¬Aè­>H²¼a¦^ç䆙ØKµ–k§«T¸üs@Æõß:Yo 5¼Ù˜˜ Þü×{e‡Ì¿Y* %‹Ç>%ÐhA’IJ+ÉÂÕ0“¤Ö$Ùµûè†�Ü{‹Sçßu&&¾ÕhË»væ“gôÖé,w.ǃ´öç§èìÛrðãŠ_ªICi‘�—Þav\4É�jŠ]?Èb,û�fsˆ­ŒÿèðÅ-,á{SίdÙ;7êÐwù­KO(>lñÊ÷èÆhnz*0LQÛŽà�
R«nÉé¸ëæÃtÙŸhá[$ßšaÀf·ü|¯rë„¿Géxµ ÿ&Ú…vtèÕ£Wu'˜C¿;aõù9Ã¥N+�>¶øïèøÍóÃöd�ަãkdÞ Cna< ©¨o!r%v7Ók;,U62¶É'²…JUjL9I—µ?š.ݺg˜ZŠ•V,l>“*•†É6Ãm§ô(³â¡=—É.B2�e»ÖõßZ{—ÿÐ<µjÓ§¶n¯¸$¾OžwIÍ> þ&ˆ°œ+‚®µÆ¤>iÀõ8ªx›/ ÐÊ ‡Ïú3ð6ßè4Yò½žË›�ÆÚP}3ÄÈÁÇb ëC†ä�:²*ƒ‚ÄFÂ`,j‹Þöap+Òº·¯Gȵ~E1û0™Ä�Is÷ØÆ)>Rò‰{¥ä)K¥Ù9ãgj«‰Øw9jñ÷¼øÙ³ž+gÉañ|ÍøKíÂ�ÀÅÜEä[´ÇCÓno�ÛN\íºœªMïÈ—q$ïí;{ÛíEÉ£»ºŸKiÈÑR€uÛvaè¾"Kõ$åõssýË fùßÅì™]îÜQˆ�£«÷ÂêAdèŸÌÄaO^³d«ÅD@ÛGÎÓCÂdÙ�¤âþE9¹¡mԃǓÇ0qW›—£g%>µû»{u;‰ Üû½ ¯‰>ö3»÷G~©{»Õ¸e>èHîØ0¯ãí/·KdW{ãkuVM‹€ :ÿå¤#9Ý øÁâgó'û¦‚6|£Ÿ£ùâ˜L9×Ô¿Ü@/­ìõbôtäÄ…šÛ'ûv‡IŸ5 ÔÛ4’9ŠŠ)iÑP�¸l¢‰{kP³xÉ�ó÷U(º[ZÀÚµÏOÌÑO‘í‹v{ þGìVˆ\´ye/<í ÷²’È®�šÞÛÑd@ñ‘”
�Y…J‡fO‡
]U’ù�¾“¡°¥àA
ó…ÁokþÓ{ô%R(fêÓ·ÐÒz2*r•;lý:ñ|2ÞïqfþþÙKD%}‘tf¡‚‚‚‚Ú®xë­ïCƒ‚´½”nêõGg'¤_ª�,¹� GÇY†] í\fJÀVŒ‡Œ‚¡z¨v�+�Á­;é5½ÞûS†Ç²BÒ­:¶5U‹Ú¥†“̧7ŠkGG Š¢<â}[ÎáÖ0vŠo}”Þ}ŒÔ�[u”J<΃¶Z¶,¨ÃðßG
Ò'¾n ù|É2ÉðºåX“rq݇?…ȫƴ»²Þ€ÔR�ù¨Ëþü¬$_³ˆWÖ¹s-¬2àZË{�µ3³¾�kxšvŠÊHf7TÙë2|B¬Oš5y
c'•AOú(r¯9?ídïœe^ßip±hQ~a¶<%•‰í-Àjá [Aø!Þ`™ÓJf%°p¬¡½‚]B�$–Ç9ɤUÂ*¥ö>9„<ͱªy|¶¹š’SÛ*ÙYHSGG‡C”fXD)óGÐõˆ7å°²åå
•í š4º�2Z[¡@ù”Ÿ_*—TRP°_;§MCKëùr37 © ùAñÆ &�4²vv„2^jD GÙà&
Ȳw®¢þ‡W§–)
äÿ�ŠsjçQçÌÓɵz\=Jñu$~E¨ J$Æ54óXâÑé°}úàÒŒNgÝi?k?càá ʽÜ;Hx¾(~“qœP¼J�ÓÿŽD¬±»aµXCõ¯ÐÇU�1¡Oe€ zy~ìíÃKofüÞ²µ'-CvçĪR2ßgÖ³›�e)³š#T�HÀ!ˆ'äïp²†«Ð$ …¿QœÞ~#@øI£¹EœíßFïénÙ!í€{«IT?W®Ù0.A>úb|)Xö:9„ï�¦y“à!ex/¶[ÿðñ–ë6ßçU¾ 7¡RÛû
ˆ!uQ€¨ðb/åg·)�ssÔÀñfªõ§æJ—ù‘SaÄØdƒšÎ
Tf�ÀIœöZ™ÑäX ;’M¸Šè¤,Bêhe×ÖÝs‚ Õå勺Ž¢oz°ÕÆNÒF †p$[6‡ÃE}­®×½Î†¯„é^à�¢Œ¶êK£J øüÑOd¡« ÐU~Œ •ðáÇKë+Ñ…Ô=ôü£VðTØË¿×#2Eqâ"ë\UÚ1  I¸h¬‹Ñ"l97j–·\J4-U9ç�¸9'm⯡˜a‹Ðuê:ÿQrö•xaa¡»»ˆ0xå€�¿þÿaµ"ý"Xb@_¶"|[µm¾}ûöŸŽaýO¬[o½"8“Ä 0i¬Wš”€hí4è /´Ú»wï¬ßAI™úùùÑ'JR¢}zÿW�º®¾a€æD}T¡W——ÿ‡¨2æÊ½88 «/>!-Mëûw $ýüñ/èGÿ;ˆ €ÆŒ
� õÕ¸9AäÞj«ÇþÒ›�þˆLP?`½úg—ûG#Ññè8Àsußþ7œu9Kÿ?„³AÿªXàoïî010d’˜ý} áÞ"AE–+q¬"€ó£Qo=šÂ�ÄÇ P0©ýÎP<0À
±ÿ7œ… ºþ9èéîLÀóÞv,à6Aú¯ÎIW÷OA%ŒÌrï_ù_¿4¸]ÿ“eô¿½@+Z^Öô¾Æé«xöWƒCCC££ÂHÀˆ>cޏ”t‚"'öÄ"Éh=ÓOP¤¾Kœ?rÎÛa¡:z c€´ÿ'•‡¨qýEzj€Õà-Då†o›v+Áù»î*ŸÿPÝ=ÝXðAÄ<ù¹ !7e¾½AJ1*ì­ûå-@‹Uâ¦?*FöϘZ™'àŸPЂ�܈�tž¹C_‹-ÔùµíüHkH û¥Á�IúÑ Ó‚°5Uñ,С¾B[L2ý™Ô[b<Êľn“÷ð­RÓFåÞÛ€ÂOÊ4(㨠ÜG«Ú"}/Pß'¥Ÿ](f…YÆNjó·�³†æg›�ÖnâßU»•ç¬�²»"G´¹cÖ—ý €Q *ÿ�owi¡<ªÑ”>¥Z¬•Ñ9–At ‹ZŠ…XH±u·ž-ßO‰ø5×Ï7Í@°ìé¼ÕwSŽÑ«štµü줘‚¢‚Ýz9¶÷ú¬·Ä±a¢ï³˜åîÖ£«»{„hÙÀÅR¼°,Qà-½a}o‹Û � צ¥»úç›Õì·vþæKìñ¯
_úßû“�\šÇKÁY<é¶—ææÞlc«Ì0á¶–Y_à“Yw¼û!kfB »œ|´Ÿý: )t²S@x¥Ë ÝEF™„�z‹U5ZÆá.r;‘ÄË›÷ çÀtš¯ü¡y´‘AAei«Õ­9Å¥Óœ«¢¬-ÿþ}ш¨W4X�å,S”^<½iÚ5¶0s-h4¶²Þ5}8M£Á‡BeÌj:#ùB¿â�bïöéÚÃãÏkîQÛwòµO~­ãG?«×1vVðôTÖúaKÝiá®öé£ßÉÄøÊÝËJ9é]ýÚD5C[ݹÿòz㮬Ïf" c§ë?¯ÐÖîhM!º™Ü‘ÑʹAa='£ª LýMv�åÿƒ2´�5ïdוV<“¿i\ÖK·§C›¼¯D«Ê)6ñÔV¨+G6+íF­õFæÙèÚ�„?Ú´NõœÒ
ú¼_ ‹)Nkßù„²((öðÑ7!ºk²©i½T>~¥Þw+tGh�³K‘õ©Š^Š\)Ðø„V6œâÉ´ÉÂ`ŒÄøA‹¶ ›…2I�ûBc9íŸÙãÊ–Ó‹«S8<9„JO·.¬‡œÑS;›ò댜"Å^U•Br‡3vÜ}ä¡å`ÃW�1¤Y�bº4 Py5*›�k�þ“ûÁcâþ—äÜZz¹ùs�0¨æ|vê!ÐåXÀü€ªœnTº%f·^5¾­QüÆÜ½IW‰‡©ýôS*÷b8œ÷wFõP~°h×h¸1fví±ÜÇà \M³ÂÝÃ!Pù*ø‘µÑx¶%×ÂÚ”îá^K�`²6öi”(íÅÈHj#b6<¯¬‰,¾:x`g»@QãκHç盎m?꨾€™˜¥ œòD [Bt%§Œ0¬|Ð#ÒÌ—Ûl"bQ)ÊLÝ_{ÓÒ"|Éj}©Ú_|±¢·[Ó�¹@¦Ÿ:.Aõˆ<ãà‰Å³®Ó_b™XZ>�6ˆ
2�¸�r(wõ«“I $÷·ÌE ¶Áî¹cŠó³)úpÕqá ãü#ÌC¯‹ì™;Ÿ¥öÙÊt³¶‰Îܼ ùãжĦå²i˜ÿ" mëô�´Ï7ÖÙ×iÇÌ ýf!�ãëfÃTè%!t[`Ú#õÓb5’;ž…†8ètxm*”! ²åÍïk¼¼ k€·áôì ÐL£»¿Â­¿ë.�rƒ/«»-¿|ðx™oEÇhRµÄ´m²¼Lëôóë~jZ�,kÛ;'¹K²Û ²Lo{ßFR?|˜[ö‘éø $`õ~¦¾îdÜB. Ó׊?‹-"¯Ÿ?É&d9©4q¹¢
U4Ë*׬×ZwÈQ>díçÆ~/%¥Q‚oän0´ 4øqšô¶µêø~~ÊZ)¡“ì­)î7º#<iñyü§ÊÖô›ú-­ëËÍXÎ ·4lpñü@¬VƒÆt$ëÉwm’ Ç;GLºµF÷”/±4ÁMý¶»R?�¹Ò_9=//½ˆ³xt2jR³÷æ Û@ à§Ö…¯P:%]¯ÙØ�«‰;^•'RíùkÞ�½º=99�Ù¼èÀì�Å@ikPF\_v@Æ~w˜R�í`ÄÁÒÆY$aËß9‡b�–oÚ1®õfèñAMMOA¼^+ÖÔtÈ7KðɵåÕÇGk³i.ïRšÒøzÐ֪״z}¸ŒÇRm¡Ö/:Äê`EÅRǤXé¯h³-pï)Ã�ãÍaEòìۥόE‰5æü*¨o�S“ÇóÐÈT•êqjæ¥� M©-å¯Lå-­JòY‹,±EBLI²*±†¢×w—‡ê~Ý´•®,^c”LÒd9y) ˜€»Œp�=;ìŽz©“—�Aèæ4· ÂR³ ŠFC7±„Ã%
)Ρó–ÚçqYŸµçb�çž.WïYܹöÙ:·¯Ÿý[ÇeÈÿžˆWU™î/•·ç¬%Ó–—*®á5ÍßÀh,1Ð{?M‹Ì+ÀêFÙÝa”ßè¿ÝÙÖE5òùÒ)0Öµ+ûúþõ§qñI}¶(néZ &N\ú & v©~lPQ¬oWZ¯ª;jc§m¶#§Î‰—Öä¿ç/¶–wx-ָ높rãAýˆ¯™ßrcëÛ"4šÅbQ¿p×JÜ¢›>ZªØ‘óÜàåÀ– ^2% %Òð|�¦x©p{f— ór¥�ÉÓµ¬¬ÐS¢¦-ÿ¹íX[gÎní{”_�vL‚ûSS³_ñýC¾•­ÂT:RŸÕ…òS§; zÖ*‚ïÕÍó»•סkè§4À]èí ù a6ƒu�˜±BÁ&­š `¿3~åbB9)‘Åã¾µ U'(oSo;_{�c›>GÎÝ–ù˜yÒ¿×Írøí˜ÃfneŽ‹Lè…Uê6A©üØ�‰©m=!FòouÑ”-×—/¾–ê½”n›åT|?^›–ÜnRi:‹}¬â%¦¦Ñ ¥O.Ñ=É*{+ryœ¯²Ùøª.–ì½S\È
~,:iz© á»T4q}û5Oh1 Ê“)(ÞtÖ»¶9 ÇJ¤hzP•;C„¬ýƤÎ ZŠW2Füa¼àøu
&ÈšB£ÙÝ܆OÒ²(R —ŽJ8›ÖŽù}wމ²êè¬�Ÿ`W@‚ÄÄ™šÍ£ê¹[ŸæŽ‹i$½,Wr.n|°N\´ç?£Hª. pàY�#¤_Ï�‰ïüæŸvÈÕÅk—Vsõ$µuwÀ•']Âw�‰ŒI0äd‘¡5êþAÕÈȾ¢f%L•´Ø'ö> ²aÑZ^kz“&ž# tIÒ £Ð„Ä•ü(‘ûqØWÙ, áõA{%³ÐSÇò|ûºï·§g2-¸M[5Â!l?·vOW¿¹u©sB19‘‚ê$H„òñ¯ Ú�àó,êJ—²¹ �Ã^"`�ÈÔ
…È|O“œ™ž“­Rõ[à-ãg"¿G=‰y?ÔÉ/Š„¼Âmv´ 9óñ4³-{*~‡hÚ&D;v8‚ éþFE.ÂFW]wgÂå.˜°cW¼†9�0ð¸ãøÄ9ø¿ã~…¸ ç´4Î�¤��–,Rcé-!ž~›8$+ß}r1¤Aª#Ô?ŠˆI–¬äv—°$ù¶RUìC/@ªÿoåýuTßÖ5Œv �$X‚;îÜÝÝ]‚'!¸»Kpw÷àîN‚;�[#·úwžs¾ï¹¯|ï÷Ÿ;î­1’�î¢dÕ®½×šk®¹~Y¿"Ͼ…ù–B‰ô¦ÜSäv$òXï€rlCMË\)ŒÛ9)ãeÀieŠ�ƒø3à€ŠB%)ïÔƒð„GsnÎ÷ªÌLÒyíŒ[Rék„YŸ†=¢ XŽ�gXï}ëyb4Ò¥Œ¸ß΢ÓK~fþ'¨Mêt|×~꥛À!ð¼ÛÒB@ÕS"ÐÔÙ.q¹�vªÿ.¦lõÄ—`(ü`¦\K»©–Ù²þƒª†ÈúliÇÈk¢r-ó·´R,{W÷o—{Ý’j]c ¶cß“ÆHHÍbè]mgÞ`ÅUùäyM5¢kño“Û{$_†^> ¡€2Éó2Þüd<*&+W˜sÊZH²E©bpÜÒDX•ýŽ‚G3ßÓ~ÉÕâXh" |d0¹Ã뵫­Xr¥÷
ØEò–kƒ1öíÛ ‚˜Ÿ8Ú†¬¾‡¨>~¨®xóíjÏ}º¤¾óšµr •+ͼf«<Í*¥Íf¤S¯&¦³ä—……FÆ–ð/�Â1§fïÒåן𿙟<÷=B}4î™7D½2yÙWÔoü­å3/'½0'°_½î°¡;û ŽP—ƒ-íÈ Ç ð2ú9ǹ–:Tò}™N|6Í
›uî rˆ5ÍÈyð¹Ô¶õËÕÍòù®Â!· â(šá<w
éù×{&žê§¹;À¯¤Ïpex¿Â÷b5²È^í©“ç/�˜ŠKaÅ tóµ¢þhïQ¤ß¶þæUˈT¶ªgÐýPª xŽÀ׆�¸ƒÀ¤¦G¢»,Ðd¨¢êAº5´j»ìmí)¼yÏB`}@³½!Ô²]£©-ïØøòò|7ýAM½Ï,‘«Áõ{Õü#tª€b"Ì�–«Ç¾,ß¾DËA»2·C¯êí²b•÷ꄱìx§B;_k.Çò©¬çèO› .:ýR[Äþ4Û‘þûë¦ÙÛí¿oÚRÎ$¦“Ôìî׳"ÄÝž;“:¯ýu&²ä g'ª¡IÁ÷Ýš#•t€Ö½'xø_žúÓåF`É´ŽTƒÒà·§_¡Þ>{Dô¾mœÀ×Û¯y@¿`T±x±gý¸&ÕÙ‡í?œφqӿů¬–c¹é�IJ;Ô Kè©
öcŽ›àøþ1’™¯+÷{u�5=7ù…”Um½¹¶Jgú¡Û Å LT.-�‡iªÒoÁó‰�TöLËcç–†´ö¶¥1XMò�ìiž}R›·°aK,[³…1
ÿè€Ü›Kåê2J·yûù¶iUmor¯¦Ó-y|ô¢j³�]´B¾é(7P•W™az ¼$íú0®dÉ–²¬í2`ÿOÐH·f¦B�JÜÔ¼i«sKZÐÔrÓ™‚AcÏ}¥±!÷ŸòÇ‚~ú Èœ=²VJx‚Ъ�ôÏbwÿËntÑÙ˜š¦½ÕñãËÏæ#~Ø[KÛ͉�4T­§ÍÁ,"…q§ l»‡¥–sì[î©fÆR\ßkø™/#S¾Ѱø2k¯µ—U÷u[åyØWÀyýËxíD烯Ýê-Z%é!è§ãÇÛ ?rß[¸µê¹XEL™´õm°æ¾o<¢Ê„Úž/#3G#»]³ø«�Ð�Ši¡ÎÓƒc«C”b†òÅ*ÍüXé‚¢oß°b÷Ö%mâ
�™ºVŸ©£àÍ4¯ýÚ‹8nw&³#�`ð 𽞷”~\yâÔo~µ –-[N·�ë¨\6üéyÀƒ—sh#�âtл©ÈÆ(Ûñp.]­‘ž‘‘K6€dÈÈȉ!é0A]O²gßß÷V" _.ߤna$§ð;7rÙr~½…$ö“8KÕH\ó{s@óæÁ�Þëª9uœ �ú‰ ¼ŽðÚ¦Ÿ—s­:E1h`$Ç}ÎH Í Vq‚s7È^ÙhÜÏÃWwúdÐß§�F¢ÍðÕ´ÃÀøùy©õ¹ˆýäÁî’ù5Ba˜†v銠‘ö85yša\ò×§
+'Ù92ûÌÀIèWeìÃë/'Ê[i‘�—$«6¼.ôËbuâ–„vÒ§™e.QVY[ƒü»è»*®µW&nöÌ®-Ñ Ÿêe߇�{ ?}þø˜#Fönÿñ~@ìBXÿ{^Ê�WçÚħ,ÙéàÝ*ßüå· *¥ÉÆZÜÞ(ÑGªŒnJ¢Šê?uŒ¥Šh%A;àU h ²dФ%`ÒþsB¯¬þÁså�jAØ�ÀD°�XH×Â6AŸëN=üý¹ƒ XÕabcOŒ�m·|•‚LÉÁÁ¡B'C€J»»ßÑ¡ÓÓÑmµÐƒJc.§’SR¨'\€Œ61LÛ¢¸¤$59YpöÅdUUÕg&&EUÕ„CÕÌÉdÄtµ&µúýý}…Oy ‡.ܺ’’’iðU¡Ú=Ý\]¯wÆÒÄr«ËÊè€t¼¬Ø1zutt[ß‹‰�-€‹äØ××·½½­ªªÊ�Á°` \Ù‡ÿÜãçO¯@Ói™™¨A=qqq€y¢…×PA]4Aˆ¶yXÙùt9#àƒ:::Öx¸*#EBBº¹»‹åÂD_›a¨9Ì4ô333ÆÆÆÀ=œ/�³£úÑOcõa|ll PŸ’‘á½ýëËPkØÂ,3Ro½ %%Ån³¨ £ÓfG`5Ožš•••–Ö
Ðx±ÁvÅ–þVè½If6€­ªª¤ô£>[
w½xfÀ3S;ž
°‡º–M„^ÏGv?à"Àg*NXõ–qÇUl¶{ÝeõÓ0A)N`ðg¼ÈoîßRdçÿ–"Ûú·¼üó˜ScÜ�ëto¡%Ú�r‰¦àœþ8
Û$+}`ÐHçhBu\êÝA~mþog­C‡l0ŽÚ²4/EÈ[4[9æJ�wãæsÎп‡ß÷~è$N0”ªöÿúI$<ErÙnì 4CM¯ÊýµþA,:¸ ÜJ:ñDL…ÐfrññA.;^zÑÿåºBð …TÿJ�v�ÇŠëéiÞxé�š>Žgº»˜“V”c-YÜÝDå�ý1’EtR)ËIàו̥ÄåúV-1é¹ÌՃ蚧œWµFiõsÇžû¡_±ÌÒ[QÞàgrÛ˜ó…h÷ìà²O휢µJ nS2‘ÙA­,gIš_ížz²ð¹®ì­¤;7}/eæ:‘]4\¤¯Ñ ZD¿œGfŽ}«�4JIõ/=Âh-~U­Y¢$Ïø DD½–DDœDÀ›ÆÝ—¤×-8�(!ça&Ùy‚@yõBw�¹&�$‰vkñÔ�Kß%¢ßj$Å\z)-N^Ud‹.…#£æ”Þ>õçµåÊ™Ûx�õ¥îÑ6yYí W`‰›*›šÉã\_´\¼Tÿ쑬ÅÕ?ŒŠ…oÆá¢"ü$ûmÒ ‰ñ~�žò:&O`´çF¹¸`¢ì¯"�ÕùYï;®”½ì �–ñuE8¬;ww¨;:sMÖ6÷ñ’Ûeٶߌ4⺤ء�P,Í#¢+%�ÝÐò‰Œ¯‘4kjcÂô§JMõÒ¨>ò-h/Û¶éú„Vð:3$LR¯Zû´Ö³?¦~(H„¯®#n‘GÑ]ª‡t}·¹ðo{¶ê“èõñµþîy‡“éÕ¡Zš¶³3?/ÎÚ ßÈ ~zñ6ðO»%9á< "íÕþއS‚ÄÜ}9éÊvÌm~ô›Ç>0ŠD)p*䌡ƒ]—–1:îR–"i‹Gô}@Fàc7âÔÿüé1)8�-×±;²8Áx/x\ï¢;‰ë˜¼s-“šñ÷Æ~" jµùn¹q³×WøC×?*܉šÒðò~»Í×7×L|¼JBm…7ž™îidh»/3Òƒ”#Uò�ð"RÞ§Ž²¿‡bWöÍEOf@…£x„¼`ŒY ¼‹”{Òj^Û%|—ƒ”=�x†Lè¥ý¢KË¿#ƒ�òr#UÿJ„ï3"¥å,\ŠrÑÛ˜©²¨§$&< ü­!³Có¥¼_“ByâBÈä¨þj Œí×AŽþµº¼‹nÎÑCE¾»zùÍņZøuDGxk¦‡¼S¦ÙgHþíâ+/§.{TÔ¦‡˜°£®/õ/¬Œ_�[&�œƒSõ ì#ò2fxKâýÅ“<n ŠOÀˆ°ïÈîÁ¼‹d? Î«Q\�ýõ$�hi.ûz7¸XVÕ¹& ‚·³ïU7RtþtÓ´rBAjïè{—}êêïãv¼<6s âm–X;Ë|^]D~<}ßC�²MIú]þSí»>‰ç?œ +Ø'?'–¾ˆˆ\¡È¢T¬qÎzÚ­ %–çq8¥?äŠCé .£—ø9íTMýo·#‘ë‘_ 2›zP’½E7Wu
p%›PX©LËi¼ܹÎûd–ûvM T5O|\F’£�„Á¥Õÿ¡œ&§f¨$¦'eˆôƒ£t�ù(ò«ŠôϨ©Š½M@¡$çÃ8O±­†•xиØ}‹�ªÎ/]–Üžž³>n2Ýæ¯\jTå§Úf¬;™ùµ,=sk¿ÔŸüP8Íàyv=� î#þaù[àP¢¨•òƒÎˆ³{Ë#<&œC4ÕxÏ«£¤Ô÷ŸÓåïän¾/2k·Úä˜ ³% �_1o3Q€Ï·¤U†¹ùöýºëjÕ‚íæ c#-ÅðÜÛŒáßѨ—’â‚%Ø“¥»¨¦´u¾„í¹:–Sâê\‹—]UÌe_g;"Š(ȉq>ü­üfe¿¿?äRDăea»ñ\h{•ƒû€¥˜I=:Öº€©€bA'¸Hƒ.Òïk0ç¸Ñ;8rÙ¿Õîˈš‰¼_œ.¡ú¦�5mtïDaÇ1VÓßuÎ#qŒŠCokL«ø@˜ìylBÈ?9³F„ž@ж¥#ê‡uËšû¿ò*2n³_Æ-‰¹¶®à;'oü¦;~ƒÏ€¡htü=gˆ2f7£åˆCÇ’Y.*4)ÄbC篣y»Çj6%^WÍŒ6~¢F&:<0›X0Ç ô/k2æg6[™â•÷4ßrE¦ɲƒ)`gKRmíì6".—IÚ÷MI/�…ëÇ—Ú4SMÒP{âú8÷cCKi¶XÙ÷<£9®ÑÅ
ìNæ9Ã¥ÖÁ Q‘1ÅÜ}¸3IQéùí`p/ßôÊm¦2=„\u¤¡F)¾ÕG…¤éžË¥úr0z?¤®FnÜXïº
­\$Øn¶OÏ�ðð¨gÔ¤VŸ0´®)‚6zNS
ùk¨ Ÿå5¥ôy–™<<ܼÓ�m¦&L qY~€0•ÐÕ²´æ¬Û"Š9Æ- &0swÃÈà›ö´ä6ÄÞ$*˜ÓyJL¦¦12ø}úŠì�Á•™Ê7 ª’ã2SC� ¤ƒÆø˜ ë0»Ö¤u^ü³y:»¨\ÌV7�г¯)1çã|GÄ|ƉkBŸ�´³ëpÚË#w�žR<©µa¸”£|˜*ëùšñAäCD†î¨ŒÒ*:ü*]«ëWD$�ó7Óà–çZ ÄGšß´±]Ãw”ƒ ÊK4ÔKÓL™]�£2Å18T×é^hÊx„E¥«µ®iö:ÑK°Kjz‹/¬Ö��ÿéá¯Û£?f_%”PÏÓM:›÷+®¬ô=Ýû-9­:ÿùØ>Ý¢|Cíæ*=ð‰Áéˆ5§öPF[^>˽ ½\�xì¹Ï›DŒMª¿/ 8!´ŒkÇ9ir/)ÞZ”Ú9N{(ÐTÎŒ0¨³©CåO2ý3¶Ü~Fš>í@Û¢a—Ûöo.€Ú‘áðMˆ$…lÂ�Eî­7©ð8.?Y¯ ­Ö_xËÎpä¦ånL¨*ÐîqU2eAÇÀÀ@C3 ¸¯jÅÄÓÜܬð©ÎiwŸ×û¡TîJZ€ò|ìäsˆÝü‰ª—“´©€7þÙ0ãØ"%í@XI$¼w�§dÂ4úéh&‘ƒ!²Î…¼¦ù][.N™õ_V×G‡·3$&pÇ‘A}žû´�K¼Uoh?Ò :¸û)ÁŠÔ%õe u‹ëîkÄv�·¦K„Ъ ×É? <˜ƒ‰4 üæé–bYÕ.ßÿÚƒ‡}÷¿ðû²ó›š¾Æ…r�Æ1М�¬p¿�$`!€@ÊX’!††$€c­‘Õ?:*ãîî^cü+PU�ëí}™ƒêX+$$¤¤¤D‡ X½ÿ ++»Ý‚ª*‘•—"i׫œÙ<bÀéõSÝ:·`ûUVÜSSÓÿxÙ~—fff·aÅÅÔ£ë/¢i�ÇÁÈXYR2½ïÜ Sl)‚õ6¿‡Ÿ_¨�XàòÒ™?3=]d ÕÿˆiÔ¸€ÒA\}ßÇ«Â,Ÿ‡Í~€Ïš““£dì?hjh$§¥¥¥§§M¸|ŸE))™™„xx€<£N£]†3úKBPˆJ)À÷´ظFF¿‰DÐÐ@]V°fCZº­jJJ5†=�ÀÁ]j ‰§ŸþÏŸ?Ç+�»»»�¶+‰@4òƒ:~ù%q`—ØØ÷@ZGuúµ|†œ «Óp1aZ~‰À0›žV²ü']O®­¡ñ‰†††žþŸt½*,]?ý)tØE¤F¦˜@cì3+×tYâ jÝ&ƒ@erÿ xþÇ n8·Ž¬Es~­”ÿËi’f;Ð`þƒ$�Q—txÊÔn A
4C‰7ìQÜ6"//ðzÃÌÅJ^w€KÔJz;kèÛ™dC(­f(î\ëj�p¸Äû%ˆúZx3óV~¬{UÔÙNáEÄ<kèd¢Ï#¼oÄ%Bœ·Sã2S<mùöš×Ðê&šù$(‡ümh‡é6Ãf�fûìþ[tœë=àL]F[’Ëèˆîß×9÷ñ•é£5ÝËb2¢häeE9¬ ·Äß[˜§À|l“密&ét¤qdm®xÜÈVj�ª¹âæíCEË©º=Ÿ¥“Œêv¦¿EŒÒZ_ç»Pšè´ÉÐÀ¸­Î¾§á_¹X%UìÊŒ¯ëêR­iã+©¹6ð“¯Ç½¯†×DïÁùȯª_!+¤¸g¿ü›LN}…û+_™{h¾Nô‡8²=’ù“²ö�Ç­F /ûíEåI¢Íâù Sy'ôÙM ÀqI„°v©ût4Ž•E8kŸ>ÿù�Y»¨YÛïÇÔ€`&¼K,õIR‚€QËÎÀ~ñ—F£}Æ%ú×7ßÞ˜{Œ®�Üd´23)Ûý¹Ð1/Ì5´D¢æå]œaùÆÄZ\ú§¾°½¶´O%f]ä—Ü&Á{:#§0böÌàw >ÔOM7P«³ÜoùñÞ1¬,ˆê½ë É[‚36fO>SJq· SÇ5’ŽÕ+ã£w_{|·²ÝÒ÷}Èp]
ÄЖ¡
²qå"þ_8X|†|wަ’Úý3¿m
¶?,*žØ”…?r¾Z^ñ<͹õxÀ©Y̨̠>ëö&×çgs6UŸ s©Î­)fîs}Ó퓉m“ù÷­š2í€ÆÝ—)¥ÅG}Ÿ¿üÏŽ�C¾¬|Ÿ¡qNç�šn·hQõüJR"—•g"¢–ÇrªÎ›Ö5j ¿¸k­�ݺGħ,j‰mu‚•ý5ê5r€oƒû¯ôBOãj¬ÅîdŽCõÕÄ€Zƒfûœñy—Eln–E·"úÙÇÈ‘2ùÎÓùu}NÇ©ÅÙ)°izóçÅãÆµÓ6—.•DW�ŸR’æ.v?ùT–ƒc|Ò>Ú -gç=|1‘Öøò·œ®²Y½ÿ.Êùý«ã?ïQxÂÔVî=2sÅñr£ðž2 \´r%*p~í]åÐZ¸Rs“.ƒäwüž^õÙáCD³%à\R"XÑ7µÕmÏÁ+ìøUü«æ8»Ñ·¨½:Ÿ{lYò¹?¸ÝyÊòy#¢š@GœïÊ1ÛóÁý+ÐÇò€?í•»¢÷‘���ÊÖ¨`WC�¿ò‘Ÿ-ž:–õ; x÷VaW{DæÄ9T® |Ïø'�1�seè¡Tý?ô£î‘KõH:Ÿ²zðøÊ¯>Ü3g~{yàê‚Ò¤]RôËG^ÖtåK‡ï·¨ÚO’ˆôc˜wÎ;ÈLZb_TêÒÑu“i͵TÃ6H*Ôëç :¯´›\pʈ�£ž‹É».ÌÚff‡\K�^¼R¾p�É3Ü/ǵJ‰É{*ÑÞB¤Â3¾yï~|–Ŷ“¬Öèì„ü†Òù…•¾íìÇï~FÀW¸€cs© É+kÉom•tËo|î¦/Ç4½Šð  L2s“–f–ùŽÁQtBBÞ‡éÊZº‘§{é ð÷jËýuml=oµ3žN—õ9ó%óŒKD¿MbÞ½«I¹§} ¨S§�>§›<òÕ.ÕLfªò©²—KˆÏŽq{×¾çN÷ w<Õ^Žkv×C(nŒaÏR–X°èâNòÒHÐ'Zâ¿‚½?Fˆ,Qô›8¼šÞÚà¯uR&zO£…æázúÀ'l±ú<ôõÑ&»Ê|’yÍZyi X”‘n »éeÈ
Ó,ó!nàEŠDùƒ_['eî{¸0ìýñ7Páô)šÜ¥ Ù×Ý&±¸d�ƒ7H/¾+‚E(�ñ•'VTâ­Í8†¶“z îeuàsò{Ò‡/ßÖ„ö{{º¯vmWô‹Eœ™ÿAh· qmÌÃZãb§G]F»Ž€Ô¸dî1OÞü^͵ý±ç>bHSjq´•&îéÁxä^_ýÃNw�‹[D¶Ò-mÛðö¯ÃË„.· Ÿ]ƒoæÖnºz<ÎW8ù”ï/|I<†(´o»È(qïž›$£~Öc%Z«u¼4ÜΟY¤¶¦@•›)Dƒ'‰á�Øn)Ñ&Q§ŽžΆ<hm)dý‹�•WÎ¥þÜnå­±7ÊUøÏA!-$¤KOl�’6Ô’Š[Mƹö±>ý’P4k±Ðœ•h@–3I€GÚÒ¤ÈT¸3öÒ�)qœj>—ʸÌ+œè+^±ZoêB÷üöeà+]�ÜSHÈ;tãI¦Ñ%mqgEdEãЮÏÞÆMY‚|]]O«$7iYäo!ë³bœùOªRÿ·X–øUí}`‚=þ_#ÄdDm:�kü¹{*×;ñ†ÛÌ#ujCÇèË,3fðîâ%«8oW­`~R¿x›EVÂI„é5æO>Lùx'd÷QgŸÑ-ég­�ß¹e <>ˆ`–êZYRѽ4qò4²6#nµ/MÁ))U•©££]@×%L!ÛêAFÇIXCØn‘Ê™ü–®…ôÆ?ï³lç|ÁUó;Ò@™¶ÚíðÂÚQDªÿk‡sŒ„«]–iË1 ,b=·Kë»:~‡¾ï–r(ñnPÁX_�RŒ�¶5ê=; nÈÏ”[x’/êCÎ-ùCœK'vEQ£Ÿ?{¦Y 'DÉF¢fD¼ÅK‚W·P�î�~õª—PgÐAm´™Sf…\.W†G©-¯îÙ( |K1Ùàu¹·ÍQº~Qëf‡‘Pp»:¥[…(PÏ1ô~>>®~ Ê3zõ6Š÷)wâ}jf:Ét 4€•…E²®(ðRÎI�>ÊQJ�-ÚdfsEßËqŸy;Z7K뙿aìàvë»ÚÓ“h·ö¼n
¯oÀ{"Ôûü1ã—²—þ¦öYŒÍö›ÖJÀ€°÷Ò:¹Zœ­ÙC·A%G]é¦KÛªgÌñ‰ã  ­ó݃5Õ0ÆT1¢<…M!^”ÛlZ3Cg6ÍMÇ”bÔ{Á)ö?â¬<¥-eÎ=Þ"›ns³ÿÜÜTôMäÎmïÝïX™hž¿›Ò#Lh¦¶Ökk6GZÎ2:Y2�gT¤[("½½ßú²Œàª÷etö"bU!/®x^özXÕÙÑ•¬:ÄM6æhÉÓ_É¢¾¿ÍÉ�€á%pv… ´‡o¦µuPs¾J8¡ A•Øè3y{‘ÄÒvË#S:üõ:&ðGxzrj7öêD+]»ùô(—�™û £çLJa³zPi8‘ãVhv…ß6ýGßÈC¥MFc.‰çpêúVƒZqú´¦Õ­ƒÔCC_T„bº«î¶f‰§Q· k^+Ù¬ aï aä.†ü ˜ÿ‡Dñ¬ÍÛã=vr~%’Ø×©<ñaƒæ²g$ág6ü‹
©Ì%p»ØÕG;dz~¶u4ûQ4ž-_ûh´‰6-‡ç\Çþ\–aÃ^™dÃΘ’tûÄ[rá|ž²înï5«}ÐV—c3cDäKcRçÎ-cj:;e‹q´êߎ‘dã9õt1ŸÈ$´²—ðiÙ—~ªe©+¬f•ý^ž¸°öÑ}é„ï[»cÖ4�«ºž®0+nËJÓòÉêIS)ü~oy¡¥ÑŒšÊ
’^n±•íšBÆ+B.iÏÖÖ@Vñ*Ó5‹e£º%º½FxûÄ[÷çér×ð~!JèóóGVäZž¸’À#vL‘�´jj@^½6Àˆ%ûHÐôwSHmÕBÎzÿmè¯2f=–| E�x+≬2\�[½*øúâw£PO®Jã„`Þ‚‡«g«½‡•lâ]óägâ² Ç,­—«/…í™)/|7ÓL4-o„³�ø‹%É]6ø#tuã<^­˜ó
p™ÈiãxùIM´X˵±oýW£«sy¦¡JfmúSjÅ#E†)’æ�Âåö¸˜?ÑÐ
ËGep9n�VT :ÀYÅ€ßðñiB*<’–“ ˆŒÔ>}ëÒ…ˆâC‹MÖ–vIE¦q&|z¬
L±#P3q2#ùXùŽžVk;÷[œÃ>¥º¤¶ðŒîDžPr{æÝL;w3$žO4a=`ÈÛ5A}NÏ�÷à9|ñßYŽ(Ðv|ï¹´ÿžÕûÄÜ(ðöéVnÈí€ð+›ˆyZfRmìuncÓB2{ùÎ� ÕY¶’õѾê=ø™ž'–Í–öˆÖiú<­‚¾ÏNóDÏíg£ïŽ™leÿe÷®ì ôÜñ²øCvڨ͊®¸uÍ Cõ�km§²H!hJ�L™8Ûƒ\€CàQÌÌÖóùÇÂI¤eþÆ +ù
ÊóT®0 ²[N=ûµFÊИ¤íÏÀÅ“.Èiû�ËÄíÏ,0®EÍq-ëGg–ͤóqTÝ”b÷³ Ë“WZf{5º¼{Ûw‚#eFnõ vik'|—Ý}ºž©ÈܩȺø-SgçÚnûW‘íS#3™XzE‚¨Wznçw¹m �Wýç§"+®u·�ƒ¶ c¸èX ‹²~à ŸÙÅ¥>ä³�Gžâ‘ßùïÝéìm/?\–š6úò‚õÙ´Óˆ’‡š‰oØ«}oó¾ï=Qeš{ûîxןAøn2¦åƒVQ‚k×|¦´ÔS]íØ½ ¦qÄã^Ú³¸*˜r´ƒ³wÁc!˜Œ7ªöeÎcG\g&¡…»Ôs™#@)?V¨¦BŠš£­² î£=Üsj½³v€©ö¦fjÇÝÎú˜ÒßZ Ã�Ð ¯ß7R¶–€ z\âû×¹ ô’Kbεt•Ì�2ŠôZÊ—z<Õ8¢ÃTIfAÀPšA!?ùå#_‰xô‘X øôæŽI'‰b}¤³áêªÉ–Ï+ªsÜtIJEmÅcºqwºùé7K{�œì{Xðw�ñÇ eçvaY bßÛödü\É®fÒÑÊ·Yî†;~�’‰ÞVHRôGcaviµ¹Òg_îú*ÑÏ^_æ5 ×*îç««+4B>NÉ–a܂njò+�œýõŽÌZäÓÈ 1g× ËÃý}4Μ«·yUµnª5À%™w¹¹÷OÍÞwųѤ'Q¼Ì÷¶u‚ï}3­Å>Y¹ø3´$÷ì}¼Mfzä*6;yÑ�3ÿY,AĤԇŸÓu¿ÅDÊM‘bsöÞ;,ÒkkŽ¥q�”}¿ÝòƒŽÌŽLáÕÇÍÌv*=7V›1’ý±
7DOàA¤Ïªž,Ïlï[…$,MÊ4Äê¬ll ‡ìtðWI·›ä#¸–�a—#"óó- -öTÍ8«[Ë z±©ƒœö²%4ce÷p ûD&ÅYq;SY›€N)�³mjjj`ÀQ>. ýšÏàq:½<«äNÈ “9zG êøa:œ[Áê>–Ü©p 2ëN{qÕ’åéê�Úb›wD¿±£À+Ø�R†*õXç‡ q´²ÿ…£ÜEÄ�OìžZ÷‚ˆˆÉEr)¦~XL®ñb§’í+�µûr#ü;Šÿƒ,ùpíÛÙðúÿQùÿÁ4¹ý¿Š`þ !Ì$ÿç|ØÞÿ³Q4ÛP•�[_ÿz Œ7Ȫ¬ž–ŠŠ
ÐDéì½6ñ€”6í¯òz2H!y²Úº×ODmdd¤±h©Íýâþêhá­¿Úâ"]�²g¦ÙXÔ ÐgªY(ЖW®âÍ=ÆNg‰äÕ
½†ã#Þ�¥Ÿ´AôaT…>¥¾Ns¶Ó,Ð œŽmÕ,¹Vœzbáé ¡»xj<ôkž¤:HV퓽}}¼òáÃXÍÏy­zÅìì,pukÉ�÷‡•¶Ë˜Ú˜ÿ`8±ìo îzÅþ"ІõÄopH•üçmÇ%�Çzþ$ÑÊ{ NLRmOh•§2cƒhpžò¶h�òl²{aN|ÊPvjS²^¿¤pBïó£ÀÄwbÚô»†yË—fç—õÚÄFÞ®y¯Á3Äð# .ƶžûÚ^æè÷]Ƈù˜Ì‡­ŽðKÆ›dpÆ;Ó׬kY"g�¡óx™ëÀDzTŽ—hž¦ñ™œ–#¤e­èýÑ ¸ Vüp W0†HÝèøxb|üèØ¯ ½ Ü´×ù•<ÿ�‰¤ä @ìU|/i´8!mÎŽÐ9“ê•úQ{Ì`çc+8å£Iì‚õUŠ{éÊGYܘ "áø9K�Ð8ztÿ€f’ÈpyKcHB¼¸¬Kc+�ŽÈB
£ ¬ZÌ]¨ëš¢ÌÌ.¯ÚU”Gg*lÚp¶”ÎRuOãײÃ{î(A’æ�bEAc“×V�¸?kŠa'#}c‚¼…LÑ Àûë=?޳¹Ü{3P¶øÂÖ�t™¼ ^ìÂo¾��rÖ‚gbûBOü”LMGùÄòBýS‚;(åέål÷sä·;é{_r±nhmaGß·W< ˆ>ÿý»ObèlèœÀ6š™è}LõfAn+‹5€ã-/^¨^ ƒ>i“D¶)¿ÔÓßÛÛ¦O¡'Öº^Y¨ž Ïg=*sVÊáUuMìvø/îÛ¾?µÿ]¯’
ð,HH-É#øÏ1bâY$Þ•Ñ1®t»îð¡s)®¾<òNíc„‰ˆ�eÕÔ3Sú~Õ€\äVùH[¥cIÆiØÒÌ]GêmƯ®~ÈTRÀYãª]y¿•Á5û\<Õñ”
5Ô†ÂIÞ„²m™½ÌD›¥ØÉxé!ÝÑXÙHK6âæøÀøñ‘EôId
C7,Srº¸xÙÌ‹õn/uE0÷e™¸~üÞbú›k.Ùíìªdo¿ekbÞ.Ân7¦MÅüMòäZïÎkeŽê~È|R¢UxÚ±²ü�3·•Ñ[ŠgK{Èï°�Ãu<Z£¨ÒiËRElhç�'_GwÒ*6MåÊÊo\ZKRÌÓ›BÞ•Æ ÏÃdSkJF¿à`çþ~lýpŸÓ~Æ,Ü– ­KÿZîÿkÄŠ¢OÙXZÀ㌀dP\×hÁtŒ©b÷mð6cÞOÓá›],ð-íwÏ©û1¿ÿešmu‘+i Ãå•ɦq÷ד[Ѓø{0¯{Ân¬cè�´¤L¤Áä/v¡º/a÷ÛF�ˆT¯Æ=¶�õ¨¤2I@Þ»=…‰Kÿ/t\§† o81bç~?Ói¡±¦ÄGvÚŽýñ.¥è- ódgdè¤[¢ÿl!‡«”â\½¶uº¨m×i�? 0¼hqç'ºôqŠ)ŒÜ÷ßL›’ GìÓ�_|¹:ÆEæVøk
P^n¾o,++/Uw®œå`eSi ¸¼F«çhP'’}f˜ó¨”£B#à÷”¿MG™R=8£?NÒAD;³­¾1"Jq¦‘¡? >QVWbµeóz z‹дL¶r£øq‰ˆ|Š W ˺ €z%K™ ìf‚¬y$#œjÜý9„Ê8|L¬mN×ünš‚&9h’2¸Ÿó€¯â¼òÊhÔ�y?dµQÑ‡ç» îP�;ޝâ™òÌàgöM €Õ¾üHBý3Ào™+§¤Üe‡û}?e3¯ËHfĦ¯oÝÀÑÌ8�Gÿè;¢wVöÉÏx4aƒ>†ö‰��’2ìicÖæ,)–”«dÔÛnîŒú‹�ËX¼ÂA Æã³¨7ÚbÞçì߈€3'‘¡“uÆ©êõD›]Ì2”¨KÞƒÍ0oFðn¢xØ›“w�6u ÅÑÕ›åßfC&98[y:ÿ,ÚZß3ÄÌ]/:+ð¢G¯îííMø>9‘r»�¤_öGàááâªX_Ia¤€éô�p5=?±³
„ô™ÍÁËk¼~-’§;AL˜/qº¬iï<©ã;=„¯œvEŽs÷�Ô’(}¢ïuÈ£ÚpÁLjjÍÕ).žï½°jy˜$¬RQC’BR‡]öÕuysóÃ�Ú¢ù!{8,ÂßX}wd° &ÅÝ?CLÄ—ýËIНý¤Ë÷,Ê]´4o6ÌWrâ‰OÕØßá°r$óR�?!ŒÄ{ùöî¼áþdJý®˜ŒýÉ=d|I23£æV ïÍ¥�=æ˜/�*�M¦õÑ%û˹¸æVYÖ¦÷·,ÝÖÇ5½ª§€ a&ÐÓÔÔTTœêîþqi , qòüšZZ% v—˜?ƒƒòÔD†í‹¨ó@� 9l±±!Ô·õ=X·™®?,N3¸¼µ‚–—­l–¢¼Û]‡»Žd;sÖ¥–Ljù @KE
Ü`âÏ*ŠbQ 1eÂ"®@ é¢×g“Ù듃lvò3@0Щ»°‡LØ»Ý\²q¡»—%Øcw–O­w9°^¹È3isÜ�fŠä�[¼ö�'k$èÝb:+©Ò1ðèYªÍccQw‘˜ÌH¥Wz÷Z¹Ä[_|\%â–›Iˆ½ÜUmx¿ªOYqdҬ\ïz˜ª',¿ÃõýmÍSOý •„A�ÌÍOÿ�‡��&¬ ëCªIµeëï•Ú§$È‘ƒºËë¥åt)ˆ^øÁÁªû|§]ðyãånÙ‡q·²JŽòw­V¥{ÓU}AWè!vìóÜT±Ýr­’öŸYÚ¬näòìâã�Tßzmm¨%IËoH8/J„V`þC°ò>–¼£•½²æË]Î�±t�pñÐ9‘Øå…ØØ-OÁTÇïò�ò”¸i×ê=™^|i—ú^óòËyätf»Y2 )A»‚Óg ¶e@Ñœ«D'¨¼ ¢’Žê¡R¯Œ€µXø,`J.÷[\TA¸L„áO‰5ˆÔ›»ŒëW}[£'©%DCæ @�ˆs©†ÉÌÐ×—ühð@QšñŒ�¸„ƒ<¥7[-R33à ªÕ·[¢oU\1W"‚XWL‹Lƒ-ÄZÏÂ’ Q ÁÿP-«ÑùWíŸOÜ:=Y¿ååeÛ•†|-z YøfŠÅŒv„±D'Þæ­S‰‘Ø”ƒÙ0s0×Ç~XM’Ø} µ®9 ù1×Ù#˜×ˆÁÌcœÿæÔ�fdIn'Ù¹kÅ��õÞÙª<áæ`wå—ôݸf`±-QŠM _£Œ±ºdí1ÛË&WÆ)&üÈ»Œµ´�éNÕX™ Ìä›dJ²¤±®oùØqûiHƒ3K0º8ÿË>8  0Ëayw—eXˆúy} ÒsF9Nás'ÿ,}±“€±)Ò–f—È xdù!¼åË.?iØÔÈsœ÷®tˆ�ÅǰjoyîŒ{!5uZ�ZBî:泊^1¸�•ß5¥ÈN3È®ë­0Œ“
�_YXX€T6UN¹v#;;»šeæãøèho?Ü�üjNãÝ%�)‚Ìý™)¸³/<>¿ì›»‹uàG«ü°�þ[Ì쉴áw48dÄXHúÅ7Ìã(ƒv¶3òÊr›º²&µ1±˜›÷-ç7Ø–oŽJ¼–|êl�̺DéÁÁ6Ö5¢ƒçræ×Ú•?ÃL‘~¬!Džñ@¶9XrX›œÝ¸!V�ÅŠ¿*mÅ¿#;{1eøºo×FtU™Ðèx–л ¼  @ø—F[Òáð¹œÒ|Ìœäý{Ø9M€sâXeض=,´¶xÛ_ñC£
ÚÂÎîÎá2VþKÝ¿¦p˜g ïä4*ˆ@¨ÿxe3²0©1p«[XXXHQ^ÞVieGl%1ا£¤Dʉã ÙR�H�pÛI²Ó�E±õ�ía�O!Û;¾Ý¸Àô39±à± H“è*�lKJ#¦Ã[jsVn
õ¨-óò S’9h ygÉ ìæœ{@ž¡9Ž|æ�Á_ß”!‡Hõg$�è»!a˜#<õÅ­k²Œ:�·2Ò?ÇÚR‹HëŽ�Åî™c>êJ
�§“|1h’h vF ©žÊ™že=çÑt×õÿ–%cSWP“Ëë–·|Àá(EžðjÝ ?@â”…gä¡CyÙÊý1"& @~Ä­°1þ(™i¹*NüÅ9ãJ˜è_ìc�ÃáþHý.Q}á]�O‘¼Û‚¥~\ê÷yøâ¶ÏÉ@
Uÿ0•�uèX{ò§9î«¶X3 Â¨¢R4ºÍðs…3’²¢¸O’O�•‹…èþ…©A÷K Áºñ̵R­oÇâñz}I¥ _æ7’•­S’Rç|�9ꜹRÞ]$„+‘‚½>Ç%)̬Ó\Q{V3ÎSßÒüRÚÉ~Ï;Ÿ mD5NÈåUŒÍ[•Ôƒ¡áê�ž§3¹ö}G†h´Õëå�¹‡¼Ž±E¡0f ûÀ!6ùŠû+«âñô£v .à%+Ó½ÿV0|tÎSŽË7ucß}InI®ç)¦8 0ÍwwoZ€:N¹ØÎÇ÷‚rŒÏ†¥ñªy>ã+À;ÿˆÑ±Å=í$Úxó“~ªÚ>b“Ýñô[:¼MËåvzÿ·"³ëÉ0³ïöÃlÕârH)ÇÞÝŸÛÅÞœÊ@]EUÛ³D†y†Ó8QÊ Ó饩OZ‹§ðb[$œ�ZUv–%úÒ‚gKLJm^]M‘õ™BMòÒT H>L+•¾N2�™äÎ7b¾�¡�ý¼¥¡”Gª<ò½Ÿ¢Ù‘pˆg¨>´öU£N�'-‚Tÿjûó%�©™g‚#*ÏÎÜèHÓââp‰± ˜ûA¨Ey.vM9–À’€÷ºõXTí£º½Õ|YÓt#“Rœ;âz–�´ ïrÖæ´}9‡«¾º¼¸l4]‡¾´û£RŸÛñ2 ÌüÚµ.9"�ýí-tâ F _z[�xyùÊN£'ZûW‡…ÌnÿHJaì †@J6ÆŽjQÕFÇçÿŠ�ªâ�6ØüemPtœÃÃï‹}·HëXôÆd€ÞÌ13U{[–KÇ
Ý>…à‘¯é1» ¯6¬‹0CÔ(Úù¡Š�ð @ø¨¯=×^-�ݵµ´¸Z,»¶@{w‡CŠ.ÊpaŽå–3µ‰ aëkIа2¤óå»
ÙXëäÔ ×}á]
Êw¥º{¦p=¥/Èi‰¯±g‘Ù§r>®«Ðš\ëxÄõ}¨‹Þ33ž£3ñÕ߸U¹YV¥~_Ns˜Tþ±õ—åd°ü•Ó1ʯ�YòH&»FV´ØÔÒ3\µš¹–ŽÕÜ£ŽÃL iï±~ÒÅáN¸Å"#5*¹©7™-�Z»®¿ED”¿¹0§ä¤5{X]ܵèß8ÔŒn};̬õö7 )–$¥á˜gsip;)�`¯/kAB rÃ/ýM��ˆ©¦yð|¶o\ÏW¹š«ˆƒÙ‡fꘇeg›Ôð>‘~ôJ]zȧ0‘Ò5ýU±é?¶�aé2b•w+©³@JAšÕ1Ÿç0L¬nн úà%ûö5 ²T¿¤Èç'Ó éR_¨§÷Ûn5oC%ê]]F† ¤»�©[iÏ{��Iäc‘‡>YÂ@<Ûj¯à‘žÌÙx÷"(Œ_æ{ï{+‘x r­ÇL©p.f ÖëÀ(çîá͆!tdnÒÚã‡4 ‘0/â6êŠOy&VÛ·MÚf“^„¶/L·K×»ÆWempšM­b£'ØÚ.ÞXõt »ÍÕyÚveVÀ^õ^ȧ0;8oñ¤ÿkzˆˆ[à¦éÍ·ºZË£Ôx^#sÃNåÚ\6Ç…) &}´jW‹•ø¼��êò‚]¾-Œzèál<�u³ûÃ.Ã6%@"ÞN0åwÂÉb»ÛÑð™»e
ÀœO=n6• PŽ`Ò {É1"í¤°*í¦’žLÒƒsŒ;Isˆ‚Wðæ»'éÃEÛQ™Ös  3ò1öÜYLJÕtdÇ_¸ÅUî:”š¾r
ÛŒ¤õt`tNÿTø3OÈ T—…xûš®çI+Aðë -¬¬hl&–ÖeŽÛy‚�iûÝ}j#Š®´Rû­ªÄö|*1Æa€ŠgOI|�œïÊ$ùvØííkЬ²¶mºÀ5ØÖUó‘â7¶ýSºûáÅÖ…mÿŸczÿßr ÂXhÞïPyÁ;ë6Ðu-µ=á°�NIÔ²ÏxÍ먑ðž¾Ç;Påspà&~Â`šf@N¨Ìê—ö¯Ÿs­©–œ€œQëzáo>†¿,ììN £7�Iöòz¿õ(zåà­Ñ/V¸!�¥æ–|kš—š‰¼nßè½:gx‰oeŸð—_p¥?m9ÿS(U*Úžõ ƒ�.:é PícñÏ’+°ö°Ë•:âB›8Í;†æË”~jð½Mà
ýC/,0+œ?!ÇR= �——£äÕ fÄ�²'·æ¦�+`#þGÀ øáÿéñÔ—ð{Õ¸ÿ½=é ºàû<éÜÄ…M°7ýê_¸_âòÉ&¼<D¾þóEYͳ6ǸÁý§³õTÇ–§»ê‹›ù~
ï[“‹¡ž¹’‘k"õË›6mà´ƒr’xÀ(+H±(I'ø–ºüt6ÖÉ¿?ÝÜ©»Èßùžd„6®ç ½€6¢O]ÿ~|^_Xáãõwqq#ËVÑç~æ Y«ñß­�F4¯§Û!J:y‹­£¹Æ æ7–ú^\­N»ÂAij_r€á¬± ØÌ $ãy/á¢5ëÏïL/Rç¿þ}ÕD>T²màë»M*·?Ï3•m8žmûù‡ ËzÍ.·[‘úzÖžÕ»æ¯"2|�ŽÒæ‚äO,–ŸÓ"bjZ?Ÿ™%N³WÞWI‰…*ôó™œf‘z6ýš~vm¼Û’þÅ1s'Ú›±CUƳ°B”N•3)ÌX-$¬T9xR�á|u¼—l1”Ô€†_˜Ž@HŠËC¹�þ(�Vµ=,:Ü‘qx°N5£W ûàfZ0ýX08²ñ€ˆˆÅóÎÚW™B÷QwÀåi‘**ËëSM¶{Ïむﶗósa”ï…ËTÉÇÓ«�†¡]æÃIà‘l¡ÂõIÍâ¼S¢Ø6úI\õ0 øÍ팩�wR£h­hâºK°—IsᘉÏ<U_4SL°„ôçgè`cÇ^7r->GPK›ýÝŽYxWÝÇÛ.&Q 4f„5–Œ]öö2€²ïw.TÖ·ŸÇ8f* _x™EvÏö®h±øº©÷‡|¨KëHO^näd¡WïÔ#Qè|©¹]vïëØMÅ'�¡$²»ÂOºìÍ›é>9<Óh ¨MC‰¨}ú]´…?8‡€ÍšEh0Â\&'†G«�k!—^Zéì]�ÒÎAÔ·³)ÏÚÙ\d„<­’<`T ´o턆¨¢»�8ÆcN÷äw߀‘Y“‡-]88^ 6çJ yåhµ]¸6jöu™oÔ¸¯O:°µÅ£|µƒ@•šF„CÀá<?tV{¨ÿ)?ѱŠ8‚Å?v´ž»9¦+¹Öú1¸(ÐÇ߸>Ï |% èå�€âÕÆÚV3<YÝö�ÕérÊéK Vïa/ÌjÎüJ{2îØ©ÁàÄåqD76û¦,3a�6˜Œ(È` ¶ŸãŠoÛ~špÊð²,•:�ÝÈïß B«Çà«3ão8Óm˜R‰*%fô³a·ÖUë•9òI©ØæÚŠ�:L­Ôu³,°#ã` "ßùÑIÐÒŽ�¾Û5¶Ð®OZÊù‡Þ¡$½ÎDÑü�3mKM1B�&h–á&3Å./DíéK„Ø8‹ªÞ/fä¼}(ã“Z²Òø¯!ƒ•;ÕdçOÌá¶×òÊ킦±Í>²Çªá<~Ú€=é
ÿSÅY‰=ÞyJ{ó(U¡]ÝëãM‚°v’ùæýkòü¥™t;°Ñ!϶ý·ÒÃ>ù¬F…íõÏœg±¤ÑâàcÈ¿P®!u�t±�¿ý ë_³; ®ËÞ^¸ìdçH:T£ËØÕú3ÏZÝþÿ5IÃ4×,Ü]¿.åGÓJÖ¿�@{Þý‰ˆ´e
Ü&.¬ÜÒ¨iâ÷b¼ÔŠt�díQ¶ðÐ ð»aâoÕ•6C§îi8÷àb
þk)÷›³{¸¾ÝŸšéÑG–ë–®}Ä“fç¿èP‡òE +ük
ÿ
<wØ&èháþóÓÿÖ4C.@ßÒzZ.o+p•`Ë’êÚ¨‹¶cÁ^-ÒÚæ•õìššhä æ€TPôr¹6ÞS#U˜Ï]˜N#Ùnh0VppèüØÃ¾þªwÅÂ1°Dù…�ã�ò>óµÿ®AT
&þ`í¸=Un°<ÛËáÁü‡ ØT”’¹Ú5�í}•>•sëîk(ùm]Týé¡¢âËc>`ZÊ@Ù¬žžžªjþ̾ãbø[}{ÌLòsê6ªíù¯µÑ×ù…�¢�fXëJ©ç~åå ÿÅ('¼ˆÏÈíÕ&
ßäŽÔYR§Îóï(éÊgı é(¾‹¬ŽÛ§¬�U Þï_9dJ*ª±M è48Y>i-à^n¡;%4ÕÝ’ÃÆÂiñÿ¶tü~bD…|H¥¬õ�ˆðu›yäðz.µx¼ßØ0"Höú­Žf¡EÓO<-YÞÄ�‡IÍÜëÀ:\[U%($+�¢bÌ·|@i/íZ�“÷Á=pF[Ý!nRšœzgL õºÈÐ"]ÉÆÉGȈ�÷Œ­¯Bgóç#ô| OOÏÈÈÀ èýéŒj£^ðÈ\Öf‰Ö©Ú2ÐÓ�¹„�²ýF'&€êj@sÃW!Øus�Ç¡} ¬  ž7¹¹)orÓɯï~§a ÙF¿¬œœk¤¦F�åããã1¿Í’ä„ÊV/ñ8­ù}†6| Œˆè�¹Á€Ì úÓÒóÝŽvf¥öÈ\ùŽ¥ÏmغN#œ#Lu{[|â;Ô…{´£k²ÍØYTTÔ勪ê *%-½»³£ö´ThVè“©®öäž4Ù’ã¢?æ“p¨&ˆ
ŒgAÎfDÐ ½Ž œF:Û²7 ZxDu�Ÿ*œþ héž.‡ ýs  ‰7¬’()ËIÀ…%G§0œ“™×Ä<Ò•l_º¯÷  Œº`ìM‰�¹È@UpmœæÝ5�ñ-»®ZÞ\ᩱS45/vûpÍ3×Bwx[ÎÇÔ¤º¾–S+……ˆÆf—ÒÀÐÏ<âçŸäýz²#jûÍëy#n0ÛÞüjZ›“Á`($€�þS�]nç– ÔZ·h•” )ÀmQrt cxáÁ/yUyó+Ù‰£‰54õªf±¨‰Ýk¼H9¬o
ôeïYHûkÖìÐvëMÅ pÞ²Ð(û51‘Ö5IÏ9˜rlqsöýøFXr«?XaÂåeÌÉ ó¼ ± ¡Bl‚S‘'Xíòw-a›G‰Ñשðe`[µt§C : ”Úcínähs»Sq¬èÓ"Iå¤QŒc×…—¢h`üSC¡\úUL$dŠzžØTN‚ðвEÓ³@6êß5 VF—y£IŽ_ÔþUõ\{Mx‡f&]jõ}¾�øzÚIв]<tì¦ãåŒ<=‚…í_žÐ¨­�­ˆó$ËŠ<Ÿ@íí_ÎÝUß�¡{ ?<(óÐJ'=4ž.R6";£FY„À/m\ò}fOm¿ŸaÊ[I‹<u+P­Él¥‹΀™Fµ÷ÈÓÅ\çM’¶”ó:ð… nU§;¥áhJÅüq\ ½kå+Àn£ìõWZ\ƒÔ×#^‰xµ‚tÅþ«úAš‘ÒÁÿ\·b¯-£*k÷UUÓ�©žÙa&X‰*¦ëóøÏS]|ðø ´]œÖÎûãéã$›Çqö̽5ú”z–~«ôÜÕNêð-ÂÚ"Ýõ›‘Yµ»þÈB°¾Bž,ÝÇÓžÎçÃõ›¬ûöµµF§Ç6b`Ú;jX*.vtÍN‘­µ£CW%òiKví˜å%¾z ¬ä1æ•|?Ÿ5�ó2tbÅñ~Ÿ÷LûÏ{µš6÷cÿÔ.X€ñ*9¸~r¤±:Žm½.h²«8§{z²˜�ù¡ôIÐ�”oêöuŸÙQ2>$BÄYë RŒ¢�Ò'©£­¶a=¢œ^bÒÓjQÆ©)XE6p™Z]`7~¯› "õ*D_ýP6žRŽç¾¬o¾'ßl0н}Ž�=ö³|3%åXc­®ïv‰f}B靯&XÎt€GÏ“ÛÑy[ú÷ùa]Ø—Ž_¶ä.Ö)¯ŸBWø}¶P7ç¢Ððñ¤›ž
� -ž]íÒÛï¯'«/ÈQ,sGpë‘3¹>̯.NH~î)Ð|ú†uÍã¾a"= þ² 1Yz*ãÝÞ£AÒV%Rá�­�QëQ´JÇ~9‰ % ”xó¢©ÿ6&ÜDæº^²¥^Áë™ £î>>lá8X™Œ§xPsKx°�î·9“"†§…—uÕØ00¤itŠŠh�¬) µñ)LÀNö$�lÔòb?[Ú±•gBë¿7b·-!oÁÀiegrˆ°€î¨(šÇ°Ïjøîrð;·ßT|=®6WŒAŽáqË‹¨<rNõgÀ<f‹
~êÇÚç4Ó…JÇ£‡´·HÓr'@8ú�ôëOPòËD×ܶ4J s1'öÔ“Œ’ãJmp?Y[5¯å}ƒÜo yC,È»Nš¦Ì²Fpw)�×mPX�“Ä3ÛÊlm2BÏ^ê¿å {ã1³‘ýh°vË ½Â¡ÿñˆo™28³¿`úËE6«+¼éÎrî{ó™¹Â³—�šL&“6dÐAÎmQGÍpÄ,®^>ŒGÃëRëH�NM®mÐì.³Ã1Ʋ¢¯8ç#vÇÍ@‡^§{£ûZ‡¹ub¶€4wÇâ.ÐÁ~vÔJÐU
¼yZ­]íÈLYC£LÈr†F‹@½$Ç[阮€ƒØpe¬XÕ«P5…�Wçpðb¹üì9²¸™j¨‚ÃÔ¿‰Ñ×:iÃ(Î¥EöO2r¹»é^SÞEŠÚˆd%ñô÷„
‚!J„¶Þ¯ pYÒ ?bžš*/ÿ¼Éªýõ#8ø/W§Ó¡èæOG½¶¤ýç3’xÔµæêaò>P®à)ÿ5âÃ0ŽÎÛŸÝ&ì'äO¢ç¢eÙ‚WöœÏƒ Ú ~<Š–§ˆÝ·Õ‡sˆ}òí翞�J=èVcsämWÃ_¼gú;?,z¥lÙz‘ž…­é`!º!ßìȈҳ„J\gH4ÎȾ€“øQgmDlRË´úŽ u"XùµÁÍû#âø½†óÞÏzŧ]ÀÛ®G’
÷sP£~›W¼ÉžjYçr>dQã<ÕF,W‹ ytµ ÕqÛ8.WØœLó¬»ëò* 7/¾~ËtRR½öæOû5ífnB7Þðl¦ö§­ñŒ`<ÂÇö5ßËqs¡SÈšS³�³]FûEXë!G-�ï;jM…Ú‹)‚ÂçýçÉ›Zq}:%WÁz©ï9ß[P>|ØW4V>$:¬¡v� .11½cN{aävQ¶êÞï"á9î¶²¤YéßÍœ¿‡� ÃDç5IÇCÜÆ?b¶³aüÀ¢Úì (’8bU¢†…˼™öÌÔÙѲ1¯PÄœ ß·ÞÎæNÕ±09¦Ëp}£1ä/rÆdKØï´<¨éý�Љ·[Í¿ ÍAѶrµ#))v/+¸g|ê…º=w=D™7
ÜòTjXïbÈ'´=l­™­P¿JE.Á,º·Ú¸ °`Œ„jcÄþ<žïvi©ß ]ˆ4ÊŽ«ìš�1Øt;¤´$Ñpøû¢’Î\›Ä±*‹kDÌN¡®½Ü£ì¡‰¡‰àÒ™ Ç⣟Ål°Ä»— 3çG'/䄸ØdOˆþ`›½¸³¶ûšÏæ"B)Ö„Ë
Åûs¸¬ï
/
›E÷.‹¾¥SŽ¿bp›/½9öû“˜!Ï'"𰵬>a§ŽÞ`éÉ6Õ[Î#rãÚš®�‘…~¼ØÑ{…4Ã!T!âO¹FÈö<´cÁ%j€Þv]°¤ß"Ö�÷ˆîÌÐËxV°X‹uØ•[¢<Ô‘•h±IÂ’]ôÏz¾áWi,ך½•!£X9�s1À·ŠÛ¹ŠÛ¡¸È�L` ›�Ȩ¸» LmO11«jß+Abjë[ÓnsÅ=ðÖœJ¶
ÔlǾÜôt:=‚�ì}Ø™#‚ÍÌ!ïE
Îy¯<}[ìÍé–F}دß$$s¬Yÿúa­¾öüJ5-)ç/àìÐÀ‚^û´ÔŒœéˆd2u¬ˆÌÀÛ÷x熰]ǰ€òÉ"P«‚O; ä„/Œ×ümˆ]bÂÉ2�Œ�wÿ¨Â'LJ ‰Þ=ø-�\³l>¾�9lLVãþã-$ @ÁöÿRŸ‰55VS6C¤¶TœXµF=¶À„�žBбü$z$Z‚I á·¨²Ð·Z8ŸŽž:ýÚ7¼¹É|”]È×™*›™²»9sL-‘µ'`¸2ñ“æ%³¨¼cWµ£m†*žšgõ¦<ÞÜø/{Üø§Y@så¢ßágÓ§Dí�_³ŠI33/Ç‹ �U¨¨dû“3Ù•! ÆÇÅŽcø€F\G´„v ðÙt@ïAU"‚ëÑù–vZ ê÷Žçêr”©×5?;2t¦­Á1@zìýÌvoY•’U àæ…_k'kÞúYPŽÝ�v:MîM°(ÒžÌ� ¾MgJŸ0Å—C5ÅW�„ƒÑæØå?[�’2�wÓÁÜÄšïtâ•}-­2K®È¶Þ3®Ë'|Ç{Vkªü°
NVÅ�zv‘ZÔð’Æ˜.À»¬Åθ|w×ÎŒã‰Tèo¼ÕÎÛ‘‰òqZˆŽ§ÀéÉioäÚNfyîEA7šï· ÆÎå›?þx”ü¼¾Üœ )|·á6áݧ`7©Õc×´,ŸÏÓº—K§wnQ®໣ž,ïË»…:`Ï•(;‰Õw‹Wíb½ Éuz®qbÀ.ób‡vw-°YîÕR…¾5Oö¹,ZÕe´«Zá [Ú€úнiõÄÀ‰`n áÃ@�ùW:G9 Ã"¼Ú�5-›îp4Ê_8 ±Äb櫼G¦d×
�]ü7€}N£IƒÏrÿ‹ÕŠ˜^@áOÃáù‡ÇHyŸ‚o�’|�0¤ÉaLŧþ�y¾©Ë¯úK8�‡¡«úâöûGÜ3ó33æ„_E?Ð�ßu³•^~9$âlìô¼Ïø´i+)>î]t®�É8ÿÔ¤˜9Hx>¼ÜïêÒ÷–=䀸”GeúÚ„yõ�/~,÷˜ˆ³¡;~ØØ¼�'ÇŽW±Y9‹?NÙ)d
F"ŸàUÝøàà ¿m±ýge ûFï¯>Ï3ðG×/,iäJ^¡·F¡Ù¬Q–SBf,W¿
L%�L9
Hð”ÊÑ퉘•6ý_³4u¯¹ˆ�†Q“*4bv')‚ËÕ`Š9iü/§Æ(Wá$t‡s,µTßõ­üH-9˜�e–o!…›’2%ËûˆÝÜx— ìxÕ4‚�QÉ Ó«H"
çrÕÆtä†AŸDÕ„AÂU{óW³5¢ÏÐYl»÷kS¹+Âl4­ç‡‰òeÏqƒ€ë\¿Ó#Ë(ÉÂZH¹jÇS9ÈRÃm�â/Á–‘móþëÏ¡ÏU‰_TÐö&Š™óîs
ó÷ºÚÔ<NH’\@�ÕÈ[Àebúaž2vñÜèöüÅ6ã&s óþûçàÞA¤jŒ©¯‡œ¨û;â.àù×�3d'Ïf2!ކFÊ6”%ê?²öC?óÖ=¬](�!«[ûFn�ÙºË8fEn,ªË;'’'y`1IŒÆ­i³V]iyXÉD±×Qd!dû{TÄß¿uö³üòwê}ãÃÏ?á$7ò-‰ì¬?§Ty´û*šËThè3eïÕ'Í!
–!R…Ë3WöA;¼—õm¹«ul›Øåêöê€OÝ�’|.çøæŒ’æÄ,×*·2s0OQpäï  Œh_ŒqS#ãÎZÆ3Üó‹]gÈ×%á¡çf¶r÷yçìðøyÈà³Éy÷ÚÃÞRe¸×KÖR°ÙÈ8oçæèÅÁ‚<oõ×��N@ÝãmÜ÷.@:­Ãzîµ7�TΑ°¿ë_ÑŠ¶+€ÏϪ³§G¼Vtœ=¸í«!‡÷À� rཬ¥¤ðx¶ü ÿ@WŸäþ…Þõ…XSsƸÿ€0©þÉKùmˆü£Ï �@Ó¯üNà@‚"@Ã…d™‚¢-#”À†ëÎW¿ªròr&Ûa-ºò~d(|RÙ‹u]ç?½ ¥Žõ@¼sßKÏ’“7/áïN¸ß¾„¿Q+ïéeƒ`ÖÐÐ > þú4üTSUÝ~ž,÷Ô2µNr�;OàÓ§v¦Rí¹�ºÌõ·UOЭAƒÎìâú1ÿW„×/…à—¯‰í�^‰II€Ê…µµµ´”ÔùÚ÷ÔšTs�›¨icV\áÀè©*S~´Àïc‰O3×îL–¨�À˜]×M Áè!“š%"¯Óß•¸ªÞœ¹¬¯M€.Ìëq=ˆ¨ãù¤5àÅï¸×„èe1;?¯E—(te˜ä²P›åéºåF¨¢ÜÐa—à-Õ¤–ßøn<ÝðÊÌ.5Àn²Vƒ®Õ ÂàÌø¶L„Å3¯¤Äj·ÃûÕ2hK_Ö}lB7pƒã‰Ô"pƒ¥}}s•»»H QcäïÞ1ÿ>]¦ýj@�ÀÁœ?î<a>._N0bWQ¥�ÑW·¨Q™$›áimËhO«=Ëÿlz% ê%¤,izúTø‰C:óÙa¯”J}zÌŽ¥ý<Ý¡†ä›ãó�#ÑsÅ„/æ…ÄN¥,ífdñ{kÇÑÓÁ¹O»9t�Îýi€”ÔQ|ïpì÷��µÇqVî«Õã�Øð�ÜÓx¾ó@mSÙNæjr&Îï´•eíîi7}ïFMª©cÇLæSqhiÛçÕ“¨°Êºúq“‰2Eßl[fÎúI¥Œ© Q‘ãNæ&Ö?5±W*gñsõ8""©pÊ=a1›‡:\C•Ü¥}Çá—½êËZæÎfn ˸Ü� ,ž+ 'æÛÇ'¡›]Æ Å€­Ràð;è‚­íþì­ï¾J';-™™zš�m¸¢«^x;NT³±¾Å ãiW{rŒU°�ƒæN=þpÁÄXAÇtFüJ?“|.Ù›³™ÛI~ÃÁÛl­®¹â÷b¼$n¡ÐÔNÄ%ó¨DGLMKÃdž¯iËÜ4{â­w;‡ìî@ÌF Ra†u±bá}~îø^úÛÑYŠÇb
om/,õ fñé64À¿¨8ST?�'4̧�o‰Ÿ Â�¬x@—/T§¯9v~Y’ü –¡ÜÈà²Emµ@k7 ¼Ñ
xéåÑì¦a¼÷É|(ÛÔ9?ô°˜£šÂ§1¿ÚHÌ¢+†ó½Ou|ø¸ Ÿq»Nk[®\(•&¾t•’G<RGjËgÊ ¼<­rtžðXÀà·ä³‹g½ó}*pDn)‚ŒÀ–ÀÛæec[,땃@µö¸‹ŒëÞÑ”ƒ²m´+¹q¢ŒÈxý˺¹„F
þ­¢êtkV†Ñc#±’éÄ c|ë·×mÆ’•-ä‰Ü�ÒIèÖþä&�G«ˆCù"o@¯€DF¶ýþ¡¦&{p2Hiìi°ÞÜIW«åÒßÊ$YàÖ·Æ�„?°õtGVÖÍYMã9Dpª£ÅC›”Ý—>µߟ?ü™Ù‡ò'­¦Ô¥·Íù³™‘*B¥†»ti~¹�xùóý�„î±S Ž5)©$]½�®wTGB‹HÛGÏ2sKù²ÚkUŒ·ÚÌœðºV@“Ú¡}ý‘fvaÈVNx¼æ•’Z·jÒ=jôzRµåWÉgfòÐ'!`š”¤÷>LñÛ4Bz&& pG~æØ~›ÊóDó·MšeÚcâáŠïUï¹î¼M”µ×Œí}õÏ̯lQmîê6Ð�Μý„ÝpHþBÓ™lã~îãr/ÂQÄÌ3ÍyõºïsØåSîµö¿ÏhšŠMüN³î"­M¤%œf®ãÒÞÌ›´.W?
±´¹ó)®Ïþ`{šµÔÕË1ÎÃß|-Ó²Äa¯Ãí£bnïÁÕ/
)>6á¥/>è["˜G�. . ®ß@O¿<ìm›cc—ì“m­iÂ�¥ˆÈ.—4s^QnYÂ�Œ²Z¬ï‡1O΂b
Ý6Ér3c8Áß°Éý=çä;ÎIâƒ*èÁv²¸ýIœþB8çõ!ña}m»b9vwʇïËð¦AõâTØÜõK‚Lc} Y ^—8ù+ºB‚¨Ø¨¼^RÁW‡ˆ4qÌ8OßOg¡¥¾O¤ÌYŒ­,Ì�’“ùôµàbq!qŽƒM×vj%wE<ìò!•ŠüqCtôâŽ
úÙ½WGI î™Æ ³Ö�ààê/Êa8‡…EnÔ<e(ÕøLWÁ¬�f[,ÏnÕ›,K5õŒÈ[QFàm$Y—tµ•uTÝj?Ð%9-*ó+s¢Ç˜dœò¶~±4TųJ}”(y  ºãí¯¾�jsï5µ1uoOE€ßh阎üµµ9Ðdü‰×
髨î2òtk�â+¬úÇÓ=ms[™Q™†EÃöÕ„w�Ñb"Bã·»&ËÕæÌŒË·ÂãzÂÚºîÚXùUƒ¬ éY†ŸHs¨Ew %Ò$µÇ£Ø„{Œ!«•7 Eò&@)œÎå~÷‘úÙB<¸¹É]JÑ#w»)jÔÔ£ŸXöËñ½çš„䊆Ürß"I!Ùñà"ï´aìï„ß‹‹iI9TÌK´Ó­9|õrž/Æ9Œbþn–ç*èœ�¸1;+§|#'&çkõÙ'(tΜÒ}àAùÅ1ï¼YµÖHù¼£µ3\ðv¶OAR=ªé‹ÈúT }l·ä…£$¢¸N~;ÕÌNsA²�¥¢–òÀ[ö¢$—Oñ·Fzªàšèûç×ÏV$kêí®¶÷"^õ¿Sû×·Õ×�Z±Ý°¾*xÊ•S.b‡
oM¥£¾4ðÌm€'ŽuÃÇR¯d㸔€Zj?
öùBËW®ù¸QÊ´>Ñé_?W=‚¬’åe]ØÒk#^6·PvËcÚßÁüç=¾•·Z9=fçO¡¥ËÛÎÉÉèçh¨][‡’ºüׯ““‰Þâ­˜?�d ’(l (‡zKL&"ÇÝgRò±œÜ{ü”Ôq¨ôEª}�&=Tm$,)MÒ
LÒš sEÁS þ<(âZ—¡�µ0í^ªiž¦ÙýÏõV�šxVï•GÉñ]îê…kIÛ„/$t[UȆRŸ>e ñañŒQÞñáóðP<BøûþbhÚÒ­™cº†’|뮉.»åƒný0n‘�üy¨c²�”ªþCÎ1'�ñˆ�ÏЃ¯|•ns&sDW_wCw ™‚Måj¤ø‚øÁXkxSÕ<cˆ—¨ÿsx]âaÀþ»®cA¶¶%ªI¦œû…¯äÁ,Bf5/TÖ©ºÅFÑšYÉÖ?z˜owpÿµ Mù™Ûf3+× ¬Îu¯¨¨”!Y¥ò\渇(e ¡?¬Ä«,G?—{“wšoáQ[ÆuØÏóM踌=ø€Î.&…ü•%ÍkÊ•©° ˆÂ!5±SãÐЧ0ŠØ ‡5Å6Ì6úC2’ L°tæ½5*Kø²¾ÄDËú
i™r>ýÙ,\”E0å3~!ØÌA&æ.ïÚ¸?†öà( ´cÅœ^â™;ßGlë¤!Ëm³2JƒÅÜ 8JQ—ún·”Mú>í’²ï„ǸØ2/v&C®Þ,§¶ý§`»%S¢�õ0Å8‘|Éš§-‘ÛúÛùÇAbÀ(Ç‚žîCîG®Œn¥~šð‰¬Æëø¾ý<�Úøâ«æ•¡îðàÞç¯dá,ÆÓ&Òi£7JQí¼Ìõ³ûx‡À¸+Æ�Òñkö¾ƒÏô>ÊßóÇ1­³•™¢œËô Å— mé¯úÊ^qÈÓJŠ?ô똞G0žùëHâÚñ¶È3US7ŸŒ!÷áj g&� ÜÛÊ@öÏ\t¬1^�“Š ^#›|-g›vpòúlwoâì~´ËCÏe}Z6´m7m^Ûa‹åSŠŠ�åMò¥ë{.� p1KLus^Y¿¢u‘í¢4“}âÂ�ìð´“"Fd¬›ë^ìÔ 7Àµ8`¥"£ xe׋ÃöêÞ©]±`ƒ¦‘¼G—q��8îþ¬’]<o„ÁµV÷¥†1sïh(‘K¿Øº÷Sʬ+38‰1Ø»!ñ^m„š–¾çâiHA[÷ȆÕ4hN«¢sE[Î…})ºÔnùsA«CÊcËš/¸Âއ¡ÁºYZÑÍOãm§ÔÄéþ^`ÙºM wÏcƒ¦xGöâTío9ƒ€ å Ò†ùjÌ‹¸�æýJ¾¼m³8«EZn÷²×^ùå(ý«C:7H,ãáCi’8:çò¯À.Û ¢yÕµ “j�Â蛣¡î_½ÅæÂzš'æ˜äicë(ã^ô} (g±Õêâ^Ä_‘¨�0YñóûÛE~´®Õ8DFÔúÛÑ�+W3Ìüµš)öa
Çèú0Æ(²/?räxáQùEþÆÓ½²»7Ø?¼fÉÓ(ígU Ûl0=? yZ²Ýµg _³Æ7F&«ë×Ò"‚Ø™®Mࣛú }»ý—#Òà”ÏÈ
¶Z-ûþh1¹²l÷Ž¥Røtš¡ß­Øõ{¨ç4]Jˇpü–ù³-Ãt]Fèmºhï 9¢ 8kqJ«lRÊ4f§MßÍ1;otS#º7̸qÌûó†RÙÑ€Æ=£Á)×ûSuMbéÀLGöûó&뵉¶´êѪS’ÂÑÎN;m 3ë`F×r•¢Ùê%0¤™üÇxš§Yƒ^rõ¸e8íÇÄÈA„þÜtè*Xˆ¬¯Gb×;uu‘gã)+¸Y¨[7´VQ]w¯I’·Š&ñH-^é uyV±´Îèã6¾$bkòˆm“ÊPN:ÈÞG-g‚b˜YŒ5þxU%‹ó°ôÜÿÂùVJû0|ÜÆ¾ƒÐ ñF–²Ó<ðOÉÇPgß|§Ù¦±.hÖeÏЭÍÕ�hF—=àYÌXD-¥Å\Úæ²ë9IþÕéʱEV5'tHÁsh5›¶ÊŽ•4÷°kÔ¡ý>øÑÐÒ×îð%(@`ÖÈR¯ÔmâQ—:!6#l1]ØúBtÝÄÿy |ŠdÛ�XÌ�ôD;ýâ zäé€P¸ë±ñ»OÎú ƒ¦ "PÇ
Ë÷[{~Úƒˆëgy?NŒø2pÔ8
¡ÀÂÇΧ°Î
êJjg}…��kú{ü ÅÙ
 Ó÷ݹiéœs
2‚ð¯VxЊ¬ƒ"ÜB…ní’ �ëÑ' "³'Þ‹Që‰�á�Ñ$&¬6)C_~+L¾c~ ÷]Ïr
8A} �«ˆ€š@¯=;cÉ‚5U†�ä$È D‚þhFnp
TÿgÝϞ믻—©<¬,v‘ø†+nä»ùóq­Ê·`Ù�0uuuZJc…õ™0ãDhß®q�§ü6 ~×tÖ�änÇË »¹Q>@ð@¿»YA·´õÔ=̺óøÅóËì$ѹQWUM3ËAaFs'-U•Ì;Ï{�™�õC6ÌvÛàòï½ý�ÀH˜ãA�æ»`v^žHF{?>;èS¼Â'“ÏUÊ·5Úá¾K¾ÊC²0´�7œˆÑ@Dþ…6|Ál!UyŸcD§ÑëļŒ&zØ| J{ÙýÝæ  ¦6®­ïáf…y:Ûµ�¬ïݘ]á^�å1#Ðü�ºZœ±·}Qÿæ3†ÇÁèØÆµ_ØŸvú[c9hšG#²\Â.¦zÐh1BÛ¡Þ±r2M}«•³Ï ‡MÎ- —›Õyç·0WûéìÙŸ$‹*ø+,%÷¦VÏœæJû?>ZqlÀÁR¡˜c3éð™‘{§×�­¢½|ëÇEQò¤RúNIᙑôÅî7Ô¤R­=NƒS|¡Ÿ¤jsw–¬ôgýX£·¿ßŸ\ʇñ�Ë וÒ+ 7{‘ÈFt@þx•‚t>-
•€;õ¾Òév4Ä!rÂÏV繫ÝÉw¦£wtìWW›_än.”ÂÓ–ŠOƒ–u��êËDZ:Ç[]Hyÿðuô”UŽsŠgŒ°ž$ïióy½ã£�åïdßÉ�šä3°Ä—š½uì&qS´{šà#•qÓùqž Q>ƒ¯¦ú² ‡DÉM¡ö! Úwæê¾'ÿóMÝ)Ë9Êc–�ÒŒfd,«�ˆ÷¼¾’m>±‚�¼çµòÚ:Î;qÏ…L¦û½ˆulß=÷ÝÍNšW«A‘¼×“«ç{7;ŒÏGH¹�çôeÉöm›¿ƒ¢êø4⻎&žžŠÕ¯ÇUû¼�ŸŽ/ä½å ¡¿cÚ™¢vVÍJ*
ø-†}ÌÜáR.�È–e–ÉAeS¿â Z+Ü#7Fõ�¼v4}õ DOæ¡'Ø�ø±ºþ KóÚZ éOã/äÅǾ©_ä‹cn®>íðïa}=@î>äAH?qm¯‘¯é¨kÍ€Ïô@·t¦)ýbi÷P¶rWT¨”WcܵoE )`à´¯ègŽŠäl†ðñ é3™ØµUÊ; ~3ªÔE$jæàfî`¿¸;)Œ¢VÚÿ÷DôëI¢±½Òvsz]ñº´zÂ^[Õ\»�óo¤ï¼žIë¼™ýÑÉSÓHlXÝ+cïÚƒŸO�Ñâu:8ÙÏ6XÔw6WÔ}îÖt<ܶ¯Ïè':ùŽn¼è"ƒœìYLÕ•‰XUjy¿ËxT£ÛRÚ¾ÍïÝ GêŽøøï)lØOhL‰¨xž×~ ­�ìý"©¿ÅÉŠésv®½Ë ù Á“ʾüi,’¿Ú-*óú÷t]ËÃÎ0…¨M”Zhðh„[}«úÀÕAæwñîÑú{TÛK §ø³Ú˜²\„ü”7)Ř͎’9´®<b­Ûm¶Wñã7Ôëš6VŸ¤Ü˜µNK¢$¼$DÒ5ë°•Mµ\ÔGB€Ê^9|ˆÕ1Ï:_M¡Þìͧ09uBŸÙ¥ׇAWˆÌãe›:¡ÅsëæMbØ m~íúfÍc¿­°º±ZŒÿ~{¯/ª4-ëéZ˜�ôü/øf•éÛ9”1âéàb¢´N$ûxôÆøèaGÑ1·½Äñ´ÐÕÕ'@îeŒb[pd•êOiÍ„!±aÁrç ²vÙÛú20^ºù¸_k~R×~µ‚1!Kå}pƈ,Ú3y¦}£™´ÆívÖŒ”#g‰1@Uï‚�u@Œ˜—!KÁ[uM9Š˜†±:©E‘¢Öõž.¿;I�õ–o,Èt.O¾â<ådØÖ�z#Ÿ2CÉìæÄêÑd¬~4ZäBnïÛª�OpEºÁ·fö3¹üB†"b6dW½$ŸŸ?ç/bVS,�òkÀ4‚(à}q p&ÎÍõ{ÆÄ;WyÙ¸¯ wR;0ñâOI�ž·éï÷�ö)MeU(Þ¡¾ÇÙ\£9žõðšû1Aóc bN_Ýy+tDïì[áÖj;)3´ö»²€Ç‚×á/*"-Ϋ SÙRûÎËrˆçh ïõàj¤3�oÕkf7ÕJ[–$˜áP,Xú`†s]oñ 5»íNNfPgùÈ>NœÉÇw<ÏC²Z«ÖÁ=×BËK?Û0ìЧìHÞiÇñ>Éj¤¤¥ /a<u¯jlëËŠUððföûmv>ˆCŸ°'[Å剰2úXÏxÐ-‚6ŠÕ«�‘È&_¤?T]©fqνÊáà�÷ÌFÁ?+5¤²ýs‘“vÓßzÙ)àô¤}œ(/pëÖIÙ º#zøb¯ŠœuwNŸj>ËÁ�ÿ8ý�:t+Ö?Š¡³•¸\Â=_9)ŠŸr«L’Zu×Þº`[¦6k<.O
SöMNhW%URºë"�ôÚo82iõÖ�7£êWuÙ µ!‹ö:ãÍcñºåRî“y¶f¾pûžÕ/l)í�·1A`fyœµª^#m”;u ÃŽÞœxç…iðÁÒüB±'²½ukÕgleí¤Á-ʪüŠ ¬;¶Œ‚`Ó0¼Îî⑺ê
²’;û&²% PB±œ�*²!%Éíl–ÜWÍÚ`hß¹y”iw…\“ŒÓPÁ²XºÚí°LGž7|ì¼+?›tÐèd:ôô àòG�†ôìfßW¿Ó‘äËv³­]×3œÊçš’œw/³)÷€f`­�…^\®ÉbÌЪ¸5ü§lv0ô�ÆE||BØÃúpºD‚ÄÜnUJQUãUÚž—"[ËfÃRª¡°±¼T+°±áªê`®8n;Ûªæ`E;7�
µP
ÂM�lf$;pŸàT»!ë(µ1O�`Å$§(Â&æêðA?¼:õ†)¼+¯º-â$΂+)Ø6 ˜´;¦«O<�´€G†ÄbþßÝ“Nï�e·Ïó.zî‰DFÂ&FÜŸ4¶ìè�zâK} î1±ïÁzÆÑ°ø2$ƒ­.¥¤ô®½}ߤ9ëêñeyɦ ƒ%""ã½²—¹o•x¢uÜ–ëí’ÅX/5åÝ¢½ ¼ƒJ4�)=û�§´/%5™FvãGö�EÏ<3íoG&Œúc)6ÙÑc”HÔ½¥É«�,çú–L~OƒË­ïxΙöšAÆX,NšÍƒç5'7RÃâe�îÛÿvQ­i>'½uT“ºO¥»rm%µä»úø3*ö‘YÜ[‹ùwf”+ÐL$y;}Å:`æùs»”Ò‚/–ó*U¬P¤!tþOéÅéþ wÄâͬÊ2Þñ4Çúñ^G…\‰’r¬÷ñ« Qk˜µEÁã\ïPMWß<bå$¤ªp`ÍMh¶-ï&úëóï)ùÜß�Á¯xíã'—Éu¿ÕּըЦAg7OŒ*ýèdn/›¥Vì ‰]9¥ã€$އX,í?ãzÊŽÙŠ‘±,ÁÜÆvQ&ÒcšÕ ïiN-€h;»ÒTwÃáÁ-b�½-ÁÿÕ5¨Ñ,,„Çû€µÉ‰x05:¸–ÂÚ#]¸ÁvÀŸéä‹Gw³M™Zök>éŸ �`=ÊL‹™�‡m·�­ù+‘aÈ"mæˆz÷
bpðàvc;é�Ú.ÿëNú]veW6{öì´ÍQ��àã-·�t%½·æì±˜ËäuÚå/mƒ¬ÛýZ”è2[Zlž-D²J9E¼À¶n�<øÇv@ƒ©c7 «†«o&ªçåݵX+�ñ“Ì£Χ]§ŠeËj¾G½R€—Cßõ£ê·hÔ&(Â(ñÊé à÷ðu7�¸#
˜9Vó+,1Ñ-�>‚�؃ÔfËáã¥Õ™Ýˆ|ŸâÂH!µù¾%´IñäÀµ Þ$•?L_”Þ Â×VÊ|Ë¿¿¸R%ÝvãýÔÆs¦u‰Èô¸›ðêþ†ü�¸ý¿$<ž§€_¿À­«¾�Å�0ªHÝÓÁ“_¿„ÍåæCƒaO)(0ðäÏÍ”ç@d߉pô2R'§k¸ÅO:Å•%epNþ´†"¹#45Ød.N*M6þ�éI•w”î=e[D¬ãóvóYÅEÃL±¥GZÛþÜ·ø�9mlÆ^ò>èÅ�^eIŠ|QÙÍ-¨qg¤�Hl·ã:”¬ÅõBíΦ˜í£z‹æRþ'ò5|.§�íAýÄŠ‡ƒ�‰µ6š†J‚)ݺ8Éʸ“§D™°½ønšý̓Åßâ(46¢Û»ú¬ŽËa";g/c߈àÁqÄ4üÜ5<ï�Z4�KÁ¡í0cŒÕí"Ë7z¤ƒ…IÀ‡Ü™ø×õ;ÞŸò¿¼ûÌ‹î8l½èå8sRhmûój5†}žÅ ޼ zR^Õ1®Ï-»6µ¹´ûU·ÿ¸CbnXè1=…|A}+ ,WR¦~®è¤ê´6 ä`“gíw![ÿR™*Å›y;N™†„ –×â3l]µîÙÝFÁ}�fµ²û­¢¹~«Ü÷‹�¨U�Gí€ãUFþ§ÙMú›íTžyûþ¿óªWùöüº\=Dr§PÚ�šƒö±µoG¿Úס:‰G|ç—k`�§€©$=/Ó>¯M4þù©ë¿¸H¨Ö,ªêædÕ\ãÈ] ˜Í­EÁÁø§£Siå ÀtÙî±~ xÇ­A³ùœC®Œ¯[¡³“'º3ul¦<¢üËÁ¹·||Aý¾Uÿ"ÁuÎ)Uí>1Ïï´C�¼ÿV§…A„3 ¶€E+‡[á&Aò^õä+ù]3$1c+Üﱩ(ÚÎÀ’µ¨’-7v#î‡å�6ìiC&Ì‘N�@6Ö¿>½{ ¼:G+�ŒAví“Êw²Kmÿ<”„`€³YšVÕ' ñáqøM­*3}±þÔXëñ&TŸ!KßbYKe¶W¦¦ „aø¨}«|Ë;É\ˆÿw–—©\Êd„̾g|ÙVlŠ À}#š03÷?jø¢0Âs «Íâ£¨Öæ‘&U�õÆ»Åz®!Iί÷‚mTl/ç0–¶ñü–QˆêsL‡GdLR§f]DŠ€Ê¢‚ê|+ž4ôúŒã`‡´Å+ñCšÂÇ€žU¥¸ø÷ÿ‰øÓùJDÏ“í PpðK¸qCñÏ›ZÒe¿>?èŠÿ÷”¾’¢bu[é/…¢Iï~ÇÒ�muu*ŠŠ~$P¾„›—?´¡q•‚Ä_å·ùN^ý Xz$Ùü÷. ì¿€Và\©ziIɹïÞ<_yM½4Ïû·�Žêo�@Þï7ä» Ä^`)))ÃÃRa}Fìi@b´èúŸœ¾-»¶¥¥å—ûÓÕú�x¸!LæŸá�ôîŸ1ã£`âuÂÓ¨aOíì¦_÷ééé½O#útf±ñ‚¢})ãŠ�Æ%%ÃFÕ˜Uxê;•áv[Whz7•6)S¹s6íÏ7m»ëò‰Þ5“Þ_ ¤Ø0 镃�*S�_Ù}ð?¡F_ÿŸBBÿãƒøÿ›_¾|~AžG7ÆT¨Ü3HRTN¤BÈàÇÿ PK‡Nâ@þ> >¦¡word/media/image9.png¡^ý‰PNG

IHDR«Œ@è;sBITÛáOà pHYsttÞfxDIDATh�íZQ²Ã Œoz—ÜÿVýì Ò�Ì8tY�˜X}�ûñ¦¥fAD^ÒëõZ×õù|.·Ä_o&:czÀÝQé)¥kíˆëÝÑEûOâ!¿ÀÊnÛö]c|ì&M¸9`Û¶}‰ó‡ô¯£íÊhö ‹YÜûgI9îw¡L»DËKl”Jë¢Ú f ¥Â�¶¾pr€<ôþÑa%ª” È`ΪÝ`Ö<rû]ž{ÂÉ-Ð"
#û:÷ž¢ƒìáx-g„pæ
~ÌI8¨ù`ÖBx¼´Ð�Û©„‚Ö
pLÐÊCíw%¿‡(ðð™.J]j~ù×°á3•T<ò“ú6(Kú‰FèPÄq‡쎆9`Æî¿©eÍ5TÊRîhYg43¨Š Ð¥õÂàŠ¹œ³œ.W±Œ·á\´¸òW†É52Ö‹^y@»æ©˜fÄž¸ÍGµ†««§tÒwå*Çou¸06ÎSñJ�¦P8"-}£aPÚ°êÍûZÙAÿݰx I7?9gýu™'aç¤DOŒòTôê!_ù
Õ6牗faô6¾é¸% P›ôk9zQú¾ºsaçàÐéÞ=‚σçêõölûz´k^„Á5žÆFœ\#ÀïÑëPé®(¯tå·fÖœ®D©oqöLK‰Pó™KŠäS0ñȘ…­óQÐ\n¥f?âò+A(2 ¥A{\Z×yæ8O�ä(†î
·íü ÎÜ7õ€v»2ø~k¼»Æ‰�ÛRCIEND®B`‚PK‡Nâ@xl¶èÈËword/media/image2.pngë ðsçå’âb``àõôp ÒÛ�X‚ƒ Hš»ýþ ¤˜‹�<C888n?ôärxD30ðaÆ©Ú|Ò Œyž.Ž!�ogøö2ài½,þ~Ùò·¼VÝ]›„íû;¸WÝoKúÀÿî0_ÎóJ¹ã�’ŸwÉ«ýŸ'ûääŸšÝ Ÿøxq´i)Î÷š’{û]÷ë]QÉ¿K憛ûu]_¡²ø„Ô6¶ëb»=.òö{KGF?ó 𼽩J7jó¹ÕÒêGWïãÒe’=[¼ý–Z�^O̱ë óB¥Õ—=Òy{xC·Pkfé‚©­ß2•¤y&¼;k YùÜCãb¥^XÛ¶¡©ûó·ó—ßëñÌyǺbo›ï÷+s¿È~}£Y?í’ð:÷SÏ­—Sq]½¤ú–×�¥"¯9_–m™èÊ•+زýöäë‹l¦ß‘�ûÿÂc½Ä¶ÛòÇ7o[èZ¼Wó½ô2ÝÈ�r}¦Þ«ìÞXßÚ瘓ô»À.ê°œþ\o‰Üõysôv©ì>±n&—½Ãó/Rµ3g>ÚZ5Ï~�´q_Ý�ûÚTYœ§
ð„:„pbp>sïe?~÷梢MÀè`ðtõsYç”ÐPK‡Nâ@òؑڗ’word/media/image4.png’mþ‰PNG

IHDR§7ç+ÓsBITÛáOà pHYsÄÄ•+5IDATh�íXA… ”ÿºÿ•ý _f¢€Hµ€Y5€N
9çp†ß× >@¨î¡ºGí te[:@¹¨¯a‹„õZ¬zKMX­}i6–Æ…‰l¯vÐ�i´ƒ)ר"a%4­ÏÅj‰³ V¬zýô¸:#»~ú§Èêa‚÷�ìÔ¬²¬†°ê+Íz¸TWlï›ØüžØ¡=ó,I$‹UK7.I’tse³ú¤t~$ìYªå`)·a¬êGˆ¶ÑoÞT¯¹”äöýì|:lç8|A½øˆ9´Zr'7Õ±Vò´À݇ÚÏCH]ò;K>‘ȶÖ͸<¥íKq�ŠŸÎB*NÃ’ùÚLx(JgIbY3ç4w8
ÝéW˜dªª\!þÍyD¨î¡ºG„êñ&%h$ÕMÊ“IEND®B`‚PK‡Nâ@©•餥word/media/image8.pngë ðsçå’âb``àõôp ÒË€XŒƒ HU(RÌÅNž!·ú?r9 <"‹øŽ€0ãTm>iFOÇ�ŒÆ·Þ›+ð4û½Ÿð{þ½ŒJ–àè5÷zÖ†Rà8nñq׺ZfY­=¸Q´ÿ2“Ìî‡Óf7Gçñ�ÿ¥zÌlëåil†Çþìº(Ö²t¶÷A­õÎ\ÙbÎs¶J+u¯c
‘�:í˜_^·L—£[+îø*×G\ÒbÓóÌÂÊEøîù»áò׎ÛV¬»%Öï<X’Ö¹wÅ~ }÷žÌ™Ý¶í�3£LÖJÆôë°­¶¸>ᯇ§ûºüŸ�–[Ù>š·v$Xmºô.fñÇiv"ÍO_wË‹苼yÇðy“ç¢àc’o•™ä¦Y–&µš?e˜Ë[Âf•x7{¡ü؆‡knë~‰–<üdjü©Iy³æDŸ¹`ç1Ñ�[ÎÀWËkwž¼ëĶ ÷îþKŸcyíàÿ}3A~ÎÛi¹ãé³�€p>0EÆ$ì~+ hOW?—uN MPK‡Nâ@“÷Þ5…˜word/media/image3.pngë ðsçå’âb``àõôp ÒË�X‚ƒ H
¼¨’RÌÅNž!·ú?r9 <"‹øŽ€0ãTm> FkOÇ�ŒÆ·Ó/òVàp-½ùÿÑ÷ G¢D�D¯öÝñüä�ÆžîE-úæ|¼)Ëp“!ô;Gè÷å§Wû¯°?ôˆÄWo·Ü«_Œ�zqyríô=÷ZÒö„’´Øä;ŶÊ¿ÚfƨœH©Ðª}{NäÊ=�éOm8/9DzkfwnŸó�ßVÕ@2lÒë(mÛï&^1߬
Î;0Éê˜n·ë >¶T·(�žra‹v‰å¯nX2G,½S:9ã`ЭKr›¾°þÖZÚ1íÒ£zõsÁ_Ÿ½=¼èÔ”í‰&ÏxžÔYµŒá�ÚëÛÕë½�}ÝšÍÄŠÄ»-·IçåÝ\¸u['w5ÃYŸ¬ä.Ï¿Ò�w¿H[/kóg[Ëë7K�zÈ=ÕÕ7ß$´ê� n4Q¾÷`ƒêÇÃWwÖÁÓÕÏe�SBPK‡Nâ@}^«Ú<XGXword/media/image1.pngU¼c�%]Ð¨Ûæ´5ÓvOÛ¶mÛ¶m{Ú¶mc·mÛ¶Ý»ïûÅw✸ªêWEÕZY™•Ï“‘
râpØp ’"J  ÿþ»†�úïØh¤üþß ÔYI\¤v÷DDRDPÅô:Ú køýG~°‘Ìž;ø×á² uŠ’[>m²¢Åº!Ö>e2ˆiªâD˜’ÚZ2‚)»á-Æ_°�@{íÆ“ŸGßõîD2m·+?×§‹û,ïëÖ¶óaÇw§ŒUOì¨JL ‹á®Z´��ŒQP$…ûý!ZdZJZrg7ÝâÖÂÆ‡.)æ÷œ
:@KMñ[sòa55 Z¦�¤ž¯¿'‰ˆÎ1Ç�Øî…E¯ .ó+=Ä›ìM×Äè-M˜|-ïåá à;ÍÒÆŽå^b©½¯¯×ËY:ô²R�Ô©¦ãæzxH, ˆÊ!¿/ W#…cî¬ø!¦¦2 Çš6ŽÉq&D Œ”’ã 5 B܈Eü¡H6ØFlVf”Ôb}wܸ$éͽ®jŸ¥;kì ¿ö�ÅËÊ¡v!-8Ü¿ÿsë<nè¹\FÇ€ÕÓ¬›ÇDgœW uâ}6Xˆp3œ˜ð3Â3%ûXñ�Ò†Š�ä�¯jÇii´*õ’ÒŽ–q‘Øì�ÝãÈ®ð•mè÷ÓôÄ¡†“Â6¾Ÿ, ¢ŸÿY …½¾Ê�@ ,Bèxš
Û©fGüÃï2†Äõ$]¡¡Ü@$6öŒ �*ÍÈvKk[F>÷C¤Sš6K£?Ô¸ˆ�rSɘ8y“85¯D¶l¿wLb¬ù�ï©›Ô1N0ÿwÑ¿²9ë…ÀН¦t¡ZóèãG�®œûÄ`á�¶Ó4†}þ4VST>vñ°*©¬4ËÕ$+ø¿F&¾MŸ÷Xßc¸×æ¶
$@UöãȨ U–1‡7o¤­ [6�Fá?}·ƒ™óüOu,B»±þ{­ÿöº
Ú‹VÀjvÃÒ»mÒ7x²]Œ„C/h�H$2ضtAßlCXpqia 3>ä±
ïÁÈXù�úYv’Ÿ Ö~¢�..«D:æ~t‹üŠÞ¯ª´»ÚŠZžø~²t$Œò>Õ@ôøäZ×ñ£·8Š7EvK§ƒñ[CBøíÎùXàbl\;û÷]jvl_yëoszmͦø8ÍðjQé@4G
gÍR¯æ†–ç
ïíÓ“Úwñ㊑t#eݽ†º·zTýû[œQ$*vSàªlõ÷êU$ÍlÒ„”`‡ã�šºÇë¶{Þ4Æ~:£1•ÖÁ�0¾ÿO0Ÿ–»û½nÆ�¦Xö©{ðíºÇa,=˜yöä1v¯ÇýÁtïçM—»áÃËŽÃ ´gÏÎø0¢Ù'C^`áÑûn™®»Q�åú{¡°�ø^¶� çøÙv4à:@!“~ß¶ÙcË´Eò9ržï[˶±px¯C½%Bìxï}Û㮟»ÏF¼•;îÐûZˆ×oÀOr®3 4ü|.ɨNB“|ýH�8Jìp>õ[Öþ˜ÛÈ«/#$Íܽ¢¥ Åa·Û²˜x⺘jK>ïJžF ²WE�ÞÖ=-Šç[ÖtgGy±qbÇÒ}½Æ¦#›£<=¼“ñ_¸§–g*ïRr\½£Š¸©SÛ}
L©#ÉÒ¨uLtò(j«Pm#¡S·Ÿ|ŒãN³ÜŒ±ùöNÛ_\QpqoYÅeØj IÃÓc¶ïÌ–ÅXs¿[
zä© §§ed55×Oöp©9ð6Y÷ í]Ý+…oç€ÔO] õ4�ýÂåp ‡Ëi|A±GÁ›wÀJ<ta>µ%ïýN*vf-Í©½‘�§Øj*ï€&)!âãbêðÄðÒƒ‚ݨ8˜çW$Öž2x‘
$ëlEìøÐi5šŒ¯=* µE˜ÃÿéŠIé§5z|e½ú&Èï‚þ FBJ3üAëT�ròGÇVGö`ÐÊù&·X®Ò£´À“ètS2˜JÕC‡ñÌùÅ/nÀœ£ò¹·“}>Ÿƒ³!�ªöLO/ŠKuÚÆ�†ú¢5°Ü«òv´wiåQ�ôÁÃ3#éybhøÏ}¿Ýxõ5Êͼ‹ÞIñ&äËQ] °Òxƒäú¦sÅ,º4\SÌÔ1#Òu åÃI­ µa(Ñ€ÔEiq¹®R9â4ª{ôn6È=K𪻭…߬wqJ3éÇøpÑ�¿x¢ò/–¨K6ñ©3�ß$: åœG®`·©žè‰’â¡�•ÍñˆJh<WCIIé‰þ…B 6hn•q�~=£HXñ½7<3�«ró�œÜÕÖÜŒËi¿Ó'EÿÃ}a’hÅ*çá&§?³¡¿±¹ù£¦£ãƒë(‰ŒdîTÏá+:S3‹=„FðaðóiEDt£» Ö£T¨¿n¾`04a¹´�EAqĈOKž vLî—y[zÂ#l$=© —‚)Û’@
’F&Ÿq†Åµ9“sÝ2–¸“Èø—Cm@ƒ=Iª/½QÇÃ… ß´º©ñ�éÁŽ:‚÷-þ5 ÚÁ<‚¹�5µ[MÙ¯Ò×]#è`ŒNå5î­ë™­f={ÅÝíÜšÂíHËè \¢w|ø‹q 7�èÈ�wÆ´¹ÏÒŸerÈXx‰*íÇâˆè8b½éOù"XlhÍ ͰœÎU1222y2{«aõu”$‘ßÁ'Áê¶Á &âèq½ZœF§[( ñm¼äÆü¸áñõvx¿Dâïÿö’tHœkJÑxxFÈ9®©h)wV@ZP‚¾1˜°ûkêDðÒ�æw¾egQù'±$ß-•¿ Ü o<ñŠÖ�÷¼¯Þ¯¥›kqÿÆ$4ïàú¬X<ùëJ*]—‹È Ü`üÔðbés;¿Ä3éÆ;ßš{Ì<ǴѤ%ÝÉ3Õ…òÇÚb=å¸ûo_MÓú•ù_†±/¹†§–­å±bÁK~m5�Üð &Õ>ÒÒÂú@‚n�%ϼð$fí¹Ž_‹>Äå˜Iü×sÖ‡U¥mlæ¦ZþàjâJÄ s¾…'ÍÛú»5�XVÖXþ&l�üI5™ÞÜñ†ÑW;ê©Â…³ s£Ç;s¼äãªÙåx׊AéuQSY@Gþ´¤#C†)/²hì/͉0SÃþ-Q'ía],î‡T4° J# ª?}a`5Y/^XñųJ±ˆ¬>—°uºÆ„óg¡'�¢å}óšÅ¸a-Ç%>›ÁL÷ (•°˜”NjթMèu)çšëHÔò²�8›uaš�б¶⊶$ƒ,g»f.4¿°»Û‡«4µE ßÛA#ˆrªyV‘ß%í_]ÎÇ3k{Ę‚™Á
ŒGÊ ¾YæÊ‘Â÷b¬ ¦P7‡¡,Ç­“ööŸF&¶h{E¡(.vÀ:ÜÛ.¨< (ÜlËPšúSv”›®!éÒ§Ô7ç®×B ÈýpÕKmeyæúÖÊ…á‹!™BÚ�_‘) i(Ü+ t¦wÉÀ•… .ê�º�–•w³x¡uça䄈ãÀeÔÈÆa8RÍãÐÅMúéð±lôIf8@ÇzrÒÇp\Üìq>�H€¼éŸS{ç /ócR
gå˜Ì #Ãቱó•ƒ ÔÌ*¯Ï›ÃÏ^°tÒ›Ljáƒg„}.‹C,Û§Žâ»»;j ZH™ÀXÓ²D°q0¼ŒmÍ –/ï–Ï�ÅWÝü Æ)p‡fߥ$½¡Zv� khž) $¿$¡yåeøÖ~ìGNãzZ~Ø¿Û:1Õa"îƒñ)$EÕ‚Àjb­’£�t—×Ó?õŽÉµÌ¼™œ:Z+T‡:°¬ÉÑ:Ü^Ó9NhŒíV5­ oçx`_ϓքd4²*À;³Ðƒ†_¡ÜFEèóAñR}-’œÞÂ/µ¹ ûüµZìŽÜØ­ö— š¯°�8ª5åõW‹5¨ÓKj–ZŠŠ¾âîÊY$)ûÔdí�£çÔC«ØÂ™×-c;’!<C¢ÔSFÒÏ•sÇ�Æ ‚J[¨–n ßO�oÉ´›zò2�(ηꀈù/šªïùÿåïèÉ)Ê“Ò8×GôœZüYj‰ºš˜Í–xÇU=¨‹2Ý‚×4¼6®á%™à„ê…BÙ}úrzó!nìµzR: ÎÓRGÔSfó7Á`(¼ÈO)
7‹¸!�(¶/µ´ }ø&<ÏôÓ@g'|Ï"Rùdá’î|)ú“Ø»kȇ]2<±ï ELR< ‹rãÙN�t2�Â…ªù=HÂZN1øGÄ­ðÒ®¹èñrÙTÅg]˜nqwÿ̥Ù®qH•¶¶@v’s÷ƒþ‘`uÅÞa7ótªŸÍy7îö\ޛɾñÍñáCÏwÂÁº]Šû^£»‚«ŠHKÊR¾Ú„hDW:€ŽÃ3 8دð·ø�¯\I+Ę+a6éB±ŸIãUU㥕™\%%emOgA‰£‚È­ÚüuûlÛ.²¹¼�ŸŒŽáFÖ,;;Yè¨fV�iÌ©Ÿ„}Ö5Àm*Ë|/+ß>'~Ç@1í�C¡ŒiU†Å’™¥ ÓµR¦ÂcÇÉ´Z,n§ݪ¿¤
.ŠšÚ üUÈ0™j5½•õcÈ… I¢)\æ*)/žÝû ¥—Mùø¢ë¥¨6•˜ÏØ �ðÁÎÒj¾6kÑ ¹pW%ñ™[üÌf฀Õðý±¶T‘vÎRI~À Gôiýö~à ¥§_/©�ê€Ì—Í�ô§×ºù«`�Þ´-+ËÉEíu;Ä{§µŽ†yTWxýPg¦ ÷ÇfTö�Uë7 Û±*M¾U1ówÎmÈ}ò•dJ¾Ütž\Rwvì&*þ�«¥²òâÍ…lAµµ™|+G[éLÖúÅ€`½+
Ð _°µ‡fXã׺UE3~7ñ`7GØ ‰ƒ*1{I¼µ$7c„äÆP2ýK†Éwi6€^ŸËð+7¬‰9ÿ&"R401°Œ=T‹¢“×NùàE“+ŠÐÖRàà€uhȵ”Õ©¶ã­*˜‰™�`æ—cêªÛCS7쥩®ñ†gèÐlbZ.UD–$ª¨wF$¡@f6
xw–©¸ çzÊ� 5ßF·jÙ [[Ô¦§O®B €j8pe[«·> ¨
 ´8Õzjê@­>¦øª†Ooó&á±€x„ñŽ?è»éµ_Ø Ú¾¨±U¡
T–Žz'´þ˜fÙ[¬ø»
/–¾9gÚ'ÆÅ]®ÒW )Ø„¹o?Pwî�K�ذͲP„Œ¬¿vSœ‘Ϙ C»ý:ö4)pí@ü;—HÏ:UŒkr>�…Ÿ0ÇtÔ¿û »Ê…B´S)dIRø¤º^ù7h„µwøh4¢w&ÆÎwBãØÆ €ñ"Ëî8š=E@%YG¢É¿?É«€³ä&8þ^ËßÙÐïvŠÎx®†^m#_£#Dvu6IdãÓ ÀõÂÚŒoZt¬àèÁˆIY.O·,<ÿŒ¥Úüž¼34sø�DŸƒB]d5f»ªÜ¤“Ër¤ºcT¾¥o-‡×‰p7|ŽÏ=¡q*�/ëd{|9yÊ�mÅq«¶Iˆ Ùfmœ³�ŽuŸUŸJOÂŽ[‡­ßø5T½AëÃf\+8fÑÞÄäèð•Ž$˜ôúf+¿D˜‘ `˜ÿ1ítVö*
z�Wy‰(ÿØ©Ð59Û�ô”²s•pÀÂ$'¯@FI Éö—†rÇ#‹TØJ8­Ô¢–* »Ù´�&æ•%5É`îèˆUÂ
%`£ZúòDGõȵ¡P¾]ÝçÀX"Û3R2P°#‡,�¨™9ªUx�4iÃ6s!©EêÐû…{ŒÆYbÞº…v=3KI‚…¦»â¾e”¡
¼ÚÀ[ ’ʆÒ@Z(Ë Ò5ÚÙÕk�# 2�þ>ÑÖÑ9¶u0ºVæ±. +LVÏ·0¦&‡t%fΓËpÁ ò½l§6}Á /bTÐ"%©¦y‰“$íN‚øZ[ð!ôý %ÕdÇH °ßXàX>G
ëNÚ›²Än;Ð4Ë ®——H-ÃÆÑí‘ôPÏujÔ4ˆšÅ?â48ì¢á€/ð–Ål‡$ö¯„_t~çÞŸ ¸á¾æÝ®Ú�n龚4­«ªêêlmUc>^žæ ò¥?¡ŸsÉ<‡óƒ+í éUÈI¥z$º ™BüÊPî.Ù飬éÏç»êWÒj‹2Ž`¾Ïš>Í3+ G†BZ/t{™‹³’¢šrÒ[§}øH@AA+ã¶Bh¹oìp’ÊÄ’û}�‘j -YÑVÞÞYXYn÷®/áú7�ô2ãLŸ 4'æ7žµ¯µpqg·–< >*ý%�°†ô ´a–¸7SöDG;yP¾H[æÜ'™ª›LàAcó÷ÅÐ,t1¢"Þ-KoG#‰ÃF;l74Ζ}þ±1&Þ7×[ÙÑ­ÊZò*=œFåb2…ÞB**ÞD`€«Ö¨¬¨?è3÷�߯ˆfŠì[ý¡9)bO$ø¢\?U´ýyó¡|5£ªºÈÏÙ»+;Ëî6`ZiêüßE¤¿»´)ˆ •ë+E CGöo±ãwêëÊ-õ Ej°aT¿,»É´5ö¢÷õ›ÞaGª=¡'̽èü)²}¬n&(\–ÖÖ‹1IJ ¥9�€ïuó<×�j½zÁòÊÊ �ƒEÔ‚ðf{im®<6^’XÄ�»¬ßªw)ç/f"'Z=…^ud²]!Æ(ÊÓU£Ò¹½…|´×öµyŸÊâÓŒúñ“ÞNª’žž(ò¤t–•Ê‚š´‚ô7t¶5ð‹_fÌ1=�ïãè‡JhµIÈ�¼|úÖÒí•í…N– þNÖÚ—ö‡°:BÒfcK¬m:Oiu¦ÅóN�º×Dzϱb‡V›°öÚ¤,°“ÐN0ßoÂ�3
ý/Æè¾BØûŽ,¦÷ T^“œ¼Î­INÌOîoÖjÌ ü†­%FbÙíË‘¥<V¤_Î+6��Ø{4æ¿Å–®÷| eb%Á.$-ò`jÜ÷rE< >èæe^†U» aã­ƒl�N9Δ�\Á¶üSt¯‡{·v0¸æ£ypR@V JÈ1Ãq‰×¬¹®¸ïJï$o<N!W¨¤TL¶µp——sü#P ìög‘�à>ךX(Sgˆ€s˾8’Ô¸÷Ê`Áæ´§ëR${l‰Cc^Ø5e��Ðç䔼�afúY«]°·¤’’Æ‹åfè�î§uÈàöõ·è/�f¨ló¾Á[KãÕ‰ª
P%ÏùæÊÒ—Væ cA}Fw “ÓBX,€°”3¸ç¼ÎËK¼åŸ»dÄCÅa]V[óxÒ‘W>’œúÈ‹ÆJûL­ÌÙÝÇÌRÃudcÝQ¨k3šQÐ*hIžð΃HËâ[¾7@Ü )º�rûod²P\Iã4¶™\ÇøTöön‘è5oöÍXŒØU×V#þ�“B%sÑ��T:ÿx°—+ó¸ŸÒ‹zÎ?�ä´Â…Xa‰%ë̸ï_`º"ÝQÊ$kÆÈ¿ùa�¤¢TÇ‹*rÓ舂ò`ê—-ºn^Å’ž ¡áTo —ÕM3E3#…ðÁ0™²ýË�õ{þŽ)(§¡kê󣃛´–!«Â?¸0jn¢èÙ$Mïêjj•$ÖNo.k]:~&oöÐv™)O„¾–õ¸ˆ¬õšWï:«‹ÒŽOÈ\´õ>[Kir¶4ñÒ6¸Ük­Ü²ÚX6u.‰/%É›óš{š‚Åò9Îò�VÄ #gìÇnT_l!ÀO9�°žÁíqI¾20ÄÂÚ¢\@z䨝cƒJô…è9­°‹â½iýüŠØŸ
…Z¢X²>úÛ�/~ˆbØÕ¾YÄñîºXžÑÞËä¶ÌÜ ý
›»‡i=–ªaTšô¨ñÚ‚|žˆôK†÷«Øv?ݘë¬nÇÖØ¡'e|ó㉦M‚¹xyg»ÙÌhàN�4¯�FýÖÄ‹¯¢…û-aê¿h>jÒpžnúpXðÝd!"¸LÍ;+`‰Úxœ9Cžœ+†9‚^&ávœ)—~S=gõ­…‡ø �щ"*‚HIJ¯§ÄåÏè+ZϸAvå—±ùáååu&ƒæ¬ROL_n&"Ïpî|nÎ|£• ÝÛeˆG¡�@È»à£âG ¿w*‹_Á'àG¯ìgâ0î¾½†�ýh¸ºpÈÐzu5G‚_Ý«@qÐ}e©€Ð³ÕèD³`âÒå­^pÝŠ}+M ß6 "‡\¡ì85®kÔu‹¿Ð5@zí…øØ»/
x-|^-3žXœ¡_ºHy$6€‰‘‡ÎüÜ÷Úg0¶ÿBôÅt¸öK}Š)7–¬AH ½ ±+Ü5!ý{E”ÀLîôÝiD·)}ŽªîÒ‰(ôTâÃd6ì&|Jà¥HJVK¬¢ƒ;wOqh³ëS«5³xti $ÞÚçJêNèypYh/»úÙãßðút6÷a¨Dî¦îí¿ °:x…ðþÇ$6 I*ú]”kâ”k”cÎÛy; ó¶T6¹#“¬Ñê¨Q5¿Ó-U˜3¾$¢±owÒS³â>U©6€íö` 9RNyÇ ‡áŠU¹Tœ >xá|Y>¦øprÙ–MHý0I„µ(Bö¨·ô°·[.q$1@˜¼�~NŒ'i ùÌŒX«ð³… zEmÁŒ{Ù~^DP¯p�¾ºáö凩·s‰ÚK”»ðýga¥²ú»×èVt·iD üß…«ÐŸÏg¦·Ó4w‡û‘´ÒÝ?ÿV˜9gäžÙv^ +¦rA�Ÿªš§Û]©n¿™?—ÒõŠð°zBœÏϯù–û[S>ÌGý˜K‚µìÅ&㽕ý¶mÜ„ÜÚvÙ*�Š^ÊçÓÿùw= @E›Í“M –l)–eþ— ÷S’|ªrYàp‰p`ûa¤æ¦Êß3~�‹ˆHó4@R¸µ³›íÍâ};éâ!JÓ`òz¬‡þèmQ²€ ê2*WZÛš”Õ1‚w�ê|H¥®K±ÁõCúˆš8´ÿ�HÔlh‹ø#Á  Æ5¶Zõî�”Ô·þü©ÁücÎ×_ÎÂE§�:ä:¯˜—&ßN·³ô±0RÆžj×¶9¶IžrùçàSËŽj—×&‘?Çv}bÄ=sÈ™Ýî<[JZÉ?YDAtGÇí ç÷¡ÅkÈ_¸˜HìÑû:Ü«åÑ·ç�çJ˜«9±Ox}Q·Iœ¾ÀîR°+µ§P0bþ‚¸¨JV6](§°é9©,ûEø[Iwõ(ëxT¬—„üàxwªÛZB^]4ƒ|3I씹Š@¯.2ž¿Eþû;ñ�R! I
`6Ò›óyfL´Z�sŸ¨O€¹ñ¸,Fç
ð½?®ÂM‘m�¤ÛþexÛ„]5‰·Eër“ÅrüÏñìÈnî=¶)aà?sÜèþž¬M‘µl‹5‰È�æÊ‚>ˆ¾Páº�Äqn_?óˆ~Ø6ˆPô·K¿†R®ÅVªõŒ½á£5ðé¶ë?PÜy[®¾ügÇEkhQ�è –îæ
-÷¼OæCâô4뺹àÿªßé z67¤rVè�1ÿ> ¢�zžÎšÛ.žèØß@¨ŒëÃ7:ü7”Ó }ZâR�9” ¸²Ø®>‰Úw~'§Âf}$Î÷·êÀx6h‡ö { TކªaçÓëw:–ò¹WÆ—Ä# ÏAi’Áþ4¡ç”ù})åN@ÁF·KÀœÈ‘�½)'ž‘zÞ—w«<c†ÝŸ#àRó*kŽ$¿Ì½�‰[ˇ‡â�„°Ü%!ÅUb1à—9Å9Võå2lÿ«J¬Nðèâ¼�£}#�)ÜÛ—JüƒÒœ
…Õ³¼'¤¡"4¶%´ë�û){)‰ßj`b£R™‹‘¥ø¼xŨÎhÉ­øï/Ìnÿ20ÃþoÔ°Ô̹v[ŠlÄ& ¿_ÑV4�qn�CÉ[ÿ+&Gú":û° Î9ÇÂõ¶·oèÍ„iR‚,Pù]¶lÃT�?\ίE°¶—¿Ðå ybª"·ï.sîäÜJý !$Œ½™ËZ'd�¥Ù åÏå<|ÝyôËz å¨J‘m'RTÅ,ø�¦ˆâú&’[L®ô‡}ã\‘$†\Vô¥ÞI|xž‘zóò†¶ÒK®2!C ÷áóY/ÅÕü—�9 ÿàb§î@|BTËìƒÖfý™—ˆC¨ ÷å=«‰ï(� fhJt›Ö!h†¢!jÑF¥ì,µ¥è•öÛÛå ÍS9Ìft: waaú#7š‰4TF‡?3±òo|õÁÔ<‹°ø•åAÛŽŒãs6ìÍš�¼Ä7š»ZÓ³Q¨ ¤ ˆ—yÚ[* ¼8)ñŸ^øÌ²Œ+yÆô×¾Œ¢]æþ¯1Òð¶�e”�2›¶Á1*�kNµ"_ZPëqë_çÙyèøØçzË€òKãòàhnUµýþÈ¡†9.¦ÈölŒ9ïßG·\_eEÛs¹0×Í|,òûû2“R Ú`¤jÇø§ˆ %�ˆw×¹¨uôóÈ6ž4ÀÆÓØZ%%e.Aiï$Xçñz:%ãÛ#I癬4Z]ÈÛý% ݬE}µ�$T[;ý°+WRj|ج·²UZÖÔ<¶ÒÂíPµÓ=aaá ˜X±J×Ïáô×ú™üËñÌZ7¥·K£d®}¹¨;-¶òhzÓYËØhú¿VV½¢¨ælEmë,å, ÄüTß´*@ˆ¢è»]´�ËÅ5RRšÁÏùÔ \Ûi–P{Êþ_;êéî~à -2‰"ç&ss1iŽ(^4i�ÀH�uýˆb[ž0ìʇ©ÑOõuf ¿GÛß÷µÖ›êªh½eA!¼Ü5z ;)�¦ðÿâÏ�í]O ‰´ÐåµWr;ž¥ CŽDapž)IÉÏÔw’Iˆ¾¦“Âz¹Äöj9ýŸÈN`�2Í®Yx�k4ànÃWR>Õc¾‚©ý)`@hßfš¡ÁO“æÝ’”4
žîTn„�d�qSøââп»/0o_m­S~lΩ­¡“»Uå´HÓßÃŽµuÞ‘œë^Å;{{CX§ˆþôƒanòÔ·Î5BQ‹j5¤§—>‰"emŒ)—fTñ!£NT_¹±™RÞô~ Ø’§Ù3‹ýÖdÛ’ó¿õˆãjŽ=ÿâÝ ÈI paݽHm¬uóOìo�KaÿŒ[Òøz ]îä|9ƒŽ}Öìb©54dZ­9_'¼¤òiÿfÇç6cï>ú–ËÒ½ne¬W¢|¹|>JoY/×ßÍ °—ã…îbiQ ¨U�#™‡¥ž0~Tö›ŠCxf!ÜO]WuݵZ3TS +Å.�YYY?Žn$·‡  ³¡Ä�ÃÒî®x7é-©jtKÜaÎ}yHdä(ÏXC²�Ûž ÿ*ö–¸®rª‡œùûç‹êg-ÜÜ |:'A/¤ðÝ¡û±mÂÝa?_m@ÿê#t²î`óFr¹G4ÍᛨúºÍ’ÆAw
?Žå#�À{
Ëmèf[?h<]´Oëñ»áaÍ=
,}ÝÂ�Ñèk|Ön jÙ•Æ„,Z,97úóF4½Ý¯®E1½Öן�b¦jyìÑ]‰’±ì+“n^¿WEÇæ«�Ž€ö u¯pÑ­œä�ß9Ñf¢£s rBg.C’AçȉñdHö¤<QäÄóR\�òò�¾
ÊïÓóÝUx 6<aµ÷Ý‹žSÁÏXvÈw‡\éNnçHÐ_w÷êÈ"œç"ƒ˜q|Xý‚;ðFlO+t\ àœrß4ç#Úà|©rËf¥ÏLfÆ¢`�ýiý³IüãT~ �Á¸6lJŠj°míIe3Úxfác&òjÐõÝ×Û[+(H÷>eçk_
-F®)ò¬Œ[?&ZM˜÷›z=ÌÜË®åß8å".kã¬äŒÛ(ÝÚKò,W ÖŸ¡µSqI7n§ÕS<DÈI¸aÅ/æÕ{mÞHRÐDû^ÓÔëz|Ö·‡mú[wTïu¢œ©²ˆaâ3`”vi—ý™uù¾Žê°[��íR6Öäj[ìKáy£Ò K]CŒKùo¨äÔá�ÜÔRê¼sãìóòê;9笡zt"œIÄhLQ¥zÕQ#~ýXÉLÁ}>™ÓRg‡ËI[ÿÂ…©d¼&Œv¿ÙC=Sôóž 8ÞìùÅØwò(Ÿì¸Tä÷d{<ŸÜkåz–…%Æ9Ÿó“èшvÐ�X  Õ4Wsùþ=Ó»BÙV Ø-çÀ³DÀÜžºqü)ာxü9S�æÇܯ15ÎWòfÈ…g6âã’’Žl¼”ØðŠTg¦Øf®._ML<‘Ñ×KÜIš|׿oÌ�>“�ëY•$™Ž'%ƨ;Ýÿ’$B4ƒž98¯›'äº)õÆsdÅoJ�Ùq»PSƼ(øpƒ�ËÚ b“roÒ–«¹ÒDí;E²[q?Dg ¸Ñ«4gk:oœ{Z
¾”Ú¨ŽñQí…¢z­h>>§$�'ëCÃülËÛyîp[±uê©u/J‡¦]é/kJ·ü#î=S3G$�±¯Í44þ()Ÿ×ÒêÖðbS"yl?—”Ùø \šÎ¾väpŒç9ˆûËsI_=U8…Þ³¿çJ,…ÕP‘c¡žkSgà³ôœÇ¼–:ùÉ”hÅyk—ü—ß±P­sWIm\»Ìýñ8}ãÞ̉_G3LBêÑÛk?— ¼l„ìvk¨àÌÄÙÍsMªGByqrX"tŸlmcH<¸¨!ì÷Ÿ�­æöZ®�8=‡¦<Ušl´é/�ïh¾iæP¿À— W$8·2Èý>~bru¡rä×¹·Í]}L~UÐÊélæúhzen a‘_ ¶ê#ÉðN7Èö¾9S¶kÙMj'Ô¦Iæ¹Â5a¼ÚLIïÍN"Ÿs�ÍgdB¹n*«áþ^ôE‡<VÐ�Ø&ýˆŸæíQÎô$óf=Iò¹Kþ쫽z#«Þ–6áú4<:ÙÑ�…ÌOP¤ù³q8ÖÜY%¬žRj�Ë]´çD:ÍNšT·?¾dÈûfÑ.T×ob†HÅã»&Vu[õ„í-(êL(†c7�öf먚øèÕ�pqU¨ö�–´»´g²Öê½ð¶~ØŒ ^ˆ<ª‰�ÄkmÓÿ~/)èÒõ2¡z#¯è�ÚQƒ*"$�pdÏõ‹¼ŠÃyÉ0m ÔoRZ 0eDñîBU[™ÕΘ¨J—- .„Î<è‡ï,É<kcýi4cH›>bídu²¬:!€�xsB÷­šY!äÙmƒ3Û®G—ðnûÎ3e—Ôk“;Zf<ØmaÏé¸5þãöSÂèMrEØD˜žê¡ÂòL‡ý²9h0ä}¸µâ‘ë'1Ü
YãŒY¬°¢÷P>?+†œÔfà<r:ì l“”'â=âs-˜è/£Ÿ/x+g)ÌLoo‡a–ÉcZ¼x ¿ÿŽûf¨ƒÖgÉêö | kQ:\]Xó„p¢ý8'†°ç”ìÁ€§NQ…“d‹èïþýe›áµ¾éö‰.÷Mk×R£F3rê^8Ó‹¥oRpJÚ㸤[vÿ¤EÊ4 ~të°Ï…Ììc#°ùìãgªjÇ»èJí?d§ÊŽ:ªNï˜QtÇHíIWGýq¿}’J›†h@wصWÁ!�ÓèÀ‘÷ÕPRrÞODû&BK´c®ÝW¿´_�H¼ñ±'ŒTwÔBž¤ ­WO²ºÏ�>åÍê5d›ê� ÿEÅ4 xÓ§ŒgŽ)D‚[Ÿd‰¬e6QŠ©Dùˆmk
¿…TÏj›yD¿ùõ¤?Ç€×Ù=Þ>fõ„ð»Ì‘éŠèjéΕ§é·/ß$kø¿ŸI,z=ëV26ì�”¹$Ec>\Ù�,@ñ‚Å ÑÀ”áñ Ç9ç¿»VÿÌq/¯9?I�xGÜ÷w«91|—%M$­}å`øšš"3ÐÍmr¸4éTÎßî•tk~02æ›{,I,?i,2d•þ¬s¹¨1UŠ.Ø€acñ½I¼`ãÅM¢óS:Ÿ«‡a«@sK²CØ ùÝ_g±ÎZÄà¾4nKåË€GŠf¸Gûv÷~?˜fnX¹‹EÎ=ŽPÚpP»iä+.Ð-)­RKÐ$þ7Ys/Pß±x9þ Ö¤‹E
 Ûfî4Ä:o1+® ä›Eržj�ÍHcÒå´ÍØvÿÆJE.�%ëŠÒŸ„=aâ� [°ýý0EÛäÙ¶¶J²ÌÔ5e=�¡tÜ™”ת‚OI÷fÚfŠšKÆÜo�cöeªmŸ*R\xÃA¼áÊÚƒ˜|Š„xåÀ¶â©r…BÊ¿¼çßT)�tlÉ-š5Ï›,¢á,‘î±ø_Š­/mxn5þø¦]]Œñ³Çò¸À20=Á;2<­Þõ99k&ÛTåJ¼íŽÒ"qx‰ß”�Œøwæçü¡‘ÀJG± 迬ߓÏ:Ϊú?áo86”\ðoçîò†ˆ
x$c°3£ˆý?È?Ð(Ø? ì5M°ˆR9þ”»j¯¼çs›câ¼kÑà5&$ýpÊÙ+k««mœyÜ¥‰îŽ¥¿ä‡mKr:YC;‹ÝJØ
4ÿùBhëMvˆHežôðúi6ÄÛ-�ìÑ2.�TÈû(ŠXÿ~aÝ—–hßa¨iÂ^[Kó�,uð±LŠ`}.`”ÔÝ5“¤´ÔœA+W"n~ÓèoW %Ž6I*î$“#p'Ô–5Ä¥mVø‡ûÃ…èúàæ‚¹´Z8ëbÐõy .еÐß šG©ožF=øÄxˆ¡±ë�Õ›MÑà|'ë™Ùë»cT�ãW13ð„×N ãýë‹wE�å­E?ƺá2zEÇJ«khÎèq·¸�D¯’2~x+¨8ˆ­ K%/”aú½~@éd;vw’T‹šñ �.L´¥øûŸÃã<Uo¦•ÔD®þº>‰LIEZꑌ1Ü�Ü ØØRúK…Ê�[c_ ,;Dör.÷úCï&á;EcHûÐTË,ôJ´[�QGÊ L"u5[@_tè�É,K„f\]Ÿ“ �!Ø3¥„Ÿ£‰’ò\ ¸�úç3ï vƒL"a� Æ Œî ºÇWÏ©t觉ç‚’Pm–rNÏæ–@s%ñã
‚»Ö%ƒ×§Åÿ+Ìô>+(.,jëêü"³,Ãù�ókþŒLÏí`mPîéHèýE¨yø]ùÖìY’X®¡v17 xN]D¿I^تM ®v…•±hòò}¸&Kù|álŸmï숲/¦:Öó6ÊßHök¾± Òô.\’âEßÎ-¢´…ød5<s¼Ú�8¨‹Tw¤±•v9X.—+EÙ¬äÝØÈ­žˆÊáü1F݃#K &ÃO
ÓRÖ¿–§hÙ#†I^Ñ»|IÊ»KÛ§XZY)© a§T9ë>ÔRTE²´³Ò”ÐøA€N4Øþ¬y>æöì©ÆRè´´´LJ¢ä¯RVìj{ û‹½ŸÂ…˜#±Òr¤9ÅJa0¢ÚÙþÊW%BÝDïô‰ò¹Øw_ªƒï=~c’Ã^°·žÖ®6òó¹^ÕÂ8 I[áÃÅd¬{0#*ô�é‚+Rì wrÜŸ¦_.¿NPèîì\?«Osæ$wÒƒf_NC­«6—0
³ÁÐ6ø½÷÷7Ý��„'™P`ôºCSŸV -z¶‹;•ò„r&�ÞrŽüË`N©&�…°«”KŸ¶^¸¯’#Ù‰OD{˹ß8ØÆµPÁe8=ưñ³›þjºC ¶")øéæj��a/þ¯Md�-éϤ{Ø+JÀ×åy·­S{Êlø¾hØÜÈíŒH_óÞ¤òEÕâ-ݯêÞxÓ^ù߸a¼¬ŽaÁîöƒ@Šî2·û\&ŸlŸðrð´Ã¤ý'Ÿ¨fNó&T¿è@À�»ÓÌ%Ý6ÝcZ ÿ_Ú‡øÕË.¾xŠÎfÇ÷˜7Ï:`KW弿âe”ˆ¾Ãpáaô¶èÈ,í L^ÕóßÍ06_¡!ÙË6�̵ÿªÒÂ`ëÈÊ©Ðjoê„R³“¦\¶Šq÷½¸Õ„ukÜРŒÝ–Ïiºüi£œÚmGOíÇ(ÉT‚gZ-”úqƒ¶¼m÷Ë1V£§tÑ#}‘>ÉÉñ»ÞÞ„XZIxÂE}ã;†�®s€˜¶äáµ-‰1á²'ºÅ(Ì51ö½˜Ób}*dzì£3ŠÉ™NóPÁ(õîè‹ÓMR3ÁõÐp£ ˜ Ö "  ¸ÑàÖ0 H@³¿­Œ]…Ì—s*Ï<«úW·¢¸|ßcœ‘‘ÎÑ;†_ë„>k3©à4€ø§—çÖl¼²‡wŠÜ³©‚Šòð“躴´yc©…¥¹�ò‡fRÛ<Ýz'C=-ŠË_ÚTsøÉ‚§»e箵-câ»§wrŸN_š½»wuàp/�Œ\�“V_Ê
ì½ìŒB&6ÑшVüÚtwÆ{«&àñw�Ž[ÈšåÝíVùõG|¬xoÊ/�ló›ˆ%{~íSníÇÐÛjÝIu<ØÜ>ä¼ vxÀ§— ÷ÅsKÿ$Gßðèy›DS™8"úõf{…OÜgR•¬$Òàï—`àií$ÍØ>k½©Ë¦¸ã€&—Ñ«nÔÕMÙ{NåÃŒ©à|�ZG.óM¼cÀ  ·á9ÑÛ—s‡=NbKåáñÿv$޾¹¿q·Ø½¸QÍ®í]?´”°7̹ sùÊæï˜œ…ßÉôÈÇCËüR‘b±Ž³xÕUü·Lr^î*_´3j¿‹Ùvû)jžñÓìK3Þ]þû[}—1¢û±}pÈZK±I�¥=ئ÷·Œ4Üäÿõà?t¾ôæ1ãøâ�öø`?�8wyZüº§�ÂÛ-~Äø&nQÍñò·Cö´mÚèãì˪_­¯Ûª4¸®˜óA±a6xoRsͰ#µ·žT%lÒ?í´àZ—îÂØÓ–¯E¾Õ|9I&‰mš
ÄZ=ÝþbÑ ª¹Y¿îÿu4 ß,Dæ‘V–
„£2Oñßˤ¿Éññ‚û d)k½ñ\FlaóÊÞÏó{çf¢!£Ž]è$Év*6™Rp‰Á2Öah1PiÿY!ºpM¢úp´eÇ}®Ö²–Ó4_uOlÚ»Jñ—Ž’}!:
ÿkBü§ ðlê|ÖV¶ë¨ÃVD“{Ún©`¦aBsJ]¾6@,©Ù·Ïï, ÛmÎþ× =3Úç²uzˆòµ;Ü ã�™d± æSøC¶52ãåhØé�Uû=â(>üJpèúSêM’bš¢óï”DcN{c©�U;u®ò-’ÿœqÜ;:{ËLõêXçñÙAèâüyöÖÕ�{bë÷Êt’> 2ŒÒŠšãØ1Oúg+åM©gƬZ½Cº®ÜMPî&«cÉ$“)¾¥shãýÏal|HÀgó ︾Z*ªmÞ<~ô/¶«Y ÌÅ¡2wjpŒ•Ø7‰lp¶>øÿ÷æ¸{ä^>‚ÎídZjG¯¿~©¼§ÒÙ×ïXŸ§ÊD¼bñâ�é@É Ý_,Tš»\7bM¨ú,¨YßÌëÊÚÊfYðó‘¿ï�gÿiç�hmËNYmØîýõ bë=ê+ý~¥¶åžT}J…�£]d(öMLYQË•§ªPþóÿÅý,ÇÞÉóPhL ­K}ì5m`c¢€¢©UÖÀ¯Ó`¼ö-ÐH±Í´föÙj(¥õHÀZ[cùoj削J /F)ä�«ÂÑ)Æ~x½Õå:ÕeC4±d¨J=øV<Ì_-Dt:#ú§é XŒ©_+ÒÔ®´Ï<MZ¦RDúÿÿ` Ñ_°èöɵKMð0•&5Ù>¸J�ª hÉ0xcÕ“ºÒ�rêJÍ2`ùñ…­ÿi¿¤¸}š5jûÌ£½¶-Iü£g×D2¤‘Z�|0(RûV7mZWÒ3™ôà¦õšçÐù¹óè=âå!Ê÷Û’½F‡Ïå‘¢¿ L­W÷¥§‚ª†eX/OSgu’3‰d&¨åƒä�ө϶6—€-�fἦJ¬¤ô/#©¼iÔÎÇÉLb©D`-íïóÛÆZĬ=­Åmƒ©©¸,_£Û^_'”ò¨Ó7°-R ™ÐN/ðÕ‰+j”�Ld ªó„Æy'>©¶Ù6¡Ù冱zåªigZFù©W! aýzŽ&lÕëye$JÙFWÌ%ëc
M@!¥¡¸d2Rõÿ~·Ìˆg”I!ž�ÑiSùQu2®ç‹ø»`kÚïÿ"y^»zÛ_Ÿß†P’dMÇ õCÝt]o¸=§8*ÁŽ7Ûyn2ú-LpófžÛIi¾LÕnŒß£¦íŠØ[Ò12¤ì=¥�ËÏYœ‡7qϧk¬�Ö�?RG´9RºøÖÏÿAMEwÓhºò¬Xé&’uÞEü#�râÍ:߂ް>>îoÒGõÂõB’¦×ž9>‡ç]JÕ^ÛwVèöÒ¾|ýd7žµTÞQ¨ ã×ÿw˾7ëý8ößjw\æïÍxöš5t¡òïf–Ý<Îr׋xˆ†Ì`ñËó ¹ºyï?üÛËâÉ[üDKòK‡§%È=†ëbÚïuc{vG~¡#XUš±>Žà“„–Q5}A-j ìf±CÕ‰],àíçðøê6ýúx|:šŸ8ÊéUæ÷DµôJ9µ±s$סç¤eΣõ[¶i9Ù¸
?3Ûn'ûr¼u½qǺÞÃV‹«Ñcu^§3Fdú�óRR½åílä=ÑçVÐlж>u9«¦½m4E"ˆ§wʘåÊÕVÖŽVT)#ˆiÅyÒ
Þ3„‰‡&Lé‰ßÍ:í*´&˜]¤ÄúU]ýLo©e·}�<-Æ6î¹:9´‘žäà%�Ž^–÷�ˆµ˜ù¡Ð$Ê2�+a�Ž4y~(Ú†êö<uÇ2'Oy6Hy¦ÎüíGn‡»çòP©nSÃ%v(mŠ °Œ}}ÂY¤ë©W G®Fý&Žm|¥€t’-+¤—ᣵ(«[qõšõ‡U„§€Î`a`™…ȧ8ú”!úŠc‘ »³öëyØ×D’|áä2匋{Ô�Èd°)ÅÇ…úcEEP¬©w€òeM=Xzì¾OW<ËŸÖ+ù�ìFÑžp'ÇÔIî<¤œ`&ØßÛöžÕš;8‹ëJü9úßNçƒ'E¢°ê Ö‡ �­8ö$.ætÒ>ß6Îß$Î>K†÷Ý{7º6.ß;OÒ.ýµšNÛå«^7î&CÚ*~ŽKSGШ¤¨¡›ï¦º:QõQ«ß4ˆðÚóJHs¢°à# B¯ç_xÒz\[`nJÞ1z›C+žA=Yу €8ûK**Á˜Ì¶:¨O˜Úú4¯i�6ªZéëC…Œ‡/^Õñº®…)Q`~.°ñu4X¬Ržøî0€ç¿g£å6Ø¢_[ÉX@ÁRz¡Ki§ÛŸ0>øo�Ä?‹o*§M{šS2Oç«Ô’ƒ©ÔÔ3Sé¾Í…¾Be­½Þ�,ÆŽ¦·×—´å½{ ÇLÁ^Eö)úy¡;Ô}ÏÛ®ÚôÕræÞÏÞU4† [ª@�¹
Ñ5LTõ$B— ìbíçPz+³[’Ð5hªw�~Âã²í—Ä«ô@T[ÿqnÿqjUëØ­ÎÒi.ç ó,£¦7ÊÒ!^üÒšõ…-žW¢æðx„NZ9~O^ÑR¹Ñ™Ñ<©*Ž7 SÄ>H·ý3²=�¦ …D¥ELD1éoàé›Ï³dMÚÌ;�u6�¸’.¯�|jõÌ ¿J¸�cŒ|9K K–ÔÙåd¸i Ó¢Œ�Ëyò<ïø_æ¼�±Ëˆúáû¸É$Í¢s8 "|�ªÁ%hcr†…zœýôŒj$§rÁ¼ °z3Ðÿ±hW8×-”Öûè{2Û3„dÐZ|’¾ç^:ÿùiÊA¹bz`ÈsŸ9œ�}+{缇{I™E©(óF{4Úx4 ì†í¯ËG1t¡ˆ}¶à_¼æ¦×}eåÅzݹ3”(íÅQBcö"=`ŽHUÑWÿÞê‘ØÝ^Ïãòöj¤s§¡×€Í²ÏÓ~£·KÜ/�—,ze/“í]Ñù¨üVýk¾Á½.lO äbôl9”šœ¼©¬,¯\‰¤Ãƒ4:;“MÖòƒ�ˆ½'7# Tºölר¥:`ãøDíõ(ïq¥Ô�ìòY�ýjQ†�ì›aFÂ?éF¢3ÖceÝØñ
ˆ#pûŒæÂ¥AdÉÚšÖhÎ8aîF5§ŽI¥_ßIWü­ªçs)¹�t�šL~‹
|¬É‰“/=‰jEËnÞ”¯¦ Jh½«¿C&ÿ í—ߟ1ƒ*ǃ»Âz“ðÖU>læ]ávÏXQÝÍßK%yvs§n~IË‚>!žJ ià—YXk«ØŠßýÐí4úcÌÊgÀŠ�;ÍB’N�Ÿ7«�´
œ±Go¬¨8OxxxÐ:#€Úq8Ç\KìhKY1mÈ#a·ü¦8—AÃÌÍ÷ÆRƒÝßfT ¨øƒÝ3Ñî"Hf;XÌ r®aLaë®õ‚cÜÒË¿kFôF·×Ìã8ÊñBq™Î-ãúB:é_1x·y’Ên
Š �:C‘mpÏšþ¥…–#*œŽì‚zt•C�1{—w%Rö,‡Vß±˜ŽSäøç™oØ­´…7ñ4P¿á€Hæ8x)bÑ.PO4í†Rª·ßi¢x 9;]ÃÞƒVN}¸ƒÈ»ðµË+ÊÙ6çP¶·Ð»˜öà¬(í雦øü EzPßö ìløuii¤ “Gþ7$M6ð•ôø™Ä¯ª€šÙñÁògœ-¿¤é¸«Æê÷BoÓYBÒÓ¹áÁï€ú#ñl$£!‘¬f{Y`æø®òž…½ZÞî²y¿f¯Ï{µ zðKØ›<¨=úïÓá�“ëÔ3,ýƒÞjÎKKó ãƒðéØ"¤ýÝ1Îò`¼£ß^²îE[Ó2-â~ñ7ÀUéºøfÏìÚ²ÛÒ6Bpda/0üZ9�)X{ÿÏ »WIY–b§¯a¦)‚£Ú˜uô°Á»ðæ­"6�ow)’! �ùõÅ÷áÃà{ ¸Õ¹yÄDšsRï›…¥ò§Õ>¡ñ¾§¯)¡6c4“T2#†�g—^‡†uN^�Ü0¡v×…RYªOÈ5Єß_^élÐç«*†Ã7 gÁCû‡ìWZR6 Smöɺ©ðÅjqQ 8ÈBRgç¢ïÉ¢/4ôUÏäŠ9£4SþHˆ× l¬�PØùFÞ@¼u¬�÷Ý€¯V~±áÛ½û
™3§Àµ …¡­ÞÞwA¹—8›£ø…'Æ™C�%ƒÔÝzûkžg»6 ãFv*ôæ4X�U)Fmè½J¦là:?àölp8�ŠåS´p¦ŽT/{Ëòp1\Šc}ºÇ“¿A°‡±àepr¦ê$6kj<Ž‘b�Ç&�Ž,d¡IÍ«ðÂeÎκ69Ǽn ÅtÛ¸§ñ½FòX͵µ´¶âóÿ§LvCiº½å¦×AånŽÖµ—ì=Æ»¤¤â„h5Û¡³mi õtZ‹5x@@°žÿg€�V]0–¿Ã€i¸½vBÚ e¼œ$wÉìîË»$-¢Ü„4Y‰ÍœÚê,×>‹ýmÊX@‘m˜C%�èÈO”Ï:uºý¹�žüŠ,] )ÿ¹çU8¿Æ«¹5 •¸ûkÈ:¥ŒËŸ–´b•;æÆ_rÆ£œµ2û­Ýr¶íÛZÁ_+]:@à–éª_¯ØÏ¿yÜlY÷LËÛ®�Õ¡=­ÛIüÔlËŽEЂ�•µL]UÕVŠ»I®½çtÏ•mc@ú 7^ÛöÔ¢;æ[´YÍY/ÜÖÊ,'PŒ]‰<Õ…›áÚ%Ç}�½ |I¿€wߘ:}_ ‘bg�ýڛߘÈÄL­E½XrUœ�EUu®JMF�”ò÷tvD š0±.¶.ÅÓ¥róS,7Ž£²›~ç_¡³Ë+µnÞ,˜xsTýÆËxtôÄ¿ƒ`b>FŽK ryãâ®"t¹lɺ½^Ä6:,w¦¦ÄÙgÒXèâi¬k4¥{#V§9Ç·ßåÝAÔmÝ_Úô�W _óÁTMáá|˜î> ý`?t®´‹�F€¼�®!Øž©i{€ßorCžÈ/ñ}ª/t˜ÍbÈB¾ÿý‡C8¼”îà~=i`'bg•HœºíUª¡Þèݹ÷Bhîa÷ð Æ-[Ô€ŒP±îy;ì{ÒšUÞsÝß-Fˆ"”åÎ\£•å-ÊAß�ãe²5é7‹‹¸Dùƒ‰+›Ìá-³Àr„çíå†}£x°¸ÏÇ¿ôìä¤,5~ÑSïÞª@ÃÐùLmAÛ·Z'RÅ\€‹‰†ñý*§Õöm¨£ýSéÃÑ~Ê0ôÜ@÷gù�3·ôÒ�å¿ê¾]>Ó&G¤£Ï0Z矸ٻ…þ�ÛVG}ñ%œt‘—,t˜=:ÝÎÄF·­tpþ¢ž¥IÞÉPŒ—‰­î›~g× ÒkU_ô$ôáé(7–µ’sB‚/žŒÓ» ­2Tr€Ãe�ªˆ_+‰ÿœ¼�O{�Ð^/̳Ì8ÄI õǧ
KçíÜ�ÏÐòÿ>mÏe ¿ž¶È[Uèµús{ÄˬàOaŠ,ÿÓ•‘žÐJ\¬žP*þ$Ü:ÍOÙ™L|¾|õH=࣊LeêÓ&„>1é¢e‚SpÞÜ¡]¯>¹hì<㌭ów‹åô<è=ypoº7�hÉ®£ÿ±yJðþ g³çË·êK>¶E°Ñ�àØÂ7&WÀ‚ ç3%Ð#üýCê²Ê�*-ûºvè†�öÆçó5fïI÷ÅcGÏçĶ}(c—.{÷Ë›çX4ªB`¥7|»æ=|¥W*Â|ƒŒåé�®l’ÔUŸäõõ?iÍøÚÝo¹\·|ç/é›5ƒ>A! ñîÂAܘêñ÷êà-ëÖ‚ _¬%%Ü“}c€;6ÆS%b¹ghÅcW ˆLÊ•�½ÄǸH¬¾‘Ö@¢1ç ÅYJJÊ¥aoärMÔ's�·‰x�(vHÂz|ÃO¬Gˆ7�Ëk·)‡™ñ6@š£LyÕNya[—W!3yr¦o{ÝrJx?^µáœ(Àg'–îŸÄŸ'ìükÒb¬ "8ødûè˜'ÏiÈîí�Qw\ñCûHž¤3ðèVöl•�Ä[»ä…Ë[ÀX›ÇR½áìÞôëL}˜Ûüƒçu»&ò1AÚ³˜ßÂû¡ÍÚ¥û0™FÌŸõ&-™ÅÕÍ<ž›Ë>¼#¦åî´T€UPD¶ø}·K  ž— Vj:’Ý ®8°¥¶½2Ü»÷Gè}VD#GĺîlÍJÿ/ óÊüßMôÙÞíûM×mP3;ÂHÔœ½ÒËPLAI.1¯-ÿ[ÕÕ šß¯gÙç]ª¶£…˸�"à6‘s_èe@Y&%¼‰™âÆä$?X÷>.lAÚ5?ε�añ¸8ïªûf�—Èò:¶~{¡ÄT Özϯ-å$‡–h¬ôw¿Ø®¡°qÒ« âMyNÉv¿Y°…˜B�qVWZWï‘K£Ã³Œ[&€ž/ÁãX[âÀ \
&ùt?…@ðm¦zÐ8B±)¢ü2Èyu”q‡q¸¿ÍVÁó®§s<b²º:#èá²Ûö³IàQCWù yG dí25Ó¨Õï ‘Cu]Ì_M†3Š{¿)šÓ'ößD®´œW)*ˆ›àªÀ=3åv7¼ûj}c%Óõd¦é€²x°;²Øª ›évü²Â¿ ½•¾%@ý‚+DË ÙxGIí´ÿõsä´»9<î 4UÏVd°-¿A�Qï{¢< x<c=Xü4Ú•¬Hß4 ü­M6ö�¿‰ÓÕÇ[f™†AÛª‡\žø&CÌ7c·ó†é)"8ØG›B<°×ßËÐ'í�¬19¸ø8!ù)ü‡Â—þÊï;`v(5Àc}O\Šu€*føIްßÂïꃣÍÿ
§¬k Ø‚×ÏB¸¸‡õx§ŽèùTŒÄäM¨�‰|8LÈ6!Tœâ�M¹Ð˜Ïýq¯|�;‡½}¨ˆVNLxÉ4/¶Œzˆõ öÐ0©(Rÿ§ûO°9ø™P«n—)ÒŸZ¢õ¹÷ª­@ ¢+ùŽŽ0Û£LŽyÆF®éŽØ`·À¹¶¬ieð÷¹ÈŒoEpŠFŽAa8ÑÿoO} éo“òD†ÅOñVßÃEÑŸvú5“gœ'm‰[†}v Ñ¢Ú/5¿âiÞÈ{›t(&øt mB6i7Ð…¯›BS3¡uûuK`|’œAÙ»q“è{ïIìÉhõÜ÷=³ëÌ¢ŽËBš>=Oa¥‘cÕ]oËäyå߬+|k‚à_šYw:g 2ŸŒ¨g›Òís�êBo˲:G¸â.¼1£«M’NEž{ƪråô�‚¡‹6Â:p%pD/ÔWiùÐI;€…Èmˆê<ƒ°y—²8�÷Ä�¥1ê’òl×ÿj¬ØvP£ÁŠ|wf°e¼�¤9m°4�E 8Ú t9î騟|à&‚�Ð+ÀÍ#Ürp‚•$ŸDÝCZðÕvs'v§Lò%}ý »‰ØÖ:±mûxê›Ö¼ÌÖ¯ÕÞìоlzD…ŒÞ’g@ØtÛ8…,^M§x1Ž;©tÏÏröI_±M×1øŸ‹J™-}xÚÅÛ
æ¯GøÍA¶¤œ]¡ÿfxp[”Ýsj놼D=ÄØ´¯¨a3rßçdì(q±Ñ*"ÊŒ<£œ`PøêOL)ìš´/kîjs`ZÔmÎù™/ê‘Ê ŸæüvËÁ#ùíHÊΙ5 NÜw‡3uânF„¨ý.©òÞ2Ÿ½ ýodO[¡“ØÍdü(®³é²=Ø�tÿØáñ\ P}¬
Ír…2Bñ+7)žGº¬°×Û‰ ÙšeD³7~9'¼«’ÃØù¹éð4XM6Qón÷J[[mq63¡,›t…GÉÛnB“(¼ñ@SK|Úz2er®Œ¨
O#SJyß×þÙÛ"±=ÈÀ777³ôÙ‘¦ô7²L\1  ì~=ÉqÓ}h\jcåMmúü¸S¶Âweר´¤1w`Cä§©®ê™` sêrÂXƒ]tÃëyYÈ‹ÚÈ®8ž YRkÄãp9sKbÍ`S‹©†›Íá1#X`Í*Z[[ÍÖåjöi$9;ëŒéáå· ýxRðxr‚:Aff0êƒu'&í*ØÙûÉlïEY9w½Íæ' 5,(æ+,(m�·£,ë®'š µÝÄÛK t?)°·à¹�j=K6,X»àI
Ü…Ì ªÉÂ�f™`jIP}ýÕ'Ü›Mï&!ÚâJü#|ªK ÖïRnÉÓ? x3_þÌÑ�ÅcˆÜ6Gùdľ;@Ñf,ªt¸Pg©ËÅ}{„/i’,�‹&.¨�Lûãweú„0+NÔ“à•®hv†â¡[@Èô­×Úa †2ô·ÕÞsðDe®ßcízt_Œ;b&8Ó°‡48 tsØ@Ñzõn�óëGi§cI`cÀM”JŠ*"ê
0Ô.þòÌ–·5D²þ?!g¸æ7$½'®zâàaäÝö$8ÔWI÷+‹¯ök`Fa2 $õ/3 +ª¶4ïÁMÜY2ˆ#²|ì›ÁS|¿Á�¸“æNL@î¬jA¢lþ@
£èK�ËÜ”•iëÕ(Ü3Äx¡äeò¿•;‚�N7W×g³âO„…šs6EÏÖ~ä%Étì“Wì“+¤â»ÎFlïL�éîNxg¨ØGN› Ù,û7*®¡’ í_�Ê¨ÈÆ,ŸD•êr%Op»¹ûßÃrZWíÕí9 1¸œ�¯f’é±§"š†Ü÷þ¹¤ úu®¨Kç4©¨# Š-Ö‘ˆ¹Öj]ðrÊpx€Å|WšÏäÐ k@ßAÆ[†–`7Cã�)�æßèQ×ÖLùIÎbÙ½,óÄ…ãªÍhuß¾\™+½åç—Göµ}ÅÝ=Nܾ`Yj%Ä­”â+Åp�ZCΫ°À“—Ÿ>99©[oùGä‹på°� s©¤Þ‹EEì–šÓ×x^¼†I^Þ¸ÑwSeøÍ•ÕËuäÖá¹×jqxëÊîüþZ —Ӿ͜¬[¬òmGö\ý8;²—Gúæ¶) L2)Á'+Kcª™´YZ¦÷*Ì6‰(¼º«v�ŸS»k8“§ôÿæNÝ‹ägtá0l„pìl.¬˜Ð*KÊrÇ^œÕ�ÿ!‚�‘uL-õpa¬Dbü–˜b«]ë/x “ÜÝf9�—u¿·“á‡Cb”8½­P±'ËpÅÏ1Ñ"+q¬ Ûå”ü!P¥LZ/ƒ¾?EËòK5*æƒL_™;�£t‘È(ÖçƒòáŽzâ ñƒøZ
`òƒ¤e“b%O »IßztÙRr£\¨Ç¡lDá„C+§�"HÂàh [)‚ d}зx·ÛÊä“vȦæ§z¤þ­_ ãNfFEòCf=úöÌe;TÒ\‘«:y%Gô¶œ�nFsη©¯­-½ÍŠ�ÁÖX–âì¶÷kQ™<öS¢IìPz¸5€²#ÊÛA ×-Òó.ŒZ»èËeÚ„ÐÞµÞ~À^¯ìXøúÉÖ ˜ú/�;ožHw!8˜j»±üwC�ìæÐ<jN«i`ÌÈ ® ö&»æÊõbxáMºa ÖÜ,¹˜Ë,Ȧ—?Û¢[TZ¾
© ‘fÁõ&«e ðæÔ�ÂþÉܪ²óðoú·ŠƒïÍ‹|Ðfµ' ^i„ý<ôsçxàdJ†?àå„ÐÊÐÅ—˜”oÖÃì|ÎÉnj èãFÛgfñx:¡·™v¶4Ü“«æq?â¡ííè«p5ôu¸šY÷G£'Ã=Ͼ¢µ£‰1ZÀ+¥�9D!î?xôØ› ±¤e³_JlÉË$:ÓæçTf}ƒá%š¡6«q.¤„¥5:ŸÔ•U­/ú)éè¾ [jŽS&2ÅÛÁ}ï7jTÓß6‹kñóÝ\¾ª}oìé•sVõT0±
®‚·È2Ú91ÞÚ_¯}KP›¸SŠím�ý±½™B Ø¡x„hØ? òe+a'£íæÔ¸v®�…Ÿø$ñE`ÙR¦ë(€ç³>ˆË»èû�?º¡¾|EZ´´ÏZ–˜`º°EÑ‘âEF5Y[�©¯#à�‘yÒ�ziºE!kŽ.\`H_KÊŒM°ÌpÎÞ
:k·¡­©ø^U¤ù+A3yùÚ“ë© üYјæo¬néH(uCuó'F/ç'r Wä2ë$ý—^µ)%×ĵ3ü¨ÊL
†´¢6YԷɿ԰L9t^à?›õøA»Âky#;,𪣟x'úŒŸªÏ�³cÑqÃB¬“«”�æc£J[�¤Ü¨ÊÓ¤d:¬„íà‡¯o²‚ÿq;F[X ‚xGÀ3–”ì–m„^ļò�G΢rÖöF&{F!¤}5müH5œY•ÊEJÑ,©õ‚ŠþMÅ‹ò¤>?ËŸ
oÃîpÍÐ�¼eÍFàïßX_K$#¾H5‚D¥;+•…û è¤ø¨p=MœQwøp’Ç—-­Kd¶N’ášy�áÆS)éÉ}µ6p=~<fœÙC~KMKÌa÷0.ËÉõ��'S·kÉÊ*
}éNåÂ`8iöé¯MTÓÔ¸uª
Wkt€f@uGªýÙ ²­ýæp™lºi'「/Å’3²ªÒ.YìŽ9ó;f92¬â,²]u¼#™CYZ‚Œ˜7(ßwOåÅû4¿wû+ùƒæëÇ‚èå.œ#—hÌo.=¾¢(\\ÊxUvYÓ%ñ"€Öl±ËpùÍ8½å,¸ï›¶”`Ív�}œç=H?ó#»ûæ~sΤØ`ex LùÞ"À¡:!OVç“ìÎ… H”u€¬9S?½µÙÚIwáò{ñ±°æ7¥°¨žÇÃ;øB{W0oMg@Ž’ñ<×kß6‹vo$ž'>“ÌhCç‚�©È>(AÊ(Ly›!ý9ˆ_.[‚.C:9•3�ðîÐo=S#×òMH˜ö66[¹.Ò{;ÀLܸ¨ú´
´1w+6Ñ^â3¼;n¬o(�Jcl‰oDÚ}â.‹ÐÉa${×5‚Ùîuz¢àŸÉPõÏÈ÷¿±ü÷ˆSŽwtÜÈ–Wi/ö‹·±’¹¡ˆr>käØNÔ  ô“N³Jû`½ß(ÅuÝ&Cšíøf¶Û¿"‘S¦Ö’CGÕA]Ç5¸›ûvO1i…Øî@ ƒGn› ¢k]ôÇ ²ÙÔ¥Ñc€›Ü_yj\å$â:Wa�Q§¬àé øÈ…=€=b[¥�ŽÚÑ»üä þˤý­Ï©€ˆÕ¥gà|LˆZÙMY£oÎU¹sH~š¾yŽÓŒb<™<Ί>)µµÜï–Ì£8C”~ÎLMFlû¦œQ±„%}ÊŠˆU@žQeÂsö¸¨4ß¡¤2gŠk­œ“ V¤‡Ô{<ÙêÊöþë�¾4QrRüHѼ±VÙ^*cªúqÕ'6J�LÉ©ŒØ`Òòßݺ¿u�:“ìÖ]‚gï߬ÂÄÀdu‚»©é…‰ßb£ËK9ñMv{“ Ä¿vµ5J—U¤öË'4Ïf÷2 È(CwG8v0œ¶sfô˜»Y \×õ>DÃ,s©÷Îd?)h¹ØzùL½˜žgµ&´I5-á5%7�3ºCùQsµ ì oÅ­ÁsÖ'^ÛÑŠ ‹·¡¼èªË3°môxãÞ=9ʈa&hÜY–H¡U�hieÉÔfø ô!Ž…wº˜XSXÍ<¿™¬Ù¥âUßÒ=›CÊÉ*«*‰eiiÑü!‰_U“SùwŸ¼BÏ":ï´ÿ·uïâç
…w øŽ+”€l™ ÿ ™’V_»[!Ì-äò…z£6€#}ù^ÄØR�]z& óÉê1xÆÒV²ˆÞóº"Ä<† …Âͤí_K�
:m^P´>Â{Gزmßœø€ùî–t<öŠ÷ JÎèŸçW;œ^®Áè®6èŠ1»@¸8¶û{v%ˆ`c/OÄ*fM mtœFùŠþøÊSÖµ&nò>Û»ÁÒ8˜ç„é¶ "+ÏdåÞHØxPœüÅ·ÈpwXΠŸæ³:9ü‰ÂWôQÎááØ�ïŸî¯]/LÅ}U2ûÀYcfä�=úÞ‹C•ýznÖ4š+»4.îÆøȹåÙp|Ã*+ºw³[{֕ƫѸ¨Ûˆ[ð#Ú¾´Ä¦Bò Ù­L„,Ù<ð¨b¾•/°žu‰7…”gD”¨É¬©°„§óäO‰V9ۛЄ﬜t¯Œ]LTf®(H÷�Ò&�·†h]rж¬>û ü¥Ô�[Sáϳ>™œ¾*Ám¹èwÜË; ]ûkÏ|”Kè:>Ç%]$ë@+sÉo­}¶M†ö}¥„zXÞ~ô;vþr-4Oº£ Žw�Èeg““mØyÿ•2»�>hïÏ™ØÓ¯']}1þÖ0ó>¦m¢$Âùý<ÈôŸòªªÏO0|.2„ÎÏÒ?›ÊCþfú#úùÿé¨fÂ5°¯úôÖ%«òfÑ}«SÒ›ˆÎÒ„�t"£‡óòB]ý‡x%K›>Ìýo20ˆ¤¨œH­�AÐÿPK‡Nâ@pA 㮩word/media/image5.png©Vþ‰PNG

IHDR¤‘1ÛsBITÛáOà pHYsÄÄ•+LIDATh�í—Áà †uÙS÷ÞçvS£"ˆh� |'Ô¿¢ó×uÝ÷í |þ½c&¶"LlE|çCxïã „€Y8^ÑH¸,ô⬠N¤KaSph¡Yí‹ã’G†–œY±ó�Ç1´p¼¨Ô{^œ¦_»–
­û=¹r;Ø€ÈE|Í9µqNQ^²êï$—
¼°÷Ô'[ÐL*˜‡&¾Y“¬ú0´`‰Üø•1_ù.…زfÒ„žŸJÖ­Ý*°ùh0 ‘(ŸÏùúÅ•Zg!vóA!ƒS—Óz)$m¾° НŒ=wMqgÇ=À‡îÂ3�æð'O"xd9çƒ{ê-«rm=ÙIfZ˜|Bó)ˆ�슢ŸX®!¯fœ&08�N–kf…CÔ4A?©&¼Ú¸vzÉO^áA½Œ·1±ab+ÂÄV„‰­[?ÏJÄÑZczéIEND®B`‚PK‡Nâ@èAûÀ»word/media/image7.png»Dþ‰PNG

IHDR ˜ó‘¡sBITÛáOà pHYsÄÄ•+^IDATh�íXAÄ ¬›þ¥ÿÿU�ýA÷@b\A)Í&„9u)0tP4[®ë:Žã<Ï-Ÿ�xÙààØ¹©”rß·ná!ôPݸ‰B¸:Ÿš¡ãßµT!È奯R¹ñ
…¯¢“›h: µ1GtíÏ–N ç¯Ú(°B„ËK CÔ&©!�hQÑÓÓ½«øè[_™I)ÎeÈæ’gô�}ƒ óù!\–Ž-I)E m pÌ,é¦pôo+üÛ%‹†‰×ê1ïB~n‰n«\Hf�Ë�§M"4˜ÒµI¹ÅT½c6wÿÑú{c¤ùNÊšJh0×Ý·„º\Þ>̰f>,Äþ^²ìŠ“rólÑÎzË-Õ‡oº²�ÂÝ�
·_jÈô6gPƒs-iX}ø¬Ý»ñyZÜ’³o¸É \¶ò¼¸@º©ùOVpdƒƒ#ÙààÈG688²ÁÁñG¶•ŠQ�¨IEND®B`‚PK‡Nâ@Ô¹™å†�word/media/image6.png�~þ‰PNG

IHDR¤‘1ÛsBITÛáOà pHYsÄÄ•+$IDATh�í—ÙÄ EeÒÿÿåÎÃ$–A¤ÖšÀyjŒ,r](œçY’|ÞN YGŠˆ;Ç+Qà÷�;ЈYVM?’-™£„«n«s>¢'IÖe1Ážùá±q½ê7©ËsVM?’mw„À½Yú_¼éC‰¥ìfÂ.׸易kå«þJ°œ\à¹wÏAæ•ÁËÄmU e¾K’ÜÃ|D
TÆŸ w ‡¸Äö]&«Z²níf!�)áãÂáù–'ÃWyGž—ØÍ†Â"Æ”·m7êx lâîH“eoMûdK#MFs5nÛ)øÎèÍ:k%Ù8ºy<ÇþPIO”bâ ä¶ò®Ïph{íµõ’GÙå×+Y@Šˆ;)v Rì@¤Ø�ø¨ÇnÑÍ÷úIEND®B`‚PK
‡Nâ@_rels/PK‡Nâ@""ýá _rels/.rels­’ÝJ1…ïß!Ì}7Û*"ÒloDè�H}€!™Ý Ýü�Lµ}{ƒ¸°®½ðr2gÎ|sÈzstƒx¡”mð
–U ‚¼ÆúNÁóîaq "3zƒCð¤àD6ÍåÅú‰ä2”{³(.>+è™ã�”Y÷ä0W!’/�6$‡\ÊÔɈz�ÉU]ßÈôÓš‘§Øik®AìN±lþÛ;´­ÕtôÁ‘ç‰r¬(Θ:b¯!i>«‚ ršfu>Íï—JGŒ¥‰1•œÛ’ì7Pay,Ïù]1´<h|üT<tdò†Ì<Æ8GtõŸDú�9¸yžÍ’}Ìæ PK
‡Nâ@customXml/_rels/PK‡Nâ@t?9z¼(customXml/_rels/item1.xml.rels…ÏÁŠ1 à»à;”Ü�Îx‘éxY¼‰¸àµt23ÅiSš(úöO+,ì1 ùþ¤Ý?¬î˜ÙS4ÐT5(ŒŽzG?çïÕ‹�½�)¢�'2ì»å¢=ál¥,ñä«¢D60‰¤�Öì& –+JËd ¬”2�:Ywµ#êu]otþm@÷aªCo úÔù™Jòÿ6 ƒwøEî0ÊÚÝX(\Â|Ì”¸È6�(¼`x·šªÜ ºkõÇÝ PK
‡Nâ@ word/_rels/PK‡Nâ@Ä[IE}h word/_rels/document.xml.rels½–ËjÃ0E÷…þƒÑ¾–�W“'›Rȶ¤Ð­b�Ô’Œ4)ÍßwˆÇ�XÝo 3&s“{e­·?²¾ÁØJ«„ÅaÄP©Î*U$ìcÿö´d�E¡2Qk ;�eÛÍãÃúj�ô#[V� hв +›ÎmZ‚6Ô (z“k#Ri
ÞˆôKÀ'Q´à¦?ƒmnf»,af—­X°?5¤üÿl�çU
¯:=JPxG‚W’´i 0`Â$d•h›ó°Qã÷hc0Ì\ Ïã0L] ‹q&.†¹O$Ÿöüp.ùù‡dÜ!?Ì|2äZ#šøgʶvêO}ê— ²¾~[;õ'>õ- Òic¯¸t\Aì5¹V¸‡ºç…®å¤ðšu”0´‹ë*º–“Âk&Ò£E-?Éý�%Ã�w]^!H§;b¯ñ>²ãÈuNÄ^C2L±rBxMÊ0ÄÒ ûŒë0ij‚.c|CNŸ O5]†º�´õ%§üæ~´ùPK‡Nâ@ª&¾¶!word/_rels/header1.xml.rels…�AjÃ0E÷…ÜAÌ>–�E(Ų7¡àmH0HcYÄ I-õí#È&�@—ó?ÿ=¦ÿü*~)eXA×´ ˆu0Ž­‚ëå{ÿ "dƒk`R°Q†qØ}ôgZ±ÔQ^\Ì¢R8+XJ‰_Rf½�ÇÜ„H\›9$�¥žÉʈú†–ä¡m�2=3`xaŠÉ(H“é@\¶XÍÿ³Ã<;M§ <qy£�ÎWwb²Tx2a×D¶ ‡^¾<6ÜPK‡Nâ@‚U~›O[Content_Types].xmlµ•;OÃ0…w$þCä5. ¡¦ <F`(«±oZ ¿dßý÷\§4B%jZK¤Ø9ç;>väÉÕ‡5ÅĤ½«Øi9f8é•vóŠ=ÍîF¬H(œÆ;¨Ø
»šMf«© µK[ †KΓ\€©ôÍÔ>Z�ôç<ù*æÀÏÆãs.½Cp8ÂìÁ¦“¨ÅÒ`qûAÃë$$gÅõú»Œª˜Áh)�‚ò<Ë;uÁÍ·tÚfnïVD0iKòõæÔÖzF_k)IÙÄI ÒÉW¦*3jÅ£ˆx/,%çr™ÐÛgk¸F°�чtZî^aÖ×µ– ¼\Z*¯lM³DÔ°3é0§Å fCÞ(jcKápø¦ï¬>˜ØT8³³ì=áï>*ÞîÓÐ}ÎnT³„”è§´¦l�­Ðn×±krÔôÍÄ‹ùEï[üÒZïÂ#Äág¾#B6îå/@¨á¯�{ùni_ Òö >ˆ?h­{C$@¤éï3lœû#àÊÀh|{ñH×ðæ9ü,66$o®Ãé'PK‡Nâ@‚U~›O Å.[Content_Types].xmlPK
‡Nâ@†)_rels/PK‡Nâ@""ýá  ª)_rels/.relsPK
‡Nâ@
²ÁcustomXml/PK
‡Nâ@Ð*customXml/_rels/PK‡Nâ@t?9z¼( þ*customXml/_rels/item1.xml.relsPK‡Nâ@Ü>Ï• ÚÁcustomXml/item1.xmlPK‡Nâ@cC{EåG  ÂcustomXml/itemProps1.xmlPK
‡Nâ@ docProps/PK‡Nâ@ jÚ¤jy 'docProps/app.xmlPK‡Nâ@”s�pµ ¿docProps/core.xmlPK‡Nâ@Ù6нþ ^docProps/custom.xmlPK
‡Nâ@�word/PK
‡Nâ@ ö+word/_rels/PK‡Nâ@Ä[IE}h  ,word/_rels/document.xml.relsPK‡Nâ@ª&¾¶! Ö-word/_rels/header1.xml.relsPK‡Nâ@Æ*:ˆ
/Øk y’word/document.xmlPK‡Nâ@ÀÌÇað  yÇword/fontTable.xmlPK‡Nâ@½´Z× õˆword/footer1.xmlPK‡Nâ@x™óÔm
 ó„word/header1.xmlPK
‡Nâ@ 
Ëword/media/PK‡Nâ@}^«Ú<XGX ŠËword/media/image1.pngPK‡Nâ@(—iVöõ\ 3Ëword/media/image10.pngPK‡Nâ@xl¶èÈË 6Äword/media/image2.pngPK‡Nâ@“÷Þ5…˜ ÒÉword/media/image3.pngPK‡Nâ@òؑڗ’ 1Æword/media/image4.pngPK‡Nâ@pA 㮩 ù#word/media/image5.pngPK‡Nâ@Ô¹™å†� Í'word/media/image6.pngPK‡Nâ@èAûÀ» Ú%word/media/image7.pngPK‡Nâ@©•餥 ûÇword/media/image8.pngPK‡Nâ@þ> >¦¡ ]Áword/media/image9.pngPK‡Nâ@ÜEJ#Ž# »Ãword/numbering.xmlPK‡Nâ@N«§p(a word/settings.xmlPK‡Nâ@Õ„´@�u °word/styles.xmlPK
‡Nâ@ }‹word/theme/PK‡Nâ@Ô_ãË • ¦‹word/theme/theme1.xmlPK$$ö‘0

6
docs/校准示意.docx

@ -0,0 +1,6 @@
1若纸盒实际纸张数小于传感器所传数据,则垫高螺丝孔处高度。如图1:
图1
2若纸盒实际纸张数大于传感器所传数据,则垫高画圈处高度。如图2:
图2
备注:垫高材料可以使用纸张或薄的塑料片。
垫高高度以实际纸张数量与纸张数据对应误差在10张以内(或可接受范围内)即可。

BIN
hex/Printer-1.8.3.1.exe

Binary file not shown.

2302
hex/Printer-433.hex

File diff suppressed because it is too large

BIN
hex/Printer-M42-V0.9.exe

Binary file not shown.

BIN
hex/Printer-M42-V1.0.exe

Binary file not shown.

BIN
hex/Printer-M53-V1.1.exe

Binary file not shown.

BIN
hex/Printer-v1.0-20200628(1)(1).exe

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_sym

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xab

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xad

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xc

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xf

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xm

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xr

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xsb

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.sip_xsd

Binary file not shown.

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.siproj

Binary file not shown.

22
si4/soft_gsm_main.si4project/soft_gsm_main.siproj_settings.xml

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectSettings
AppVer="4.00.0093"
AppVerMinReader="4.00.0034"
GlobalConfiguration="1"
GlobalWorkspace="0"
LocalsInDb="0"
IndexMembers="1"
IndexFragments="1"
UseMasterFileList="0"
SourceDir="..\..\source"
BackupDir="%PROJECT_DATA_DIR%\Backup"
MasterFileList="%PROJECT_SOURCE_DIR%\%PROJECT_NAME%_filelist.txt"
IsImportProject="0"
>
<Imports>
<ImportedLibs/>
</Imports>
<ParseConditions>
<Defines/>
</ParseConditions>
</ProjectSettings>

BIN
si4/soft_gsm_main.si4project/soft_gsm_main.siwork

Binary file not shown.

424
source/app/app_common.c

@ -0,0 +1,424 @@
#include "app_common.h"
#include "../clib/md5.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../app/app_task_gm35.h"
#include "../app/app_paraid.h"
#include "../app/app_task_relay.h"
//0xFF+0xFE+2+20+1+21 `0xFF``0xFE`00``2A``simno,salt
#define LEN_GPRS_TCP_PKG_AT_SIGNIN 46
#define LEN_GPRS_TCP_DATA_ACK 8
struct printer_maintenance_global G;
TS_PH3_ccmodbus_ack ccmodbus_ack;
U8 ccmodbus_len = 0;
vU8 gprsTcpPkg_Signin[LEN_GPRS_TCP_PKG_AT_SIGNIN] = {0xFF,0xFE,0x0,0x2A};
vU8 gprsdataack[LEN_GPRS_TCP_DATA_ACK] = {0xFF,0xFE,0x0,0x4,0x11,0x95,0x8F,0xCD};
void Lu_register_init()
{
U8 i = 0;
G.total_weight = 0;
G.rfid = 0;
for(i=0;i<MD_SLAVER_INFO_MAX;i++)
{
G.slaver_info[i].mask = 0;
}
G.slaver_info[0].slaver = 0x11;
G.slaver_info[0].oper = MODBUS_OPER_READ;
G.slaver_info[0].reg = 0x02;
G.slaver_info[0].regnum = 0x02;
G.slaver_info[0].mask = 2; //0->无效 1:暂时有效 2->永久有效
G.slaver_info[1].slaver = 0x12;
G.slaver_info[1].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[1].reg = 0x02;
G.slaver_info[1].regnum = 0x02;
G.slaver_info[1].bytes = 4;
G.slaver_info[1].buf = (U8*)&G.total_weight;
G.slaver_info[1].mask = 0;
G.slaver_info[2].slaver = 0x12;
G.slaver_info[2].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[2].reg = 0x04;
G.slaver_info[2].regnum = 0x01;
G.slaver_info[2].bytes = 2;
G.slaver_info[2].buf = (U8*)&G.rfid;
G.slaver_info[2].mask = 0;
G.slaver_info[3].slaver = 0x13;
G.slaver_info[3].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[3].reg = 0x02;
G.slaver_info[3].regnum = 0x02;
G.slaver_info[3].bytes = 4;
G.slaver_info[3].buf = (U8*)&G.total_weight;
G.slaver_info[3].mask = 0;
G.slaver_info[4].slaver = 0x13;
G.slaver_info[4].oper = MODBUS_OPER_WRITE_M;
G.slaver_info[4].reg = 0x04;
G.slaver_info[4].regnum = 0x01;
G.slaver_info[4].bytes = 2;
G.slaver_info[4].buf = (U8*)&G.rfid;
G.slaver_info[4].mask = 0;
#if 0
for(i = 0; i < PAPER_BOX_NUM; i++)
{
G.paperCalibs[i].num0 = 0;
G.paperCalibs[i].angle0 = 0x23F0;
G.paperCalibs[i].num1 = 400;
G.paperCalibs[i].angle1 = 0x20C4;
G.currentSensorVal[i] = 0;
G.papers[i].version = APP_VERSION_HEX;
G.papers[i].LowPower = 0x00;
G.papers[i].cameraNotWorking = 0x00;
G.papers[i].cameraIndex = 0x00;
G.papers[i].paperNum = 0x00;
}
G.boardstatus.a9RecvDataInterval = 0;
G.boardstatus.a9Status = 0;
G.boardstatus.wdtStatus = 0;
G.lastResetToISPCmdTimeInSeconds = 0;
//G.irthreshold[0] = 7;
//G.irthreshold[1] = 5;
G.runmode = MODE_RUN;
//G.runmode = DEBUG_IR;
//G.runmode = DEBUG_A9;
//G.runmode = DEBUG_CAMER;
#endif
}
#if 0
U16 L2_paper_count(U8 index, U32 angle)
{
S32 x1,y1,x2,y2,x,paper;
//y = (x-x1) * (y2-y1) / (x2-x1) + y1
x1 = G.paperCalibs[index].angle0;
y1 = G.paperCalibs[index].num0;
x2 = G.paperCalibs[index].angle1;
y2 = G.paperCalibs[index].num1;
x = angle;
paper = (S16)(1.0 * (x-x1) * (y2-y1) / (x2-x1) + y1);
if(paper > 0x1FF)
{
paper = 0x1FF;
}
if(paper < 0)
{
paper = ~paper + 1;
paper |= 1<<9;
}
else
{
paper &= ~(1<<9);
}
paper &= 0x3FF;
return paper;
}
static void resetToIsp()
{
if(s_nos_tick.t_1s < G.lastResetToISPCmdTimeInSeconds)
{
//isp
IAP_CONTR = 0x60;
//disable wdt
}
else
{
G.lastResetToISPCmdTimeInSeconds = s_nos_tick.t_1s + 2; //2s(1s-2s)
}
}
U8 L2_constructor_ccmodbus_ack(TS_PH3_ccmodbus_ack *pccmodbus, U8 addr, U8 oper, U8 *buf, U8 len)
{
pccmodbus->filter1 = 0xFF;
pccmodbus->filter2 = 0xFE;
pccmodbus->num0 = (len + 4) >> 8 & 0xFF;
pccmodbus->num1 = (len + 4) >> 0 & 0xFF;
pccmodbus->addr = addr;
pccmodbus->oper = oper;
byte_copy_uc((U8*)&pccmodbus->buf, buf, len);
crc16(pccmodbus->crc, &pccmodbus->addr, len + 2);
pccmodbus->buf[len] = pccmodbus->crc[1];
pccmodbus->buf[len+1] = pccmodbus->crc[0];
return len + 6 + 2;
}
int L2_ph3_common_send(U8 dst, void *buf, U8 len)
{
switch(dst)
{
case ADDR_UPPER:
L0_uart0_sendArray(buf,len);
break;
case ADDR_SERVER:
L3_gm35_send(buf, len);
L0_uart0_uc('S');
break;
default:
break;
}
return 0;
}
void L2_do_uart_report(void)
{
TS_Printer_Report report_ack;
byte_copy_uc(&report_ack.papers[0],&G.papers[0],3);
byte_copy_uc(&report_ack.papers[1],&G.papers[1],3);
byte_copy_uc(&report_ack.boardstatus,&G.boardstatus,3);
report_ack.ir = 0;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_REPORT, (U8 *)&report_ack, sizeof(report_ack));
L2_ph3_common_send(ADDR_UPPER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_gprs_send_signin_pkg(void)
{
libc_memcpy(gprsTcpPkg_Signin+4,G.ccid,20);
gprsTcpPkg_Signin[24] = ',';
libc_memcpy(gprsTcpPkg_Signin+25,G.ccid_passwd,21);
L2_ph3_common_send(ADDR_SERVER,(U8 *)&gprsTcpPkg_Signin,LEN_GPRS_TCP_PKG_AT_SIGNIN);
}
void L2_gprs_send_ack_pkg(void)
{
L2_ph3_common_send(ADDR_SERVER,(U8 *)&gprsdataack,LEN_GPRS_TCP_DATA_ACK);
}
void L2_gprs_send_heart_pkg(void)
{
TS_gprs_heart gprs_heart;
gprs_heart.version = APP_VERSION_HEX;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_SERVER, OPER_GPRS_HEART, (U8 *)&gprs_heart, sizeof(gprs_heart));
L2_ph3_common_send(ADDR_SERVER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_gprs_send_report_pkg(void)
{
TS_Printer_Report report_ack;
byte_copy_uc(&report_ack.papers[0],&G.papers[0],3);
byte_copy_uc(&report_ack.papers[1],&G.papers[1],3);
byte_copy_uc(&report_ack.boardstatus,&G.boardstatus,3);
report_ack.ir = 0;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_SERVER, OPER_GPRS_REPORT, (U8 *)&report_ack, sizeof(report_ack));
L2_ph3_common_send(ADDR_SERVER,(U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_angle_setid(U8 *buf)
{
TS_Angle_SetId *ts_angle_setid = (TS_Angle_SetId*)buf;
TS_PH1A_DAT ph1a;
ph1a.filter = D_HETU_FXA;
ph1a.id = SLAVER_ID_N;
ph1a.oper = OPER_ANGLE_SET_ID;
ph1a.xaxis[0] = ts_angle_setid->id;
ph1a.xaxis[1] = ts_angle_setid->id;
ph1a.yaxis[0] = ts_angle_setid->id;
ph1a.yaxis[1] = ts_angle_setid->id;
ph1a.zaxis[0] = ts_angle_setid->id;
ph1a.zaxis[1] = ts_angle_setid->id;
L0_uart2_sendArray(&ph1a,sizeof(TS_PH1A_DAT));
}
void L2_do_angle_setid_ack(U8 id)
{
TS_Angle_SetId ts_setid_ack;
ts_setid_ack.id = id;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_SET_485_ID, (U8 *)&ts_setid_ack, sizeof(ts_setid_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_paper_count(U8 *buf)
{
TS_Paper_Count_Ack paper_count_ack;
TS_Paper_Count *ts_paper = (TS_Paper_Count*)buf;
U16 num = 0;
if(ts_paper->no >= PAPER_BOX_NUM)
{
L0_uart0_uc('x');
return;
}
num = L2_paper_count(ts_paper->no,G.currentSensorVal[ts_paper->no]);
paper_count_ack.no = ts_paper->no;
paper_count_ack.num[0] = num >> 8 & 0xFF;
paper_count_ack.num[1] = num >> 0 & 0xFF;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_PAPER_COUNT, (U8 *)&paper_count_ack, sizeof(paper_count_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_read(U8 *buf)
{
TS_Paper_Upper_calib_ack upper_calib_ack;
TS_Paper_Upper_Calib_Read *ts_calib = (TS_Paper_Upper_Calib_Read*)buf;
if(ts_calib->no >= PAPER_BOX_NUM)
{
L0_uart0_uc('x');
return;
}
upper_calib_ack.num0 = G.paperCalibs[ts_calib->no].num0;
upper_calib_ack.angle0 = G.paperCalibs[ts_calib->no].angle0;
upper_calib_ack.num1 = G.paperCalibs[ts_calib->no].num1;
upper_calib_ack.angle1 = G.paperCalibs[ts_calib->no].angle1;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_READ, (U8 *)&upper_calib_ack, sizeof(upper_calib_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib(U8 *buf)
{
TS_Paper_Upper_calib_ack upper_calib_ack;
TS_Paper_Upper_Calib *ts_calib = (TS_Paper_Upper_Calib*)buf;
if(ts_calib->no >= PAPER_BOX_NUM || ts_calib->point >= 2)
{
L0_uart0_uc('x');
return;
}
switch(ts_calib->point)
{
case 0:
{
G.paperCalibs[ts_calib->no].num0 = (U16)(ts_calib->paperNum0) << 8 | ts_calib->paperNum1;
G.paperCalibs[ts_calib->no].angle0 = G.currentSensorVal[ts_calib->no];
break;
}
case 1:
{
G.paperCalibs[ts_calib->no].num1 = (U16)(ts_calib->paperNum0) << 8 | ts_calib->paperNum1;
G.paperCalibs[ts_calib->no].angle1 = G.currentSensorVal[ts_calib->no];
break;
}
}
L3_flash_write_page0(); //??Flash
upper_calib_ack.num0 = G.paperCalibs[ts_calib->no].num0;
upper_calib_ack.angle0 = G.paperCalibs[ts_calib->no].angle0;
upper_calib_ack.num1 = G.paperCalibs[ts_calib->no].num1;
upper_calib_ack.angle1 = G.paperCalibs[ts_calib->no].angle1;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB, (U8 *)&upper_calib_ack, sizeof(upper_calib_ack));
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_enter(void)
{
G.runmode = MODE_PAPER_CALIB;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_MODE, NULL, 0 );
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L2_do_calib_leave(void)
{
G.runmode = MODE_RUN;
ccmodbus_len = L2_constructor_ccmodbus_ack(&ccmodbus_ack, ADDR_UPPER, OPER_CALIB_LEAVE, NULL, 0 );
L0_uart0_sendArray((U8 *)&ccmodbus_ack,ccmodbus_len);
}
void L3_protocol_handler_uart0_fun(TS_PH3_ccmodbus *p,U8 from) //0?????¡§??????????????¡§a9
{
switch(p->oper)
{
case OPER_CALIB_MODE:
L2_do_calib_enter();
break;
case OPER_CALIB_LEAVE:
L2_do_calib_leave();
break;
case OPER_CALIB:
L2_do_calib(p->buf);
break;
case OPER_CALIB_READ:
L2_do_calib_read(p->buf);
break;
case OPER_PAPER_COUNT:
L2_do_paper_count(p->buf);
break;
case OPER_SET_485_ID:
L2_do_angle_setid(p->buf);
break;
case OPER_RELAY:
L2_do_relay(p->buf);
if(from == 1)
{
L0_uart0_uc('R');
L0_uart0_uchex(p->buf[0]);
L0_uart0_uchex(p->buf[1]);
g_at_send_status.ack_flag = 1; //???¨¦???????????
}
break;
case OPER_ISP: //ResetToISP???????¡§??????¡ì???
L0_uart0_uc('P');
resetToIsp();
break;
case 0x00: //????¡¦?
L0_uart0_uc('H');
break;
case 0x99: //?¡ã?????¡§????
G.runmode = p->buf[1] & 0x0F;
Lc_print_buf("Version: %s\r\n",APP_VERSION);
Lc_delay_ms(700);// 2000--7s
break;
default:
break;
};
}
void L3_protocol_handler_uart4_fun(U8 *pPara,U8 from)
{
from = 0;
if(StrStartsWith(pPara,"OK")) //module ok
{
g_at_send_status.module_ok = 1;
}
else if(StrStartsWith(pPara,"+CCID")) //sim ok
{
L0_uart0_uc('s');
libc_memcpy(G.ccid,pPara+7,20);
getPwd(G.ccid, G.ccid_passwd);
g_at_send_status.sim_ok = 1;
}
else if(StrStartsWith(pPara,"+CREG: 1,1")) //net ok
{
L0_uart0_uc('n');
g_at_send_status.net_ok = 1;
}
else if(StrStartsWith(pPara,"+CGATT:1")) //gprs ok
{
L0_uart0_uc('g');
g_at_send_status.gprs_ok = 1;
}
else if(StrStartsWith(pPara,"CONNECT OK") || StrStartsWith(pPara,"STATE:CONNECT OK")) //conn ok
{ //ALREAY CONNECT??????????????¡§???????????????????????¡§????????????????????¡§?¡è???????
if(g_at_send_status.conn_ok == 0)
{
L0_uart0_uc('c');
g_at_send_status.conn_ok = 1;
}
}
else if(StrStartsWith(pPara,"CLOSE") || StrStartsWith(pPara,"STATE:CLOSED")) //conn close //CLOSE OK / CLOSED
{
if(g_at_send_status.conn_ok == 1)
{
L0_uart0_uc('d');
g_at_send_status.conn_ok = 0;
g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s;
}
}
}
#endif

208
source/app/app_common.h

@ -0,0 +1,208 @@
#ifndef _APP_COMMON_H
#define _APP_COMMON_H
#include "../clib/type.h"
#include "../tpc/tpc_uart.h"
#include "../tpc/tpc_modbus.h"
#define APP_VERSION_HEX 0x12 //高4位主版本,低4位次版本
// #define BOARD_MAIN03_A9
// #define BOARD_MAIN04_GM35
#define BOARD_MAIN04_GM35_M42
#ifdef BOARD_MAIN03_A9
#define APP_VERSION "MA10_A9_v2.0.6"
#elif defined BOARD_MAIN04_GM35
#define APP_VERSION "MA10_GM35_v2.0.6"
#elif defined BOARD_MAIN04_GM35_M42
#define APP_VERSION "MA10_GM35_v3.0.2"
#else
#define APP_VERSION "MA10_X_v2.0.6"
#endif
#define PAPER_BOX_NUM 3
#define RELAY_NUM 8
enum RunMode
{
MODE_RUN = 0x00,
MODE_DEBUG_COMMON = 0x01,
MODE_DEBUG_IR = 0x02,
MODE_DEBUG_GM35 = 0x03,
MODE_PAPER_CALIB = 0x04,
};
enum CCMODBUS_ADDR
{
ADDR_UPPER = 0x10,
ADDR_SERVER = 0x11,
ADDR_Maintenance = 0x12,
};
enum CCMODBUS_OPER
{
OPER_RELAY = 0x95,
OPER_REPORT = 0x93,
OPER_ISP = 0x80,
OPER_CALIB_MODE = 0x50,
OPER_CALIB = 0x51,
OPER_CALIB_READ = 0x52,
OPER_PAPER_COUNT = 0x53,
OPER_SET_485_ID = 0x54,
OPER_CALIB_LEAVE = 0x5a,
OPER_GPRS_HEART = 0x00,
// OPER_GPRS_ACK = 0x95,
OPER_GPRS_REPORT = 0x97,
};
enum TS_485_OPER
{
OPER_ANGLE_DAT = 0x90,
OPER_ANGLE_SET_ID = 0x91,
};
#define MASTER_ID 0x00
#define SLAVER_ID_MIN 0x01
#define SLAVER_ID_MAX 0x03
#define SLAVER_ID_N 0xee
typedef struct printer_paper
{
U8 version; //版本号(板卡对应版本号)APP_VERSION_HEX
vU16 paperNum:10; //10bit纸张数据 表示最大量程1024 实际170张
vU16 cameraIndex:4; //摄像头编号
vU16 cameraNotWorking:1; //是否正常工作
vU16 LowPower:1; // =1 lowPower 提醒需要充电,或者未连接电池
}TS_P_paper;
typedef struct boardstatus
{
U8 a9Status;
U8 a9RecvDataInterval;
U8 wdtStatus;
}TS_BoardStatus;
typedef struct printer_paper_calib
{
U16 num0; //x0
U16 angle0; //y0
U16 num1; //x1
U16 angle1; //y1
}TS_PaperCalib;
/**
*
*/
//数据上报协议
typedef struct printer_report
{
TS_P_paper papers[PAPER_BOX_NUM-1];
TS_BoardStatus boardstatus;
U8 ir;
}TS_Printer_Report;
//校准协议
typedef struct
{
U8 no; //paper box no
U8 point; //校准点
U8 paperNum0; //当前纸张数量高位
U8 paperNum1; //当前纸张数量低位
}TS_Paper_Upper_Calib;
typedef struct
{
U8 no; //paper box no
}TS_Paper_Upper_Calib_Read;
typedef struct
{
U16 num0; //x0
U16 angle0; //y0
U16 num1; //x1
U16 angle1; //y1
}TS_Paper_Upper_calib_ack;
//读取当前纸张数量
typedef struct
{
U8 no; //paper box no
}TS_Paper_Count;
typedef struct
{
U8 no; //paper box no
U8 num[2]; //高位在前
}TS_Paper_Count_Ack;
//设置当前angle id
typedef struct
{
U8 id; //paper box no
}TS_Angle_SetId;
//gprs相关协议
typedef struct
{
U8 version;
}TS_gprs_heart;
/**
* Register Memory Map
*/
#define MD_SLAVER_INFO_MAX 6
typedef struct printer_maintenance_global
{
U16 reserved;
U32 total_weight;
U16 rfid;
MD_SLAVER_INFO slaver_info[MD_SLAVER_INFO_MAX];
#if 1
TS_PaperCalib paperCalibs[PAPER_BOX_NUM];
U16 currentSensorVal[PAPER_BOX_NUM]; //当前纸张传感输出
TS_P_paper papers[PAPER_BOX_NUM];
TS_BoardStatus boardstatus;
U8 runmode; //运行模式
U32 lastResetToISPCmdTimeInSeconds; //isp reset time
U8 ccid[21]; //保存ccid卡号空间 20+'\0'
U8 ccid_passwd[22]; //保存ccid密码空间 21+'\0'
#endif
}PMGlobal;
//寄存器内存基地址
#define REG_MEM_BASE ((U16*)(&G)) //寄存器基础地址(本文件外部不应该使用该宏定义)
//变量地址转寄存器
#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1)
//寄存器转变量地址
#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1))
extern struct printer_maintenance_global G;
extern void Lu_register_init(void);
extern U16 L2_paper_count(U8 index, U32 angle);
extern void L3_protocol_handler_uart0_fun(TS_PH3_ccmodbus *pPara,U8 from);
extern void L3_protocol_handler_uart4_fun(U8 *pPara,U8 from);
extern U8 L2_constructor_ccmodbus_ack(TS_PH3_ccmodbus_ack *pccmodbus, U8 addr, U8 oper, U8 *buf, U8 len);
extern void L2_do_uart_report(void);
extern void L2_gprs_send_signin_pkg(void);
extern void L2_gprs_send_ack_pkg(void);
extern void L2_gprs_send_heart_pkg(void);
extern void L2_gprs_send_report_pkg(void);
extern void L2_do_angle_setid_ack(U8 id);
#endif

124
source/app/app_drv.c

@ -0,0 +1,124 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_drv.h"
#include "../clib/clib.h"
#include "../app/app_common.h"
#include "../app/app_task_485.h"
#include "../app/app_task_gm35.h"
#include "../msp/uart3.h"
/// reg.H,reg.L data0 data1 data2;
/// (reg.HL)=data0 (reg.HL+1)=data1 (reg.HL+2)=data2 (reg.HL+3)=data3
/// 0x0f 0----14 15
#if 0
TS_drv_ ts_drv[TS_DRV_MAX]=
{
0x0e,NULL, /// FE 01 02 03 04
0x12,NULL, //uart0 reply
0x0d,NULL, //433 camera //fd 01 02 03 06
0x99,NULL, //a9 gprs
0x00,NULL,
};
#endif
#if 0
void L3_UARTcom4_exp_protocol(TS_Handle_0d0a *p)
{
if (1 == p->ok )
{
U8 array[D_s_SSTR_0D0A_len+1];
U8 num = p->buf[0];
byte_copy_uc(array,p->buf+1,num);
p->ok = 0;
array[num] = 0;
L3_protocol_handler_uart4_fun(array,0);
}
}
void L3_task_a9_rcv_handle(TS_Handle_PH3 *p)
{
if (1 == p->ok)
{
TS_PH3_ccmodbus ccmodbus;
byte_copy_uc((U8*)&ccmodbus,(U8*)&p->ts_ccmodbus,p->ts_ccmodbus.num + 3);
p->ok = 0;
g_at_send_status.tcp_last_recv_stmp = s_nos_tick.t_1s;
L3_protocol_handler_uart0_fun(&ccmodbus,1);
}
}
#endif
void L3_UARTcom3_exp_protocol(TS_Handle_PH3 *p)
{
if (1 == p->ok)
{
TS_PH3_ccmodbus ccmodbus;
//L0_uart0_uc(0xaa);
byte_copy_uc((U8*)&ccmodbus,(U8*)&p->ts_ccmodbus,p->ts_ccmodbus.num + 3);
p->ok = 0;
G.rfid = ccmodbus.buf[0];
}
}
void L3_UARTcom0_exp_protocol(TS_Handle_PH3 *p)
{
if (1 == p->ok)
{
TS_PH3_ccmodbus ccmodbus;
//L0_uart0_uc(0xaa);
byte_copy_uc((U8*)&ccmodbus,(U8*)&p->ts_ccmodbus,p->ts_ccmodbus.num + 3);
p->ok = 0;
//L3_protocol_handler_uart0_fun(&ccmodbus,0);
}
}
#if 0
void L3_UARTcom2_exp_protocol(TS_Handle_PH1A *p)
{
if (1 == p->ok )
{
U8 slaveId = s_task_485.slaveId;
TS_PH1A_DAT tsph1A;
byte_copy_uc((U8*)&tsph1A,(U8*)&p->buf,D_HETU_FXA_buf_max);
p->ok = 0;
switch(tsph1A.oper)
{
case OPER_ANGLE_DAT:{
s_task_485.received = 1;
G.currentSensorVal[slaveId - U485_BASE] = (U16)tsph1A.xaxis[0] << 8 | tsph1A.xaxis[1];
//ID已�在�议解�处过滤,这里����处�
#if 0
L0_uart0_uc(tsph1A.filter);L0_uart0_uc(tsph1A.id);
L0_uart0_uc(tsph1A.xaxis[0]);L0_uart0_uc(tsph1A.xaxis[1]);
L0_uart0_uc(tsph1A.yaxis[0]);L0_uart0_uc(tsph1A.yaxis[1]);
L0_uart0_uc(tsph1A.zaxis[0]);L0_uart0_uc(tsph1A.zaxis[1]);
#endif
G.papers[slaveId - U485_BASE].version = APP_VERSION_HEX;
G.papers[slaveId - U485_BASE].LowPower = 0x00; //1bit
G.papers[slaveId - U485_BASE].cameraNotWorking = 0x00; //1bit
G.papers[slaveId - U485_BASE].cameraIndex = 0x00; //4bit
G.papers[slaveId - U485_BASE].paperNum =
L2_paper_count(slaveId - U485_BASE, (U16)tsph1A.xaxis[0] << 8 | tsph1A.xaxis[1]); //10bit
break;
}
case OPER_ANGLE_SET_ID:
L2_do_angle_setid_ack(tsph1A.xaxis[0]);
break;
}
}
}
#endif

36
source/app/app_drv.h

@ -0,0 +1,36 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_drv_H
#define _bsp_drv_H
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#define TS_DRV_MAX 6
typedef struct
{
vU8 add;
void (*p2fun)(U8 *pPara,U8 from);
}TS_drv_;
extern TS_drv_ ts_drv[TS_DRV_MAX];
extern void L3_UARTcom2_exp_protocol(TS_Handle_PH1A *p);
extern void L3_UARTcom0_exp_protocol(TS_Handle_PH3 *p);
extern void L3_UARTcom3_exp_protocol(TS_Handle_PH3 *p);
extern void L3_UARTcom4_exp_protocol(TS_Handle_0d0a *p);
extern void L3_task_a9_rcv_handle(TS_Handle_PH3 *p);
#endif // #ifndef _bsp_drv_H

212
source/app/app_paraid.c

@ -0,0 +1,212 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file app_paraid.c
/// @brief parameter & id app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20190107
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
///
//////////////////////////////////////////////////////////////////////////
//#include "app_algorithm.h"
#include "app_paraid.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
#include "../msp/msp_eeprom.h"
#include "../msp/uart0.h"
//-------------------------------------------
struct _s_flash_data s_flash_data;
void L3_flash_show_page0()
{
U8 i = 0;
U8 *ptr = (U8 *)&s_flash_data.f_page0;
L0_uart0_sendstr("Page0 Content: \r\n");
Lc_delay_ms(500);// 2000--7s
for(i=0;i<sizeof(struct _s_flash_page0);i++)
{
L0_uart0_uchex(*ptr++);
}
}
void L3_flash_read_page0()
{
struct _s_flash_page0 *p_page0 = &s_flash_data.f_page0;
L1_Iap_Read_array(D_flash_Addr_start(s_flash_data.page0),(U8*)p_page0,sizeof(struct _s_flash_page0));
L3_flash_show_page0();
}
void L3_flash_erase_page0()
{
L1_Iap_erase(D_flash_Addr_start(s_flash_data.page0)); //page0读完立即擦除
//L0_uart0_sendstr("Page0 Erased.");
}
void L3_flash_write_page0()
{
U8 i = 0;
struct _s_flash_page0 *p_page0 = &s_flash_data.f_page0;
L3_flash_erase_page0(); //page0擦除
p_page0->page = s_flash_data.page0;
p_page0->filter0 = FLASH_PARAM_PAGE_FILTER0;
p_page0->filter1 = FLASH_PARAM_PAGE_FILTER1;
#if 0
for(i=0;i<RELAY_NUM;i++)
{
#if (defined BOARD_MAIN04_GM35) || (defined BOARD_MAIN04_GM35_M42)
if(s_relay_oper[i].relay == RELAY_PC)
{
p_page0->relay_status[i] = RELAY_KAI; //pc必须是断开的(不断路)
}
else
{
p_page0->relay_status[i] = s_relay_oper[i].relay_status;
}
#elif defined BOARD_MAIN03_A9
p_page0->relay_status[i] = s_relay_oper[i].relay_status;
#endif
}
#endif
for(i=0;i<PAPER_BOX_NUM;i++)
{
p_page0->ts_paper_calib[i].num0 = G.paperCalibs[i].num0;
p_page0->ts_paper_calib[i].angle0 = G.paperCalibs[i].angle0;
p_page0->ts_paper_calib[i].num1 = G.paperCalibs[i].num1;
p_page0->ts_paper_calib[i].angle1 = G.paperCalibs[i].angle1;
}
crc16(p_page0->crc,(U8*)&p_page0->relay_status,sizeof(struct _s_flash_page0) - 3 - 2);
//L3_flash_show_page0();
L1_Iap_Write_array(D_flash_Addr_start(s_flash_data.page0),(U8*)p_page0,sizeof(struct _s_flash_page0));
//L0_uart0_sendstr("Page0 Writed.");
}
#if 0
void L3_flash_read_page1()
{
struct _s_flash_page1 *p_page1 = &s_flash_data.f_page1;
L1_Iap_Read_array(D_flash_Addr_start(s_flash_data.page1),(U8*)p_page1,sizeof(struct _s_flash_page1));
}
void L3_flash_erase_page1()
{
L1_Iap_erase(D_flash_Addr_start(s_flash_data.page1)); //page0读完立即擦除
L0_uart0_sendstr("Page1 Erased.");
}
void L3_flash_write_page1()
{
struct _s_flash_page1 *p_page1 = &s_flash_data.f_page1;
L3_flash_erase_page1(); //page1擦除
crc16(p_page1->crc,(U8*)&p_page1->relay_oper_max_time,sizeof(struct _s_flash_page1) - 3 - 2);
L3_flash_show_page1();
L1_Iap_Write_array(D_flash_Addr_start(s_flash_data.page1),(U8*)p_page1,sizeof(struct _s_flash_page1));
L0_uart0_sendstr("Page1 Writed.");
Lc_delay_ms(500);// 2000--7s
}
#endif
//=====================================================================================
void L3_flash_init()
{
s_flash_data.page0 = FLASH_PARAM_PAGE_0;
s_flash_data.page0_ok = 0;
s_flash_data.page1 = FLASH_PARAM_PAGE_1;
s_flash_data.page1_ok = 0;
}
void L3_flash_read_param()
{
struct _s_flash_page0 *p_page0 = &s_flash_data.f_page0;
struct _s_flash_page1 *p_page1 = &s_flash_data.f_page1;
U8 i,CRC[2];
//Read Page 0
L1_Iap_Read_array(D_flash_Addr_start(s_flash_data.page0),(U8*)p_page0,sizeof(struct _s_flash_page0));
if((p_page0->page == s_flash_data.page0)
&& (p_page0->filter0 == FLASH_PARAM_PAGE_FILTER0) && (p_page0->filter1 == FLASH_PARAM_PAGE_FILTER1))
{
crc16(CRC,(U8*)&p_page0->relay_status,sizeof(struct _s_flash_page0) - 3 - 2);
if((CRC[0] == p_page0->crc[0]) && (CRC[1] == p_page0->crc[1]))
{
s_flash_data.page0_ok = 1;
L0_uart0_sendstr("Flash Page0 CRC Success.");
//L1_Iap_erase(D_flash_Addr_start(s_flash_data.page0)); //page0读完立即擦除
#if 0
for(i=0;i<RELAY_NUM;i++)
{
G.relayStatus[i] = p_page0->relay_status[i];
}
#endif
for(i=0;i<PAPER_BOX_NUM;i++)
{
G.paperCalibs[i].num0 = p_page0->ts_paper_calib[i].num0;
G.paperCalibs[i].angle0 = p_page0->ts_paper_calib[i].angle0;
G.paperCalibs[i].num1 = p_page0->ts_paper_calib[i].num1;
G.paperCalibs[i].angle1 = p_page0->ts_paper_calib[i].angle1;
}
}
}
#if 0 //page1测试不成功
//Read Page 1
L1_Iap_Read_array(D_flash_Addr_start(s_flash_data.page1),(U8*)p_page1,sizeof(struct _s_flash_page1));
if((p_page1->page == s_flash_data.page1)
&& (p_page1->filter0 == FLASH_PARAM_PAGE_FILTER0) && (p_page1->filter1 == FLASH_PARAM_PAGE_FILTER1))
{
crc16(CRC,(U8*)&p_page1->relay_oper_max_time,sizeof(struct _s_flash_page1) - 3 - 2);
if((CRC[0] == p_page1->crc[0]) && (CRC[1] == p_page1->crc[1]))
{
s_flash_data.page1_ok = 1;
L0_uart0_sendstr("Flash Page1 CRC Success.");
}
}
if(s_flash_data.page1_ok == 0)
{
p_page1->page = s_flash_data.page1;
p_page1->filter0 = FLASH_PARAM_PAGE_FILTER0;
p_page1->filter1 = FLASH_PARAM_PAGE_FILTER1;
for(i=0;i<RELAY_NUM;i++)
{
p_page1->relay_oper_max_time[i] = g_flash_relay_max_time[i];
}
L3_flash_write_page1();
s_flash_data.page1_ok = 1;
}
if(s_flash_data.page1_ok == 0)
{
p_page1->page = s_flash_data.page1;
p_page1->filter0 = FLASH_PARAM_PAGE_FILTER0;
p_page1->filter1 = FLASH_PARAM_PAGE_FILTER1;
for(i=0;i<RELAY_NUM;i++)
{
p_page1->relay_oper_max_time[i] = g_flash_relay_max_time[i];
}
s_flash_data.page1_ok = 1;
}
#endif
}

63
source/app/app_paraid.h

@ -0,0 +1,63 @@
#ifndef _app_paraid_H
#define _app_paraid_H
#include "../bsp/bsp_paraid.h"
#include "../bsp/bsp_relay.h"
#include "../app/app_common.h"
#define D_page_max 127 ///128page * 512byte = 64K
#define FLASH_PARAM_PAGE_0 (0) //127page写入不成功,0可以
#define FLASH_PARAM_PAGE_1 (1) //127page写入不成功,0可以
#define D_flash_Addr_start(page) (0x0 + 512*(page))
#define D_flash_Addr_end(page) (0x0 + 512*(page + 1)-1)
#define FLASH_PARAM_PAGE_FILTER0 0xAA
#define FLASH_PARAM_PAGE_FILTER1 0x55
struct _s_flash_page0
{
U8 page;
U8 filter0;
U8 filter1;
U8 relay_status[RELAY_NUM];
TS_PaperCalib ts_paper_calib[PAPER_BOX_NUM];
U8 crc[2];
};
struct _s_flash_page1
{
U8 page;
U8 filter0;
U8 filter1;
U32 relay_oper_max_time[RELAY_NUM];
U8 crc[2];
};
struct _s_flash_data
{
U8 page0;
struct _s_flash_page0 f_page0;
U8 page0_ok;
U8 page1;
struct _s_flash_page1 f_page1;
U8 page1_ok;
};
extern struct _s_flash_data s_flash_data;
extern void L3_flash_init();
extern void L3_flash_read_param();
extern void L3_flash_erase_page0();
extern void L3_flash_read_page0();
extern void L3_flash_write_page0();
extern void L3_flash_erase_page1();
extern void L3_flash_read_page1();
extern void L3_flash_write_page1();
#endif //_app_paraid_H calib

95
source/app/app_task_485.c

@ -0,0 +1,95 @@
#include "app_task_485.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../app/app_common.h"
#define MODBUS_SLAVER_DW20_REG_START 0x02
#define MODBUS_SLAVER_DW20_REG_NUM 0x02
#define MODBUS_SLAVER_RETRY_MAX_TIME 3
TS_485 ts_485;
void L3_task_485_init(void)
{
L1_task_init(&ts_485.task);
L3_task_s_go(ts_485,D_task_init);
ts_485.slaverIndex = 0;
ts_485.pkglen = 0;
ts_485.retryTimes = 0;
ts_485.ackFlag = 0;
}
#define D_task_485_constructor_modbus_pkg 0x51
#define D_task_485_send_modbus_pkg 0x52
#define D_task_485_wait_modbus_ack 0x53
#define D_task_485_switch_next_slaver 0x54
void L3_task_485_handle(TS_485 *s)
{
TTSS_Task_init();
L2_task_go(D_task_485_constructor_modbus_pkg);
TTSS_Task_step(D_task_485_constructor_modbus_pkg)
if(G.slaver_info[s->slaverIndex].mask > 0)
{
s->pkglen = L3_pack_modbus(&s->loopPkg,G.slaver_info + s->slaverIndex);
s->ackFlag = 0;
s->retryTimes = 0;
L2_task_go(D_task_485_send_modbus_pkg);
}
else
{
L2_task_go(D_task_485_switch_next_slaver);
}
TTSS_Task_step(D_task_485_send_modbus_pkg)
//Lc_delay_ms(70);
//L0_uart2_uc(s->pkglen);
//Lc_delay_ms(70);
L0_uart2_sendArray((U8*)&s->loopPkg,s->pkglen);
s->sendStamp = s_nos_tick.t_50ms;
L2_task_go(D_task_485_wait_modbus_ack);
TTSS_Task_step(D_task_485_wait_modbus_ack)
if(s_nos_tick.t_50ms - s->sendStamp >= 2)
{
if(s_uart2_rec.ok)
{
s_uart2_rec.ok = 0;
s->pAckPkg = (TS_PH4_modbus*)(s_uart2_rec.buf);
if(s->pAckPkg->salver == G.slaver_info[s->slaverIndex].slaver)
{
s->ackFlag = 1;
if(s->pAckPkg->salver == G.slaver_info[0].slaver && s->pAckPkg->oper == MODBUS_OPER_READ)
{
G.total_weight =
s->pAckPkg->buf[1] >> 24 | s->pAckPkg->buf[2] >> 16 | s->pAckPkg->buf[3] >> 8 | s->pAckPkg->buf[4];
}
}
}
s->retryTimes++;
if(s->ackFlag || s->retryTimes >= MODBUS_SLAVER_RETRY_MAX_TIME)
{
if(G.slaver_info[s->slaverIndex].mask == 1)
{
G.slaver_info[s->slaverIndex].mask = 0;
}
L2_task_go(D_task_485_switch_next_slaver);
}
else
{
L2_task_go(D_task_485_send_modbus_pkg);
}
}
TTSS_Task_step(D_task_485_switch_next_slaver)
if(++ s->slaverIndex >= MD_SLAVER_INFO_MAX)
{
s->slaverIndex = 0;
}
L2_task_go(D_task_485_constructor_modbus_pkg);
TTSS_Task_end();
}

28
source/app/app_task_485.h

@ -0,0 +1,28 @@
#ifndef APP_TASK_485
#define APP_TASK_485
#include "../ctask/task.h"
#include "../tpc/tpc_modbus.h"
#include "app_common.h"
#define U485_BASE 1
typedef struct
{
TS_task task;
TS_PH4_modbus loopPkg;
TS_PH4_modbus *pAckPkg;
U8 slaverIndex;
U8 pkglen;
U32 sendStamp;
U8 retryTimes;
U8 ackFlag;
}TS_485;
#define U485_TIMEOUT 3 //3 x 100ms = 300ms
extern TS_485 ts_485;
extern void L3_task_485_init();
extern void L3_task_485_handle(TS_485 *s);
#endif

45
source/app/app_task_485_control.c

@ -0,0 +1,45 @@
#include "app_task_485_control.h"
#include "../msp/uart0.h"
#include "../app/app_common.h"
#define MODBUS_SLAVER_DW20_REG_START 0x02
#define MODBUS_SLAVER_DW20_REG_NUM 0x02
#define MODBUS_SLAVER_RETRY_MAX_TIME 3
TS_485_control ts_485_control;
void L3_task_485_control_init(void)
{
L1_task_init(&ts_485_control.task);
L3_task_s_go(ts_485_control,D_task_init);
ts_485_control.total_weight_pool = 0;
ts_485_control.rfid_pool = 0;
}
#define D_task_485_control_01 0x51
void L3_task_485_control_handle(TS_485_control *s)
{
TTSS_Task_init();
L2_task_go(D_task_485_control_01);
TTSS_Task_step(D_task_485_control_01)
if(s->total_weight_pool != G.total_weight)
{
G.slaver_info[1].mask = 1;
//G.slaver_info[3].mask = 1;
s->total_weight_pool = G.total_weight;
}
if(s->rfid_pool != G.rfid)
{
G.slaver_info[2].mask = 1;
//G.slaver_info[4].mask = 1;
s->total_weight_pool = G.total_weight;
}
L2_task_go(D_task_485_control_01);
TTSS_Task_end();
}

20
source/app/app_task_485_control.h

@ -0,0 +1,20 @@
#ifndef APP_TASK_485_CONTROL
#define APP_TASK_485_CONTROL
#include "../ctask/task.h"
#include "../tpc/tpc_modbus.h"
#include "app_common.h"
typedef struct
{
TS_task task;
S32 total_weight_pool;
S32 rfid_pool;
}TS_485_control;
extern TS_485_control ts_485_control;
extern void L3_task_485_control_init();
extern void L3_task_485_control_handle(TS_485_control *s);
#endif

438
source/app/app_task_gm35.c

@ -0,0 +1,438 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_test.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_gm35.h"
#include "../clib/bit.h"
#include "../clib/clib.h"
#include "../msp/uart0.h"
#include "../msp/uart4.h"
#include "../app/app_common.h"
#include "../app/app_task_wdt.h"
#include "../app/app_paraid.h"
#include "../app/app_common.h"
struct _at_send_status g_at_send_status;
struct _s_task_gm35_gprs_ s_task_gm35_flow;
struct _s_task_gm35_gprs_ s_task_gm35_daemon;
// struct _s_task_gm35_gprs_ s_task_gm35_send;
#define LEN_GPRS_TCP_PKG 18
U8 ins_cipsend[30] = "AT+CIPSEND=000\r\n";
#define GM35_TCP_CIPSEND(x) L0_uart4_sendstr(x); g_at_send_status.send_lock = 1
#define GM35_TCP_CIPSEND_COMPLETE() g_at_send_status.send_lock = 0
U8 * _cipsend_hex(U8 len)
{
U8 pos = libc_strlen("AT+CIPSEND=");
ins_cipsend[pos++] = len % 1000 / 100 + '0';
ins_cipsend[pos++] = len % 100 / 10 + '0';
ins_cipsend[pos++] = len % 10 / 1 + '0';
return ins_cipsend;
}
//将数据放入gm35待发送缓冲区
void L3_gm35_send(U8 *buf , U8 len)
{
//g_at_send_status.tcp_last_send_stmp = s_nos_tick.t_1s;
int i = 0x20000;
GM35_TCP_CIPSEND(_cipsend_hex(len));
while(i--);
L0_uart4_sendArray(buf,len);
GM35_TCP_CIPSEND_COMPLETE();
}
//------------------------------------------------------ gm35 tasks --------------------------------
// void L3_task_gm35_send_init(void)
// {
// L1_task_init(&s_task_gm35_send.task);
// L3_task_s_go(s_task_gm35_send,D_task_init);
// }
void L3_task_gm35_flow_init(void)
{
U8 i = 0;
//task init;
L1_task_init(&s_task_gm35_flow.task);
L3_task_s_go(s_task_gm35_flow,D_task_init);
//data init;
g_at_send_status.send_lock = 0;
g_at_send_status.module_ok = 0;
g_at_send_status.sim_ok = 0;
g_at_send_status.net_ok = 0;
g_at_send_status.gprs_ok = 0;
g_at_send_status.conn_ok = 0;
g_at_send_status.status = STATUS_GM35_INIT;
g_at_send_status.heart_stmp = 0;
g_at_send_status.data_stmp = 0;
g_at_send_status.sign_flag = 0;
g_at_send_status.heart_flag = 0;
g_at_send_status.data_flag = 0;
g_at_send_status.ack_flag = 0;
// g_at_send_status.pending_flag = 0;
g_at_send_status.ins_flag = 0;
// g_at_send_status.ccid[20] = 0;
// g_at_send_status.ccid_passwd[21] = 0;
g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s; //重新上电和检测到断开时设置
g_at_send_status.ins_stmp = 0; //每次发送指令时设置
g_at_send_status.tcp_last_recv_stmp = 0; //连接成功和接收到数据时设置
//缓冲区清0
// for(i=0;i<BUF_SIZE;i++)
// {
// g_at_send_status.pendingLengths[i] = 0;
// }
}
void L3_task_gm35_daemon_init(void)
{
L1_task_init(&s_task_gm35_daemon.task);
L3_task_s_go(s_task_gm35_daemon,D_task_init);
}
//------------------------ GM35 Daemon Handle -----------------------------------
#define TTSS_TASK_GM35_DAEMON_CIPSTATUS 0x01
#define TTSS_TASK_GM35_DAEMON_JUDGE 0x02
#define TTSS_TASK_GM35_DAEMON_CLOSE0 0x03
#define TTSS_TASK_GM35_DAEMON_REBOOT0 0x04
#define TTSS_TASK_GM35_DAEMON_REBOOT1 0x05
#define TTSS_TASK_GM35_DAEMON_REBOOT2 0x06
#define TTSS_TASK_BOARD_REBOOT 0x0A
#define TCP_MAX_IDLE 130
#define TCP_MAX_DISCONN 120
#define GM35_REBOOT_MAXTIMES 10
void L2_task_gm35_daemon_handle(struct _s_task_gm35_gprs_ *s)
{
TTSS_Task_init();
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_10s);
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_CIPSTATUS)
if(0 == g_at_send_status.send_lock)
{
L0_uart4_sendstr(AT_INS_CIPSTATUS);
}
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_JUDGE,D_Tdelay_2s);
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_JUDGE)
if(1 == g_at_send_status.conn_ok)
{
if(s_nos_tick.t_1s - g_at_send_status.tcp_last_recv_stmp > TCP_MAX_IDLE * 2)
{
//g_at_send_status.conn_ok = 0; //强制关闭连接
//g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s;
//L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_JUDGE,D_Tdelay_1s);
L0_uart0_sendstr("GM35 reboot.");
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_REBOOT0,0); //重启GM35
}
else if(s_nos_tick.t_1s - g_at_send_status.tcp_last_recv_stmp > TCP_MAX_IDLE)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CLOSE0,0); //关闭连接
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_3s);
}
}
else
{
if(g_at_send_status.gm35_reboot_times >= GM35_REBOOT_MAXTIMES)
{
L0_uart0_sendstr("Board reboot.");
g_at_send_status.gm35_reboot_times = 0; //重启需要时间,这里提前设置一下
//不写入继电器状态,重启自动回到初始状态
//L3_flash_write_page0(); //写继电器状态
L2_task_go_Tdelay(TTSS_TASK_BOARD_REBOOT,0); //重启板卡
}
else if(s_nos_tick.t_1s - g_at_send_status.tcp_close_stmp > TCP_MAX_DISCONN)
{
L0_uart0_sendstr("GM35 reboot.");
g_at_send_status.tcp_close_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_REBOOT0,0); //重启GM35
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_3s);
}
}
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_CLOSE0)
L0_uart4_sendstr(AT_INS_CLOSED);
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_3s);
#ifdef BOARD_MAIN04_GM35_M42
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_REBOOT0)
//set low
L2_gm35_disable();
g_at_send_status.gm35_reboot_times++;
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_REBOOT1,D_Tdelay_1s);
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_REBOOT1)
//set high
L2_gm35_enable();
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_REBOOT2,D_Tdelay_1s);
#elif defined BOARD_MAIN03_A9
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_REBOOT0)
L0_uart4_sendstr(AT_RESET);
g_at_send_status.gm35_reboot_times++;
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_REBOOT2,D_Tdelay_1s);
#endif
TTSS_Task_step(TTSS_TASK_GM35_DAEMON_REBOOT2)
L3_task_gm35_flow_init();
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_3s);
TTSS_Task_step(TTSS_TASK_BOARD_REBOOT)
s_task_wdt.seed_flag = FLAG_WDT_hunger; //饿死看门狗
L2_task_go_Tdelay(TTSS_TASK_GM35_DAEMON_CIPSTATUS,D_Tdelay_3s);
TTSS_Task_end();
}
//------------------------ GM35 Flow Handle -----------------------------------
#define TTSS_TASK_GM35_FLOW_ATEQV 0x01
#define TTSS_TASK_GM35_FLOW_ATEQV_WAIT 0x02
#define TTSS_TASK_GM35_FLOW_CCID 0x03
#define TTSS_TASK_GM35_FLOW_CCID_WAIT 0x04
#define TTSS_TASK_GM35_FLOW_CREG 0x05
#define TTSS_TASK_GM35_FLOW_CREG_WAIT 0x06
#define TTSS_TASK_GM35_FLOW_GPRS 0x07
#define TTSS_TASK_GM35_FLOW_GPRS_WAIT 0x08
#define TTSS_TASK_GM35_FLOW_CIPSTART 0x09
#define TTSS_TASK_GM35_FLOW_CIPSTART_WAIT 0x0A
#define TTSS_TASK_GM35_FLOW_CIPSTART_SUCCESS 0x0B
#define INS_TIMEOUT 2
#define GM35_SEND_DATA_INTERVAL 300
#define GM35_SEND_HEART_INTERVAL 60
#define GM35_SEND_CIPSTATUS_INTERVAL 5
void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s)
{
TTSS_Task_init()
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_10s);//上电等待10s
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV)
L0_uart4_sendstr(AT_INS_ATEQV);
g_at_send_status.module_ok = 0;
g_at_send_status.ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV_WAIT,D_Tdelay_300ms); //指令发送完毕等待300ms
TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV_WAIT)
if(1 == g_at_send_status.module_ok)
{
G.boardstatus.a9Status = STATUS_GM35_MODULE_OK;//修改状态
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CCID,0);
}
else
{
if(s_nos_tick.t_1s - g_at_send_status.ins_stmp > INS_TIMEOUT)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,0);
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV_WAIT,D_Tdelay_300ms);
}
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CCID)
L0_uart4_sendstr(AT_INS_CCID);
g_at_send_status.sim_ok = 0;
g_at_send_status.ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CCID_WAIT,D_Tdelay_300ms); //指令发送完毕等待300ms
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CCID_WAIT)
if(1 == g_at_send_status.sim_ok)
{
//Lc_print_buf("ccid: %s,",G.ccid);
L0_uart0_uc('C');
L0_uart0_sendArray(G.ccid,20);
Lc_delay_ms(100);// 2000--7s
L0_uart0_uc('S');
L0_uart0_sendArray(G.ccid_passwd,21);
//Lc_print_buf("%s\r\n",G.ccid_passwd);
G.boardstatus.a9Status = STATUS_GM35_SIM_OK;//修改状态
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CREG,0);
}
else
{
if(s_nos_tick.t_1s - g_at_send_status.ins_stmp > INS_TIMEOUT)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CCID,0);
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CCID_WAIT,D_Tdelay_300ms);
}
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CREG)
L0_uart4_sendstr(AT_INS_CREG);
g_at_send_status.net_ok = 0;
g_at_send_status.ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CREG_WAIT,D_Tdelay_300ms); //指令发送完毕等待300ms
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CREG_WAIT)
if(1 == g_at_send_status.net_ok)
{
G.boardstatus.a9Status = STATUS_GM35_NET_OK;//修改状态
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_GPRS,0);
}
else
{
if(s_nos_tick.t_1s - g_at_send_status.ins_stmp > INS_TIMEOUT)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CREG,0);
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CREG_WAIT,D_Tdelay_300ms);
}
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_GPRS)
L0_uart4_sendstr(AT_INS_GPRS);
g_at_send_status.gprs_ok = 0;
g_at_send_status.ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_GPRS_WAIT,D_Tdelay_300ms); //指令发送完毕等待300ms
TTSS_Task_step(TTSS_TASK_GM35_FLOW_GPRS_WAIT)
if(1 == g_at_send_status.gprs_ok)
{
G.boardstatus.a9Status = STATUS_GM35_GPRS_OK;//修改状态
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART,0);
}
else
{
if(s_nos_tick.t_1s - g_at_send_status.ins_stmp > INS_TIMEOUT)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_GPRS,0);
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_GPRS_WAIT,D_Tdelay_300ms);
}
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CIPSTART)
L0_uart4_sendstr(AT_INS_CIPSTART);
g_at_send_status.conn_ok = 0;
g_at_send_status.ins_stmp = s_nos_tick.t_1s;
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART_WAIT,D_Tdelay_300ms); //指令发送完毕等待300ms
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CIPSTART_WAIT)
if(1 == g_at_send_status.conn_ok)
{
//L3_task_gm35_send_init(); //初始化发送任务
g_at_send_status.heart_stmp = s_nos_tick.t_1s;
g_at_send_status.data_stmp = s_nos_tick.t_1s;//连接成功后立刻发送账号密码
g_at_send_status.sign_flag = 1;
g_at_send_status.heart_flag = 0;
g_at_send_status.data_flag = 0; //login
g_at_send_status.ack_flag = 0;
//g_at_send_status.pending_flag = 0;
g_at_send_status.tcp_last_recv_stmp = s_nos_tick.t_1s; //设置数据接收时间
g_at_send_status.gm35_reboot_times = 0; //gm35重启次数清0
G.boardstatus.a9Status = STATUS_GM35_TCP_OK;//修改状态
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART_SUCCESS,0);
}
else
{
if(s_nos_tick.t_1s - g_at_send_status.ins_stmp > INS_TIMEOUT)
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART,0);
}
else
{
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART_WAIT,D_Tdelay_300ms);
}
}
TTSS_Task_step(TTSS_TASK_GM35_FLOW_CIPSTART_SUCCESS)
if(1 == g_at_send_status.conn_ok)
{
U8 pkglen = 0;
if(g_at_send_status.sign_flag == 1) //发送登陆包
{
L0_uart0_uc('l');
g_at_send_status.sign_flag = 0; //只发一次
L2_gprs_send_signin_pkg();
}
else if(g_at_send_status.ack_flag == 1)
{
L0_uart0_uc('z');
g_at_send_status.ack_flag = 0;
L2_gprs_send_ack_pkg();
}
else if(s_nos_tick.t_1s - g_at_send_status.heart_stmp >= GM35_SEND_HEART_INTERVAL) //每隔60s发送心跳
{
L0_uart0_uc('x');
g_at_send_status.heart_stmp = s_nos_tick.t_1s;
L2_gprs_send_heart_pkg();
}
else if(s_nos_tick.t_1s - g_at_send_status.data_stmp >= GM35_SEND_DATA_INTERVAL) //每隔300s发送数据
{
L0_uart0_uc('y');
g_at_send_status.data_stmp = s_nos_tick.t_1s;
L2_gprs_send_report_pkg();
}
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART_SUCCESS,D_Tdelay_1s);
}
else
{
L0_uart4_uc(0x1a); //关闭send
L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_CIPSTART,D_Tdelay_300ms); //断线重连
}
TTSS_Task_end();
}
//------------------------ GM35 Core Handle -----------------------------------
void L3_task_gm35_core_init(void)
{
g_at_send_status.gm35_reboot_times = 0;
L3_task_gm35_daemon_init();
L3_task_gm35_flow_init();
//L3_task_gm35_send_init();
}
void L3_task_gm35_core_handle()
{
L2_task_gm35_daemon_handle(&s_task_gm35_daemon);
L2_task_gm35_flow_handle(&s_task_gm35_flow);
}

106
source/app/app_task_gm35.h

@ -0,0 +1,106 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _app_gm35_gprs_H
#define _app_gm35_gprs_H
#include "../bsp/bsp_config.h"
#include "../bsp/bsp_gm35.h"
#include "../tpc/tpc_uart.h"
#include "../ctask/task.h"
////<<<<<<<<<<<<<<<<<<< GM35模块 AT操作指令 <<<<<<<<<<<<<<<<<<<<<<<<
#define AT_INS_ATEQV "ATE0Q0V1\r\n" //模块查询指令
#define AT_INS_CCID "AT+CCID\r\n" //SIM卡查询指令
#define AT_INS_CREG "AT+CREG?\r\n" //网络查询指令
#define AT_INS_GPRS "AT+CGATT=1;+CGDCONT=1,\"IP\",\"CMNET\";+CGACT=1,1\r\n" //GPRS操作指令
#define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"wx.yinzhimeng.com.cn\",9999\r\n"
//#define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"weizezhao.imwork.net\",49809\r\n" //连接服务器
// #define AT_INS_CIPSTART "AT+CIPSTART=\"TCP\",\"43.249.193.233\",38916\r\n" //连接服务器
#define AT_INS_CIPSEND "AT+CIPSEND\r\n" //发送数据
#define AT_INS_CLOSED "AT+CIPCLOSE\r\n" //主动关闭连接
#define AT_INS_CIPSTATUS "AT+CIPSTATUS\r\n" //查询连接状态
#define AT_INS_CSQ "AT+CSQ\r\n" //查询信号指令
#define AT_RESET "AT+RST=2\r\n" //a9重启指令 AT+RST=2硬件重启(vUSB供电) AT+RST=1软件重启
////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<<
struct _s_task_gm35_gprs_
{
TS_task task;
};
#define STATUS_GM35_INIT 0
#define STATUS_GM35_MODULE_OK 1
#define STATUS_GM35_SIM_OK 2
#define STATUS_GM35_NET_OK 3
#define STATUS_GM35_GPRS_OK 4
#define STATUS_GM35_TCP_OK 5
#define BUF_SIZE 5
#define BUF_MAX 32 //注意缓冲区的长度
struct _at_send_status
{
vU8 send_lock;
vU8 module_ok;
vU8 sim_ok;
vU8 net_ok;
vU8 gprs_ok;
vU8 conn_ok;
vU8 status;
vU32 ins_stmp; //指令时间戳
vU32 tcp_last_recv_stmp; //上次接收数据时间戳
vU32 tcp_close_stmp; //断开连接时间戳
vU32 heart_stmp; //连接成功后,等待发送时间
vU32 data_stmp;//数据发送时间记录
vU8 sign_flag; //发送登录数据标志
vU8 heart_flag; //发送心跳标志
vU8 data_flag;//定时发送数据标志
vU8 ack_flag;//下行数据ack
vU8 gm35_reboot_times; //gm35重启次数
vU8 ins_flag; //at指令ok标志
};
extern struct _at_send_status g_at_send_status;
extern struct _s_task_gm35_gprs_ s_task_gm35_gprs;
extern struct _s_task_gm35_gprs_ s_task_connect_gprs;
extern void L3_task_gm35_core_init(void);
extern void L3_task_gm35_core_handle(void);
extern void L3_gm35_send(U8 *d , U8 len);
#endif

83
source/app/app_task_relay.c

@ -0,0 +1,83 @@
#include "app_task_relay.h"
#include "app_common.h"
#include "../app/app_paraid.h"
struct _s_task_relay_ s_task_relay;
void L3_task_relay_init(void)
{
U8 i = 0;
//0.任务初始化
L1_task_init(&s_task_relay.task);
L3_task_s_go(s_task_relay,D_task_init);
//1.任务变量初始化
s_task_relay.pc = 0;
s_task_relay.pc_stmp = s_nos_tick.t_1s;
//2.读取flash参数
#if 0
if(1 == s_flash_data.page0_ok)
{
for(i=0;i<RELAY_NUM;i++)
{
s_relay_oper[i].relay_status = s_flash_data.f_page0.relay_status[i];
}
//3.继电器上电初始化
for(i=0;i<RELAY_NUM;i++)
{
// s_relay_oper[i].relay_handler(
// s_relay_oper[i].relay_status
// );
s_relay_oper[i].relay_handler(
L2_relay_convert_and_do(i,s_relay_oper[i].relay_status)
);
}
}
if(1 == s_flash_data.page1_ok)
{
for(i=0;i<RELAY_NUM;i++)
{
s_relay_oper[i].relay_oper_max_time = s_flash_data.f_page1.relay_oper_max_time[i];
}
}
#endif
}
#define TTSS_TASK_RELAY_01 0x1
#define TTSS_TASK_RELAY_02 0x2
#define TTSS_TASK_RELAY_03 0x3
void L3_task_relay_handle(struct _s_task_relay_ *s)
{
TTSS_Task_init();
L2_task_go(TTSS_TASK_RELAY_01);
TTSS_Task_step(TTSS_TASK_RELAY_01)
if(s->pc != 0)
{
if(PC_GUANJI == s->pc)
{
if(s_nos_tick.t_1s - s->pc_stmp >= 7) //至少经过6s 6s-7s
{
s->pc = 0;
s->pc_stmp = s_nos_tick.t_1s;
s_relay_oper[RELAY_PC].relay_handler(L2_relay_convert_and_do(RELAY_PC,RELAY_KAI));
s_relay_oper[RELAY_PC].relay_status = RELAY_KAI;
}
}
else
{
if(s_nos_tick.t_1s - s->pc_stmp >= 2) //至少经过1s 1s-2s
{
s->pc = 0;
s->pc_stmp = s_nos_tick.t_1s;
s_relay_oper[RELAY_PC].relay_handler(L2_relay_convert_and_do(RELAY_PC,RELAY_KAI));
s_relay_oper[RELAY_PC].relay_status = RELAY_KAI;
}
}
}
L2_task_go_Tdelay(TTSS_TASK_RELAY_01,D_Tdelay_300ms);
TTSS_Task_end();
}

17
source/app/app_task_relay.h

@ -0,0 +1,17 @@
#ifndef APP_TASK_RELAY_H
#define APP_TASK_RELAY_H
#include "../bsp/bsp_relay.h"
struct _s_task_relay_
{
TS_task task;
vU8 pc;
vU32 pc_stmp;
};
extern struct _s_task_relay_ s_task_relay;
extern void L3_task_relay_init(void);
extern void L3_task_relay_handle(struct _s_task_relay_ *s);
#endif

44
source/app/app_task_report.c

@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_test.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_report.h"
#include "../msp/uart0.h"
//#include "bsp_IRS.h"
#include "../app/app_common.h"
struct _s_task_report_ s_task_report;
void L3_task_report_init(void)
{
L1_task_init(&s_task_report.task);
L3_task_s_go(s_task_report,D_task_init);
}
#define TASK_HEARTBEAT_REPORT 0x1
void L3_task_report_handle(struct _s_task_report_ *s)
{
TTSS_Task_init()
L2_task_go(TASK_HEARTBEAT_REPORT);
TTSS_Task_step(TASK_HEARTBEAT_REPORT)
if(G.runmode == MODE_RUN)
{
L2_do_uart_report();
}
L2_task_go_Tdelay(TASK_HEARTBEAT_REPORT,D_Tdelay_1s);
TTSS_Task_end();
}

31
source/app/app_task_report.h

@ -0,0 +1,31 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _app_task_report_H
#define _app_task_report_H
#include "../ctask/task.h"
#include "../bsp/bsp_config.h"
////---------------------Task ---------------------------------
struct _s_task_report_
{
TS_task task;
};
extern struct _s_task_report_ s_task_report;
extern void L3_task_report_init(void);
extern void L3_task_report_handle(struct _s_task_report_ *s);
#endif // #ifndef _bsp_gc6133_H

33
source/app/app_task_wdt.c

@ -0,0 +1,33 @@
#include "app_task_wdt.h"
#include "../bsp/bsp_wdt.h"
#include "../msp/uart0.h"
struct _s_task_wdt s_task_wdt;
void L3_task_wdt_init(void)
{
L1_task_init(&s_task_wdt.task);
L3_task_s_go(s_task_wdt,D_task_init);
s_task_wdt.seed_flag = FLAG_WDT_SEED;
}
#define TTSS_TASK_WDT_STP_01 0x1
void L3_task_wdt_handle(struct _s_task_wdt *s)
{
TTSS_Task_init()
L2_task_go(TTSS_TASK_WDT_STP_01);
TTSS_Task_step(TTSS_TASK_WDT_STP_01)
if(FLAG_WDT_SEED == s->seed_flag)
{
L0_wdt_feed();
}
else
{
L0_uart0_uc('E');
}
L2_task_go(TTSS_TASK_WDT_STP_01);
L1_task_Tdelay(D_Tdelay_1s);
TTSS_Task_end();
}

20
source/app/app_task_wdt.h

@ -0,0 +1,20 @@
#ifndef APP_TASK_WDT
#define APP_TASK_WDT
#include "../ctask/task.h"
struct _s_task_wdt
{
TS_task task;
vU8 seed_flag;
};
#define FLAG_WDT_SEED 0
#define FLAG_WDT_hunger 1
extern struct _s_task_wdt s_task_wdt;
extern void L3_task_wdt_init();
extern void L3_task_wdt_handle(struct _s_task_wdt *s);
#endif

BIN
source/app/bak.zip

Binary file not shown.

165
source/app/main.c

@ -0,0 +1,165 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions: CC-PWR-VH01-m02.sch
//////////////////////////////////////////////////////////////////////////
//20160413 CC-ACC-VH02
//20170111 CC-ls_02
//
//20170608 cc_as_stc01_main
//
//
//
//
/// 下面是一个含有两个参数的函数的注释说明(简述)
///
/// 这里写该函数的详述信息
/// @param a 被测试的变量(param描述参数)
/// @param s 指向描述测试信息的字符串
/// @return 测试结果(return描述返回值)
/// @see Test() (本函数参考其它的相关的函数,这里作一个链接)
/// @note (note描述需要注意的问题)
/************************************************
stc5ac32s
************************************************/
//===============================================
//寄存器头文件
//===============================================
#include "main.h"
/// main init
/// @param a 被测试的变量(param描述参数)
/// @param s 指向描述测试信息的字符串
/// @return 测试结果(return描述返回值)
/// @see Test() (本函数参考其它的相关的函数,这里作一个链接)
/// @note (note描述需要注意的问题)
void L0_main_init(void)
{
//L2_relay_init();
///step : 1>>>>>>>>>引脚选择相关>>>>>>>>>
L0_pin_config();
// L0_cpu_init();
L0_timer0_Init();
L1_tick_init();
///step : 3>>>>>>>>>中断控制相关>>>>>>>>>
EA = 1; //打开总中断
///step : 4>>>>>>>>>串口等debug相关>>>>>>>>>
L1_uart0_buf_init();
L1_uart2_buf_init();
L1_uart3_buf_init();
L1_uart4_buf_init();
L1_uart_tpc_config(); //配置串口对应的操作协议
L2_485_init();
Lc_delay_ms(700);// 2000--7s
///step: 7>>>>>>>>>寄存器默认初始化>>>>>>>>>>>>>
Lu_register_init();
//L3_flash_write_page0();
#if 0
///step: 5>>>>>>>>>看门狗>>>>>>>>>>>>>
//L0_wdt_init();
L2_gm35_init();
///step: 6>>>>>>>>>Flash>>>>>>>>>>>>>
L3_flash_init();
L3_flash_read_param();
///step : 7>>>>>>>>>任务相关>>>>>>>>>
L3_task_report_init(); //与上位机通信
L3_task_relay_init(); //继电器
L3_task_gm35_core_init();
L3_task_wdt_init(); //看门狗任务初始化
#endif
L3_task_485_init(); //485轮询任务初始化
L3_task_485_control_init();
}
//===============================================
//主函数
//===============================================
void main(void)
{
//-----------------------------------------------
//系统初始化
//----------------------------------------------
L0_main_init();
Lc_print_buf("Init complete...\r\n");
Lc_delay_ms(70);
Lc_print_buf("Version:");
L0_uart0_uc((APP_VERSION_HEX >> 4 & 0xF) + '0');
L0_uart0_uc('.');
L0_uart0_uc((APP_VERSION_HEX >> 0 & 0xF) + '0');
L0_uart0_0d0a();
//-----------------------------------------------
//系统主循环
//-----------------------------------------------
while(9)
{
if(1 == s_nos_tick.t1s_heatbeart)
{
s_nos_tick.t1s_heatbeart = 0;
//L0_uart0_uc('.');
L0_uart0_sendArray("abcdefg", 7);
}
//串口3 RFID接收
L3_UARTcom3_exp_protocol(&s_uart3_rec);
//485轮询
L3_task_485_handle(&ts_485);
//master->slaver发送逻辑控制
L3_task_485_control_handle(&ts_485_control);
#if 0
//看门狗
L3_task_wdt_handle(&s_task_wdt);
//每隔n秒,主动向上位机发送心跳包
//L3_task_report_handle(&s_task_report);
//解析串口0协议(上位机发送的控制消息)
L3_UARTcom0_exp_protocol(&s_uart0_rec);
//gsm模块初始化+tcp发送消息
//L3_task_a9_handle();
L3_task_gm35_core_handle();
//解析串口4协议(gsm模块收到的at响应消息+服务器发送消息)
L3_UARTcom4_exp_protocol(&s_uart4_at_rec);
//解析串口4+CIPRCV协议
L3_task_a9_rcv_handle(&s_uart4_tcp_rec);
//继电器PC按键弹起
L3_task_relay_handle(&s_task_relay);
#endif
}
}//end main

92
source/app/main.h

@ -0,0 +1,92 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2017, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
///
///
///
///
///
///
///
/// msp: humtemp flow
/// bsp: i2c adc
///
///
///
///
///
//////////////////////////////////////////////////////////////////////////
#ifndef _MAIN_H
#define _MAIN_H
#include "../bsp/bsp_config.h"
//#include "../bsp/adxl362.h"
//#include "../msp/stc_adc.h"
#include "../msp/uart0.h"
#include "../msp/uart2.h"
#include "../msp/uart3.h"
#include "../msp/uart4.h"
#include "../msp/time.h"
#include "../msp/iic_sim.h"
//#include "../msp/msp_buzz.h"
//#include "../msp/msp_rtc.h"
//#include "../msp/msp_plcd.h"
//#include "../msp/msp_vc.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
//#include "../debug/debug_drv.h"
//#include "../uartcom/uprotocol.h"
//#include "../uartcom/Uartcom0.h"
#include "../ctask/task.h"
//#include "../bsp/bsp_led.h"
//#include "../bsp/am2320.h"
//#include "../bsp/weather.h"
//#include "app_yeelink.h"
//#include "app_flow.h"
//#include "app_Gsensor.h"
//#include "app_io.h"
#include "../bsp/bsp_relay.h"
#include "../bsp/bsp_gm35.h"
#include "../bsp/bsp_wdt.h"
#include "../bsp/bsp_485.h"
#include "../app/app_drv.h"
#include "../app/app_task_report.h"
#include "../app/app_task_gm35.h"
#include "../app/app_task_wdt.h"
#include "../app/app_task_485.h"
#include "../app/app_task_485_control.h"
#include "../app/app_task_relay.h"
#include "../app/app_common.h"
#include "../app/app_paraid.h"
//////////////////////////////////////////////////////////////////
#endif //#ifndef _MAIN_H

BIN
source/bsp/bak.zip

Binary file not shown.

8
source/bsp/bsp_485.c

@ -0,0 +1,8 @@
#include "bsp_485.h"
void L2_485_init(void)
{
//485配置输出 P70 P41
BITN_0(P7M1,BITN0);BITN_1(P7M0,BITN0);
BITN_0(P4M1,BITN1);BITN_1(P4M0,BITN1);
}

12
source/bsp/bsp_485.h

@ -0,0 +1,12 @@
#ifndef BSP_485_H
#define BSP_485_H
#include "../cpu/STC_stc8a8k.h"
#include "../cpu/c51_macro.h"
#include "../clib/bit.h"
#define D_485_TX() P70 = 1; P41 = 1;// >750us
#define D_485_RX() P70 = 0; P41 = 0;
extern void L2_485_init(void);
#endif

285
source/bsp/bsp_config.c

@ -0,0 +1,285 @@
#include "bsp_config.h"
#include "../clib/bit.h"
#include "../cpu/c51_macro.h"
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_func.c
/// @brief bsp @ fuctiong ; io复用选择等,和cpu型号息息相关
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180308
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
struct _s_sysclk s_sysclk;
//// mclk out init 系统时钟输出配置,可以提供给其他外设作为时钟
void L0_MCLKO_init(void)
{
#if 10
BITN_1(P_SW2,EAXFR);// P_SW2 = 0x80;
///-----------------------------------------------------
// p107@stc8.pdf
BITS_CLR(CKSEL,0x03,BIT0);/// 00: 内部24M 以烧写器的配置为主 01 extern osc 10 extern input 11 intern 32kIRC
s_sysclk.m = 11059260;
#if 0 //fixme: 加入这一部分会影响波特率
CLKDIV = 0;///BITS_CLR(CLKDIV,0xff,BIT0);
BITS_SET(CLKDIV,(1-0),BIT0); /// SYSClk = MCLK/1
s_sysclk.clk = s_sysclk.m/1;
#endif
BITS_CLR(CKSEL,0xf,BIT4);
BITS_SET(CKSEL,5,BIT4);/// sytem out clock sysclk/2 =3
/// 0--disable 0001 sysclk/1 2=/2 4=/4 6=/8 8=/16 10=/32 12=/64 14=/128
///?? 4 5,2M 2 11m=2 波形添加了2v的直流分量
s_sysclk.out = s_sysclk.clk/2;
BITN_0(CKSEL,MCLKO_S);/// P5.4 SELECTED
CKSEL = 0x10;
BITN_0(P5M1,BITN4);BITN_0(P5M0,BITN4);
BITN_0(P5M1,BITN4);BITN_1(P5M0,BITN4);/// 01 推挽
/// BITN_1(CKSEL,MCLKO_S);/// P1.6 SELECTED
/// BITN_0(P1M1,BITN6);BITN_0(P1M0,BITN6);
///-----------------------------------------------------
//00 01 81 80
//10 01 81 80
//L0_uart0_uc(CKSEL);
//L0_uart0_uc(CLKDIV);
//L0_uart0_uc(IRC24MCR);
//L0_uart0_uc(EAXFR);
BITN_0(P_SW2,EAXFR);// P_SW2 = 0x80;
#else
BITN_1(P5M1,BITN4);BITN_0(P5M0,BITN4);
#endif
//while(1);
}
void L0_cLK_init(void)
{
BITN_1(P_SW2,EAXFR);// P_SW2 = 0x80;
///-----------------------------------------------------
// p107@stc8.pdf
BITS_CLR(CKSEL,0x03,BIT0);/// 00: 内部24M 以烧写器的配置为主 01 extern osc 10 extern input 11 intern 32kIRC
s_sysclk.m = 11059260;
#if 0 //fixme: 加入这一部分会影响波特率
CLKDIV = 0;///BITS_CLR(CLKDIV,0xff,BIT0);
BITS_SET(CLKDIV,(1-0),BIT0); /// SYSClk = MCLK/1
s_sysclk.clk = s_sysclk.m/1;
#endif
BITS_CLR(CKSEL,0xf,BIT4);
BITS_SET(CKSEL,4,BIT4);/// sytem out clock sysclk/2 =3
/// 0--disable 0001 sysclk/1 2=/2 4=/4 6=/8 8=/16 10=/32 12=/64 14=/128
///?? 4 5,2M 2 11m=2 波形添加了2v的直流分量
s_sysclk.out = s_sysclk.clk/2;
BITN_0(CKSEL,MCLKO_S);/// P5.4 SELECTED
BITN_0(P5M1,BITN4);BITN_0(P5M0,BITN4);
/// BITN_1(CKSEL,MCLKO_S);/// P1.6 SELECTED
/// BITN_0(P1M1,BITN6);BITN_0(P1M0,BITN6);
///-----------------------------------------------------
///-----------------------------------------------------
/// BITN_1(P_SW2,CMPO_S);//比较器选择输出使能 cmpo p69@stc8.pdf
BITN_0(P_SW2,EAXFR);// P_SW2 = 0x80;
//while(1);
}
void L0_led2_set(unsigned char onf)
{
if(onf)
{
BITN_0(P3M1,BITN4);BITN_0(P3M0,BITN4); ///P34 LED
D_P34_OFF();
}else
{
D_P34_ON();
BITN_1(P3M1,BITN4);BITN_0(P3M0,BITN4); ///高阻 P34 LED
}
}
void L0_pin_config(void)
{
//uart0
BITN_0(P_SW1 ,BITN7);//
BITN_0(P_SW1 ,BITN6);// rxd p3.0 txd p3.1
//BITN_0(P_SW1 ,BITN7);//
//BITN_1(P_SW1 ,BITN6);// rxd p3.6 txd p3.7
//uart2
BITN_0(P_SW2 ,BITN0);// rxd2 p1.0 txd2 p1.1
//BITN_1(P_SW2 ,BITN0);// rxd2 p4.0 txd2 p4.2
//uart3
P_SW2 = 0x02; // RXD3_2/P5.0, TXD3_2/P5.1
//uart4
BITN_1(P_SW2 ,BITN2);// rxd4 p5.2 txd4 p5.3
//BITN_0(P_SW2 ,BITN2);// rxd4 p0.2 txd4 p0.3
}
void L0_cpu_init(void)
{
L0_cLK_init();
/******************************
// fixme: accord to the pcb
P3.7 TXD1
P3.6 RXD1 vsys 使
P1
P36 VSYC hsync int2
P35 RCLK
P5.4 MCLK0
P55 PWDN
P34 LED
*************************/
P1M0 = 0x00;
P1M1 = 0xff;
BITN_0(P3M1,BITN5);BITN_0(P3M0,BITN5); ///P35 RCLK
BITN_0(P5M1,BITN5);BITN_0(P5M0,BITN5); ///P55 PWDN
BITN_0(P3M1,BITN4);BITN_0(P3M0,BITN4); ///P34 LED
///普通应用
BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6); ///P36 hsync rxd
BITN_0(P1M1,BITN1);BITN_0(P1M0,BITN1);///P37 txd 需要和系统的txd切换 发送完了立即切回原来的txd
///P36 VSYC 也可作为hsync int2
}
//------------------------------串口协议配置 ------------------------------------
TS_Handle_PH3 s_uart0_rec;
TS_Handle_PH4 s_uart2_rec;
TS_Handle_PH3 s_uart3_rec;
TS_Handle_0d0a s_uart4_at_rec;
TS_Handle_PH3 s_uart4_tcp_rec;
void (*Lp0_uart0_fun)(unsigned char sbufreg);
void (*Lp0_uart2_fun)(unsigned char sbufreg);
void (*Lp0_uart3_fun)(unsigned char sbufreg);
void (*Lp0_uart4_fun)(unsigned char sbufreg);
//uart2
void L1_s2b_PH4_2(unsigned char sbufreg)
{
s_uart2_rec.reg = sbufreg;
L1_s2b_PH4(&s_uart2_rec);
}
//uart0
void L1_s2b_PH3_0(unsigned char sbufreg)
{
s_uart0_rec.reg = sbufreg;
L1_s2b_PH3(&s_uart0_rec);
}
//uart3
void L1_s2b_PH3_3(unsigned char sbufreg)
{
s_uart0_rec.reg = sbufreg;
L1_s2b_PH3(&s_uart3_rec);
}
//GM35协议
void L1_s2b_gm35(unsigned char sbufreg)
{
s_uart4_tcp_rec.reg = sbufreg;
L1_a9_PH3(&s_uart4_tcp_rec);
if(0 == s_uart4_tcp_rec.head)
{
s_uart4_at_rec.reg = sbufreg;
L1_s2b_0d0a(&s_uart4_at_rec);
}
else
{
s_uart4_at_rec.head = 0;
}
}
void L1_uart_tpc_config(void)
{
//uart0 protocol setting...
s_uart0_rec.head = 0;
s_uart0_rec.ok = 0;
s_uart0_rec.head_0 = D_CMD_Filter1_ff;
s_uart0_rec.head_1 = D_CMD_Filter2_fe;
s_uart0_rec.sp = (U8*)&(s_uart0_rec.ts_ccmodbus);
//uart2 protocol setting...
s_uart2_rec.head = 0;
s_uart2_rec.ok = 0;
s_uart2_rec.num = 0;
//uart3 ...
s_uart3_rec.head = 0;
s_uart3_rec.ok = 0;
s_uart3_rec.head_0 = D_CMD_Filter1_ff;
s_uart3_rec.head_1 = D_CMD_Filter2_fe;
s_uart3_rec.sp = (U8*)&(s_uart0_rec.ts_ccmodbus);
//uart4
s_uart4_at_rec.head = 0;
s_uart4_at_rec.ok = 0;
s_uart4_at_rec.num = 0;
s_uart4_at_rec.setflag = FLAG_NONE;
//a9 +CIPRCV
s_uart4_tcp_rec.head = 0;
s_uart4_tcp_rec.ok = 0;
s_uart4_tcp_rec.head_0 = D_CMD_Filter1_ff;
s_uart4_tcp_rec.head_1 = D_CMD_Filter2_fe;
s_uart4_tcp_rec.sp = (U8*)&(s_uart4_tcp_rec.ts_ccmodbus);
Lp0_uart0_fun = L1_s2b_PH3_0;
Lp0_uart2_fun = L1_s2b_PH4_2;
Lp0_uart3_fun = L1_s2b_PH3_3;
Lp0_uart4_fun = L1_s2b_gm35;
}

376
source/bsp/bsp_config.h

@ -0,0 +1,376 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file hard_config.h
/// @brief hard config include
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx
///-------------------------------------------------------------------------
/// @version 1.1
/// @author CC
/// @date 20180308
/// @note
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#ifndef _BSP_CONFIG_H
#define _BSP_CONFIG_H
#include <INTRINS.H>
#include "../clib/Type.h"
#include "../clib/bit.h"
#include "../tpc/tpc_modbus.h"
#include "../tpc/tpc_uart.h"
#include "../tpc/tpc_0d0a.h"
//#define D_iic_inspect
#define D_open_save_f
//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE
#define TYPE_BOARD_hhnew 16
#define TYPE_BOARD_st_sleep04_01 4
#define TYPE_BOARD_st_sleep03 5
#define TYPE_BOARD_SMMM_MB_VH032_0E 6
#define TYPE_BOARD_LPC17xx_ 8
#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036
#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551
#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7
#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178
#define TYPE_BOARD_stc5as32_WIFIBV01 532
#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32
#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感
#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板
//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end
// BORAD,
// MCU:SHC6601
// IDE :KEIL
//>>>>>>>>>>>>>>>>>>>>>>mcu TYPE
#define TYPE_MCU_SHC6601 66
#define TYPE_MCU_STC 51
#define TYPE_MCU_LPC17xx 3217
#define TYPE_MCU_STM32 3232
#define D_CPUfamily_8bits 8
#define D_CPUfamily_16bits 16
#define D_CPUfamily_32bits 32
//<<<<<<<<<<<<<<<<<<<<<<mcu TYPE end
//>>>>>>>>>>>>>>>>>>>>>>IDE TYPE
#define TYPE_IDE_KEIL 1
#define TYPE_IDE_MDK 2
#define TYPE_IDE_IAR 3
//<<<<<<<<<<<<<<<<<<<<<<IDE TYPE end
//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE
#define TYPE_ASENSOR_ADXL362 362
#define TYPE_ASENSOR_MSA300 362
#define TYPE_ASENSOR TYPE_ASENSOR_MSA300
//<<<<<<<<<<<<<<<<<<<<<<G-SENSOR TYPE end
//STEP 1 TYPE_UASER_BOARD SELECT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define TYPE_UASER_BOARD TYPE_BOARD_GSM_MAIN_V07 //打印机运维板
//#define TYPE_UASER_BOARD TYPE_BOARD_PAPER6133_M0A6 //会议计时器版v TI26_MT01-M178
//#define TYPE_UASER_BOARD TYPE_BOARD_SMMM_MB_VH032_0E
//#define TYPE_UASER_BOARD TYPE_BOARD_stc90c516rd
//#define TYPE_UASER_BOARD TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7
//#define TYPE_UASER_BOARD TYPE_BOARD_stc5as32_WIFIBV01
//#define TYPE_UASER_BOARD TYPE_BOARD_hhnew
//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#if(TYPE_UASER_BOARD == TYPE_BOARD_GSM_MAIN_V07)
#define TYPE_MCU TYPE_MCU_STC
#define TYPE_IDE TYPE_IDE_KEIL
#include <stdio.h>
#include <string.h>
#include <intrins.h>
#include "../cpu/STC_stc8a8k.h"
#include "../cpu/c51_macro.h"
#define D_CPUfamily_type D_CPUfamily_8bits
#define BRT_115200 115200
#define BRT_9600 9600
#define D_uart0_BRT BRT_115200
#define MainFre_5M 0
#define MainFre_11M 1
#define MainFre_22M 2
#define MainFre_27M 3
//#define D_sys_MainFre MainFre_16M2
#define D_sys_MainFre MainFre_11M
#if(MainFre_5M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif(MainFre_22M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif(MainFre_27M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#else ///MainFre_11M
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#endif//D_sys_MainFre)
#elif(TYPE_UASER_BOARD == TYPE_BOARD_PAPER6133_M0A6)
#define TYPE_MCU TYPE_MCU_STC
#define TYPE_IDE TYPE_IDE_KEIL
#include <stdio.h>
#include <string.h>
#include <intrins.h>
#include "../cpu/STC_stc8a8k.h"
#include "../cpu/c51_macro.h"
#define D_CPUfamily_type D_CPUfamily_8bits
#define BRT_115200 115200
#define BRT_9600 9600
#define D_uart0_BRT BRT_115200
#define MainFre_5M 0
#define MainFre_11M 1
#define MainFre_22M 2
#define MainFre_27M 3
//#define D_sys_MainFre MainFre_16M2
#define D_sys_MainFre MainFre_11M
#if(MainFre_5M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif(MainFre_22M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif(MainFre_27M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#else ///MainFre_11M
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#endif//D_sys_MainFre)
#elif(TYPE_UASER_BOARD == TYPE_BOARD_TI26_MT01_M178)
#define TYPE_MCU TYPE_MCU_STC
#define TYPE_IDE TYPE_IDE_KEIL
#include <stdio.h>
#include <string.h>
#include "../cpu/STC_stc8a8k.h"
#define D_CPUfamily_type D_CPUfamily_8bits
#elif(TYPE_UASER_BOARD == TYPE_BOARD_SMMM_MB_VH032_0E)
//Fix Me.
#elif(TYPE_UASER_BOARD == TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7)
#define TYPE_MCU TYPE_MCU_SHC6601
#define TYPE_IDE TYPE_IDE_KEIL
//typedef unsigned char type_comm;//通用类型的变量,取决于编译器和cpu的位数和系统的堆栈优化等
#include <stdio.h>
#include <string.h>
#include <intrins.h>
#define NOP() _nop_()
#define D_CPUfamily_type D_CPUfamily_8bits
typedef unsigned char type_comm;
#ifdef D_debug_sim
#define D_sim_uart
#define D_sim_timer0
#endif
//---------------------------------------------------
#define MainFre_2M2 0
#define MainFre_4M2 1
#define MainFre_8M2 2
#define MainFre_16M2 3
///#define D_sys_MainFre MainFre_16M2
#define D_sys_MainFre MainFre_4M2
///#define D_sys_MainFre MainFre_2M2
/// send+10000 = 100ms 10==1ms 1=200us
#if(MainFre_16M2 == D_sys_MainFre)
#define D_Cdelay_200us 9 //20us 20us*250 = 5000us 5ms
#define D_Cdelay_1us 1 ////while p21翻转时测定 1.74M 0.5us 一个指令
#elif (MainFre_8M2 == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif (MainFre_4M2 == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif (MainFre_2M2 == D_sys_MainFre)
#define D_Cdelay_200us 40
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#endif
#define D_Tdelay_100ms (10)
#define D_Tdelay_200ms (20)
#define D_Tdelay_400ms (65534)
#define D_Cdelay_400us (2*D_Cdelay_200us+3)
#define D_Cdelay_1ms (5*D_Cdelay_200us)
#define D_Cdelay_1ms2 (6*D_Cdelay_200us+7+1)
#define D_Cdelay_5ms (254+16)
/// 对应task中的n v 最大值255
//// 如果main循环耗时 20us 那么//20us 20us*250 = 5000us 5ms
//---------------------------------------------------
#include "../cpu/SHC16L.h"
#include "../cpu/shc16l_macro.h"
//SADEN1 串口从 机地址
//---------------------------------------------------
#define gReg_user2 SADEN1
#define gRegU_SO SADDR
#define gRegU_AppFlag CCAP0L // io口状态位
#define gRegU_iic_wr CCAP1L // iic 读写状态位
#define gRegU_iic_return CCAP2L ///// i2c模块任务调度状态,判定i2c模块是否空闲的标志
#define gRegU_CWreg CCAP3L
#define gRegU_SO3 CCAP3L
#define D_AppFlag_CWInt BITN0 /// CW 的中断app标志 区别于中断标志,一般用于保存中断标志
/// 因为中断标志大部分会在中断中自动或者程序清除,应用程序中看不到了
#define D_AppFlag_HotReset BITN1 /// 热启动的标志位
#define L2_AppFlag_init() gRegU_AppFlag = 0;
//---------------------------------------------------
///L2_AppFlag_CWInt_is(D_AppFlag_CWInt)
#define L2_AppFlag_CWInt_is(BITNx) BITN_G(gRegU_AppFlag, (BITNx))
#define L2_AppFlag_CWInt_set(BITNx) BITN_1(gRegU_AppFlag,(BITNx))
#define L2_AppFlag_CWInt_clear(BITNx) BITN_0(gRegU_AppFlag,(BITNx))
//---------------------------------------------------
#ifdef daosdifjasodfij
SHC16LAXXQN32
P30 SENSINT2 Gsensor.INT1
P31 SENSINT3 Gsensor.INT2
P21 buz
p20 PW_PG
P07 MOTO
P04 PW_IRQ
P51 txd
P50 rxd
P07 BAT_CAL
P06 BAT_CAL_EN
P05 VCIN0
P04 PW_IRQ
P27 LED1
P26 LED12
P25 LED82
P24 LED8
P23 LED5
P22 LED51
P10 SCL
p11 SDA
typedef enum MainFreSelect
{
MainFre_2M,
MainFre_4M,
MainFre_8M,
MainFre_16M,
MainFre_Max
}MainFreSelect;
#endif
#define D_MainFre 1 //MainFre_4M
typedef U16 UN_TYPE;
#elif(TYPE_UASER_BOARD == TYPE_BOARD_hhnew)
#include "../cpu/SHC16L_macro.h"
#define TYPE_MCU TYPE_MCU_SHC6601
#define TYPE_IDE TYPE_IDE_KEIL
typedef unsigned short type_comm;//通用类型的变量,取决于编译器和cpu的位数和系统的堆栈优化等
#elif(TYPE_UASER_BOARD == TYPE_BOARD_LPC17xx_)
#define TYPE_MCU TYPE_MCU_LPC17xx
#define TYPE_IDE TYPE_IDE_MDK
// typedef unsigned int type_comm;//通用类型的变量,取决于编译器和cpu的位数和系统的堆栈优化等
#include "lpc17xxcc.h"
#include "lpc17xxzlg.h"
#include "lpc17xx_macro.h"
#include "target_cfg.h"
#elif(TYPE_UASER_BOARD == TYPE_BOARD_STM32F_103ZET6_READBULL)
#define TYPE_MCU TYPE_MCU_STM32
#define TYPE_IDE TYPE_IDE_MDK
// typedef unsigned int type_comm;//通用类型的变量,取决于编译器和cpu的位数和系统的堆栈优化等
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32_macro.h"
#endif //TYPE_UASER_BOARD == TYPE_BOARD_GSM_MAIN_V07
//externs
struct _s_sysclk
{
U32 m;
U32 clk;
U32 out;
};
extern struct _s_sysclk s_sysclk;
extern void L0_pin_config(void);
extern void L1_uart_tpc_config(void);
extern void L1_bsp_pwm_set(U16 val_H,U16 val_L);
extern void L1_bsp_pwm_init(void);
extern void L0_cpu_init(void);
extern void L0_MCLKO_init(void);
extern void L3_pwm_fun(U8 *pPara);
extern void L0_led2_set(unsigned char onf);
//---------- 串口协议配置---------------
//#include "../tpc/tpc_modbus.h"
#define D_s_uart0_rec_close(); s_uart0_rec.ok = 2;// 关闭串口协议解析
#define D_s_uart0_rec_open(); s_uart0_rec.ok = 0;// 关闭串口协议解析
extern void (*Lp0_uart0_fun)(unsigned char sbufreg);
extern void (*Lp0_uart2_fun)(unsigned char sbufreg);
extern void (*Lp0_uart3_fun)(unsigned char sbufreg);
extern void (*Lp0_uart4_fun)(unsigned char sbufreg);
extern TS_Handle_PH3 s_uart0_rec;
extern TS_Handle_PH4 s_uart2_rec;
extern TS_Handle_PH3 s_uart3_rec;
extern TS_Handle_0d0a s_uart4_at_rec;
extern TS_Handle_PH3 s_uart4_tcp_rec;
extern void L1_bsp_uart_config(void);
#endif//_BSP_CONFIG_H
/*********************************end file*********************************************/

16
source/bsp/bsp_gm35.c

@ -0,0 +1,16 @@
#include "bsp_gm35.h"
void L2_gm35_init()
{
L2_gm35_enable();
}
void L2_gm35_enable()
{
GM35_ENABLE();
}
void L2_gm35_disable()
{
GM35_DISABLE();
}

17
source/bsp/bsp_gm35.h

@ -0,0 +1,17 @@
#ifndef BSP_GM35_H
#define BSP_GM35_H
#include "../cpu/STC_stc8a8k.h"
#include "../cpu/c51_macro.h"
#include "../clib/bit.h"
#define GM35_VBAT_EN P67
#define GM35_DISABLE() GM35_VBAT_EN = 0
#define GM35_ENABLE() GM35_VBAT_EN = 1
extern void L2_gm35_init();
extern void L2_gm35_enable();
extern void L2_gm35_disable();
#endif

119
source/bsp/bsp_paraid.c

@ -0,0 +1,119 @@
#include "bsp_paraid.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
#include "../msp/msp_eeprom.h"
#include "../msp/uart0.h"
void L1_Iap_erase(vU16 addr)
{
EA = 0;
L0_Iap_Erase(addr);
EA = 1;
}
void L1_Iap_Write_array(vU16 addr,U8 *buf,U8 len)
{
U8 i = 0;
EA = 0;
for(i=0;i<len;i++)
{
L0_Iap_Program(addr + i,buf[i]);
}
EA = 1;
}
void L1_Iap_Read_array(vU16 addr,U8 *buf,U8 len)
{
U8 i = 0;
EA = 0;
for(i=0;i<len;i++)
{
buf[i] = L0_Iap_Read(addr + i);
}
EA = 1;
}
//----------------------------------------------------------
#define D_paraid_debug_print
void L1_paraid_init(void)
{
vU16 pa[2];
/// char *ID;
/// ID = (char idata *)0xf1;/// for (i=0; i<7; i++) { UartSend(ID[i]); }
///UartSend(ID[i]);
// L1_Iap_Read_us(D_paraAdd_paper150,&ts_task_ALGO.usPaper150);
// L1_Iap_Read_us(D_paraAdd_paper150,&ts_task_ALGO.usPaper150);
// L1_Iap_main();
L1_Iap_Read_us(D_paraAdd0_paper150,&pa[0]);
L1_Iap_Read_us(D_paraAdd1_paper150,&pa[1]);
#ifdef D_paraid_debug_print
//L0_uart0_us(pa[0]);L0_uart0_us(pa[1]); PrintCam_L0_uart0_uc(0x0a);
#endif
#if 0
if(pa[1] == pa[0])
{
if(0xffff != pa[1])
{
if(pa[0] < D_paper_150at_top)
{
if(pa[0] > D_paper_150at_bottom)
{
goto GOTO_PARA_OK;
}
}
}
}
GOTO_PARA_ERRO:
L1_Iap_Write_us(D_paraAdd0_paper150,D_paper_150at);
L1_Iap_Write_us(D_paraAdd1_paper150,D_paper_150at);
GOTO_PARA_OK:
;
#endif
///nothing
}
void L1_Iap_Write_us(vU16 addr,vU16 val)
{
EA = 0;
/*********
IAP_CONTR = WT_12M; //使能IAP
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
_nop_();
IAP_CMD = 2; //设置IAP写命令
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
L0_Iap_Idle(); //关闭IAP功能
***************/
L0_Iap_Erase(addr);
L0_Iap_Program(addr,val>>8);
L0_Iap_Program(addr+1,val&0x00ff);
EA = 1;
}
void L1_Iap_Read_us(vU16 addr,vU16 *val)
{
EA = 0;
*val = L0_Iap_Read(addr);
*val <<= 8;
*val |= L0_Iap_Read(addr+1);
EA = 1;
}

17
source/bsp/bsp_paraid.h

@ -0,0 +1,17 @@
#ifndef BSP_PARAID_H
#define BSP_PARAID_H
#include "../clib/type.h"
#define D_paraid_debug_print
#define D_paraAdd0_paper150 0x0000
#define D_paraAdd1_paper150 0x0200
extern void L1_paraid_init(void);
extern void L1_Iap_erase(vU16 addr);
extern void L1_Iap_Write_us(vU16 addr,vU16 val);
extern void L1_Iap_Read_us(vU16 addr,vU16 *val);
extern void L1_Iap_Write_array(vU16 addr,U8 *buf,U8 len);
extern void L1_Iap_Read_array(vU16 addr,U8 *buf,U8 len);
#endif

249
source/bsp/bsp_relay.c

@ -0,0 +1,249 @@
#include "bsp_relay.h"
#include "../msp/pwm.h"
#include "../app/app_paraid.h"
#if 0 //可惜sbit不能作为参数值
U8 g_relay_data[RELAY_NUM][2] =
{
RELAY_PRINTER, ULN1B,
RELAY_PC, ULN2B,
RELAY_LED, ULN3B,
RELAY_LED_FUYIN, ULN4B,
RELAY_LED_RENXIANG, ULN5B,
RELAY_12V_RESV, 5ULN6B,
};
#endif
void _ULN1B_HANDLER(U8 oper)
{
ULN1B = oper;
}
void _ULN2B_HANDLER(U8 oper)
{
ULN2B = oper;
}
void _ULN3B_HANDLER(U8 oper)
{
ULN3B = oper;
}
void _ULN4B_HANDLER(U8 oper)
{
ULN4B = oper;
}
void _ULN5B_HANDLER(U8 oper)
{
ULN5B = oper;
}
void _ULN6B_HANDLER(U8 oper)
{
ULN6B = oper;
}
void _ULN8B_HANDLER(U8 oper)
{
ULN8B = oper;
}
void _CBC_HANDLER(U8 oper)
{
switch(oper)
{
case RELAY_KAI:
D_pwer12_off();
break;
case RELAY_BI:
D_pwer12_on();
break;
default:
break;
}
}
struct _s_relay_oper s_relay_oper[RELAY_NUM] =
{
//status这里全部为RELAY_BI,如果系统看门狗重启,值会保存在flash_page0,从而读取设定
//oper_max_time这里全部为0,真实值由flash->page1设定
//relay_name, relay_handler, initital, status, oper_max_time, oper_stmp
{RELAY_PRINTER, _ULN1B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_PC, _ULN2B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_LED, _ULN3B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_LED_FUYIN, _ULN4B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_LED_RENXIANG,_ULN5B_HANDLER, RELAY_KAI, RELAY_KAI, 0, 0}, //常开
{RELAY_12V_RESV, _ULN6B_HANDLER, RELAY_BI, RELAY_BI, 0, 0},
{RELAY_PRINTER_1, _ULN8B_HANDLER, RELAY_BI, RELAY_BI, 0, 0}, //常闭
{RELAY_CBC, _CBC_HANDLER, RELAY_NONE, RELAY_NONE, 0, 0}, //无常闭常开特性
};
U8 L2_relay_convert_and_do(int i,int val)
{
U8 oper = val;
if(s_relay_oper[i].relay_initial == RELAY_BI) //常闭
{
oper = val;
}
else if(s_relay_oper[i].relay_initial == RELAY_KAI) //常开
{
oper = !val;
}
return oper;
}
#if 1
void L1_relay_on(vU8 n,vU8 val)
{
U8 i = 0;
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == n)
{
if(n == RELAY_PC) //PC属于按键,每次发送指令 都代表按下(断开)
{
if(val == RELAY_KAI)
{
s_task_relay.pc = PC_GUANJI;
}
else
{
s_task_relay.pc = PC_KAIJI;
}
s_task_relay.pc_stmp = s_nos_tick.t_1s;
val = RELAY_BI; //短路
}
s_relay_oper[i].relay_handler(L2_relay_convert_and_do(i,val));
s_relay_oper[i].relay_status = val;
s_relay_oper[i].relay_oper_stmp = s_nos_tick.t_1s;
}
}
}
#else
void L1_relay_on(vU8 n,vU8 val)
{
U8 i = 0;
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == n)
{
#ifdef BOARD_MAIN04_GM35
if(n == RELAY_PC) //PC属于按键,每次发送指令 都代表按下(断开)
{
if(val == RELAY_KAI)
{
s_task_relay.pc = PC_GUANJI;
}
else
{
s_task_relay.pc = PC_KAIJI;
}
s_task_relay.pc_stmp = s_nos_tick.t_1s;
val = RELAY_KAI;
}
#elif defined BOARD_MAIN03_A9
//xxx
#endif
if(n == RELAY_12V_RESV) //12v继电器保留,暂不工作,以减少功率
{
val = s_relay_oper[i].relay_initial;
}
s_relay_oper[i].relay_handler(val);
s_relay_oper[i].relay_status = val;
s_relay_oper[i].relay_oper_stmp = s_nos_tick.t_1s;
}
}
}
#endif
void L2_do_relay(U8 *buf)
{
U8 val = buf[0], index = buf[1] ,i = 0;
if(index == 0xFF) //操作所有继电器
{
if(val == RELAY_BI)
{
L2_relay_poweron_all();
}
else
{
L2_relay_poweroff_all();
}
}
else
{
for(i=0;i<RELAY_NUM;i++)
{
if((index >> i) & 0x1)
{
// L1_relay_on(i,((val >> i) & 0x1 == PROTO_RELAY_KAI ? RELAY_KAI : RELAY_BI));
L1_relay_on(i, val >> i & 0x1);
}
}
}
}
void L2_relay_init(void)
{
ULN1B = 0;
ULN2B = 0;
ULN3B = 0;
ULN4B = 0;
ULN5B = 0;
ULN6B = 0;
ULN8B = 0;
_CBC_HANDLER(RELAY_BI); //闭合
//set output
BITN_0(P1M1,BITN5);BITN_1(P1M0,BITN5);
BITN_0(P6M1,BITN2);BITN_1(P6M0,BITN2);
BITN_0(P6M1,BITN1);BITN_1(P6M0,BITN1);
BITN_0(P6M1,BITN0);BITN_1(P6M0,BITN0);
BITN_0(P1M1,BITN3);BITN_1(P1M0,BITN3);
BITN_0(P1M1,BITN4);BITN_1(P1M0,BITN4);
BITN_0(P4M1,BITN4);BITN_1(P4M0,BITN4);
//继电器上电初始化 继电器 1响应,0恢复默认状态(常开 or 常闭)
ULN1B = 0;
ULN2B = 0;
ULN3B = 0;
ULN4B = 0;
ULN5B = 0;
ULN6B = 0;
ULN8B = 0;
BITN_0(P6M1,BITN4);BITN_1(P6M0,BITN4);
BITN_0(P6M1,BITN5);BITN_1(P6M0,BITN5);
_CBC_HANDLER(RELAY_BI); //闭合
}
//全关(断开)
void L2_relay_poweroff_all(void)
{
_CBC_HANDLER(RELAY_KAI);
L1_relay_on(RELAY_PC, RELAY_KAI);
L1_relay_on(RELAY_PRINTER, RELAY_KAI);
L1_relay_on(RELAY_PRINTER_1, RELAY_KAI);
}
void L2_relay_poweron_all(void)
{
U8 i = 0;
_CBC_HANDLER(RELAY_BI);
for(i=0;i<RELAY_NUM;i++)
{
if(s_relay_oper[i].relay == RELAY_CBC)
{
continue;
}
else if(s_relay_oper[i].relay == RELAY_PC)
{
//开机,短路2-3s
L1_relay_on(s_relay_oper[i].relay, RELAY_BI);
}
else
{
L1_relay_on(s_relay_oper[i].relay, s_relay_oper[i].relay_initial);
}
}
}

91
source/bsp/bsp_relay.h

@ -0,0 +1,91 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file msa300.c
/// @brief msa300 driver app
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20170122
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
#ifndef _BSP_RELAY_H
#define _BSP_RELAY_H
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../cpu/c51_macro.h"
#include "../app/app_common.h"
#include "../app/app_task_relay.h"
///-------------------- 继电器协议映射-----------------------
typedef void (*relay_handler)(U8);
struct _s_relay_oper
{
U8 relay;
relay_handler relay_handler;
U8 relay_initial; //继电器初始化状态
U8 relay_status;
vU32 relay_oper_max_time; //保持操作状态最长时间(s)
vU32 relay_oper_stmp; //继电器操作时间戳
};
#ifdef BOARD_MAIN03_A9 //A9板卡
#define ULN1B (P14)
#define ULN2B (P63)
#define ULN3B (P62)
#define ULN4B (P61)
#define ULN5B (P15)
#define ULN6B (P44)
#elif defined BOARD_MAIN04_GM35 //GM35板卡
#define ULN1B (P15)
#define ULN2B (P44)
#define ULN3B (P14)
#define ULN4B (P63)
#define ULN5B (P62)
#define ULN6B (P61)
#elif defined BOARD_MAIN04_GM35_M42 //GM35_M42板卡
#define ULN1B (P15)
#define ULN2B (P62)
#define ULN3B (P61)
#define ULN4B (P60)
#define ULN5B (P13)
#define ULN6B (P14)
#define ULN8B (P44)
#define D_pwer12_on() D_P64_ON(); D_P65_OFF(); //relay bi
#define D_pwer12_off() D_P64_OFF();D_P65_ON(); //relay kai
#endif
#define RELAY_KAI 1 //程序内部的 开和闭 IO赋值
#define RELAY_BI 0
#define RELAY_NONE 2
#if 0
#define PROTO_RELAY_KAI 1 //用户协议的IO赋值
#define PROTO_RELAY_BI 0
#endif
#define PC_GUANJI 1
#define PC_KAIJI 2
#define RELAY_PRINTER 0 //打印机
#define RELAY_PC 1 //PC
#define RELAY_LED 2 //灯箱
#define RELAY_LED_FUYIN 3 //复印补光
#define RELAY_LED_RENXIANG 4 //人像补光
#define RELAY_12V_RESV 5 //保留
#define RELAY_PRINTER_1 6 //打印机第二路开关
#define RELAY_CBC 7 //磁保持继电器
extern struct _s_relay_oper s_relay_oper[RELAY_NUM];
extern void L2_do_relay(U8 *buf);
extern void L2_relay_init(void);
extern void L1_relay_on(vU8 n,vU8 val);
extern U8 L2_relay_convert_and_do(int index,int val);
extern void L2_relay_poweroff_all(void);
extern void L2_relay_poweron_all(void);
#endif // #ifndef _LED_H

23
source/bsp/bsp_wdt.c

@ -0,0 +1,23 @@
#include "reg51.h"
#include <intrins.h>
#include "bsp_wdt.h"
//测试工作频率为11.0592MHz
sfr WDT_CONTR = 0xc1;
sbit P32 = P3^2;
void L0_wdt_init()
{
// WDT_CONTR = 0x23; //使能看门狗,溢出时间约为0.5s
// WDT_CONTR = 0x24; //使能看门狗,溢出时间约为1s
WDT_CONTR = 0x27; //使能看门狗,溢出时间约为8s
P32 = 0; //测试端口
}
void L0_wdt_feed()
{
WDT_CONTR |= 0x10; //清看门狗,否则系统复位
}

7
source/bsp/bsp_wdt.h

@ -0,0 +1,7 @@
#ifndef BSP_WDT
#define BSP_WDT
extern void L0_wdt_init();
extern void L0_wdt_feed();
#endif

385
source/clib/bit.h

@ -0,0 +1,385 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
#ifndef __BIT_H__
#define __BIT_H__
#define cSetb0 0x01
#define cSetb1 0x02
#define cSetb2 0x04
#define cSetb3 0x08
#define cSetb4 0x10
#define cSetb5 0x20
#define cSetb6 0x40
#define cSetb7 0x80
#define cClrb0 0xfe
#define cClrb1 0xfd
#define cClrb2 0xfb
#define cClrb3 0xf7
#define cClrb4 0xef
#define cClrb5 0xdf
#define cClrb6 0xbf
#define cClrb7 0x7f
#define cTestb0 0x01
#define cTestb1 0x02
#define cTestb2 0x04
#define cTestb3 0x08
#define cTestb4 0x10
#define cTestb5 0x20
#define cTestb6 0x40
#define cTestb7 0x80
#define true 1
#define false 0
#define B0000_0000 0x00
#define B0000_0001 0x01
#define B0000_0010 0x02
#define B0000_0011 0x03
#define B0000_0100 0x04
#define B0000_0101 0x05
#define B0000_0110 0x06
#define B0000_0111 0x07
#define B0000_1000 0x08
#define B0000_1001 0x09
#define B0000_1010 0x0A
#define B0000_1011 0x0B
#define B0000_1100 0x0C
#define B0000_1101 0x0D
#define B0000_1110 0x0E
#define B0000_1111 0x0F
#define B0001_0000 0x10
#define B0001_0001 0x11
#define B0001_0010 0x12
#define B0001_0011 0x13
#define B0001_0100 0x14
#define B0001_0101 0x15
#define B0001_0110 0x16
#define B0001_0111 0x17
#define B0001_1000 0x18
#define B0001_1001 0x19
#define B0001_1010 0x1A
#define B0001_1011 0x1B
#define B0001_1100 0x1C
#define B0001_1101 0x1D
#define B0001_1110 0x1E
#define B0001_1111 0x1F
#define B0010_0000 0x20
#define B0010_0001 0x21
#define B0010_0010 0x22
#define B0010_0011 0x23
#define B0010_0100 0x24
#define B0010_0101 0x25
#define B0010_0110 0x26
#define B0010_0111 0x27
#define B0010_1000 0x28
#define B0010_1001 0x29
#define B0010_1010 0x2A
#define B0010_1011 0x2B
#define B0010_1100 0x2C
#define B0010_1101 0x2D
#define B0010_1110 0x2E
#define B0010_1111 0x2F
#define B0011_0000 0x30
#define B0011_0001 0x31
#define B0011_0010 0x32
#define B0011_0011 0x33
#define B0011_0100 0x34
#define B0011_0101 0x35
#define B0011_0110 0x36
#define B0011_0111 0x37
#define B0011_1000 0x38
#define B0011_1001 0x39
#define B0011_1010 0x3A
#define B0011_1011 0x3B
#define B0011_1100 0x3C
#define B0011_1101 0x3D
#define B0011_1110 0x3E
#define B0011_1111 0x3F
#define B0100_0000 0x40
#define B0100_0001 0x41
#define B0100_0010 0x42
#define B0100_0011 0x43
#define B0100_0100 0x44
#define B0100_0101 0x45
#define B0100_0110 0x46
#define B0100_0111 0x47
#define B0100_1000 0x48
#define B0100_1001 0x49
#define B0100_1010 0x4A
#define B0100_1011 0x4B
#define B0100_1100 0x4C
#define B0100_1101 0x4D
#define B0100_1110 0x4E
#define B0100_1111 0x4F
#define B0101_0000 0x50
#define B0101_0001 0x51
#define B0101_0010 0x52
#define B0101_0011 0x53
#define B0101_0100 0x54
#define B0101_0101 0x55
#define B0101_0110 0x56
#define B0101_0111 0x57
#define B0101_1000 0x58
#define B0101_1001 0x59
#define B0101_1010 0x5A
#define B0101_1011 0x5B
#define B0101_1100 0x5C
#define B0101_1101 0x5D
#define B0101_1110 0x5E
#define B0101_1111 0x5F
#define B0110_0000 0x60
#define B0110_0001 0x61
#define B0110_0010 0x62
#define B0110_0011 0x63
#define B0110_0100 0x64
#define B0110_0101 0x65
#define B0110_0110 0x66
#define B0110_0111 0x67
#define B0110_1000 0x68
#define B0110_1001 0x69
#define B0110_1010 0x6A
#define B0110_1011 0x6B
#define B0110_1100 0x6C
#define B0110_1101 0x6D
#define B0110_1110 0x6E
#define B0110_1111 0x6F
#define B0111_0000 0x70
#define B0111_0001 0x71
#define B0111_0010 0x72
#define B0111_0011 0x73
#define B0111_0100 0x74
#define B0111_0101 0x75
#define B0111_0110 0x76
#define B0111_0111 0x77
#define B0111_1000 0x78
#define B0111_1001 0x79
#define B0111_1010 0x7A
#define B0111_1011 0x7B
#define B0111_1100 0x7C
#define B0111_1101 0x7D
#define B0111_1110 0x7E
#define B0111_1111 0x7F
#define B1000_0000 0x80
#define B1000_0001 0x81
#define B1000_0010 0x82
#define B1000_0011 0x83
#define B1000_0100 0x84
#define B1000_0101 0x85
#define B1000_0110 0x86
#define B1000_0111 0x87
#define B1000_1000 0x88
#define B1000_1001 0x89
#define B1000_1010 0x8A
#define B1000_1011 0x8B
#define B1000_1100 0x8C
#define B1000_1101 0x8D
#define B1000_1110 0x8E
#define B1000_1111 0x8F
#define B1001_0000 0x90
#define B1001_0001 0x91
#define B1001_0010 0x92
#define B1001_0011 0x93
#define B1001_0100 0x94
#define B1001_0101 0x95
#define B1001_0110 0x96
#define B1001_0111 0x97
#define B1001_1000 0x98
#define B1001_1001 0x99
#define B1001_1010 0x9A
#define B1001_1011 0x9B
#define B1001_1100 0x9C
#define B1001_1101 0x9D
#define B1001_1110 0x9E
#define B1001_1111 0x9F
#define B1010_0000 0xA0
#define B1010_0001 0xA1
#define B1010_0010 0xA2
#define B1010_0011 0xA3
#define B1010_0100 0xA4
#define B1010_0101 0xA5
#define B1010_0110 0xA6
#define B1010_0111 0xA7
#define B1010_1000 0xA8
#define B1010_1001 0xA9
#define B1010_1010 0xAA
#define B1010_1011 0xAB
#define B1010_1100 0xAC
#define B1010_1101 0xAD
#define B1010_1110 0xAE
#define B1010_1111 0xAF
#define B1011_0000 0xB0
#define B1011_0001 0xB1
#define B1011_0010 0xB2
#define B1011_0011 0xB3
#define B1011_0100 0xB4
#define B1011_0101 0xB5
#define B1011_0110 0xB6
#define B1011_0111 0xB7
#define B1011_1000 0xB8
#define B1011_1001 0xB9
#define B1011_1010 0xBA
#define B1011_1011 0xBB
#define B1011_1100 0xBC
#define B1011_1101 0xBD
#define B1011_1110 0xBE
#define B1011_1111 0xBF
#define B1100_0000 0xC0
#define B1100_0001 0xC1
#define B1100_0010 0xC2
#define B1100_0011 0xC3
#define B1100_0100 0xC4
#define B1100_0101 0xC5
#define B1100_0110 0xC6
#define B1100_0111 0xC7
#define B1100_1000 0xC8
#define B1100_1001 0xC9
#define B1100_1010 0xCA
#define B1100_1011 0xCB
#define B1100_1100 0xCC
#define B1100_1101 0xCD
#define B1100_1110 0xCE
#define B1100_1111 0xCF
#define B1101_0000 0xD0
#define B1101_0001 0xD1
#define B1101_0010 0xD2
#define B1101_0011 0xD3
#define B1101_0100 0xD4
#define B1101_0101 0xD5
#define B1101_0110 0xD6
#define B1101_0111 0xD7
#define B1101_1000 0xD8
#define B1101_1001 0xD9
#define B1101_1010 0xDA
#define B1101_1011 0xDB
#define B1101_1100 0xDC
#define B1101_1101 0xDD
#define B1101_1110 0xDE
#define B1101_1111 0xDF
#define B1110_0000 0xE0
#define B1110_0001 0xE1
#define B1110_0010 0xE2
#define B1110_0011 0xE3
#define B1110_0100 0xE4
#define B1110_0101 0xE5
#define B1110_0110 0xE6
#define B1110_0111 0xE7
#define B1110_1000 0xE8
#define B1110_1001 0xE9
#define B1110_1010 0xEA
#define B1110_1011 0xEB
#define B1110_1100 0xEC
#define B1110_1101 0xED
#define B1110_1110 0xEE
#define B1110_1111 0xEF
#define B1111_0000 0xF0
#define B1111_0001 0xF1
#define B1111_0010 0xF2
#define B1111_0011 0xF3
#define B1111_0100 0xF4
#define B1111_0101 0xF5
#define B1111_0110 0xF6
#define B1111_0111 0xF7
#define B1111_1000 0xF8
#define B1111_1001 0xF9
#define B1111_1010 0xFA
#define B1111_1011 0xFB
#define B1111_1100 0xFC
#define B1111_1101 0xFD
#define B1111_1110 0xFE
#define B1111_1111 0xFF
/*************************************************
*************************************************/
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define BIT3 3
#define BIT4 4
#define BIT5 5
#define BIT6 6
#define BIT7 7
///--------------------------------------
#define BITN0 0X01
#define BITN1 0X02
#define BITN2 0X04
#define BITN3 0X08
#define BITN4 0X10
#define BITN5 0X20
#define BITN6 0X40
#define BITN7 0X80
/// BITNx = { 0x40 0x80}
#define BITN_1(X,BITNx) (X)|= (BITNx)
#define BITN_0(X,BITNx) (X)&=~(BITNx)
#define BITN_G(X,BITNx) ((X)&(BITNx))
//BITN_1(reg,BITN0)
#define BITS_1(X,BITx) (X)|= (BITx)
#define BITS_0(X,BITx) (X)&=~(BITx)
//// 多位配置,一定要配对使用,先清除再设置。
#define BITS_SET(REG,VAL,BITx) (REG)|= ((VAL)<<(BITx))
#define BITS_CLR(REG,VAL,BITx) (REG)&= ~((VAL)<<(BITx))
#if 0
/// b = {0,1,2,3,4,5,6,7}
#define BIT_1(X,b) (X)|= (1<<(b))
#define BIT_0(X,b) (X)&=~(1<<(b))
#define BIT_G(X,b) ((X)&(1<<(b)))
#define SETBIT(regVal, bitN) ((regVal) |= (1<<(bitN))) // 置位
#define CLRBIT(regVal, bitN) ((regVal) &= ~(1<<(bitN))) // 清位
#define GETBIT(regVal, bitN) ((regVal) & (1<<(bitN)) ) // 取位值
// 原来的意思是双位进行移位和赋值 0b0000 0011 // fixme
#define BITD_CLR(regVal,D,bitN) (regVal)&=~((D)<<(bitN))
#define BITD_SET(regVal,D,bitN) BITD_CLR((regVal),3,(bitN));(regVal)|= ((D)<<(bitN))
///-----------------------------------
#define IO_OUT_HIGH(PORT, PIN) SETBIT(PORT, PIN)
#define IO_OUT_LOW(PORT, PIN) CLRBIT(PORT, PIN)
#endif
#endif /* __BIT_H__ */

1580
source/clib/clib.c

File diff suppressed because it is too large

110
source/clib/clib.h

@ -0,0 +1,110 @@
/*****************************************************************************
* uart.h: Header file for NXP LPC17xx Family Microprocessors
*
* Copyright(C) 2009, NXP Semiconductor
* All rights reserved.
*
* History
* 2009.05.27 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#ifndef _CLIB_H_
#define _CLIB_H_
#include <stdarg.h>
#include <stdlib.h>
#include "../msp/uart0.h"
#include "../clib/type.h"
//#include "../clib/Clib.h"
//#include "../debug/debug_drv.h"
//extern char guc_send[128];
extern unsigned char code cguHex2Char[16][2];
extern U8 Lc_Hex2Char(U8 CharStr);
//extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d);
// input: 123456d
// output: '1' '2' '3'....
//对应的点阵 为 0123456789. ,最后为空格,专为显示点阵类的数值使用
//extern void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d);
//extern U32 L2_fun_number_show(int i,char str[4]);
#if 0
struct _s_temp_
{
U8 d[16];
};
extern struct _s_temp_ s_temp22;
extern U8 s_temp[16];
extern U32 ul2fun2[10];
extern void Lc_Byte_cp(BYTE *src,BYTE *dis, int len);
extern void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3);
extern void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]);
extern void Lc_int2str_3(U32 ui_in,char *d);
extern U32 Lc_abs(vU32 a,vU32 b,vU32 *diff);
extern void Lc_int2str_4(U32 ui_in,char *d);
extern void Lc_sint2str_3(int i_in,char *d);
#define Lc_WEI(WEIx,WEIn) (U8)((WEIx/ul2fun2[WEIn])%10);
#define Lc_eee(WEIn) ul2fun2[WEIn]
#endif
extern char *Lc_int2a(vS32 value, char *string, UN_TYPE radix);
extern void Lc_int2D(vS16 value, char *string,char bits);
extern char *strstr(const char *str1, const char *str2);
extern unsigned char catch_protocol (const char d_src[],char d_protocol[]) ;
#define Lc_delay_1us() L0_delay_1us()
extern void Lc_delay_us(vU16 i);
extern void Lc_delay_ms(vU16 i);
////////////////
extern void Lc_uc_hex(char ww);
extern void Lc_us_hex(U16 ww);
//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...);
extern void Lc_print(char *dat4,...);
extern void Lc_print_NC(char *dat,...);
extern void Lc_print_buf(char *dat4,...);
extern void L3_us_big(U16 *d);
extern void L3_ui_big(vU32 *d);
extern void Lc_buf_copy_uc(U8 *d,const U8 *s,U8 num);
#define UART0_PUTCHAR(n) L0_uart0_uc(n)
//#define UART0_PRINTF(format,...) Lc_print_buf(format,##__VA_ARGS__)
//#define UART0_PRINTF(format,args...) Lc_print_buf(format) //keil居然不支持宏定义中使用...
#define UART0_PRINTF Lc_print_buf
extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len);
extern void crc16(unsigned char *CRC,void *dat,unsigned int len);
//extern void libc_memcpy(char *dst,const char *src,int len);
//extern U8 libc_strlen(char *str);
extern U8 Lc_Hex2Char_l(U8 CharStr);
extern U8 *libc_encodeHex(U8 *dst,U8 *hex,U8 len);
extern void libc_memcpy(unsigned char *dst,const unsigned char *src,int len);
extern int libc_strlen(char *str);
extern void libc_memset(char *dst,U8 d,int len);
extern U8 libc_STRNEQ(U8 *s1,U8 *s2,U8 len);
extern U8 libc_strhas(U8 *s1,U8 len1,U8*s2,U8 len2);
extern U8 libc_atoi(U8 *str);
extern void byte_copy_uc(void *dst,void *src,U32 len);
extern U8 StrStartsWith(U8 *s1,U8 *s2);
#endif /* end __UART_H */
/*****************************************************************************
** End Of File
******************************************************************************/

254
source/clib/md5.c

@ -0,0 +1,254 @@
#include "md5.h"
void debugMd5(MD5_CTX *context)
{
U8 dst1[129];
L0_uart0_ulhex(context->count[0]);
L0_uart0_uc(',');
L0_uart0_ulhex(context->count[1]);
Lc_print_buf("\r\n");
Lc_delay_ms(700);// 2000--7s
L0_uart0_ulhex(context->state[0]);
L0_uart0_uc(',');
L0_uart0_ulhex(context->state[1]);
L0_uart0_uc(',');
L0_uart0_ulhex(context->state[2]);
L0_uart0_uc(',');
L0_uart0_ulhex(context->state[3]);
Lc_delay_ms(700);// 2000--7s
Lc_print_buf("\r\n");
Lc_delay_ms(700);// 2000--7s
libc_encodeHex(dst1, context->buffer,64);
L0_uart0_sendArray(dst1,64);
Lc_delay_ms(2000);// 2000--7s
L0_uart0_sendArray(dst1+64,64);
Lc_delay_ms(2000);// 2000--7s
Lc_print_buf("\r\n");
Lc_delay_ms(700);// 2000--7s
}
U8 PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void MD5Init(MD5_CTX *context)
{
int i;
context->count[0] = 0;
context->count[1] = 0;
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
for(i=0;i<64;i++)
{
context->buffer[i] = 0;
}
}
void MD5Update(MD5_CTX *context,U8 *input,U32 inputlen)
{
U32 i = 0,index = 0,partlen = 0;
index = (context->count[0] >> 3) & 0x3F;
partlen = 64 - index;
context->count[0] += inputlen << 3;
if(context->count[0] < (inputlen << 3))
context->count[1]++;
context->count[1] += inputlen >> 29;
if(inputlen >= partlen)
{
libc_memcpy(&context->buffer[index],input,partlen);
MD5Transform(context->state,context->buffer);
for(i = partlen;i+64 <= inputlen;i+=64)
MD5Transform(context->state,&input[i]);
index = 0;
}
else
{
i = 0;
}
libc_memcpy(&context->buffer[index],&input[i],inputlen-i);
}
void MD5Final(MD5_CTX *context,U8 digest[16])
{
U32 index = 0,padlen = 0;
U8 bits[8];
index = (context->count[0] >> 3) & 0x3F;
padlen = (index < 56)?(56-index):(120-index);
MD5Encode(bits,context->count,8);
MD5Update(context,PADDING,padlen);
MD5Update(context,bits,8);
MD5Encode(digest,context->state,16);
}
void MD5Encode(U8 *output,U32 *input,U32 len)
{
U32 i = 0,j = 0;
while(j < len)
{
output[j] = input[i] & 0xFF;
output[j+1] = (input[i] >> 8) & 0xFF;
output[j+2] = (input[i] >> 16) & 0xFF;
output[j+3] = (input[i] >> 24) & 0xFF;
i++;
j+=4;
}
}
void MD5Decode(U32 *output,U8 *input,U32 len)
{
U32 i = 0,j = 0;
while(j < len)
{
output[i] = ((U32)input[j]) |
((U32)input[j+1] << 8) |
((U32)input[j+2] << 16) |
((U32)input[j+3] << 24);
i++;
j+=4;
}
}
void MD5Transform(U32 state[4],U8 block[64])
{
U32 a = state[0];
U32 b = state[1];
U32 c = state[2];
U32 d = state[3];
U32 x[64];
MD5Decode(x,block,64);
FF(a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */
FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */
FF(c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */
FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */
FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */
FF(d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */
FF(c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */
FF(b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */
FF(a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */
FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */
FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
/* Round 2 */
GG(a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */
GG(d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */
GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */
GG(a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */
GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */
GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */
GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */
GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */
GG(b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */
GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */
GG(c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */
GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
/* Round 3 */
HH(a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */
HH(d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */
HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
HH(a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */
HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */
HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */
HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */
HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */
HH(b, c, d, a, x[ 6], 23, 0x4881d05); /* 44 */
HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */
HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */
/* Round 4 */
II(a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */
II(d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */
II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
II(b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */
II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */
II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
II(b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */
II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */
II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
II(c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */
II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
II(a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */
II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */
II(b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
}
U8* md5hex(U8 *encrypt,U8 *dst)
{
U8 decrypt[16];
MD5_CTX md5;
MD5Init(&md5);
MD5Update(&md5,encrypt,libc_strlen((char *)encrypt));
MD5Final(&md5,decrypt);
libc_encodeHex(dst,decrypt,16);
return dst;
}
U8 *getPwd(U8 *simno,U8 *pwd)
{
U8 i,dst[33],*ptr,*ptr1,length;
//length = (U8)libc_strlen((char*)simno);
length = 20;
md5hex(simno,dst);
ptr = dst;
ptr1 = pwd;
for(i=0;i<16;i++)
{
*pwd++ = *ptr++;
}
for(i=length-5;i<length;i++)
{
*pwd++ = simno[i];
}
*pwd = 0;
return ptr1;
}
#if 0
int main(int argc, char *argv[])
{
int i = 10;
for(i=0;i<10;i++)
{
U8 encrypt[] ="admin";//21232f297a57a5a743894a0e4a801fc3
U8 dst[33];
md5hex(encrypt,dst);
printf("%s\n",dst);
}
return 0;
}
#endif

53
source/clib/md5.h

@ -0,0 +1,53 @@
#ifndef MD5_H
#define MD5_H
#include "clib.h"
#include "type.h"
typedef struct
{
U32 count[2];
U32 state[4];
U8 buffer[64];
}MD5_CTX;
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \
{ \
a += F(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define GG(a,b,c,d,x,s,ac) \
{ \
a += G(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define HH(a,b,c,d,x,s,ac) \
{ \
a += H(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define II(a,b,c,d,x,s,ac) \
{ \
a += I(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context,U8 *input,U32 inputlen);
void MD5Final(MD5_CTX *context,U8 digest[16]);
void MD5Transform(U32 state[4],U8 block[64]);
void MD5Encode(U8 *output,U32 *input,U32 len);
void MD5Decode(U32 *output,U8 *input,U32 len);
U8* md5hex(U8 *encrypt,U8 *dst);
U8 *getPwd(U8 *simno,U8 *pwd);
#endif

51
source/clib/type.c

@ -0,0 +1,51 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
//#include <stdint.h>
#include "type.h"
//void L3_us_big(__packed unsigned short *d)
#ifdef doc_sdfjaskdjf3423
void L3_us_big(U16 *d)
{
tu_us2uc tu,ta;
tu.us = *d;
ta.d[0] = tu.d[1];
ta.d[1] = tu.d[0];
*d = ta.us;
}
//void L3_ui_big(__packed INT32U *d)
void L3_ui_big(vU32 *d)
{
tu_ui4uc tu,ta;
tu.ui = *d;
ta.d[0] = tu.d[3];
ta.d[1] = tu.d[2];
ta.d[2] = tu.d[1];
ta.d[3] = tu.d[0];
*d = ta.ui;
}
#endif

256
source/clib/type.h

@ -0,0 +1,256 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
//#include <stdint.h>
#ifndef __TYPE_H__
#define __TYPE_H__
#ifndef NULL
#define NULL ((void *)0)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (1)
#endif
/*********************************************************************************************************
*********************************************************************************************************/
typedef unsigned char U8;
typedef volatile U8 vU8;
typedef U8 BOOLEAN; /* 布尔变量 */
typedef U8 *PU8;
typedef U8 BYTE;
typedef signed char S8;
typedef signed char *PS8;
#define bit char
//#define code
typedef unsigned short U16; /* 无符号16位整型变量 */
typedef volatile U16 vU16; /* 无符号16位整型变量 */
typedef signed short S16;
typedef volatile S16 vS16; /* 有符号16位整型变量 */
typedef signed long S32;
typedef unsigned long U32; /* 无符号32位整型变量 */
typedef volatile U32 vU32; /* 有符号32位整型变量 */
typedef volatile signed long vS32;
typedef float FP32; /* 单精度浮点数(32位长度) */
typedef double FP64; /* 双精度浮点数(64位长度) */
//typedef unsigned char BOOLEAN; // 布尔变量
typedef unsigned char INT8U; // 无符号8位整型变量
typedef signed char INT8S; // 有符号8位整型变量
typedef unsigned short INT16U; // 无符号16位整型变量
typedef signed short INT16S; // 有符号16位整型变量
typedef unsigned long INT32U; // 无符号32位整型变量
typedef signed long INT32S; // 有符号32位整型变量
//typedef float FP32; // 单精度浮点数(32位长度)
//typedef double FP64; // 双精度浮点数(64位长度)
typedef unsigned int FLAG_P; // 标准类变量
//typedef unsigned char INTU; // 标准类变量8BIT MCU
typedef unsigned int INTU; // 标准类变量32BIT MCU
/******************
**************************/
/*********************************************************************************************************
*********************************************************************************************************/
#define ZY_OK 0 /* 操作成功 */
#define ZY_NOT_OK 1 /* 操作失败 */
#define ZY_PARAMETER_ERR 2 /* 参数错误 */
#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */
#define ZY_NO_MEMORY 12 /* 内存不足 */
#define ZY_TIME_OUT 13 /* 超时 */
#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */
/*********************************************************************************************************
realView编译器需要添加的头文件
*********************************************************************************************************/
#include <ctype.h>
#include <stdlib.h>
#include <setjmp.h>
//#include <rt_misc.h>
#define D_flag_lock 2
#define D_flag_clear 0
#define D_flag_CanUse 1
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef U8 UN_TYPE;
/*************
******************/
//>>>>>
typedef union
{
vU16 us;
volatile U8 d[2];// d0 L d1 H
}tu_us2uc;
typedef union
{
vU32 ui;
vU16 s[2];
vU8 d[4];
}tu_ui4uc;
typedef union
{
vU16 word;
struct
{
vU8 l;
vU8 h;
}BYTE2;
}U_U16;
typedef union
{
vU32 dWord;
struct
{
vU8 byte0;
vU8 byte1;
vU8 byte2;
vU8 byte3;
}BYTE4;
}U_U32;
typedef union
{
vU16 us;
vU8 uc[2];
}U_F16;
typedef union
{
float fl;
vU8 uc[4];
}U_F32;
typedef struct
{
vU8 *buffer;
vU8 wpt;
vU8 rpt;
vU8 cnt;
}byte_len_fifo_struct;
typedef struct
{
vU16 *buffer;
vU16 wpt;
vU16 rpt;
vU16 cnt;
}word_len_fifo_struct;
typedef struct
{
vU16 x;
vU16 y;
}point_struct;
typedef struct
{
vU16 x;
vU16 y;
vU16 width;
vU16 height;
}rect_struct;
#define HIGHT 1
#define LOW 0
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef ABS
#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
#endif
#define F_FINSIH 1
#define F_WORKING 0
#define F_WAITINGKEY 2
#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init);
//if step > 1 bug warning!!
#define DF_var_down(v,step,min,init) \
if((v) < ((min) + (step))) \
{ \
(v) = (init); \
}else \
{ \
(v) -= (step); \
}
#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8))
#define D_us2uc_L(x) (U8)(0x00ff&(x))
#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx))
#define D_uc_low(ww) ((ww)>>4)
#define D_uc_high(ww) ((ww)&0x0f)
#define L0_type_byte(x) ((U8 *) &(x))
//#define _nop_ __NOP
// #define _nop_
extern void L3_us_big(U16 *d);
extern void L3_ui_big(vU32 *d);
#endif /* __TYPE_H__ */

265
source/clib/type.h.bak

@ -0,0 +1,265 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
//#include <stdint.h>
#ifndef __TYPE_H__
#define __TYPE_H__
#include "../bsp/type_hs.h"
#ifndef NULL
#define NULL ((void *)0)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (1)
#endif
/*********************************************************************************************************
*********************************************************************************************************/
typedef unsigned char U8;
typedef volatile U8 vU8;
typedef U8 BOOLEAN; /* 布尔变量 */
typedef U8 *PU8;
typedef U8 BYTE;
typedef signed char S8;
typedef signed char *PS8;
#define bit char
//#define code
typedef unsigned short U16; /* 无符号16位整型变量 */
typedef volatile U16 vU16; /* 无符号16位整型变量 */
typedef signed short S16;
typedef volatile S16 vS16; /* 有符号16位整型变量 */
typedef signed long S32;
typedef unsigned long U32; /* 无符号32位整型变量 */
typedef volatile U32 vU32; /* 有符号32位整型变量 */
typedef volatile signed long vS32;
typedef float FP32; /* 单精度浮点数(32位长度) */
typedef double FP64; /* 双精度浮点数(64位长度) */
//typedef unsigned char BOOLEAN; // 布尔变量
typedef unsigned char INT8U; // 无符号8位整型变量
typedef signed char INT8S; // 有符号8位整型变量
typedef unsigned short INT16U; // 无符号16位整型变量
typedef signed short INT16S; // 有符号16位整型变量
typedef unsigned long INT32U; // 无符号32位整型变量
typedef signed long INT32S; // 有符号32位整型变量
//typedef float FP32; // 单精度浮点数(32位长度)
//typedef double FP64; // 双精度浮点数(64位长度)
typedef unsigned int FLAG_P; // 标准类变量
//typedef unsigned char INTU; // 标准类变量8BIT MCU
typedef unsigned int INTU; // 标准类变量32BIT MCU
/******************
**************************/
/*********************************************************************************************************
*********************************************************************************************************/
#define ZY_OK 0 /* 操作成功 */
#define ZY_NOT_OK 1 /* 操作失败 */
#define ZY_PARAMETER_ERR 2 /* 参数错误 */
#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */
#define ZY_NO_MEMORY 12 /* 内存不足 */
#define ZY_TIME_OUT 13 /* 超时 */
#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */
/*********************************************************************************************************
realView编译器需要添加的头文件
*********************************************************************************************************/
#include <ctype.h>
#include <stdlib.h>
#include <setjmp.h>
//#include <rt_misc.h>
#define D_flag_lock 2
#define D_flag_clear 0
#define D_flag_CanUse 1
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#if(D_CPUfamily_type == D_CPUfamily_32bits)
typedef vU32 UN_TYPE;
#elif(D_CPUfamily_type == D_CPUfamily_16bits)
typedef U16 UN_TYPE;
#else
typedef U8 UN_TYPE;
#endif
//>>>>>
typedef union
{
vU16 us;
volatile U8 d[2];// d0 L d1 H
}tu_us2uc;
typedef union
{
vU32 ui;
vU16 s[2];
vU8 d[4];
}tu_ui4uc;
typedef union
{
vU16 word;
struct
{
vU8 l;
vU8 h;
}BYTE2;
}U_U16;
typedef union
{
vU32 dWord;
struct
{
vU8 byte0;
vU8 byte1;
vU8 byte2;
vU8 byte3;
}BYTE4;
}U_U32;
typedef union
{
vU16 us;
vU8 uc[2];
}U_F16;
typedef union
{
float fl;
vU8 uc[4];
}U_F32;
typedef struct
{
vU8 *buffer;
vU8 wpt;
vU8 rpt;
vU8 cnt;
}byte_len_fifo_struct;
typedef struct
{
vU16 *buffer;
vU16 wpt;
vU16 rpt;
vU16 cnt;
}word_len_fifo_struct;
typedef struct
{
vU16 x;
vU16 y;
}point_struct;
typedef struct
{
vU16 x;
vU16 y;
vU16 width;
vU16 height;
}rect_struct;
#define HIGHT 1
#define LOW 0
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef ABS
#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
#endif
#define F_FINSIH 1
#define F_WORKING 0
#define F_WAITINGKEY 2
#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init);
//if step > 1 bug warning!!
#define DF_var_down(v,step,min,init) \
if((v) < ((min) + (step))) \
{ \
(v) = (init); \
}else \
{ \
(v) -= (step); \
}
#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8))
#define D_us2uc_L(x) (U8)(0x00ff&(x))
#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx))
#define D_uc_low(ww) ((ww)>>4)
#define D_uc_high(ww) ((ww)&0x0f)
#define L0_type_byte(x) ((U8 *) &(x))
//#define _nop_ __NOP
// #define _nop_
extern void L3_us_big(U16 *d);
extern void L3_ui_big(vU32 *d);
#endif /* __TYPE_H__ */

198
source/clib/uartlib.c

@ -0,0 +1,198 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
/*****************************************************************************
update by cc @201501101001
.
uartcom/uartlib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/uartcom0
uart相关的通讯协议 com + n
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/uprotocol: uartcom + n服务的
struct _s_protocol_ ()------struct _s_protocol_
void L1_uart_2buf(struct _s_protocol_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc----------s_at0
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uartlib.h"
void (*L0pf_send_uc)(U8 ww);
/********************************************************************
*
* : L0_Usend_uc_hex
* : :L0_Usend_uc_hex(0x0c); output " 0c "
* :
* : SendHUcLc_HexToChar
* :
* :
***********************************************************************/
void Lcp_uc_hex(void (*L0pf_send_uc)(char ww),char ww)
{
L0pf_send_uc(Lc_Hex2Char((ww>>4)&0x0f));
L0pf_send_uc(Lc_Hex2Char(ww&0x0f));
}
void Lcp_us_hex(void (*L0pf_send_uc)(char ww),U16 ww)
{//
U8 t;
t = (U8)(((ww >> 8)&0x00ff));
Lcp_uc_hex(L0pf_send_uc,t);
t = (U8)(((ww )&0x00ff));
Lcp_uc_hex(L0pf_send_uc,t);
}
void Lc_print(char *dat,...)
{
const char *s;
vS32 d;
char buf[16];
va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针,
//取参必须通过这个指针进行。
//<Step 1> 在调用参数表之前,定义一个 va_list 类型的变量,
//(假设va_list 类型变量被定义为ap);
va_start(ap, dat);
// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数,
//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在
//变参表前面紧挨着的一个变量,即“...”之前的那个参数;
// <Step 3> 然后是获取参数,调用va_arg,它的第一个参数是ap,
//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,
//并且把 ap 的位置指向变参表的下一个变量位置;
//"e645654675y73\0"
while ( *dat != 0) // 判断是否到达字符串结束符
{
if ( *dat == 0x5c ) //'\'
{
switch ( *++dat )
{
case 'r': //回车符
L0pf_send_uc(0x0d);
dat ++;
break;
case 'n': //换行符
L0pf_send_uc(0x0a);
dat ++;
break;
case 't': //
L0pf_send_uc(0x09);
dat ++;
break;
default:
dat ++;
break;
}
}
else if ( *dat == '%')
{ //
switch ( *++dat )
{
case 'C':
case 'c': //字符
//va_arg()里的任务就是根据指定的参数类型
//取得本参数的值,并且把指针调到下一
//个参数的起始地址
//#define va_arg(ap,t)
//( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//char *ap; %c " , 0x30,
s = va_arg(ap, const char *); // 0x30
L0pf_send_uc((char)s); // '0'
dat++;
break;
case 'd': //十进制
//" %d",0x30,
//" %d",48,
// int i = 48;
//" %d",i,
d = va_arg(ap, int); // 0x30 =48d
Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8'
for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s
{ //\0
L0pf_send_uc(*s);
//printf("%c",*s);
}
dat++;
break;
case 'X':
case 'x': //字符串
d = va_arg(ap, int); // 0x30 =48d
dat++;//%X2 %X4 %X8
Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8'
for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s
{ //\0
L0pf_send_uc(*s);
}
dat++;
break;
case 'S':
case 's': //字符串
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
L0pf_send_uc(*s);
}
dat++;
break;
case 'f': //十进制
d = va_arg(ap, int);
Lc_int2a(d, buf, 10);
for (s = buf; *s; s++)
{
L0pf_send_uc(*s);
}
dat++;
break;
default:
dat++;
break;
}
} /* end of else if */
else
{
L0pf_send_uc( *dat++);
}
}//end while....
}//

70
source/clib/uartlib.h

@ -0,0 +1,70 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201501101001
.
uartcom/uartlib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/uartcom0
uart相关的通讯协议 com + n
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/uprotocol: uartcom + n服务的
struct _s_protocol_ ()------struct _s_protocol_
void L1_uart_2buf(struct _s_protocol_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc----------s_at0
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uartlib_H
#define _uartlib_H
#include <stdarg.h>
#include <stdlib.h>
#include "../bsp/bsp_config.h"
#include "Clib.h"
//#include "../debug/debug_drv.h"
extern void (*L0pf_send_uc)(char ww);
extern void Lcp_uc_hex(void (*L0pf_send_uc)(char ww),char ww);
extern void Lcp_us_hex(void (*L0pf_send_uc)(char ww),U16 ww);
//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...);
extern void Lc_print(char *dat,...);
extern void Lc_print_buf(char *dat,...);
#endif // _uart_H

198
source/cpu/STARTUP777.A51

@ -0,0 +1,198 @@
$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
; Version 8.01
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
; STARTUP.A51: This code is executed after processor reset.
;
; To translate this file use A51 with the following invocation:
;
; A51 STARTUP.A51
;
; To link the modified STARTUP.OBJ file to your application use the following
; Lx51 invocation:
;
; Lx51 your object file list, STARTUP.OBJ controls
;
;------------------------------------------------------------------------------
;
; User-defined <h> Power-On Initialization of Memory
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
; <i> Note: The absolute start-address of IDATA memory is always 0
; <i> The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN EQU 80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU 0
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU 0
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
; <i> The length of PDATA memory in bytes.
PDATALEN EQU 0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
; The following EQU statements define the stack pointer for reentrant
; functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
; <q> IBPSTACK: Enable SMALL model reentrant stack
; <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.
; <q> XBPSTACK: Enable LARGE model reentrant stack
; <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.
; <q> PBPSTACK: Enable COMPACT model reentrant stack
; <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
;
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;</h>
;------------------------------------------------------------------------------
;
; Memory Page for Using the Compact Model with 64 KByte xdata RAM
; <e>Compact Model Page Definition
;
; <i>Define the XDATA page used for PDATA variables.
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE EQU 0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR DATA 0A0H
;
; </e>
;------------------------------------------------------------------------------
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
#endif
;</h>
LJMP ?C_START
END

408
source/cpu/STC_CC_8051.H

@ -0,0 +1,408 @@
#ifndef _D_stc_CC_8051_h_
#define _D_stc_CC_8051_h_
#include<intrins.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// 定义与编译器无关的数据类型
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs
// 7 6 5 4 3 2 1 0 Reset Value
sfr ACC = 0xE0; //Accumulator 0000,0000
sfr B = 0xF0; //B Register 0000,0000
sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000
//-----------------------------------
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
//-----------------------------------
sfr SP = 0x81; //Stack Pointer 0000,0111
sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000
sfr DPH = 0x83; //Data Pointer High Byte 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机系统管理特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000
// 7 6 5 4 3 2 1 0 Reset Value
sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
//-----------------------------------
sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000
/*
PCA_P4:
0, PCA P1
1PCA/PWM P1 P4 : ECI P1.2 P4.1
PCA0/PWM0 P1.3 P4.2
PCA1/PWM1 P1.4 P4.3
SPI_P4:
0, SPI P1
1SPI P1 P4 : SPICLK P1.7 P4.3
MISO P1.6 P4.2
MOSI P1.5 P4.1
SS P1.4 P4.0
S2_P4:
0, UART2 P1
1UART2 P1 P4 : TxD2 P1.3 P4.3
RxD2 P1.2 P4.2
GF2:
ADRJ:
0, 10 A/D 8 ADC_RES , 2 ADC_RESL
110 A/D 2 ADC_RES 2 , 8 ADC_RESL
DPS: 0, 使DPTR0
1使DPTR1
*/
//-----------------------------------
sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO
/*
7 6 5 4 3 2 1 0 Reset Value
PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000B
b7 - PCAWAKEUP : PCA powerdown
b6 - RXD_PIN_IE : P3.0(RXD) 沿 RI powerdown()
b5 - T1_PIN_IE : T1 沿 T1 powerdown()
b4 - T0_PIN_IE : T0 沿 T0 powerdown()
b3 - LVD_WAKE : CMPIN LVD powerdown()
b2 -
b1 - T1CLKO : T1CKO(P3.5) T1 Fck1 = 1/2 T1
b0 - T0CLKO : T0CKO(P3.4) T0 Fck0 = 1/2 T1
*/
//-----------------------------------
sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000
//-----------------------------------
sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011
/*
ALES1 and ALES0:
00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle
01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.
10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)
11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.
RWS2,RWS1,RWS0:
000 : The MOVX read/write pulse is 1 clock cycle.
001 : The MOVX read/write pulse is 2 clock cycles.
010 : The MOVX read/write pulse is 3 clock cycles.
011 : The MOVX read/write pulse is 4 clock cycles. (default)
100 : The MOVX read/write pulse is 5 clock cycles.
101 : The MOVX read/write pulse is 6 clock cycles.
110 : The MOVX read/write pulse is 7 clock cycles.
111 : The MOVX read/write pulse is 8 clock cycles.
*/
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机中断特殊功能寄存器
//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义
//其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南
// 7 6 5 4 3 2 1 0 Reset Value
sfr IE = 0xA8; //中断控制寄存器 EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000
//-----------------------
sbit EA = IE^7;
sbit ELVD = IE^6; //低压监测中断允许位
sbit EADC = IE^5; //ADC 中断允许位
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
//-----------------------
sfr IE2 = 0xAF; //Auxiliary Interrupt - - - - - - ESPI ES2 0000,0000B
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000
//--------
sbit PPCA = IP^7; //PCA 模块中断优先级
sbit PLVD = IP^6; //低压监测中断优先级
sbit PADC = IP^5; //ADC 中断优先级
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000
sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00
sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00
//-----------------------
//新一代 1T 8051系列 单片机I/O 口特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111
sfr P0M0 = 0x94; // 0000,0000
sfr P0M1 = 0x93; // 0000,0000
sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111
sfr P1M0 = 0x92; // 0000,0000
sfr P1M1 = 0x91; // 0000,0000
sfr P1ASF = 0x9D; //P1 analog special function
//不可进行位寻址
sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111
sfr P2M0 = 0x96; // 0000,0000
sfr P2M1 = 0x95; // 0000,0000
sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 1111,1111
sfr P3M0 = 0xB2; // 0000,0000
sfr P3M1 = 0xB1; // 0000,0000
sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111
sfr P4M0 = 0xB4; // 0000,0000
sfr P4M1 = 0xB3; // 0000,0000
// 7 6 5 4 3 2 1 0 Reset Value
sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - - - - x000,xxxx
sfr P5 = 0xC8; //8 bitPort5 - - - - P5.3 P5.2 P5.1 P5.0 xxxx,1111
sfr P5M0 = 0xCA; // 0000,0000
sfr P5M1 = 0xC9; // 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机定时器特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000
//-----------------------------------
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
//-----------------------------------
sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0 0000,0000
sfr TL0 = 0x8A; //T0 Low Byte 0000,0000
sfr TH0 = 0x8C; //T0 High Byte 0000,0000
sfr TL1 = 0x8B; //T1 Low Byte 0000,0000
sfr TH1 = 0x8D; //T1 High Byte 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机串行口特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000
//-----------------------------------
sbit SM0 = SCON^7; //SM0/FE
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//-----------------------------------
sfr SBUF = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器
sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
// 7 6 5 4 3 2 1 0 Reset Value
// WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000
//-----------------------
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00
//-----------------------
sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。
sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。
//-
//-
sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。
sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。
//-----------------------
sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000
/*
CIDL: idle PCA , 0: , 1:
CPS2: PCA 2
CPS1: PCA 1
CPS0: PCA 0
CPS2 CPS1 CPS0
0 0 0 fosc/12
0 0 1 fosc/2
0 1 0 Timer0
0 1 1 ECI/P3.4 fosc/2
1 0 0 Fosc/1
1 0 1 /4Fosc/4
1 1 0 /6Fosc/6
1 1 1 /8Fosc/8
ECF: PCA计数器溢出中断允许位, 1-- CF(CCON.7)
*/
//-----------------------
sfr CL = 0xE9; //PCA 计数器低位 0000,0000
sfr CH = 0xF9; //PCA 计数器高位 0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000
sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000
//ECOMn = 1:允许比较功能。
//CAPPn = 1:允许上升沿触发捕捉功能。
//CAPNn = 1:允许下降沿触发捕捉功能。
//MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
//TOGn = 1:当匹配情况发生时, CEXn 将翻转。
//PWMn = 1:将 CEXn 设置为 PWM 输出。
//ECCFn = 1:允许 CCON 中的 CCFn 触发中断。
//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
// 0 0 0 0 0 0 0 0x00 未启用任何功能。
// x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。
// x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。
// x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。
// 1 0 0 1 0 0 x 0x49 16位软件定时器。
// 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。
// 1 0 0 0 0 1 0 0x42 8位 PWM。
//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
// 0 0 0 0 0 0 0 0x00 无此操作
// 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断
// 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断
// 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断
// 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断
//-----------------------
sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。 0000,0000
sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。 0000,0000
sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。 0000,0000
sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。 0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00
sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00
//PCA_PWMn: 7 6 5 4 3 2 1 0
// - - - - - - EPCnH EPCnL
//B7-B2: 保留
//B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。
//B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 ADC 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 SPI 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100
sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - - - - - 00xx,xxxx
sfr SPDAT = 0xCF; //SPI Data Register 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
// 7 6 5 4 3 2 1 0 Reset Value
sfr IAP_CMD = 0xC5; //IAP Mode Table 0 - - - - - MS1 MS0 0xxx,xx00
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7; //IAP Control Register IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000
//--------------------------------------------------------------------------------
//>>>ADD BY CC
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
//sbit P34=P3^4; //定义SDA数据线
//sbit P35=P3^5; //定义SCL时钟线
#define mBIT_1(X,N) X|= (1<<N)
#define mBIT_0(X,N) X&=~(1<<N)
#define mBIT_G(X,N) (X&(1<<N))
//高阻状态
#define P0_conf_in(n) mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define P1_conf_in(n) mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define P2_conf_in(n) mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define P2_conf_port(n) mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define P3_conf_in(n) mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define P3_conf_port(n) mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define P4_conf_in(n) mBIT_1(P4M1,n);mBIT_0(P4M0,n);
#define P5_conf_in(n) mBIT_1(P5M1,n);mBIT_0(P5M0,n);
#define NOP() _nop_()
#endif
/*
8051-based microcontroller with 1T(1-clock) High-Speed Core,
Dual DPTR, 36-44 I/O Lines, 2 Timers/Counters, 2 PCA Timers,
Alternative build-in oscillator,
Independent Baud Rate Generator, Programmable Clock-Out,
32K bytes flash ROM, 1280 bytes data RAM,
On-chip EEPROM, 2 UARTs, WDT, ISP/IAP, A/D, CCP/PWM
*/

466
source/cpu/STC_stc15w.H

@ -0,0 +1,466 @@
#ifndef __STC15F2K60S2_H_
#define __STC15F2K60S2_H_
// stc_stc15w.h
#include<intrins.h>
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
#define TOx12 BITN7
#define T1x12 BITN6
#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍
#define T2R BITN4 //定时器2 运行 =1
#define T2_C BITN3 //定时器/计数器选择
#define T2x12 BITN2
#define EXTRAM BITN1
#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
/// 不可位寻址
#define ET4 BITN6
#define ET3 BITN5
#define ES4 BITN4
#define ES3 BITN3
#define ET2 BITN2
#define ESPI BITN1
#define ES2 BITN0
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
sfr SBUF = 0x99; //Serial Data Buffer
sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
#define S2SM0 BITN7
#define S2ST4 BITN6
#define S2SM2 BITN5
#define S2REN BITN4
#define S2TB8 BITN3
#define S2RB8 BITN2
#define S2TI BITN1
#define S2RI BITN0
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//---------------------------------------------------------------
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
#define S3SM0 BITN7
#define S3ST4 BITN6
#define S3SM2 BITN5
#define S3REN BITN4
#define S3TB8 BITN3
#define S3RB8 BITN2
#define S3TI BITN1
#define S3RI BITN0
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
//---------------------------------------------------------------
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
#define S4SM0 BITN7
#define S4ST4 BITN6
#define S4SM2 BITN5
#define S4REN BITN4
#define S4TB8 BITN3
#define S4RB8 BITN2
#define S4TI BITN1
#define S4RI BITN0
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
//比较器特殊功能寄存器
sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1
sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2
//增强型PWM波形发生器特殊功能寄存器
sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器
sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器
sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器
sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器
//如下特殊功能寄存器位于扩展RAM区域
//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCH (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM2T1H (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM7T2H (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR (*(unsigned char volatile xdata *)0xff54)
/////////////////////////////////////////////////
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/// >>>>> add by cc
//sbit P34=P3^4; //定义SDA数据线
//sbit P35=P3^5; //定义SCL时钟线
#define mBIT_1(X,N) X|= (1<<N)
#define mBIT_0(X,N) X&=~(1<<N)
#define mBIT_G(X,N) (X&(1<<N))
//高阻状态
#define P0_conf_in(n) mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define P1_conf_in(n) mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define P2_conf_in(n) mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define P2_conf_port(n) mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define P3_conf_in(n) mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define P3_conf_port(n) mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define P4_conf_in(n) mBIT_1(P4M1,n);mBIT_0(P4M0,n);
#define P5_conf_in(n) mBIT_1(P5M1,n);mBIT_0(P5M0,n);
#define NOP() _nop_()
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0;
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF;
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0;
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF;
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0;
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF;
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0;
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF;
//// n: BITN0---BITN7
#define D_stdIO_P0(BITN) BITN_0(P0M1,BITN);BITN_0(P0M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P0(BITN) BITN_0(P0M1,BITN);BITN_1(P0M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P0(BITN) BITN_1(P0M1,BITN);BITN_0(P0M0,BITN); /////////10 高阻
#define D_OpenD_P0(BITN) BITN_1(P0M1,BITN);BITN_1(P0M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P1(BITN) BITN_0(P1M1,BITN);BITN_0(P1M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P1(BITN) BITN_0(P1M1,BITN);BITN_1(P1M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P1(BITN) BITN_1(P1M1,BITN);BITN_0(P1M0,BITN); /////////10 高阻
#define D_OpenD_P1(BITN) BITN_1(P1M1,BITN);BITN_1(P1M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P2(BITN) BITN_0(P2M1,BITN);BITN_0(P2M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P2(BITN) BITN_0(P2M1,BITN);BITN_1(P2M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P2(BITN) BITN_1(P2M1,BITN);BITN_0(P2M0,BITN); /////////10 高阻
#define D_OpenD_P2(BITN) BITN_1(P2M1,BITN);BITN_1(P2M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P3(BITN) BITN_0(P3M1,BITN);BITN_0(P3M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P3(BITN) BITN_0(P3M1,BITN);BITN_1(P3M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P3(BITN) BITN_1(P3M1,BITN);BITN_0(P3M0,BITN); /////////10 高阻
#define D_OpenD_P3(BITN) BITN_1(P3M1,BITN);BITN_1(P3M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P4(BITN) BITN_0(P4M1,BITN);BITN_0(P4M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P4(BITN) BITN_0(P4M1,BITN);BITN_1(P4M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P4(BITN) BITN_1(P4M1,BITN);BITN_0(P4M0,BITN); /////////10 高阻
#define D_OpenD_P4(BITN) BITN_1(P4M1,BITN);BITN_1(P4M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P5(BITN) BITN_0(P5M1,BITN);BITN_0(P5M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(BITN) BITN_0(P5M1,BITN);BITN_1(P5M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(BITN) BITN_1(P5M1,BITN);BITN_0(P5M0,BITN); /////////10 高阻
#define D_OpenD_P5(BITN) BITN_1(P5M1,BITN);BITN_1(P5M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P6(BITN) BITN_0(P6M1,BITN);BITN_0(P6M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P6(BITN) BITN_0(P6M1,BITN);BITN_1(P6M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P6(BITN) BITN_1(P6M1,BITN);BITN_0(P6M0,BITN); /////////10 高阻
#define D_OpenD_P6(BITN) BITN_1(P6M1,BITN);BITN_1(P6M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P7(BITN) BITN_0(P7M1,BITN);BITN_0(P7M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P7(BITN) BITN_0(P7M1,BITN);BITN_1(P7M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P7(BITN) BITN_1(P7M1,BITN);BITN_0(P7M0,BITN); /////////10 高阻
#define D_OpenD_P7(BITN) BITN_1(P7M1,BITN);BITN_1(P7M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#endif

514
source/cpu/STC_stc8a8k.H

@ -0,0 +1,514 @@
#ifndef __STC_stc8a8k_H_
#define __STC_stc8a8k_H_
// STC_stc8a8k.h
#include<intrins.h>
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//包含本头文件后,不用另外再包含"REG51.H"
//内核特殊功能寄存器 // 复位值 描述
sfr ACC = 0xE0; //0000,0000 累加器Accumulator
sfr B = 0xF0; //0000,0000 B寄存器
sfr PSW = 0xD0; //0000,0000 程序状态字
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
sfr SP = 0x81; //0000,0111 堆栈指针
sfr DPL = 0x82; //0000,0000 数据指针低字节
sfr DPH = 0x83; //0000,0000 数据指针高字节
//I/O 口特殊功能寄存器
sfr P0 = 0x80; //1111,1111 端口0
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1 = 0x90; //1111,1111 端口1
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2 = 0xA0; //1111,1111 端口2
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3 = 0xB0; //1111,1111 端口3
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P4 = 0xC0; //1111,1111 端口4
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P5 = 0xC8; //xxxx,1111 端口5
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;
sfr P6 = 0xE8; //0000,0000 端口6
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;
sfr P7 = 0xF8; //0000,0000 端口7
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
//系统管理特殊功能寄存器
sfr PCON = 0x87; //0001,0000 电源控制寄存器
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
#define TOx12 BITN7
#define T1x12 BITN6
#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍
#define T2R BITN4 //定时器2 运行 =1
#define T2_C BITN3 //定时器/计数器选择
#define T2x12 BITN2
#define EXTRAM BITN1
#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1
sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1
sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1
sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器
sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器
sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器
//-----------------------------------------------------------------
sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器
#define EAXFR BITN7
#define I2C_S1 BITN5
#define I2C_S2 BITN4
#define CMPO_S BITN3
#define S4_S BITN2
#define S3_S BITN1
#define S2_S BITN0
//-----------------------------------------------------------------
//中断特殊功能寄存器
sfr IE = 0xA8; //0000,0000 中断控制寄存器
sbit EA = IE^7;
sbit ELVD = IE^6;
sbit EADC = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sfr IP = 0xB8; //0000,0000 中断优先级寄存器
sbit PPCA = IP^7;
sbit PLVD = IP^6;
sbit PADC = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2
/// 不可位寻址
#define ET4 BITN6
#define ET3 BITN5
#define ES4 BITN4
#define ES3 BITN3
#define ET2 BITN2
#define ESPI BITN1
#define ES2 BITN0
sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2
sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器
//定时器特殊功能寄存器
sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器
sfr TL0 = 0x8A; //0000,0000 T0低字节
sfr TL1 = 0x8B; //0000,0000 T1低字节
sfr TH0 = 0x8C; //0000,0000 T0高字节
sfr TH1 = 0x8D; //0000,0000 T1高字节
sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器
sfr T4H = 0xD2; //0000,0000 T4高字节
sfr T4L = 0xD3; //0000,0000 T4低字节
sfr T3H = 0xD4; //0000,0000 T3高字节
sfr T3L = 0xD5; //0000,0000 T3低字节
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节
sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节
sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器
//串行口特殊功能寄存器
sfr SCON = 0x98; //0000,0000 串口1控制寄存器
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器
//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器
//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器
//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器
//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器
sfr SBUF = 0x99; //Serial Data Buffer
sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
#define S2SM0 BITN7
#define S2ST4 BITN6
#define S2SM2 BITN5
#define S2REN BITN4
#define S2TB8 BITN3
#define S2RB8 BITN2
#define S2TI BITN1
#define S2RI BITN0
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//---------------------------------------------------------------
sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器
#define S3SM0 BITN7
#define S3ST4 BITN6
#define S3SM2 BITN5
#define S3REN BITN4
#define S3TB8 BITN3
#define S3RB8 BITN2
#define S3TI BITN1
#define S3RI BITN0
sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器
//---------------------------------------------------------------
sfr S4CON = 0x84; //0000,0000 串口4控制寄存器
#define S4SM0 BITN7
#define S4ST4 BITN6
#define S4SM2 BITN5
#define S4REN BITN4
#define S4TB8 BITN3
#define S4RB8 BITN2
#define S4TI BITN1
#define S4RI BITN0
sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器
//ADC 特殊功能寄存器
sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器
sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位
sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位
//SPI 特殊功能寄存器
sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器
sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器
sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器
//IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器
sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节
sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节
sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器
sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器
//PCA/PWM 特殊功能寄存器
sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器
sfr CL = 0xE9; //0000,0000 PCA计数器低字节
sfr CH = 0xF9; //0000,0000 PCA计数器高字节
sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器
sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器
sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器
sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节
sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节
sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节
sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器
sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器
sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器
sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节
sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节
sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节
//比较器特殊功能寄存器
sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1
sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2
//sfr P_SW2 = 0xba;
sfr PWMCFG = 0xf1;
sfr PWMIF = 0xf6;
sfr PWMFDCR = 0xf7;
sfr PWMCR = 0xfe;
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define TADCP (*(unsigned int volatile xdata *)0xfff3)
#define PWM0T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM0T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM0CR (*(unsigned char volatile xdata *)0xff04)
#define PWM0HLD (*(unsigned char volatile xdata *)0xff05)
#define PWM1T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM1T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM1CR (*(unsigned char volatile xdata *)0xff14)
#define PWM1HLD (*(unsigned char volatile xdata *)0xff15)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM2CR (*(unsigned char volatile xdata *)0xff24)
#define PWM2HLD (*(unsigned char volatile xdata *)0xff25)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM3CR (*(unsigned char volatile xdata *)0xff34)
#define PWM3HLD (*(unsigned char volatile xdata *)0xff35)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM4CR (*(unsigned char volatile xdata *)0xff44)
#define PWM4HLD (*(unsigned char volatile xdata *)0xff45)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM5CR (*(unsigned char volatile xdata *)0xff54)
#define PWM5HLD (*(unsigned char volatile xdata *)0xff55)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff60)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff62)
#define PWM6CR (*(unsigned char volatile xdata *)0xff64)
#define PWM6HLD (*(unsigned char volatile xdata *)0xff65)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff70)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff72)
#define PWM7CR (*(unsigned char volatile xdata *)0xff74)
#define PWM7HLD (*(unsigned char volatile xdata *)0xff75)
#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF
#define MCLKODIV BIT4
#define MCLKO_S BITN3
#define MCLKSEL BIT0
#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF
#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF
#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF
#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF
/////////////////////////////////////////////////
/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
/// >>>>> add by cc
//sbit P34=P3^4; //定义SDA数据线
//sbit P35=P3^5; //定义SCL时钟线
#define mBIT_1(X,N) X|= (1<<N)
#define mBIT_0(X,N) X&=~(1<<N)
#define mBIT_G(X,N) (X&(1<<N))
/// add by cc 20181118
#define D_IO_normal_P0(n); mBIT_0(P0M1,n);mBIT_0(P0M0,n);
#define D_IO_normal_P1(n); mBIT_0(P1M1,n);mBIT_0(P1M0,n);
#define D_IO_normal_P2(n); mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define D_IO_normal_P3(n); mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define D_IO_HighOut_P0(n); mBIT_0(P0M1,n);mBIT_1(P0M0,n);
#define D_IO_HighOut_P1(n); mBIT_0(P1M1,n);mBIT_1(P1M0,n);
#define D_IO_HighOut_P2(n); mBIT_0(P2M1,n);mBIT_1(P2M0,n);
#define D_IO_HighOut_P3(n); mBIT_0(P3M1,n);mBIT_1(P3M0,n);
//高阻状态
#define D_IO_HighR_P0(n); mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define D_IO_HighR_P1(n); mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define D_IO_HighR_P2(n); mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define D_IO_HighR_P3(n); mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define D_IO_OpenDrain_P0(n); mBIT_1(P0M1,n);mBIT_1(P0M0,n);
#define D_IO_OpenDrain_P1(n); mBIT_1(P1M1,n);mBIT_1(P1M0,n);
#define D_IO_OpenDrain_P2(n); mBIT_1(P2M1,n);mBIT_1(P2M0,n);
#define D_IO_OpenDrain_P3(n); mBIT_1(P3M1,n);mBIT_1(P3M0,n);
//高阻状态
#define P0_conf_in(n) mBIT_1(P0M1,n);mBIT_0(P0M0,n);
#define P1_conf_in(n) mBIT_1(P1M1,n);mBIT_0(P1M0,n);
#define P2_conf_in(n) mBIT_1(P2M1,n);mBIT_0(P2M0,n);
#define P2_conf_port(n) mBIT_0(P2M1,n);mBIT_0(P2M0,n);
#define P3_conf_in(n) mBIT_1(P3M1,n);mBIT_0(P3M0,n);
#define P3_conf_port(n) mBIT_0(P3M1,n);mBIT_0(P3M0,n);
#define P4_conf_in(n) mBIT_1(P4M1,n);mBIT_0(P4M0,n);
#define P5_conf_in(n) mBIT_1(P5M1,n);mBIT_0(P5M0,n);
#define NOP() _nop_()
//added by cc
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0;
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF;
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0;
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF;
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0;
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF;
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0;
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF;
//// n: BITN0---BITN7
#define D_stdIO_P0(BITN) BITN_0(P0M1,BITN);BITN_0(P0M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P0(BITN) BITN_0(P0M1,BITN);BITN_1(P0M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P0(BITN) BITN_1(P0M1,BITN);BITN_0(P0M0,BITN); /////////10 高阻
#define D_OpenD_P0(BITN) BITN_1(P0M1,BITN);BITN_1(P0M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P1(BITN) BITN_0(P1M1,BITN);BITN_0(P1M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P1(BITN) BITN_0(P1M1,BITN);BITN_1(P1M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P1(BITN) BITN_1(P1M1,BITN);BITN_0(P1M0,BITN); /////////10 高阻
#define D_OpenD_P1(BITN) BITN_1(P1M1,BITN);BITN_1(P1M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P2(BITN) BITN_0(P2M1,BITN);BITN_0(P2M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P2(BITN) BITN_0(P2M1,BITN);BITN_1(P2M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P2(BITN) BITN_1(P2M1,BITN);BITN_0(P2M0,BITN); /////////10 高阻
#define D_OpenD_P2(BITN) BITN_1(P2M1,BITN);BITN_1(P2M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P3(BITN) BITN_0(P3M1,BITN);BITN_0(P3M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P3(BITN) BITN_0(P3M1,BITN);BITN_1(P3M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P3(BITN) BITN_1(P3M1,BITN);BITN_0(P3M0,BITN); /////////10 高阻
#define D_OpenD_P3(BITN) BITN_1(P3M1,BITN);BITN_1(P3M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P4(BITN) BITN_0(P4M1,BITN);BITN_0(P4M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P4(BITN) BITN_0(P4M1,BITN);BITN_1(P4M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P4(BITN) BITN_1(P4M1,BITN);BITN_0(P4M0,BITN); /////////10 高阻
#define D_OpenD_P4(BITN) BITN_1(P4M1,BITN);BITN_1(P4M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P5(BITN) BITN_0(P5M1,BITN);BITN_0(P5M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P5(BITN) BITN_0(P5M1,BITN);BITN_1(P5M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P5(BITN) BITN_1(P5M1,BITN);BITN_0(P5M0,BITN); /////////10 高阻
#define D_OpenD_P5(BITN) BITN_1(P5M1,BITN);BITN_1(P5M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P6(BITN) BITN_0(P6M1,BITN);BITN_0(P6M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P6(BITN) BITN_0(P6M1,BITN);BITN_1(P6M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P6(BITN) BITN_1(P6M1,BITN);BITN_0(P6M0,BITN); /////////10 高阻
#define D_OpenD_P6(BITN) BITN_1(P6M1,BITN);BITN_1(P6M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#define D_stdIO_P7(BITN) BITN_0(P7M1,BITN);BITN_0(P7M0,BITN); //////00 准双向口 灌电流20mA 拉电流270-150uS
#define D_HighI_P7(BITN) BITN_0(P7M1,BITN);BITN_1(P7M0,BITN); //////01 推挽输出 20mA 加限流
#define D_HighR_P7(BITN) BITN_1(P7M1,BITN);BITN_0(P7M0,BITN); /////////10 高阻
#define D_OpenD_P7(BITN) BITN_1(P7M1,BITN);BITN_1(P7M0,BITN); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
#endif //STC_stc8a8k

300
source/cpu/c51_macro.H

@ -0,0 +1,300 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2018, 传控科技
/// All rights reserved.
///
/// @file __C51_MACRO_H_
/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20180102
//
//////////////////////////////////////////////////////////////////////////
#ifndef __C51_MACRO_H_
#define __C51_MACRO_H_
#include<intrins.h>
#define D_P07_ON() P07 = 1
#define D_P06_ON() P06 = 1
#define D_P05_ON() P05 = 1
#define D_P04_ON() P04 = 1
#define D_P03_ON() P03 = 1
#define D_P02_ON() P02 = 1
#define D_P01_ON() P01 = 1
#define D_P00_ON() P00 = 1
#define D_P07_OFF() P07 = 0
#define D_P06_OFF() P06 = 0
#define D_P05_OFF() P05 = 0
#define D_P04_OFF() P04 = 0
#define D_P03_OFF() P03 = 0
#define D_P02_OFF() P02 = 0
#define D_P01_OFF() P01 = 0
#define D_P00_OFF() P00 = 0
#define D_P07_AT() (P07)
#define D_P06_AT() (P06)
#define D_P05_AT() (P05)
#define D_P04_AT() (P04)
#define D_P03_AT() (P03)
#define D_P02_AT() (P02)
#define D_P01_AT() (P01)
#define D_P00_AT() (P00)
#define D_P07_REV() P07 = ~P07
#define D_P06_REV() P06 = ~P06
#define D_P05_REV() P05 = ~P05
#define D_P04_REV() P04 = ~P04
#define D_P03_REV() P03 = ~P03
#define D_P02_REV() P02 = ~P02
#define D_P01_REV() P01 = ~P01
#define D_P00_REV() P00 = ~P00
#define D_P17_ON() P17 = 1
#define D_P16_ON() P16 = 1
#define D_P15_ON() P15 = 1
#define D_P14_ON() P14 = 1
#define D_P13_ON() P13 = 1
#define D_P12_ON() P12 = 1
#define D_P11_ON() P11 = 1
#define D_P10_ON() P10 = 1
#define D_P17_OFF() P17 = 0
#define D_P16_OFF() P16 = 0
#define D_P15_OFF() P15 = 0
#define D_P14_OFF() P14 = 0
#define D_P13_OFF() P13 = 0
#define D_P12_OFF() P12 = 0
#define D_P11_OFF() P11 = 0
#define D_P10_OFF() P10 = 0
#define D_P17_AT() (P17)
#define D_P16_AT() (P16)
#define D_P15_AT() (P15)
#define D_P14_AT() (P14)
#define D_P13_AT() (P13)
#define D_P12_AT() (P12)
#define D_P11_AT() (P11)
#define D_P10_AT() (P10)
#define D_P17_REV() P17 = ~P17
#define D_P16_REV() P16 = ~P16
#define D_P15_REV() P15 = ~P15
#define D_P14_REV() P14 = ~P14
#define D_P13_REV() P13 = ~P13
#define D_P12_REV() P12 = ~P12
#define D_P11_REV() P11 = ~P11
#define D_P10_REV() P10 = ~P10
#define D_P27_ON() P27 = 1
#define D_P26_ON() P26 = 1
#define D_P25_ON() P25 = 1
#define D_P24_ON() P24 = 1
#define D_P23_ON() P23 = 1
#define D_P22_ON() P22 = 1
#define D_P21_ON() P21 = 1
#define D_P20_ON() P20 = 1
#define D_P27_OFF() P27 = 0
#define D_P26_OFF() P26 = 0
#define D_P25_OFF() P25 = 0
#define D_P24_OFF() P24 = 0
#define D_P23_OFF() P23 = 0
#define D_P22_OFF() P22 = 0
#define D_P21_OFF() P21 = 0
#define D_P20_OFF() P20 = 0
#define D_P27_AT() (P27)
#define D_P26_AT() (P26)
#define D_P25_AT() (P25)
#define D_P24_AT() (P24)
#define D_P23_AT() (P23)
#define D_P22_AT() (P22)
#define D_P21_AT() (P21)
#define D_P20_AT() (P20)
#define D_P27_REV() P27 = ~P27
#define D_P26_REV() P26 = ~P26
#define D_P25_REV() P25 = ~P25
#define D_P24_REV() P24 = ~P24
#define D_P23_REV() P23 = ~P23
#define D_P22_REV() P22 = ~P22
#define D_P21_REV() P21 = ~P21
#define D_P20_REV() P20 = ~P20
#define D_P37_ON() P37 = 1
#define D_P36_ON() P36 = 1
#define D_P35_ON() P35 = 1
#define D_P34_ON() P34 = 1
#define D_P33_ON() P33 = 1
#define D_P32_ON() P32 = 1
#define D_P31_ON() P31 = 1
#define D_P30_ON() P30 = 1
#define D_P37_OFF() P37 = 0
#define D_P36_OFF() P36 = 0
#define D_P35_OFF() P35 = 0
#define D_P34_OFF() P34 = 0
#define D_P33_OFF() P33 = 0
#define D_P32_OFF() P32 = 0
#define D_P31_OFF() P31 = 0
#define D_P30_OFF() P30 = 0
#define D_P37_AT() (P37)
#define D_P36_AT() (P36)
#define D_P35_AT() (P35)
#define D_P34_AT() (P34)
#define D_P33_AT() (P33)
#define D_P32_AT() (P32)
#define D_P31_AT() (P31)
#define D_P30_AT() (P30)
#define D_P37_REV() P37 = ~P37
#define D_P36_REV() P36 = ~P36
#define D_P35_REV() P35 = ~P35
#define D_P34_REV() P34 = ~P34
#define D_P33_REV() P33 = ~P33
#define D_P32_REV() P32 = ~P32
#define D_P31_REV() P31 = ~P31
#define D_P30_REV() P30 = ~P30
#define D_P47_ON() P47 = 1
#define D_P46_ON() P46 = 1
#define D_P45_ON() P45 = 1
#define D_P44_ON() P44 = 1
#define D_P43_ON() P43 = 1
#define D_P42_ON() P42 = 1
#define D_P41_ON() P41 = 1
#define D_P40_ON() P40 = 1
#define D_P47_OFF() P47 = 0
#define D_P46_OFF() P46 = 0
#define D_P45_OFF() P45 = 0
#define D_P44_OFF() P44 = 0
#define D_P43_OFF() P43 = 0
#define D_P42_OFF() P42 = 0
#define D_P41_OFF() P41 = 0
#define D_P40_OFF() P40 = 0
#define D_P47_AT() (P47)
#define D_P46_AT() (P46)
#define D_P45_AT() (P45)
#define D_P44_AT() (P44)
#define D_P43_AT() (P43)
#define D_P42_AT() (P42)
#define D_P41_AT() (P41)
#define D_P40_AT() (P40)
#define D_P47_REV() P47 = ~P47
#define D_P46_REV() P46 = ~P46
#define D_P45_REV() P45 = ~P45
#define D_P44_REV() P44 = ~P44
#define D_P43_REV() P43 = ~P43
#define D_P42_REV() P42 = ~P42
#define D_P41_REV() P41 = ~P41
#define D_P40_REV() P40 = ~P40
#define D_P57_ON() P57 = 1
#define D_P56_ON() P56 = 1
#define D_P55_ON() P55 = 1
#define D_P54_ON() P54 = 1
#define D_P53_ON() P53 = 1
#define D_P52_ON() P52 = 1
#define D_P51_ON() P51 = 1
#define D_P50_ON() P50 = 1
#define D_P57_OFF() P57 = 0
#define D_P56_OFF() P56 = 0
#define D_P55_OFF() P55 = 0
#define D_P54_OFF() P54 = 0
#define D_P53_OFF() P53 = 0
#define D_P52_OFF() P52 = 0
#define D_P51_OFF() P51 = 0
#define D_P50_OFF() P50 = 0
#define D_P57_AT() (P57)
#define D_P56_AT() (P56)
#define D_P55_AT() (P55)
#define D_P54_AT() (P54)
#define D_P53_AT() (P53)
#define D_P52_AT() (P52)
#define D_P51_AT() (P51)
#define D_P50_AT() (P50)
#define D_P57_REV() P57 = ~P57
#define D_P56_REV() P56 = ~P56
#define D_P55_REV() P55 = ~P55
#define D_P54_REV() P54 = ~P54
#define D_P53_REV() P53 = ~P53
#define D_P52_REV() P52 = ~P52
#define D_P51_REV() P51 = ~P51
#define D_P50_REV() P50 = ~P50
#define D_P67_ON() P67 = 1
#define D_P66_ON() P66 = 1
#define D_P65_ON() P65 = 1
#define D_P64_ON() P64 = 1
#define D_P63_ON() P63 = 1
#define D_P62_ON() P62 = 1
#define D_P61_ON() P61 = 1
#define D_P60_ON() P60 = 1
#define D_P67_OFF() P67 = 0
#define D_P66_OFF() P66 = 0
#define D_P65_OFF() P65 = 0
#define D_P64_OFF() P64 = 0
#define D_P63_OFF() P63 = 0
#define D_P62_OFF() P62 = 0
#define D_P61_OFF() P61 = 0
#define D_P60_OFF() P60 = 0
#define D_P67_AT() (P67)
#define D_P66_AT() (P66)
#define D_P65_AT() (P65)
#define D_P64_AT() (P64)
#define D_P63_AT() (P63)
#define D_P62_AT() (P62)
#define D_P61_AT() (P61)
#define D_P60_AT() (P60)
#define D_P67_REV() P67 = ~P67
#define D_P66_REV() P66 = ~P66
#define D_P65_REV() P65 = ~P65
#define D_P64_REV() P64 = ~P64
#define D_P63_REV() P63 = ~P63
#define D_P62_REV() P62 = ~P62
#define D_P61_REV() P61 = ~P61
#define D_P60_REV() P60 = ~P60
#define D_P77_ON() P77 = 1
#define D_P76_ON() P76 = 1
#define D_P75_ON() P75 = 1
#define D_P74_ON() P74 = 1
#define D_P73_ON() P73 = 1
#define D_P72_ON() P72 = 1
#define D_P71_ON() P71 = 1
#define D_P70_ON() P70 = 1
#define D_P77_OFF() P77 = 0
#define D_P76_OFF() P76 = 0
#define D_P75_OFF() P75 = 0
#define D_P74_OFF() P74 = 0
#define D_P73_OFF() P73 = 0
#define D_P72_OFF() P72 = 0
#define D_P71_OFF() P71 = 0
#define D_P70_OFF() P70 = 0
#define D_P77_AT() (P77)
#define D_P76_AT() (P76)
#define D_P75_AT() (P75)
#define D_P74_AT() (P74)
#define D_P73_AT() (P73)
#define D_P72_AT() (P72)
#define D_P71_AT() (P71)
#define D_P70_AT() (P70)
#define D_P77_REV() P77 = ~P77
#define D_P76_REV() P76 = ~P76
#define D_P75_REV() P75 = ~P75
#define D_P74_REV() P74 = ~P74
#define D_P73_REV() P73 = ~P73
#define D_P72_REV() P72 = ~P72
#define D_P71_REV() P71 = ~P71
#define D_P70_REV() P70 = ~P70
#endif //__C51_MACRO_H_

44
source/cpu/stc_mcu.c

@ -0,0 +1,44 @@
/*******************************************************************************
// 说明: 头文件声明
*******************************************************************************/
#include "STC_mcu.h"
void L0_mcu_hard_Init(void)
{
P0M1 = 0x00;
P0M0 = 0xff;
IT0 = 1;
EX0 = 1;
P4SW|=0x70; //SET p4.5 P4.6 P4.4 为通用io
//fixme
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
}
/*********************************end file*********************************************/

14
source/cpu/stc_mcu.h

@ -0,0 +1,14 @@
#ifndef STC_MCU_H
#define STC_MCU_H
#include "STC_CC_8051.h"
void L0_mcu_hard_Init(void);
#endif
/*********************************end file*********************************************/

236
source/ctask/task.c

@ -0,0 +1,236 @@
/*****************************************************
*============================================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*============================================================================
****************************************************************************/
#include "task.h"
//任务命名规则:
// 1:第一层
/// 0驱动芯片级 flash
/// 1芯片应用级 save
/// 2任务应用级 jilu_save
//
// 2:第二层/flash/i2c/7290/等各类芯片
// 3:任务序号/不同的芯片/
//
void L1_task_init(TS_task *s)
{
s->en = 1;
// s->pfun = 0;
s->sh = 0;
s->sh_next= 0;
/// s->sh_pre= 0;
s->n= 0;
}
#if 0
//L2_task_voice_handle(&s_task_music.task);
//L1_task_go(D_task_close);
//if(L1_task_busy(s)){ L1_task_goout(s_task_music.task,D_task_voice_send_single) }
void L2_task_voice_handle(struct _s_task_music_ *s)
{ //s_task_music.task.sh
switch(s->task.sh)
{
case D_task_voice_init://
s->sector = 0;
break;
case D_task_voice_cuimian :
s->sector = D_voice_music_wantsleep;
L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1);
break;
case D_task_voice_cuimian1://
L2_task_go(D_task_voice_cuimian2);
break;
case D_task_voice_cuimian2://
if(0 == s->volume_change)
{
//L3_voice_stop();
s->sector = D_voice_stop;
s->status = D_voice_status_stop;
//L2_task_go(D_task_voice_play);
L2_task_go_son(D_task_voice_play,0);
}else
{
s->volume_change --;
s->volume_temp = s->volume;
s->volume = s->volume_change*s->volume_shop/20;//
if (s->volume_temp != s->volume)
{
s->sector = D_voice_volume|s->volume;
//s->status = D_voice_status_stop;
//L2_task_go(D_task_voice_volume3);
L2_task_go_son(D_task_voice_play,D_task_voice_cuimian2);
}
//else
{
L2_task_delay(D_task_delay_1m);
}
}
break;
//>>>>>>>>>>>>>>>>>> son function
case D_task_voice_play://
if(L3_task_s_busy(s_task_wt558d))
{
}else
{
s_task_wt558d.reg = s_task_music.sector;
L3_task_s_go(s_task_wt558d,D_task_wt558d_fun);
L2_task_go(D_task_voice_ask);
}
break;
case D_task_voice_ask://
if(L3_task_s_busy(s_task_wt558d))
{
}else
{
L2_task_go_father();//回到
}
break;
//<<<<<<<<<<<<<<<<<<<<<< son function
//-----------------------task standerd code
case D_task_Tdelay://----
s->task.n--;
if (s->task.n == 0)
{
s->task.n = 0;
L2_task_delay_over();
}
break;
default :
break;
}
L2_task_wt558d_handle(&s_task_wt558d);
}
void L2_task_voice_handle(struct _s_task_music_ *s)
{ //s_task_music.task.sh
switch(s->task.sh)
{
case D_task_voice_init://
s->sector = 0;
break;
case D_task_voice_cuimian :
s->sector = D_voice_music_wantsleep;
L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1);
break;
case D_task_voice_cuimian1://
L2_task_go(D_task_voice_cuimian2);
break;
//-----------------------task standerd code
case D_task_Tdelay://----
s->task.n--;
if (s->task.n == 0)
{
s->task.n = 0;
L2_task_delay_over();
}
break;
default :
break;
}
L2_task_wt558d_handle(&s_task_wt558d);
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>记录task
struct _s_task_4ChuShengRiQi_
{
TS_task task;
unsigned char pic_id;//画面ID
};
extern struct _s_task_4ChuShengRiQi_ s_task_4ChuShengRiQi_;
#define D_task_4ChuShengRiQi_init 0x10
#define D_task_4ChuShengRiQi_key 0x11
extern void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s);
void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s)
{
switch(s->task.sh)
{
case D_task_4ChuShengRiQi_init://
s->pic_id= 0;
break;
case D_task_4ChuShengRiQi_key :
if(1 == s_task_keyx1.down )
{
s_task_keyx1.down = 0;
if(D_keyx_left == s_task_keyx1.key_value)
{}
}else if(1 == s_task_keyx_4.down)
{
s_task_keyx_4.down = 0;
}
else {}
//L2_task_go_son(D_task_4ChuShengRiQi_play,D_task_4ChuShengRiQi_cuimian1);
break;
L0_task_delay();
}
}
//<<<<<<<<<<<<<<<<<<<记录task
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/*****************************************************
*==============================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================
****************************************************************************/
#endif

261
source/ctask/task.h

@ -0,0 +1,261 @@
/********************************
2013.7.23 add dictionary and task step by cc
:task
:task step
:sh ( struct handle)
sh_next
,sh_next执行完后执行sh_pre
***************************/
/*****************************************************
*==============================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================
****************************************************************************/
#ifndef _TASK_H_
#define _TASK_H_
#include "../clib/type.h"
#include "../msp/time.h"
#include "task.h"
#include "tick.h"
typedef struct _ts_task
{
volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停
volatile UN_TYPE sh; //当前任务段
volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段
volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用
vU32 n;
}TS_task;
//extern TS_task ts_task_stcadc;
#define D_task_close 0
#if 0
#define D_task_Tdelay 0x01
#define D_task_stop 0x04
#define D_task_Cdelay 0x09
#define D_task_init 0x10
#define D_task_quit 0xf0
#endif
#define D_task_Tdelay 0xe1
#define D_task_stop 0xe4
#define D_task_Cdelay 0xe9
#define D_task_init 0xe0
#define D_task_quit 0xf0
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 s->task
#define L2_task_delay_over() s->task.sh = s->task.sh_next
#define L2_task_go(next) s->task.sh = next;
#define L2_task_en(onf) s->task.en = onf;
#define L2_task_busy(s) (D_task_close != s.task.sh)
#define L2_task_free(s) (D_task_close == s.task.sh)
#define L2_task_go_father() s->task.sh = s->task.sh_pre;
#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre;
//>task 定时>>>>>>>>>>>>>>TTSS
/// D_task_Tdelay == task timer delay 需要额外有个定时单元 和time0定时器设置相关
/// Delay_cycle适用于 时间短的,其一次循环取决于主循环的时间,和Tdelay比,Cdelay长时间计时误差大
#define L2_task_switch_default_idelay(); \
case D_task_Tdelay:\
if (s_nos_tick.t_50ms >= s->task.n)\
{\
L2_task_delay_over();\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
#if 0
#define L2_task_switch_default_idelay2(); \
case D_task_Tdelay:\
if (s_nos_tick.t_10ms >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart(D_TBH_ch0,3,'i');\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
//在等待的过程中设置间隔时间,定时调用funxx
//这样在等待的空闲时间可以定时显示一些心跳信息和
//执行心跳功能
#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay()
#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \
case D_task_Tdelay:\
if (s_nos_tick.t_10ms >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart_fun(chhh,invent,funxx);\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
//在等待的过程中设置间隔时间,定时显示字符ch
//这样在等待的空闲时间可以定时显示一些待机信息ch
// 通过ch表明目前运行的阶段和心跳信息
#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay()
#define L2_task_switch_flag_idelay000(invent,ch); \
case D_task_Tdelay:\
if (s_nos_tick.t_10ms >= s->task.n)\
{\
L2_task_delay_over();\
}else\
{\
L2_time_beat_heart(D_TBH_ch0,invent,ch);\
}\
break; \
case D_task_Cdelay:\
s->task.n--; \
if (s->task.n == 0) \
{ \
s->task.n = 0; \
L2_task_delay_over();\
} \
break;\
default : \
break;
#endif
//if(delay_n+s_time0.t_10ms > 655340)
//{s_time0.t_10ms = 0;}
//fix 201312 防止s_time0.t_10ms 溢出
// 但是有风险
//>>L2_task_delay一定要放在L2_task_go之后
#define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\
s->task.sh = D_task_Tdelay;\
s->task.n = delay_n + s_nos_tick.t_50ms;
//>>L2_task_delay一定要放在L2_task_go之后
#define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\
s->task.sh = D_task_Cdelay;\
s->task.n = delay_n
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<内部调用 s->task
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 外部调用
#define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre;
#define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s;
#define L3_task_s_go(s,next) (s).task.sh = next;
#define L3_task_s_en(s,onf) (s).task.en = onf;
//L1_task_goout(s_task_music.task,D_task_close);
#define L3_task_s_busy(s) (D_task_close != (s).task.sh)
#define L3_task_s_free(s) (D_task_close == (s).task.sh)
#define L3_task_s_step(s) ((s).task.sh)
#define D_task_uc unsigned char
#define D_task_ui unsigned int
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define TTSS_Task_init(); switch(s->task.sh)\
{\
case D_task_init:\
#define TTSS_Task_step(step); break;\
case (step):
#define TTSS_Task_end(); break;\
L2_task_switch_default_idelay();}
#define TTSS_Task_fun(step); break;\
case (step):
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
extern void L1_task_init(TS_task *s);
#define L2_task_go_Tdelay(next,delay_n) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Tdelay;\
s->task.n = (delay_n) + s_nos_tick.t_50ms; \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
#define L2_task_go_Cdelay(next,delay_n) do{ \
if(delay_n) \
{ \
s->task.sh_next = next;\
s->task.sh = D_task_Cdelay;\
s->task.n = (delay_n); \
} \
else \
{ \
s->task.sh = next; \
} \
}while(0)
#endif//_TASK_H_
/*****************************************************
*==============================================================
* HISTORY
* Below this line, this part is controlled by TSTS. DO NOT MODIFY!!
(Task Step by Step Turn by Turn StructureTSTS
*==============================================================
****************************************************************************/

92
source/ctask/tick.c

@ -0,0 +1,92 @@
/*****************************************************************************
* uart.h: Header file for NXP LPC17xx Family Microprocessors
*
* Copyright(C) 2017,SensorControl
* All rights reserved.
*
* History
* 2009.05.27 ver 1.00 Prelimnary version, first Release
*2017.01.10 ver 1.10 rename tick.h tick.c
****************************************************************************************/
#include "tick.h"
//#include "../bsp/weather.h"
//#include "../bsp/bsp_led.h"
struct _s_nos_tick_ s_nos_tick;
/*********************************************************************************************************
* Function Name: timer0Isr
* Description: TIMER0
* Input: ?
* Output: ?
* Return: ?
*********************************************************************************************************/
void L1_tick_init(void)
{
s_nos_tick.n_stamp = 0;
s_nos_tick.t1s_heatbeart= 0;
s_nos_tick.flag_50ms = 0;
s_nos_tick.t_50ms = 0;
s_nos_tick.t_100ms = 0;
s_nos_tick.t_1s = 0;
s_nos_tick.flag_1s = 0;
s_nos_tick.t_n = 0;
}
#if 0
// 11.0592 15us --- 140us
void L1_tick_tick (void)
{
if(s_nos_tick.flag_50ms == 1)
{
s_nos_tick.flag_50ms = 0;
}
else
return ;
//s_nos_tick.t_n++;
if (s_nos_tick.t_n >= D_TIMER0_50MS_COUNT)// 5500--- 100 10s--556
{
s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522 楠岃瘉
if(s_nos_tick.t_50ms % 2 == 0)
{
s_nos_tick.t_100ms ++;
}
if(s_nos_tick.t_50ms%D_TIMER0_1S_COUNT == 0)
{
s_nos_tick.t_1s ++;//
s_nos_tick.flag_1s = 1;
s_nos_tick.t1s_heatbeart = 1;
}
s_nos_tick.t_n = 0;
}
}
#else
void L1_tick_tick (void)
{
/// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms
///锟洁当锟斤拷1.39锟斤拷锟絫_10ms 锟斤拷锟斤拷锟斤拷锟斤拷诘锟截癸拷锟斤拷锟较低筹拷锟斤拷锟?锟斤拷全锟斤拷锟斤拷锟斤拷锟斤拷
// 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000锟斤拷/锟斤拷
s_nos_tick.tp_count++;
s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522 锟斤拷证
if(s_nos_tick.t_50ms % D_TIMER0_1S_COUNT == 0)
{
// 65535*65535/24/60/60/356/10 =12.7锟斤拷
s_nos_tick.t_1s ++;//// 65535*65535/24/60/60/356/10 =12.7锟斤拷
s_nos_tick.flag_1s2 = 1;
s_nos_tick.t1s_heatbeart = 1;
}
//<<<<<<<<<<<<<<<<<<<<<<
}
#endif

147
source/ctask/tick.h

@ -0,0 +1,147 @@
/*****************************************************************************
* uart.h: Header file for NXP LPC17xx Family Microprocessors
*
* Copyright(C) 2017,SensorControl
* All rights reserved.
*
* History
* 2009.05.27 ver 1.00 Prelimnary version, first Release
*2017.01.10 ver 1.10 rename tick.h tick.c
******************************************************************************/
#ifndef __tick_H
#define __tick_H
#include "../clib/Type.h"
//#include "../bsp/type_hs.h"
#include "../msp/time.h"
struct _s_nos_tick_
{
vU32 tp_count;
vU8 flag_50ms;
vU32 sys_clock;
vU32 t_n; // noos系统定时器最小技术单元
vU32 t_50ms; // noos 系统定时器10m技术
vU32 t_100ms;
vU32 t_1s;
vU8 flag_1s;
vU8 flag_1s2;
vU32 n_stamp;
vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除
vU8 ts_flag;
};
extern struct _s_nos_tick_ s_nos_tick;
//D_debug_sim_usinghhh
//10ms 不能使用,10ms是最小颗粒时长,存在误差,无法使用
#define D_Tdelay_ms D_TIMER0_50MS_COUNT//D_TIMER0_10MS_COUNT
#define D_Tdelay_100ms (D_Tdelay_ms+2)
#define D_Tdelay_200ms (D_Tdelay_ms+4)
#define D_Tdelay_300ms (D_Tdelay_ms+6)
#define D_Tdelay_400ms (D_Tdelay_ms+8)
#define D_Tdelay_1s (D_Tdelay_ms+20)
#define D_Tdelay_2s (D_Tdelay_1s*2)
#define D_Tdelay_3s (D_Tdelay_1s*3)
#define D_Tdelay_5s (D_Tdelay_1s*5)
#define D_Tdelay_10s (D_Tdelay_1s*10)
#define D_Tdelay_15s (D_Tdelay_1s*15)
#define D_Tdelay_1min (D_Tdelay_1s*60)
#define D_Tdelay_10min (D_Tdelay_1s*60 * 10)
#define D_Tdelay_1h (D_Tdelay_1min*60)
#define D_Tdelay_1day (D_Tdelay_1h*24)
#define D_TIMER0_1S_COUNT 20
//#define D_10mS 1//D_TIMER0_10MS_COUNT
//#define D_100mS (D_10mS*10)
//#define D_1S (D_10mS*100)
//>> 定时器: 初始化 间隔时间到
// L0_nos_tick10ms_start(s->times); 开始初始化s->times 以10ms为一个单位
// if( L0_nos_tick10ms_interval(s->times) < 20)// s->times 执行了20次后,也就是 定时20*10m到达
//必须配对
#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms
#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n)
#define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s
#define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n)
//>>>//必须配对
#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_50ms;
#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_50ms - time_stamp) > time_overflow)
#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x)
#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp);
//>>>示例如下:
#if 0
{
case D_task_init://
Lc_print_buf(" \r\n YL_ init");
s->step = D_AT;
L0_esp_open();
L2_task_go(D_task_YL_ready);
s_uart0_rec.ok = 0;
L2_tick_time_stamp(s->t_stamp);
// L1_task_idelay(1*D_idelay_1s); //大约6s
break;
case D_task_YL_ready:
if(1 == s_uart0_rec.ok)
{
if(strstr(s_uart0_rec.array,"ready") != NULL)
{
Ldi_print("ready..\r\n");
s->step = D_AT;
L2_task_go(D_task_YL_ask);
}
s_uart0_rec.ok = 0;
}
if(L2_tick_time_stamp(s->t_stamp,1*D_idelay_1s))
{// 时间溢出
L0_esp_close();
Ldi_print("fail esp restart.\r\n");
L2_task_go(D_task_init);
L1_task_idelay(2*D_idelay_1s);
}
break;
}
#endif
#define D_main_status_debug 2
#define D_main_status_run 3
// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔)
/// #define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断
void L1_tick_init(void);
extern void L1_tick_tick (void);
//L2_time_beat_heart(D_TBH_ch1,2,'t')
#define D_TBH_ch0 0
#define D_TBH_ch1 1
#define D_TBH_ch2 2
#define D_TBH_ch3 3
#define D_TBH_ch4 4
#define D_TBH_ch5 5
extern void L2_time_beat_heart(vU32 ch,U8 invent,U8 s);
//void L2_time_beat_heart_fun(INT32U ch,unsigned char invent,void *fun(void));
extern void L2_time_beat_heart_fun(vU32 ch,U8 invent,void (*fun)(void));
#endif /* end __tick_H */
/*****************************************************************************
** End Of File
******************************************************************************/

7
source/debug/cc_as_stc01_main.ini

@ -0,0 +1,7 @@
//MODE COM4 9600,0,8,1
//ASSIGN COM4 < SIN > SOUT
// please "dir vtreg" and show the
MODE COM2 115200,0,8,1
ASSIGN COM2 < S0IN > S0OUT
//MODE COM1 9600,0,8,1
//ASSIGN COM1 < S0IN > S0OUT

6
source/debug/cc_ls_03_debug.ini

@ -0,0 +1,6 @@
//MODE COM4 9600,0,8,1
//ASSIGN COM4 < SIN > SOUT
MODE COM6 9600,0,8,1
ASSIGN COM6 < S0IN > S0OUT
//MODE COM1 9600,0,8,1
//ASSIGN COM1 < S0IN > S0OUT

123
source/debug/debug.ini

@ -0,0 +1,123 @@
MODE COM1 9600,0,8,1
//assign com1 SOUT
ASSIGN COM1 < SIN > SOUT
//ASSIGN WIN <SIN >SOUT
KILL FUNC *
KILL BUTTON *
//swatch(0.5)
DEFINE BUTTON "adc", "adc()"
signal void adc (void) {
// while (1) { /* repeat forever */
P14= 0; /* set PORTA bit 0 */
printf("adc is on\n");
twatch(500);
//} /* repeat */
}
DEFINE BUTTON "k1 ", "k1()"
signal void k1 (void) {
P2.0= 0;
//P20= 0;
printf("K1 down\n");
swatch(0.17);
P2.0= 1;
//P20= 1;
swatch(0.17);
printf("K1 up\n");
}
DEFINE BUTTON "k2 ", "k2()"
signal void k2 (void) {
P2.1= 0;
//P21= 0;
printf("K2 down\n");
swatch(0.17);
P2.1= 1;
//P21= 1;
swatch(0.17);
printf("K2 up\n");
}
DEFINE BUTTON "k3 ", "k3()"
signal void k3 (void) {
P2.2= 0;
//P22= 0;
printf("K3 down\n");
swatch(0.07);
P2.2= 1;
//P22= 1;
swatch(0.07);
printf("K3 up\n");
}
DEFINE BUTTON "kx4 enter/", "kx4()"
signal void kx4 (void) {
P13= 0; /* set PORTA bit 0 */
printf("Kx4 down\n");
swatch(0.07);
P13= 1;
swatch(0.07);
printf("Kx4 up\n");
}
DEFINE BUTTON "<-- kx1_left ", "kx1_left()"
signal void kx1_left (void) {
P12= 0; /* set PORTA bit 0 */
printf("kx1_left down\n");
swatch(0.07);
P11= 0;
swatch(0.07);
P12= 1;
swatch(0.07);
P11= 1;
swatch(0.07);
printf("kx1_left up\n");
}
DEFINE BUTTON "kx1_right--> ", "kx1_right()"
signal void kx1_right (void) {
P11= 0; /* set PORTA bit 0 */
printf("kx1_right down\n");
swatch(0.07);
P12= 0;
swatch(0.07);
P11= 1;
swatch(0.07);
P12= 1;
swatch(0.07);
printf("kx1_right up\n");
}
DEFINE BUTTON "My Registers", "MyRegs()"
FUNC void MyRegs (void) {
printf ("---------- MyRegs() ----------\n");
printf (" R4 R8 R9 R10 R11 R12\n");
printf (" %04X %04X %04X %04X %04X %04X\n",
R0, R1, R2, R3, R4, R5);
printf ("------------------------------\n");
}
//bs write P3,1,"check_moto()"//如果有写p2的动作则会执行这个 signal函数。
//signal void check_moto (void)

45
source/debug/debug2.ini

@ -0,0 +1,45 @@
MODE COM1 9600,0,8,1
//assign com1 SOUT
ASSIGN COM1 < S0IN > S0OUT
//ASSIGN WIN <S0IN >S0OUT
//S0TIME = 0
KILL FUNC *
KILL BUTTON *
//
//AA 70 70 71 72 72 75 74 76 77 78 79 24 55
DEFINE BUTTON "master_send01","master_send01()"
signal void master_send01(void) {
printf("DD\n");
// #define rU0IIR rU0FCR /* share the same address */
//U0IIR =0x02;
// U0THR = 0x33; U0IIR =0x04; twatch(1000);
U0RBR = 0x34; U0IIR =0x04; twatch(1000);
//U0RBR=0xaa;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x71;twatch(1000);
}
DEFINE BUTTON "master_send021","master_send021()"
signal void master_send021(void) {
// printf("DD\n");
// #define rU0IIR rU0FCR /* share the same address */
//U0IIR =0x02;
// U0THR = 0x33; U0IIR =0x04; twatch(1000);
U0RBR = 0xAA; twatch(1000);
U0RBR=0x66;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x71;twatch(1000);
}

82
source/debug/debug_M3sfy.ini

@ -0,0 +1,82 @@
MODE COM1 115200,0,8,1
//assign com1 SOUT
ASSIGN COM4 < S1IN > S1OUT
//ASSIGN WIN <S0IN >S0OUT
//S0TIME = 0
KILL FUNC *
KILL BUTTON *
DEFINE BUTTON "A","key_up2()"
signal void key_up2(void)
{
//s_task_key_up.sim = 1;
s_nos_tick.t1s_heatbeart = 1;
twatch(1000);
//swatch (0.05); /* wait 50 milliseconds */
// swatch(0.1);//twatch(1000);
}
DEFINE BUTTON "V","key_down2()"
signal void key_down2(void)
{
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
twatch(1000);
s_task_key_down.up = 1;
//swatch(0.1);
// swatch(0.1);//twatch(1000);
}
DEFINE BUTTON "key_upanddown","key_upanddown()"
signal void key_upanddown(void)
{
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
// twatch(10);
s_task_key_up.down = 1;
twatch(1000);
s_task_key_down.up = 1;
// twatch(10);
s_task_key_up.up = 1;
//swatch(0.1);//
twatch(100);
}
DEFINE BUTTON "key_ent2","key_ent2()"
signal void key_ent2(void)
{
//s_task_key_up.sim = 1;
s_task_key_ent.down = 1;
twatch(1000);
s_task_key_ent.up = 1;
}
DEFINE BUTTON "key_clear","key_clear()"
signal void key_clear(void)
{
//s_task_key_up.sim = 1;
s_task_key_up.down = 0;
s_task_key_down.down = 0;
s_task_key_ent.down = 0;
s_task_key_up.up = 0;
s_task_key_down.up = 0;
s_task_key_ent.up = 0;
twatch(1000);
}

54
source/debug/debug_M3sfy2.ini

@ -0,0 +1,54 @@
MODE COM4 115200,0,8,1
//assign com1 SOUT
ASSIGN COM4 < S1IN > S1OUT
//ASSIGN WIN <S0IN >S0OUT
//S0TIME = 0
KILL FUNC *
KILL BUTTON *
//#include "key_ext.h"
DEFINE BUTTON "A","key_up2()"
signal void key_up2(void)
{
s_task_key_ext.value = 1;
twatch(100);
}
DEFINE BUTTON "V","key_down2()"
signal void key_down2(void)
{
s_task_key_ext.value = 2;
twatch(10);
}
DEFINE BUTTON "key_ent2","key_ent2()"
signal void key_ent2(void)
{
s_task_key_ext.value = 0x3;
twatch(10);
}
DEFINE BUTTON "Setup","key_setup()"
signal void key_setup(void)
{
s_task_key_ext.value = 0x12;
twatch(10);
}
DEFINE BUTTON "Adc100","Adc100()"
signal void Adc100(void)
{
s_adc_read.uiV = 100;
twatch(10);
}
DEFINE BUTTON "Adc5000","Adc5000()"
signal void Adc5000(void)
{
s_adc_read.uiV = 5000;
twatch(10);
}

130
source/debug/debug_app.c

@ -0,0 +1,130 @@
/*****************************************************************************
* uart.c: UART API file for NXP LPC17xx Family Microprocessors
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#include "target_cfg.h"
#include "type.h"
#include "time.h"
#include "uart.h"
//#include "..\Sensor.h"
#include "debug_app.h"
struct _s_task_debug_led_ s_task_debug_led;
void L2_task_debug_led_init(void)
{
D_P1_OUT(15);
D_P1_OFF(15); //指示灯
D_P1_OUT(16);
D_P1_OFF(16); //指示灯
while(0)
{
D_P1_OFF(15) ;
L0_delay_ms(600);
D_P1_ON(15) ;
L0_delay_ms(600);
L0_debugS_uc('a'); L0_USART_print(UART_debug,"\r\n");
// L2_oled_main();
}
L3_task_s_go(s_task_debug_led,D_task_debug_led_init);
}
void L2_task_debug_led_handdle(struct _s_task_debug_led_ *s)
{
switch(s->task.sh)
{
case D_task_debug_led_init://
L0_USART_print(UART_debug,"\r\n s_task_debug_led ");
L2_task_go(D_task_debug_led_key);
break;
case D_task_debug_led_key :
D_P1_ON(15);
L0_debugS_uc('^');
L2_task_go(D_task_debug_led_key2);
L1_task_idelay(D_idelay_1s);
// L0_oled_point(60,50,0x00);
//L2_debug_Au4B48347975);
break;
case D_task_debug_led_key2 :
D_P1_OFF(15);
//L0_debugS_uc('~');
#if 0
if((s->x ++)> 64)s->x =0;
if((s->y ++)> 48)s->y =0;
L0_oled_point(s->x,s->y,0xff);
#else
// L0_oled_point(60,50,0xff);
#endif
L2_task_go(D_task_debug_led_key);
L1_task_idelay(D_idelay_1s);
//L2_debug_Au4B1234567);
break;
L2_task_switch_default_idelay();
}
}
void L1_debug_rx_handle(struct _s_protocol_ *p)
{
// unsigned int i;
p->cashe[0] = p->rbr;//
if(p->num > D_s_protocol_len)
{
p->num = 0;
p->buf[p->num] = p->cashe[0];
}else
{
p->buf[p->num] = p->cashe[0];
p->num ++;
}
}
struct _s_uart_config_ s_debug_config;
#define D_debug_buf s_debug_config.puart_config->st->buf
#define D_debug_buf_d(x) s_debug_config.puart_config->st->buf[(x)]
#define D_debug_num (s_debug_config.puart_config->st->num)
void L1_debug_init(void)
{
ts_uart1.L1_uart_rx_handle = L1_debug_rx_handle;
ts_uart1.st = (struct _s_protocol_ *)&s_at1;
s_debug_config.usart = 1;
s_debug_config.puart_config = &ts_uart1;
s_debug_config.type = 0;
#if 0
while(9)
{
if(D_debug_num >= 1)
{
L0_Usend_uc(s_debug_config.usart,D_debug_buf_d(0));
D_debug_num = 0;
}
}
#endif
}
//>>>>>>>>>>>>>>>>>>>>> debug led task

44
source/debug/debug_app.h

@ -0,0 +1,44 @@
/*****************************************************************************
* uart.h: Header file for NXP LPC17xx Family Microprocessors
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#ifndef __DEBUG_APP_H
#define __DEBUG_APP_H
#include "LPC17xxcc.h"
#include "LPC17xxzlg.h"
#include "LPC17xx_macro.h"
#include "Task.h"
#include "time.h"
#include "debug_drv.h"
struct _s_task_debug_led_
{
_ts_task task;
unsigned char x;
unsigned char y;
};
extern struct _s_task_debug_led_ s_task_debug_led;
#define D_task_debug_led_init 0x10
#define D_task_debug_led_key 0x11
#define D_task_debug_led_key2 0x12
void L2_task_debug_led_init(void);
extern void L2_task_debug_led_handdle(struct _s_task_debug_led_ *s);
extern void L1_debug_init(void);
#endif /* end __DEBUG_APP_H */
/*****************************************************************************
** End Of File
******************************************************************************/

48
source/debug/debug_drv.c

@ -0,0 +1,48 @@
/*****************************************************************************
* debug_drv.c: debug app
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#include "debug_drv.h"
void L3_debug_drv_init(void)
{
L0pf_send_uc = L0_uart0_uc;
Lc_print("\r\n debug shell init:\t");
/// io 设置的标准写法
Lc_print("Mode:");
#ifdef D_debug_time
Lc_print(" debug");
#else
//D_debug_time_using
Lc_print(" normal");
#endif
}
#ifdef D_debug_sim
fff
void L3_debug_cycle(void)
{
INTERRUPT_UART();
TIMER0_IRQHandler();
}
#else
#endif
/******************************************************************************
** End Of File
******************************************************************************/

85
source/debug/debug_drv.h

@ -0,0 +1,85 @@
/*****************************************************************************
* DEBUG_DRV.h: Header file for DEBUY DRIVER FILES
*
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
******************************************************************************/
#ifndef __DEBUG_DRV_H
#define __DEBUG_DRV_H
#include "../clib/type.h"
#include "../clib/clib.h"
#include "../clib/uartlib.h"
#include "../msp/uart0.h"
#include "debug_led.h"
void L3_debug_drv_init(void);
#define L3_debug_time() L0pf_send_uc = L0_uart0_uc; ///Lc_print("\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__);
extern void L3_debug_cycle(void);
#if 0
#define UART_debug_reg ((LPC_UART1_TypeDef *) LPC_UART1_BASE )
//#define UART_debug ((LPC_UART1_TypeDef *) LPC_UART1_BASE )
//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE )
//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE )
#define UART_debug 1
#define L0_debugS_uc(x) //L0_Usend_uc(UART_debug,x)
#define L0_debugS_uc_hex(x) //L0_Usend_uc_hex(UART_debug,x)
#define L0_debug_uc_show(x,y); //L0_USART_print(UART_debug,x,y);
#define L0_debug_us_show(x,y); //L0_USART_print(UART_debug,x,y);
#define L0_debug_ul_show(x,y); //L0_USART_print(UART_debug,x,y);
//#define L2_debug_info(x) //L0_USART_print(UART_debug,x);
#define L2_debug_Au4B(x) // L0_Usend_Au4B(UART_debug,x)
#define L0_debug_Au4B_show(x,y); //L0_USART_print(UART_debug,x,y);
#define L0_debug_Aus_show(x,y); //L0_USART_print(UART_debug,x,y);
#define L0_debug_A4B_show(x,y); //L0_USART_print(UART_debug,x,y);
//#define debug22(format...) Lc_print("%s (%d): ",__FILE__,__LINE__);
//#define LOG(format, args...) Lc_print(format, ##args)
//#define RTA_printf(...) Lc_print(__VA_ARGS__)
//#define L2_debug_info Lc_print
//#define L3_debug_time() Lc_print(L0_uart0_uc,"\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__);
#define L2_debug_info(...) \
Lc_print(L0_uart_uc,__VA_ARGS__);
//do {
//Lc_print("%s (%d): ", __FILE__, __LINE__);
//Lc_print(format, __VA_ARGS__);
//} while (0)
#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
#define LOG(...) {\
Lc_print(L0_uart_uc,"%s: Line %d:\t", __FILE__, __LINE__);\
Lc_print(L0_uart_uc, __VA_ARGS__);\
Lc_print(L0_uart_uc,"\n");\
}
int main() {
int x = 3;
// 一些代码...
LOG("x = %d", x); // 2-1-5.cpp: Line 12: x = 3
}
#endif
#endif /* end __DEBUG_DRV_H */
/*****************************************************************************
** End Of File
******************************************************************************/

37
source/debug/debug_led.c

@ -0,0 +1,37 @@
/*****************************************************************************
* debug_drv.c: debug app
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
*
CC-ACC-VH02
******************************************************************************/
#include "debug_led.h"
void L3_debug_led_init(void)
{
D_led_THB_init();
D_led_debug_init();
//D_led_D0_init();
D_led_D1_init();
D_led_D2_init();
//while(0)
{
D_led_THB_REV();
D_led_debug_REV();
D_led_D1_REV();
D_led_D2_REV();
}
}
/******************************************************************************
** End Of File
******************************************************************************/

138
source/debug/debug_led.h

@ -0,0 +1,138 @@
/*****************************************************************************
* DEBUG_DRV.h: Header file for DEBUY DRIVER FILES
*
*
* Copyright(C) 2013, cc
* All rights reserved.
*
* History
* 2013.05.24 ver 1.00 Prelimnary version, first Release
20160413 CC-ACC-VH02
led pin33 P22 LED
P16 P17
******************************************************************************/
#ifndef __DEBUG_LED_H
#define __DEBUG_LED_H
#include "../clib/type.h"
#include "../bsp/type_hs.h"
///P22是timer heratbeat
#define D_led_THB BIT2
#define D_led_THB_SEL0 P2_SEL0
#define D_led_THB_SEL1 P2_SEL1
#define D_led_THB_SEL2 P2_SEL2
#define D_led_THB_DIR P2_DIR
#define D_led_THB_REV() D_P22_REV()
#define D_led_THB_ON() P22 = 1
#define D_led_THB_OFF() P22 = 0
#define D_led_THB_init() \
BITN_0(D_led_THB_SEL2,(D_led_THB));\
BITN_0(D_led_THB_SEL1,(D_led_THB));\
BITN_0(D_led_THB_SEL0,(D_led_THB));\
BITN_0(D_led_THB_DIR, (D_led_THB)); // led_debug output
//>>>>>>>>>>>>>>>>CC-ACC-VH02 管脚空闲
///P23是debug端口
#define D_led_debug BIT3
#define D_led_debug_SEL0 P2_SEL0
#define D_led_debug_SEL1 P2_SEL1
#define D_led_debug_SEL2 P2_SEL2
#define D_led_debug_DIR P2_DIR
#define D_led_debug_REV() D_P23_REV()
#define D_led_debug_ON() P23 = 1
#define D_led_debug_OFF() P23 = 0
#define D_led_debug_init() \
BITN_0(D_led_debug_SEL2,(D_led_debug));\
BITN_0(D_led_debug_SEL1,(D_led_debug));\
BITN_0(D_led_debug_SEL0,(D_led_debug));\
BITN_0(D_led_debug_DIR,( D_led_debug)); // led_debug output
///P24是debug
#define D_led_D1 BIT4
#define D_led_D1_SEL0 P2_SEL0
#define D_led_D1_SEL1 P2_SEL1
#define D_led_D1_DIR P2_DIR
#define D_led_D1_REV() D_P24_REV()
#define D_led_D1_ON() P24 = 0
#define D_led_D1_OFF() P24 = 1
#define D_led_D1_init() D_led_D1_OFF();\
BITN_0(D_led_D1_SEL1,(D_led_D1));\
BITN_0(D_led_D1_SEL0,(D_led_D1));\
BITN_0(D_led_D1_DIR, (D_led_D1));\
BITN_0(P2_PE, (D_led_D1));\
BITN_1(P2_DS, (D_led_D1));\
BITN_0(P2_OD, (D_led_D1)); //CMOS or push_Pull
///PE上拉 OD推挽输出ds= 电流增强
///P25是debug
#define D_led_D2 BIT5
#define D_led_D2_SEL0 P2_SEL0
#define D_led_D2_SEL1 P2_SEL1
#define D_led_D2_DIR P2_DIR
#define D_led_D2_REV() D_P25_REV()
#define D_led_D2_ON() P25 = 0
#define D_led_D2_OFF() P25 = 1
#define D_led_D2_init() D_led_D2_OFF();\
BITN_0(D_led_D2_SEL1,(D_led_D2));\
BITN_0(D_led_D2_SEL0,(D_led_D2));\
BITN_0(D_led_D2_DIR, (D_led_D2));\
BITN_0(P2_PE, (D_led_D2));\
BITN_1(P2_DS, (D_led_D2));\
BITN_0(P2_OD, (D_led_D2)); //CMOS or push_Pull
///PE=1上拉 OD=0推挽输出 ds=1 电流增强
// 仿linux做一个errono的结构体 用来保存当前的错误信息
struct _s_errorno_
{
int errono;
char *errostr;
};
//#define D_debug_time
#ifdef D_debug
#define D_debug_sim
#define D_debug_spi_sim
#define D_debug_time
#define D_debug_time_using
#define D_debug_sim_using
#define D_debug_key
#define D_debug_adc
#define D_debug_lcd
#define D_debug_flash
#endif
extern void L3_debug_led_init(void);
#endif /* end __DEBUG_LED_H */
/*****************************************************************************
** End Of File
******************************************************************************/

BIN
source/debug/testiic.uvla

Binary file not shown.

66
source/debug/复制 2debug_M3sfy.ini

@ -0,0 +1,66 @@
//MODE COM1 9600,0,8,1
//assign com1 SOUT
//ASSIGN COM1 < S0IN > S0OUT
//ASSIGN WIN <S0IN >S0OUT
//S0TIME = 0
KILL FUNC *
KILL BUTTON *
DEFINE BUTTON "key_up","key_up()"
signal void key_up(void)
{
//s_task_key_up.sim = 1;
s_task_key_up.down = 1;
//swatch(0.1);
twatch(1000);
//swatch (0.05); /* wait 50 milliseconds */
s_task_key_up.up = 1;
// swatch(0.1);//twatch(1000);
}
DEFINE BUTTON "key_down","key_down()"
signal void key_down(void)
{
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
swatch(0.1);
//twatch(1000);
s_task_key_down.up = 1;
// swatch(0.1);//twatch(1000);
}
DEFINE BUTTON "key_upanddown","key_upanddown()"
signal void key_upanddown(void)
{
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
// twatch(10);
s_task_key_up.down = 1;
twatch(1000);
s_task_key_down.up = 1;
// twatch(10);
s_task_key_up.up = 1;
swatch(0.1);//twatch(1000);
}
DEFINE BUTTON "key_ent","key_ent()"
signal void key_ent(void)
{
//s_task_key_up.sim = 1;
s_task_key_ent.down = 1;
twatch(1000);
s_task_key_ent.up = 1;
}

129
source/debug/复制 debug_M3sfy.ini

@ -0,0 +1,129 @@
//MODE COM1 9600,0,8,1
//assign com1 SOUT
//ASSIGN COM1 < S0IN > S0OUT
//ASSIGN WIN <S0IN >S0OUT
//S0TIME = 0
KILL FUNC *
KILL BUTTON *
DEFINE BUTTON "key_up","key_up()"
signal void key_up(void) {
//s_task_key_up.sim = 1;
s_task_key_up.down = 1;
twatch(1000);
s_task_key_up.up = 1;
}
DEFINE BUTTON "key_down","key_down()"
signal void key_down(void) {
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
twatch(1000);
s_task_key_down.up = 1;
}
DEFINE BUTTON "key_upanddown","key_upanddown()"
signal void key_upanddown(void) {
//s_task_key_up.sim = 1;
s_task_key_down.down = 1;
// twatch(10);
s_task_key_up.down = 1;
twatch(1000);
s_task_key_down.up = 1;
// twatch(10);
s_task_key_up.up = 1;
}
}
DEFINE BUTTON "key_ent","key_ent()"
signal void key_ent(void) {
//s_task_key_up.sim = 1;
s_task_key_ent.down = 1;
twatch(1000);
s_task_key_ent.up = 1;
}
DEFINE BUTTON "key_up","key_up()"
signal void key_up(void) {
U1THR = 'e';
//LPC_GPIO1->FIOSET |= (1<<18);
FIO1SET|= (1<<18);
twatch(1000);
//U0RBR=0xaa;twatch(1000);
//U0RBR=0x70;twatch(1000);
}
DEFINE BUTTON "key_down","key_down()"
signal void key_down(void) {
printf("key down\n");
FIO1CLR|= (1<<18);
twatch(1000);
//U0RBR=0xaa;twatch(1000);
//U0RBR=0x70;twatch(1000);
}
//AA 70 70 71 72 72 75 74 76 77 78 79 24 55
DEFINE BUTTON "master_send01","master_send01()"
signal void master_send01(void) {
printf("DD\n");
// #define rU0IIR rU0FCR /* share the same address */
//U0IIR =0x02;
// U0THR = 0x33; U0IIR =0x04; twatch(1000);
U0RBR = 0x34; U0IIR =0x04; twatch(1000);
//U0RBR=0xaa;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x71;twatch(1000);
}
DEFINE BUTTON "master_send021","master_send021()"
signal void master_send021(void) {
// printf("DD\n");
// #define rU0IIR rU0FCR /* share the same address */
//U0IIR =0x02;
// U0THR = 0x33; U0IIR =0x04; twatch(1000);
U0RBR = 0xAA; twatch(1000);
U0RBR=0x66;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x70;twatch(1000);
//U0RBR=0x71;twatch(1000);
}
int SendChar (int ch)
{
//while (!(USART1->SR & USART_FLAG_TXE));
U1THR = (ch & 0x1FF);
twatch(200);
return (ch);
}
int GetKey (void)
{
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}

287
source/msp/UART0.C

@ -0,0 +1,287 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart0.h"
#include "uart2.h"
#include "uart3.h"
#include "uart4.h"
#include <stdio.h>
struct _s_protocol_ s_at0;
struct _s_uart0_send_buf_ s_uart0_send_shop;
struct _s_uart0_send_buf_ s_uart0_send_depot;
#define FOSC 11059200UL
#define BRT (256 - FOSC / 115200 / 32) ///定时器1 模式2 做串口波特率
///#define Debug_with_keil_sim
#ifdef Debug_with_keil_sim
void L0_uart0_init(void)
{
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
EA = 1;
AUXR = 0x40;
// TI = 0;
RI = 0;
D_uart0_ES_INT(1); //打开串口中断
}
#else
void L0_uart0_init(void)
{// 19200
///定时器1 模式2 做串口波特率
SCON = 0x50;
TMOD = 0x20;
TL1 = BRT;
TH1 = BRT;
TR1 = 1;
AUXR = 0x40;
TI = 0;
RI = 0;
D_uart0_ES_INT(1); //打开串口中断
}
#endif
#if 0
void L0_uart0_init(void)
{// 19200
//------------------------------------------------
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
// TL1 = 0x70; //设定定时初值
// TH1 = 0xFF; //设定定时初值
//115200
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI = 0;
D_uart0_ES_INT(1); //打开串口中断
void UartInit(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
#endif
void L1_uart0_buf_init(void)
{
s_uart0_send_depot.p = s_uart0_send_depot.buf;
s_uart0_send_shop.now = 0;
L0_uart0_init();
}
void L0_uart0_uc(U8 ww)
{
s_uart0_send_depot.max = 1;
s_uart0_send_depot.buf[0] = ww;
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
void L0_uart0_us(U16 ww)
{
L0_uart0_uc(ww >> 8 & 0xFF);
L0_uart0_uc(ww >> 0 & 0xFF);
}
void L0_uart0_0d0a(void)
{
s_uart0_send_depot.max = 2;
s_uart0_send_depot.buf[0] = 0x0d;
s_uart0_send_depot.buf[1] = 0x0a;
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
// L0_uart0_uc(cguHex2Char[D_uc_low(s->sec)][0]);
void L0_uart0_uchex(U8 ww)
{
s_uart0_send_depot.max = 2;
s_uart0_send_depot.buf[0] = cguHex2Char[D_uc_low(ww)][1];
s_uart0_send_depot.buf[1] = cguHex2Char[D_uc_high(ww)][1];
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
void L0_uart0_ulhex(vU32 ww)
{
U_U32 ultemp;
ultemp.dWord = ww;
L0_uart0_uchex(ultemp.BYTE4.byte0);
L0_uart0_uchex(ultemp.BYTE4.byte1);
L0_uart0_uchex(ultemp.BYTE4.byte2);
L0_uart0_uchex(ultemp.BYTE4.byte3);
}
void L0_uart0_sendstr(U8 *str)
{
//L0_uart0_sendbuf(str,strlen(str));
s_uart0_send_depot.max = strlen(str);
s_uart0_send_depot.p = str;
L0_uart0_sendbuf();
}
void L0_uart0_sendArray(U8 *buf,U8 len)
{
//L0_uart0_sendbuf(str,strlen(str));
s_uart0_send_depot.max = len;
s_uart0_send_depot.p = buf;
L0_uart0_sendbuf();
}
// 发送buf数组 中的0----(num-1)
void L0_uart0_sendbuf(void)
{
register unsigned char n = 0;
if(s_uart0_send_depot.max>= D_send_buf_max)
{
s_uart0_send_depot.max = D_send_buf_max - 1;
}
D_uart0_ES_INT(0);
if(0 == s_uart0_send_shop.now)
{/// 上次的已经发送完毕了,或者第一次开始
/// (s_uart0_send_shop.now == s_uart0_send_shop.max = 0 buf中为空)
for(n = 0;n < s_uart0_send_depot.max; n++)
{
s_uart0_send_shop.buf[n] = s_uart0_send_depot.p[n];
}
s_uart0_send_shop.max = s_uart0_send_depot.max;
L0_uart0_IntTIClear();
s_uart0_send_shop.now = 1;
///D_uart0_ES_INT(1);
L0_uart0_set(s_uart0_send_shop.buf[0]);
}else
{// 需要插入
/// [0]--?--[pool.now]--?--[pool.max-1].......................................
/// [0]--?--[pool.now]--?--[pool.max]+[bath.0]--?---[bath.max-1].............
for(n = 0;n < s_uart0_send_depot.max; n++)
{
s_uart0_send_shop.buf[s_uart0_send_shop.max] = s_uart0_send_depot.p[n];
s_uart0_send_shop.max ++;
if(s_uart0_send_shop.max >= D_send_buf_max)
{
s_uart0_send_shop.max = D_send_buf_max - 1;
}
}
}
D_uart0_ES_INT(1);
}
/*************************************************
UART
*************************************************/
#define D_SERVE_UART interrupt 4
void INTERRUPT_UART(void) D_SERVE_UART// using 2
{
D_uart0_ES_INT(0);
//------------------------------------------------
if(L0_uart0_IntRI()) //如果是U0接收中断
{L0_uart0_IntRIClear(); //清除接收中断标志
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>用户程序 添加协议>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// output: 对应的结构体变量中携带 缓存buf和协议ok的标志
//s_uart0_rec.reg = L0_uart0_get();
//s_uart0_rec.ok = 1;
Lp0_uart0_fun(L0_uart0_get());
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//------------------------------------------------------------
else
{
if(L0_uart0_IntTI()) //如果是U0发送中断
{L0_uart0_IntTIClear(); //清除发送中断标志
if(s_uart0_send_shop.max != s_uart0_send_shop.now)
{
L0_uart0_set(s_uart0_send_shop.buf[s_uart0_send_shop.now]);
s_uart0_send_shop.now ++;
}else
{
s_uart0_send_shop.max = 0;
s_uart0_send_shop.now = 0;//可以发送下一个数据
}
}
}
D_uart0_ES_INT(1);
}

288
source/msp/UART0.C.bak

@ -0,0 +1,288 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart0.h"
#include "uart2.h"
#include "uart3.h"
#include "uart4.h"
#include <stdio.h>
struct _s_protocol_ s_at0;
struct _s_uart0_send_buf_ s_uart0_send_shop;
struct _s_uart0_send_buf_ s_uart0_send_depot;
#define FOSC 11059200UL
#define BRT (256 - FOSC / 115200 / 32) ///定时器1 模式2 做串口波特率
///#define Debug_with_keil_sim
#ifdef Debug_with_keil_sim
void L0_uart0_init(void)
{
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
EA = 1;
AUXR = 0x40;
// TI = 0;
RI = 0;
D_uart0_ES_INT(1); //打开串口中断
}
#else
void L0_uart0_init(void)
{// 19200
///定时器1 模式2 做串口波特率
SCON = 0x50;
TMOD = 0x20;
TL1 = BRT;
TH1 = BRT;
TR1 = 1;
AUXR = 0x40;
TI = 0;
RI = 0;
D_uart0_ES_INT(1); //打开串口中断
}
#endif
#if 0
void L0_uart0_init(void)
{// 19200
//------------------------------------------------
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
// TL1 = 0x70; //设定定时初值
// TH1 = 0xFF; //设定定时初值
//115200
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI = 0;
D_uart0_ES_INT(1); //打开串口中断
void UartInit(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xE8; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
#endif
void L1_uart0_buf_init(void)
{
s_uart0_send_depot.p = s_uart0_send_depot.buf;
s_uart0_send_shop.now = 0;
L0_uart0_init();
}
void L0_uart0_uc(U8 ww)
{
s_uart0_send_depot.max = 1;
s_uart0_send_depot.buf[0] = ww;
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
void L0_uart0_us(U16 ww)
{
L0_uart0_uc(ww >> 8 & 0xFF);
L0_uart0_uc(ww >> 0 & 0xFF);
}
void L0_uart0_0d0a(void)
{
s_uart0_send_depot.max = 2;
s_uart0_send_depot.buf[0] = 0x0d;
s_uart0_send_depot.buf[1] = 0x0a;
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
// L0_uart0_uc(cguHex2Char[D_uc_low(s->sec)][0]);
void L0_uart0_uchex(U8 ww)
{
s_uart0_send_depot.max = 2;
s_uart0_send_depot.buf[0] = cguHex2Char[D_uc_low(ww)][1];
s_uart0_send_depot.buf[1] = cguHex2Char[D_uc_high(ww)][1];
s_uart0_send_depot.p = s_uart0_send_depot.buf;
L0_uart0_sendbuf();
}
void L0_uart0_ulhex(vU32 ww)
{
U_U32 ultemp;
ultemp.dWord = ww;
L0_uart0_uchex(ultemp.BYTE4.byte0);
L0_uart0_uchex(ultemp.BYTE4.byte1);
L0_uart0_uchex(ultemp.BYTE4.byte2);
L0_uart0_uchex(ultemp.BYTE4.byte3);
}
void L0_uart0_sendstr(U8 *str)
{
//L0_uart0_sendbuf(str,strlen(str));
s_uart0_send_depot.max = strlen(str);
s_uart0_send_depot.p = str;
L0_uart0_sendbuf();
}
void L0_uart0_sendArray(U8 *buf,U8 len)
{
//L0_uart0_sendbuf(str,strlen(str));
s_uart0_send_depot.max = len;
s_uart0_send_depot.p = buf;
L0_uart0_sendbuf();
}
// 发送buf数组 中的0----(num-1)
void L0_uart0_sendbuf(void)
{
register unsigned char n = 0;
if(s_uart0_send_depot.max>= D_send_buf_max)
{
s_uart0_send_depot.max = D_send_buf_max - 1;
}
D_uart0_ES_INT(0);
if(0 == s_uart0_send_shop.now)
{/// 上次的已经发送完毕了,或者第一次开始
/// (s_uart0_send_shop.now == s_uart0_send_shop.max = 0 buf中为空)
for(n = 0;n < s_uart0_send_depot.max; n++)
{
s_uart0_send_shop.buf[n] = s_uart0_send_depot.p[n];
}
s_uart0_send_shop.max = s_uart0_send_depot.max;
L0_uart0_IntTIClear();
s_uart0_send_shop.now = 1;
///D_uart0_ES_INT(1);
L0_uart0_set(s_uart0_send_shop.buf[0]);
}else
{// 需要插入
/// [0]--?--[pool.now]--?--[pool.max-1].......................................
/// [0]--?--[pool.now]--?--[pool.max]+[bath.0]--?---[bath.max-1].............
for(n = 0;n < s_uart0_send_depot.max; n++)
{
s_uart0_send_shop.buf[s_uart0_send_shop.max] = s_uart0_send_depot.p[n];
s_uart0_send_shop.max ++;
if(s_uart0_send_shop.max >= D_send_buf_max)
{
s_uart0_send_shop.max = D_send_buf_max - 1;
}
}
}
D_uart0_ES_INT(1);
}
/*************************************************
UART
*************************************************/
#define D_SERVE_UART interrupt 4
void INTERRUPT_UART(void) D_SERVE_UART// using 2
{
D_uart0_ES_INT(0);
//------------------------------------------------
if(L0_uart0_IntRI()) //如果是U0接收中断
{L0_uart0_IntRIClear(); //清除接收中断标志
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>用户程序 添加协议>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// output: 对应的结构体变量中携带 缓存buf和协议ok的标志
//s_uart0_rec.reg = L0_uart0_get();
//s_uart0_rec.ok = 1;
Lp0_uart0_fun(L0_uart0_get());
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//------------------------------------------------------------
else
{
if(L0_uart0_IntTI()) //如果是U0发送中断
{L0_uart0_IntTIClear(); //清除发送中断标志
if(s_uart0_send_shop.max != s_uart0_send_shop.now)
{
L0_uart0_set(s_uart0_send_shop.buf[s_uart0_send_shop.now]);
s_uart0_send_shop.now ++;
}else
{
s_uart0_send_shop.max = 0;
s_uart0_send_shop.now = 0;//可以发送下一个数据
}
}
}
D_uart0_ES_INT(1);
}

117
source/msp/UART0.h

@ -0,0 +1,117 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uart0_H
#define _uart0_H
#include "../bsp/bsp_config.h"
//#include "../bsp/type_hs.h"
//#include "../debug/debug_drv.h"
//#include "../uartcom/urec2protocol.h"
//?include "../uartcom/uprotocol2app.h"
#define Ldi_print(x) Lc_print_buf(x)
//#include "../uartcom/UProtocol.h"
#include "../ctask/task.h"
#include "../clib/Clib.h"
//#define D_s_uart0_rec_close(); s_uart0_rec.ok = 2;// 关闭串口协议解析
//#define D_s_uart0_rec_open(); s_uart0_rec.ok = 0;// 关闭串口协议解析
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define D_send_buf_max 64 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
struct _s_uart0_send_buf_
{//8byte
U8 num; //接收到的数目注意数据长度的范围
U8 *p;
U8 now; /// 当前buf所在的位置 0------(max-1)
U8 max; /// 当前buf的最大值,也就是需要发送的长度
U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度
};
extern struct _s_uart0_send_buf_ s_uart0_send_shop;
extern struct _s_uart0_send_buf_ s_uart0_send_depot;
#define D_uart0_ES_INT(x) ES = (x)
#define L0_uart0_IntRI() (RI)//BITN_G(SCON,U0RI)
#define L0_uart0_IntTI() (TI)//BITN_G(SCON,U0TI)
#define L0_uart0_IntRIClear(); RI = 0;//BITN_0(SCON,U0RI)
#define L0_uart0_IntTIClear(); TI = 0;//BITN_0(SCON,U0TI)
#define L0_uart0_set(x) SBUF = (x);
#define L0_uart0_get() (SBUF)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L1_uart0_buf_init(void);
extern void L0_uart0_init(void);
extern void L0_uart0_uchex(U8 ww);
extern void L0_uart0_ulhex(vU32 ww);
extern void L0_uart0_us(U16 ww);
extern void L0_uart0_ul(vU32 ww);
extern void L0_uart0_sendstr(U8 *str);
extern void L0_uart0_0d0a(void);
extern void L0_uart0_uc(U8 ww);
///////////////////////////////////////////////////////////////
extern void L0_uart0_sendArray(U8 *buf,U8 len);
extern void L0_uart0_sendbuf(void);
#endif //#ifndef _uart0_H

228
source/msp/UART1.C

@ -0,0 +1,228 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BIT1; //p5.1输出TXD
//P5_DIR |= BIT0; //p5.0输入RXD
//P5_SEL0 &= ~(BIT0 +BIT1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BIT0 +BIT1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_protocol_ ()------struct _s_protocol_
void L1_uart_2buf(struct _s_protocol_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart0.h"
struct _s_protocol_ s_at0;
struct _s_send_buf_ s_send_pool;
struct _s_send_buf_ s_send_bath;
U8 L0_uart0_get(void){return SBUF;}
//#define D_uart_baudrate(X) PCON |= U0BRD; (256 - s_sys_para.sys_clock * (1 + 1) / (32 * X))
sbit led =P0^4;
void L0_uart0_init(void)
{
//UART初始化
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
// AUXR |= 0x40; //定时器1时钟为Fosc,即1T 去掉为9600
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
// 0 1 0 1
// b7 b6 5 4 , 3 2 1 0
// 0
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
//L0_uart0_IntTIClear();
//L0_uart0_IntSendStart();
L0_uart0_IntSendOver();
TI = 0;
ES = 1; //打开串口中断
s_send_bath.p = s_send_bath.buf;
}
void L0_uart0_uc(U8 ww)
{
s_send_bath.max = 1;
s_send_bath.buf[0] = ww;
s_send_bath.p = s_send_bath.buf;
L0_uart0_sendbuf();
}
void L0_uart0_0d0a(void)
{
s_send_bath.max = 2;
s_send_bath.buf[0] = 0x0d;
s_send_bath.buf[1] = 0x0a;
s_send_bath.p = s_send_bath.buf;
L0_uart0_sendbuf();
}
// L0_uart0_uc(cguHex2Char[D_uc_low(s->sec)][0]);
void L0_uart0_uchex(U8 ww)
{
s_send_bath.max = 2;
s_send_bath.buf[0] = cguHex2Char[D_uc_low(ww)][1];
s_send_bath.buf[1] = cguHex2Char[D_uc_high(ww)][1];
s_send_bath.p = s_send_bath.buf;
L0_uart0_sendbuf();
}
void L0_uart0_ulhex(vU32 ww)
{
U_U32 ultemp;
ultemp.dWord = ww;
L0_uart0_uchex(ultemp.BYTE4.byte0);
L0_uart0_uchex(ultemp.BYTE4.byte1);
L0_uart0_uchex(ultemp.BYTE4.byte2);
L0_uart0_uchex(ultemp.BYTE4.byte3);
}
#define D_SERVE_UART interrupt 4
/*************************************************
UART
*************************************************/
void INTERRUPT_UART(void) D_SERVE_UART// using 2
{
D_51_REG_ES(0);
//------------------------------------------------
if(L0_uart0_IntRI()) //如果是U0接收中断
{L0_uart0_IntRIClear(); //清除接收中断标志
//L1_uart_2buf(&s_at0);
L1_uart_2strbuf(&s_at0);
//D_led_D2_REV();
}
//------------------------------------------------
else
{
if(L0_uart0_IntTI()) //如果是U0发送中断
{L0_uart0_IntTIClear(); //清除发送中断标志
if(s_send_pool.max != s_send_pool.now)
{
L0_uart0_set(s_send_pool.buf[s_send_pool.now]);
s_send_pool.now ++;
}else
{
s_send_pool.max = 0;s_send_pool.now = 0;
L0_uart0_IntSendOver(); //可以发送下一个数据
}
}
}
D_51_REG_ES(1);
}
#define D_task_uart0_0 0x10
#define D_task_uart0_buf_send 0x11
#define D_task_uart0_buf_pre 0x12
#define D_task_uart0_buf_over 0x13
//U8 packagea[] = "AT+CIPSEND=251\r\n";
void L0_uart0_sendstr(U8 *str)
{
//L0_uart0_sendbuf(str,strlen(str));
s_send_bath.max = strlen(str);
s_send_bath.p = str;
L0_uart0_sendbuf();
}
// 发送buf数组 中的0----(num-1)
void L0_uart0_sendbuf(void)
{
unsigned char n = 0;
//s_send_bath.max = 1;
//s_send_bath.0 = 1;
//s_send_bath.buf[0] = ww;
/// s_send_bath.buf s_send_bath.max 已经在调用前写入
if(s_send_bath.max>= D_send_buf_max)
{
s_send_bath.max = 3;
}
ES = 0;
if(L0_uart0_SendIntFree())
{/// 上次的已经发送完毕了,或者第一次开始
/// (s_send_pool.now == s_send_pool.max = 0 buf中为空)
for(n = 0;n < s_send_bath.max; n++)
{
s_send_pool.buf[n] = s_send_bath.p[n];
}
//s_send_pool.now = 0;
s_send_pool.max = s_send_bath.max;
L0_uart0_IntTIClear();
L0_uart0_IntSendStart();
s_send_pool.now = 1;
L0_uart0_set(s_send_pool.buf[0]);
}else
{// 需要插入
/// [0]--?--[pool.now]--?--[pool.max-1].......................................
/// [0]--?--[pool.now]--?--[pool.max]+[bath.0]--?---[bath.max-1].............
for(n = 0;n < s_send_bath.max; n++)
{
s_send_pool.buf[s_send_pool.max] = s_send_bath.p[n];
s_send_pool.max ++;
if(s_send_pool.max >= D_send_buf_max)
{
s_send_pool.max = D_send_buf_max;
}
}
}
ES = 1;
}

246
source/msp/UART2.c

@ -0,0 +1,246 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart2.h"
#include "../bsp/bsp_485.h"
struct _s_uart2_send_buf_ s_uart2_send_shop;
struct _s_uart2_send_buf_ s_uart2_send_depot;
#define FOSC 11059200L //系统频率
//#define BAUD2 4800 //串口波特率
//#define BAUD2 9600 //串口波特率
#define BAUD2 115200 //串口波特率
void L0_uart2_init(void)
{
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE8; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
//设置txd2为强推挽
BITN_1(P1M0,BITN1); BITN_0(P1M1,BITN1);//P11
//对于433模块,CPU可以控制的情况下需要拉低(PWDN),
//如果不能控制需要人为短路
D_uart2_ES_INT_OPEN(); //打开串口中断
}
void L1_uart2_buf_init(void)
{
s_uart2_send_depot.p = s_uart2_send_depot.buf;
s_uart2_send_shop.now = 0;
L0_uart2_init();
}
void L0_uart2_uc(U8 ww)
{
s_uart2_send_depot.max = 1;
s_uart2_send_depot.buf[0] = ww;
s_uart2_send_depot.p = s_uart2_send_depot.buf;
L0_uart2_sendbuf();
}
void L0_uart2_sendstr(U8 *str)
{
//L0_uart2_sendbuf(str,strlen(str));
s_uart2_send_depot.max = strlen(str);
s_uart2_send_depot.p = str;
L0_uart2_sendbuf();
}
void L0_uart2_sendArray(void *buf,U8 len)
{
D_485_TX(); //切换到输出状态
//L0_uart2_sendbuf(str,strlen(str));
s_uart2_send_depot.max = len;
s_uart2_send_depot.p = buf;
L0_uart2_sendbuf();
}
// 发送buf数组 中的0----(num-1)
void L0_uart2_sendbuf(void)
{
register unsigned char n = 0;
if(s_uart2_send_depot.max >= D_send2_buf_max)
{
s_uart2_send_depot.max = 3;
}
D_uart2_ES_INT_CLOSE();
if(0 == s_uart2_send_shop.now)
{/// 上次的已经发送完毕了,或者第一次开始
/// (s_uart2_send_shop.now == s_uart2_send_shop.max = 0 buf中为空)
for(n = 0;n < s_uart2_send_depot.max; n++)
{
s_uart2_send_shop.buf[n] = s_uart2_send_depot.p[n];
}
s_uart2_send_shop.max = s_uart2_send_depot.max;
L0_uart2_IntTIClear();
s_uart2_send_shop.now = 1;
L0_uart2_set(s_uart2_send_shop.buf[0]);
}else
{// 需要插入
/// [0]--?--[pool.now]--?--[pool.max-1].......................................
/// [0]--?--[pool.now]--?--[pool.max]+[bath.0]--?---[bath.max-1].............
for(n = 0;n < s_uart2_send_depot.max; n++)
{
s_uart2_send_shop.buf[s_uart2_send_shop.max] = s_uart2_send_depot.p[n];
s_uart2_send_shop.max ++;
if(s_uart2_send_shop.max >= D_send2_buf_max)
{
s_uart2_send_shop.max = D_send2_buf_max;
}
}
}
D_uart2_ES_INT_OPEN();
}
/*************************************************
UART
*************************************************/
#define D_SERVE_uart2 interrupt 8
void INTERRUPT_uart2(void) D_SERVE_uart2// using 2
{
D_uart2_ES_INT_CLOSE();
//------------------------------------------------
if(L0_uart2_IntRI()) //如果是U0接收中断
{L0_uart2_IntRIClear(); //清除接收中断标志
//UART0_PUTCHAR('%');
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>用户程序 添加协议>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// input: 解析协议函数 和对应的结构体变量
/// output: 对应的结构体变量中携带 缓存buf和协议ok的标志
//s_uart2_rec.reg = L0_uart2_get();
//s_uart2_rec.ok = 1;
(*Lp0_uart2_fun)(L0_uart2_get());
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
//------------------------------------------------
else
{
if(L0_uart2_IntTI()) //如果是U0发送中断
{
L0_uart2_IntTIClear(); //清除发送中断标志
#if 1 //433焊反 txd2->rxd2短路,暂时禁止发送数据,以免冲突
if(s_uart2_send_shop.max != s_uart2_send_shop.now)
{
L0_uart2_set(s_uart2_send_shop.buf[s_uart2_send_shop.now]);
s_uart2_send_shop.now ++;
}else
{
s_uart2_send_shop.max = 0;
s_uart2_send_shop.now = 0;//可以发送下一个数据
D_485_RX();
}
#endif
}
}
D_uart2_ES_INT_OPEN();
}
#if 0
void L0_uart2_0d0a(void)
{
s_uart2_send_depot.max = 2;
s_uart2_send_depot.buf[0] = 0x0d;
s_uart2_send_depot.buf[1] = 0x0a;
s_uart2_send_depot.p = s_uart2_send_depot.buf;
L0_uart2_sendbuf();
}
// L0_uart2_uc(cguHex2Char[D_uc_low(s->sec)][0]);
void L0_uart2_uchex(U8 ww)
{
s_uart2_send_depot.max = 2;
s_uart2_send_depot.buf[0] = cguHex2Char[D_uc_low(ww)][1];
s_uart2_send_depot.buf[1] = cguHex2Char[D_uc_high(ww)][1];
s_uart2_send_depot.p = s_uart2_send_depot.buf;
L0_uart2_sendbuf();
}
void L0_uart2_ulhex(vU32 ww)
{
U_U32 ultemp;
ultemp.dWord = ww;
L0_uart2_uchex(ultemp.BYTE4.byte0);
L0_uart2_uchex(ultemp.BYTE4.byte1);
L0_uart2_uchex(ultemp.BYTE4.byte2);
L0_uart2_uchex(ultemp.BYTE4.byte3);
}
void L0_uart2_sendstr(U8 *str)
{
//L0_uart2_sendbuf(str,strlen(str));
s_uart2_send_depot.max = strlen(str);
s_uart2_send_depot.p = str;
L0_uart2_sendbuf();
}
#endif

114
source/msp/UART2.h

@ -0,0 +1,114 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uart2_H
#define _uart2_H
#include "../bsp/bsp_config.h"
//#include "../bsp/type_hs.h"
//#include "../debug/debug_drv.h"
//#include "../uartcom/urec2protocol.h"
//?include "../uartcom/uprotocol2app.h"
#include "../ctask/task.h"
#include "../clib/Clib.h"
#define D_s_uart2_rec_close(); s_uart2_rec.ok = 2;// 关闭串口协议解析
#define D_s_uart2_rec_open(); s_uart2_rec.ok = 0;// 关闭串口协议解析
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define D_send2_buf_max 64 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
struct _s_uart2_send_buf_
{//8byte
U8 num; //接收到的数目注意数据长度的范围
U8 *p;
U8 now; /// 当前buf所在的位置 0------(max-1)
U8 max; /// 当前buf的最大值,也就是需要发送的长度
U8 buf[D_send2_buf_max + 1];//buffer 的第一位是 长度
};
extern struct _s_uart2_send_buf_ s_uart2_send_shop;
extern struct _s_uart2_send_buf_ s_uart2_send_depot;
//#define S4SM0 BITN7
#define D_uart2_ES_INT_CLOSE() BITN_0(IE2,ES2)
#define D_uart2_ES_INT_OPEN() BITN_1(IE2,ES2)
#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI)
#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI)
#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI)
#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI)
#define L0_uart2_set(x) S2BUF = (x);
#define L0_uart2_get() (S2BUF)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L1_uart2_buf_init(void);
extern void L0_uart2_init(void);
extern void L0_uart2_uchex(U8 ww);
extern void L0_uart2_ulhex(vU32 ww);
extern void L0_uart2_ul(vU32 ww);
extern void L0_uart2_sendstr(U8 *str);
extern void L0_uart2_0d0a(void);
extern void L0_uart2_uc(U8 ww);
extern void L0_uart2_sendstr(U8 *str);
extern void L0_uart2_sendArray(void *buf,U8 len);
///////////////////////////////////////////////////////////////
extern void L0_uart2_sendbuf16(U8 buf[],vU16 num);
extern void L0_uart2_sendbuf(void);
#endif //#ifndef _uart2_H

228
source/msp/UART3.c

@ -0,0 +1,228 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
// 20160413 CC-ACC-VH02
// 连接至 J22 RXD0 TXD0
//P5_DIR &= ~BITN1; //p5.1输出TXD
//P5_DIR |= BITN0; //p5.0输入RXD
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
//P5_SEL1 |= BITN0 +BITN1;
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#include "uart3.h"
#include <stdio.h>
//struct _s_protocol_ s_at0;
struct _s_uart3_send_buf_ s_uart3_send_shop;
struct _s_uart3_send_buf_ s_uart3_send_depot;
#define FOSC 11059200UL
#define BRT (256 - FOSC / 115200 / 32) ///定时器1 模式2 做串口波特率
void L0_uart3_init(void) //57600
{
#if 0
S3CON = 0x10; //8位数据,可变波特率
S3CON &= 0xBF; //串口3选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xD0; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器
#endif
S3CON = 0x10; //8位数据,可变波特率
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
T3L = 0xD0; //设定定时初值
T3H = 0xFF; //设定定时初值
T4T3M |= 0x08; //启动定时器3
D_uart3_ES_INT_OPEN(); //打开串口中断
}
void L1_uart3_buf_init(void)
{
s_uart3_send_depot.p = s_uart3_send_depot.buf;
s_uart3_send_shop.now = 0;
L0_uart3_init();
}
void L0_uart3_uc(U8 ww)
{
s_uart3_send_depot.max = 1;
s_uart3_send_depot.buf[0] = ww;
s_uart3_send_depot.p = s_uart3_send_depot.buf;
L0_uart3_sendbuf();
}
void L0_uart3_us(U16 ww)
{
L0_uart3_uc(ww >> 8 & 0xFF);
L0_uart3_uc(ww >> 0 & 0xFF);
}
void L0_uart3_0d0a(void)
{
s_uart3_send_depot.max = 2;
s_uart3_send_depot.buf[0] = 0x0d;
s_uart3_send_depot.buf[1] = 0x0a;
s_uart3_send_depot.p = s_uart3_send_depot.buf;
L0_uart3_sendbuf();
}
// L0_uart3_uc(cguHex2Char[D_uc_low(s->sec)][0]);
void L0_uart3_uchex(U8 ww)
{
s_uart3_send_depot.max = 2;
s_uart3_send_depot.buf[0] = cguHex2Char[D_uc_low(ww)][1];
s_uart3_send_depot.buf[1] = cguHex2Char[D_uc_high(ww)][1];
s_uart3_send_depot.p = s_uart3_send_depot.buf;
L0_uart3_sendbuf();
}
void L0_uart3_ulhex(vU32 ww)
{
U_U32 ultemp;
ultemp.dWord = ww;
L0_uart3_uchex(ultemp.BYTE4.byte0);
L0_uart3_uchex(ultemp.BYTE4.byte1);
L0_uart3_uchex(ultemp.BYTE4.byte2);
L0_uart3_uchex(ultemp.BYTE4.byte3);
}
void L0_uart3_sendstr(U8 *str)
{
//L0_uart3_sendbuf(str,strlen(str));
s_uart3_send_depot.max = strlen(str);
s_uart3_send_depot.p = str;
L0_uart3_sendbuf();
}
void L0_uart3_sendArray(U8 *buf,U8 len)
{
//L0_uart3_sendbuf(str,strlen(str));
s_uart3_send_depot.max = len;
s_uart3_send_depot.p = buf;
L0_uart3_sendbuf();
}
// 发送buf数组 中的0----(num-1)
void L0_uart3_sendbuf(void)
{
register unsigned char n = 0;
if(s_uart3_send_depot.max>= D_send_buf_max)
{
s_uart3_send_depot.max = D_send_buf_max - 1;
}
D_uart3_ES_INT_CLOSE();
if(0 == s_uart3_send_shop.now)
{/// 上次的已经发送完毕了,或者第一次开始
/// (s_uart3_send_shop.now == s_uart3_send_shop.max = 0 buf中为空)
for(n = 0;n < s_uart3_send_depot.max; n++)
{
s_uart3_send_shop.buf[n] = s_uart3_send_depot.p[n];
}
s_uart3_send_shop.max = s_uart3_send_depot.max;
L0_uart3_IntTIClear();
s_uart3_send_shop.now = 1;
///D_uart3_ES_INT(1);
L0_uart3_set(s_uart3_send_shop.buf[0]);
}else
{// 需要插入
/// [0]--?--[pool.now]--?--[pool.max-1].......................................
/// [0]--?--[pool.now]--?--[pool.max]+[bath.0]--?---[bath.max-1].............
for(n = 0;n < s_uart3_send_depot.max; n++)
{
s_uart3_send_shop.buf[s_uart3_send_shop.max] = s_uart3_send_depot.p[n];
s_uart3_send_shop.max ++;
if(s_uart3_send_shop.max >= D_send_buf_max)
{
s_uart3_send_shop.max = D_send_buf_max - 1;
}
}
}
D_uart3_ES_INT_OPEN();
}
/*************************************************
UART
*************************************************/
#define D_SERVE_UART3 interrupt 17
void INTERRUPT_UART3(void) D_SERVE_UART3// using 3
{
D_uart3_ES_INT_CLOSE();
//------------------------------------------------
if(L0_uart3_IntRI()) //如果是U0接收中断
{L0_uart3_IntRIClear(); //清除接收中断标志
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>用户程序 添加协议>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/// output: 对应的结构体变量中携带 缓存buf和协议ok的标志
//s_uart3_rec.reg = L0_uart3_get();
//s_uart3_rec.ok = 1;
//s_uart3_rec.reg = L0_uart3_get();
//s_uart3_rec.ok = 1;
//Lp0_uart3_fun(L0_uart3_get());
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//------------------------------------------------------------
else
{
if(L0_uart3_IntTI()) //如果是U0发送中断
{L0_uart3_IntTIClear(); //清除发送中断标志
if(s_uart3_send_shop.max != s_uart3_send_shop.now)
{
L0_uart3_set(s_uart3_send_shop.buf[s_uart3_send_shop.now]);
s_uart3_send_shop.now ++;
}else
{
s_uart3_send_shop.max = 0;
s_uart3_send_shop.now = 0;//可以发送下一个数据
}
}
}
D_uart3_ES_INT_OPEN();
}

117
source/msp/UART3.h

@ -0,0 +1,117 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2015, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
//////////////////////////////////////////////////////////////////////////
/*****************************************************************************
update by cc @201700110
.
clib/clib.c:
(线),
(lcd等固屏输出的)使
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...)
-----------------------------------------------------------------------------------------
uartcom/Uprotocol2app
uart口来对应
typedef struct _ts_lcm_pro_; ? LCM的协议------------
L3_UARTcom0_exp_protocol
-----------------------------------------------------------------------------------------
uartcom/urec2protocol:
struct _s_uart_rec_ ()------struct _s_uart_rec_
void L1_uart_2buf(struct _s_uart_rec_ *p)
--------------------------------------------------------------------------------------------
msp/uartx.c cpu相关
L0_UART0_Init
UART0_IRQHandler
L0_Usend_uc------UserDef
-----------------------------------------------------------------------------------------
********************************************************************************/
#ifndef _uart3_H
#define _uart3_H
#include "../bsp/bsp_config.h"
//#include "../bsp/type_hs.h"
//#include "../debug/debug_drv.h"
//#include "../uartcom/urec2protocol.h"
//?include "../uartcom/uprotocol2app.h"
#include "../tpc/tpc_uart.h"
#include "../ctask/task.h"
#include "../clib/Clib.h"
//extern struct _s_PH1_FX_ s_uart3_rec;
#define D_s_uart3_rec_close(); s_uart3_rec.ok = 2;// 关闭串口协议解析
#define D_s_uart3_rec_open(); s_uart3_rec.ok = 0;// 关闭串口协议解析
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define D_send3_buf_max 64 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
struct _s_uart3_send_buf_
{//8byte
U8 num; //接收到的数目注意数据长度的范围
U8 *p;
U8 now; /// 当前buf所在的位置 0------(max-1)
U8 max; /// 当前buf的最大值,也就是需要发送的长度
U8 buf[D_send3_buf_max + 1];//buffer 的第一位是 长度
};
extern struct _s_uart3_send_buf_ s_uart3_send_shop;
extern struct _s_uart3_send_buf_ s_uart3_send_depot;
//#define S4SM0 BITN7
#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3)
#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3)
#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI)
#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI)
#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI)
#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI)
#define L0_uart3_set(x) S3BUF = (x);
#define L0_uart3_get() (S3BUF)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
void L1_uart3_buf_init(void);
extern void L0_uart3_init(void);
extern void L0_uart3_uchex(U8 ww);
extern void L0_uart3_ulhex(vU32 ww);
extern void L0_uart3_ul(vU32 ww);
extern void L0_uart3_sendstr(U8 *str);
extern void L0_uart3_0d0a(void);
extern void L0_uart3_uc(U8 ww);
///////////////////////////////////////////////////////////////
extern void L0_uart3_sendArray(U8 *buf,U8 len);
extern void L0_uart3_sendbuf(void);
#endif //#ifndef _uart3_H

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save